diff --git a/lib/common/init.js b/lib/common/init.js index d732352a30514..b77040d8a44d7 100644 --- a/lib/common/init.js +++ b/lib/common/init.js @@ -1,4 +1,5 @@ const timers = require('timers') +const util = require('util') process.atomBinding = require('./atom-binding-setup')(process.binding, process.type) @@ -8,7 +9,15 @@ process.atomBinding = require('./atom-binding-setup')(process.binding, process.t // which would delay the callbacks for arbitrary long time. So we should // initiatively activate the uv loop once setImmediate and process.nextTick is // called. -var wrapWithActivateUvLoop = function (func) { +const wrapWithActivateUvLoop = function (func) { + const wrapped = wrapWithActivateUvLoopImpl(func) + if (func[util.promisify.custom]) { + wrapped[util.promisify.custom] = wrapWithActivateUvLoopImpl(func[util.promisify.custom]) + } + return wrapped +} + +const wrapWithActivateUvLoopImpl = function (func) { return function () { process.activateUvLoop() return func.apply(this, arguments) diff --git a/spec/node-spec.js b/spec/node-spec.js index b87ed189633ad..9bb03494a56ff 100644 --- a/spec/node-spec.js +++ b/spec/node-spec.js @@ -179,6 +179,10 @@ describe('node feature', () => { it('can be scheduled in time', (done) => { remote.getGlobal('setTimeout')(done, 0) }) + + it('can be promisified', (done) => { + remote.getGlobal('setTimeoutPromisified')(0).then(done) + }) }) describe('setInterval called under Chromium event loop in browser process', () => { diff --git a/spec/static/main.js b/spec/static/main.js index d920426df3d95..2715e3f9a2071 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -79,6 +79,8 @@ ipcMain.on('echo', function (event, msg) { event.returnValue = msg }) +global.setTimeoutPromisified = util.promisify(setTimeout) + const coverage = new Coverage({ outputPath: path.join(__dirname, '..', '..', 'out', 'coverage') })