return Promise instead of Thenable