electron/atom/common/lib/init.js

63 lines
1.7 KiB
JavaScript
Raw Normal View History

2016-01-12 02:40:23 +00:00
var Module, fs, path, timers, wrapWithActivateUvLoop;
fs = require('fs');
path = require('path');
timers = require('timers');
Module = require('module');
process.atomBinding = function(name) {
var e, error;
try {
return process.binding("atom_" + process.type + "_" + name);
} catch (error) {
e = error;
if (/No such module/.test(e.message)) {
return process.binding("atom_common_" + name);
}
}
};
if (!process.env.ELECTRON_HIDE_INTERNAL_MODULES) {
/* Add common/api/lib to module search paths. */
Module.globalPaths.push(path.resolve(__dirname, '..', 'api', 'lib'));
}
/*
setImmediate and process.nextTick makes use of uv_check and uv_prepare to
run the callbacks, however since we only run uv loop on requests, the
callbacks wouldn't be called until something else activated the uv loop,
which would delay the callbacks for arbitrary long time. So we should
initiatively activate the uv loop once setImmediate and process.nextTick is
called.
*/
wrapWithActivateUvLoop = function(func) {
return function() {
process.activateUvLoop();
return func.apply(this, arguments);
};
};
process.nextTick = wrapWithActivateUvLoop(process.nextTick);
global.setImmediate = wrapWithActivateUvLoop(timers.setImmediate);
global.clearImmediate = timers.clearImmediate;
if (process.type === 'browser') {
/*
setTimeout needs to update the polling timeout of the event loop, when
called under Chromium's event loop the node's event loop won't get a chance
to update the timeout, so we have to force the node's event loop to
recalculate the timeout in browser process.
*/
global.setTimeout = wrapWithActivateUvLoop(timers.setTimeout);
global.setInterval = wrapWithActivateUvLoop(timers.setInterval);
}