2010-01-31 11:13:30 -08:00
|
|
|
(function (process) {
|
2010-01-30 23:22:34 -08:00
|
|
|
|
|
|
|
process.global.process = process;
|
|
|
|
process.global.global = process.global;
|
|
|
|
global.GLOBAL = global;
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
/** deprecation errors ************************************************/
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2010-01-20 21:39:10 +01:00
|
|
|
function removed (reason) {
|
|
|
|
return function () {
|
|
|
|
throw new Error(reason)
|
|
|
|
}
|
|
|
|
}
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2010-01-20 21:39:10 +01:00
|
|
|
GLOBAL.__module = removed("'__module' has been renamed to 'module'");
|
|
|
|
GLOBAL.include = removed("include(module) has been removed. Use process.mixin(GLOBAL, require(module)) to get the same effect.");
|
|
|
|
GLOBAL.puts = removed("puts() has moved. Use require('sys') to bring it back.");
|
|
|
|
GLOBAL.print = removed("print() has moved. Use require('sys') to bring it back.");
|
|
|
|
GLOBAL.p = removed("p() has moved. Use require('sys') to bring it back.");
|
|
|
|
process.debug = removed("process.debug() has moved. Use require('sys') to bring it back.");
|
|
|
|
process.error = removed("process.error() has moved. Use require('sys') to bring it back.");
|
2010-03-01 10:42:37 -08:00
|
|
|
process.watchFile = removed("process.watchFile() has moved to fs.watchFile()");
|
|
|
|
process.unwatchFile = removed("process.unwatchFile() has moved to fs.unwatchFile()");
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2009-10-31 19:56:27 +01:00
|
|
|
GLOBAL.node = {};
|
|
|
|
|
2010-01-20 21:39:10 +01:00
|
|
|
node.createProcess = removed("node.createProcess() has been changed to process.createChildProcess() update your code");
|
|
|
|
node.exec = removed("process.exec() has moved. Use require('sys') to bring it back.");
|
|
|
|
node.inherits = removed("node.inherits() has moved. Use require('sys') to access it.");
|
2010-03-01 11:39:35 -08:00
|
|
|
process.inherits = removed("process.inherits() has moved to sys.inherits.");
|
2009-06-30 13:40:00 +02:00
|
|
|
|
2009-10-31 19:56:27 +01:00
|
|
|
node.http = {};
|
2010-01-20 21:39:10 +01:00
|
|
|
node.http.createServer = removed("node.http.createServer() has moved. Use require('http') to access it.");
|
|
|
|
node.http.createClient = removed("node.http.createClient() has moved. Use require('http') to access it.");
|
2009-10-31 19:56:27 +01:00
|
|
|
|
|
|
|
node.tcp = {};
|
2010-01-20 21:39:10 +01:00
|
|
|
node.tcp.createServer = removed("node.tcp.createServer() has moved. Use require('tcp') to access it.");
|
|
|
|
node.tcp.createConnection = removed("node.tcp.createConnection() has moved. Use require('tcp') to access it.");
|
2009-10-31 19:56:27 +01:00
|
|
|
|
|
|
|
node.dns = {};
|
2010-01-20 21:39:10 +01:00
|
|
|
node.dns.createConnection = removed("node.dns.createConnection() has moved. Use require('dns') to access it.");
|
2009-11-07 16:27:18 +01:00
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
/**********************************************************************/
|
|
|
|
|
|
|
|
// Module
|
|
|
|
|
2010-02-04 22:28:04 +01:00
|
|
|
var internalModuleCache = {};
|
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
function Module (id, parent) {
|
|
|
|
this.id = id;
|
|
|
|
this.exports = {};
|
|
|
|
this.parent = parent;
|
|
|
|
|
2010-02-04 22:28:04 +01:00
|
|
|
if (parent) {
|
2010-02-11 12:09:46 +01:00
|
|
|
this.moduleCache = parent.moduleCache;
|
|
|
|
} else {
|
|
|
|
this.moduleCache = {};
|
2010-02-04 22:28:04 +01:00
|
|
|
}
|
2010-02-11 12:09:46 +01:00
|
|
|
this.moduleCache[this.id] = this;
|
2010-02-04 22:28:04 +01:00
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
this.filename = null;
|
|
|
|
this.loaded = false;
|
|
|
|
this.exited = false;
|
|
|
|
this.children = [];
|
|
|
|
};
|
|
|
|
|
|
|
|
function createInternalModule (id, constructor) {
|
2010-02-04 22:28:04 +01:00
|
|
|
var m = new Module(id);
|
2010-01-15 12:46:08 -08:00
|
|
|
constructor(m.exports);
|
|
|
|
m.loaded = true;
|
2010-02-04 22:28:04 +01:00
|
|
|
internalModuleCache[id] = m;
|
2010-01-15 12:46:08 -08:00
|
|
|
return m;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
process.createChildProcess = function (file, args, env) {
|
|
|
|
var child = new process.ChildProcess();
|
|
|
|
args = args || [];
|
2010-02-03 12:19:08 -08:00
|
|
|
env = env || process.env;
|
2009-10-31 19:02:30 +01:00
|
|
|
var envPairs = [];
|
|
|
|
for (var key in env) {
|
|
|
|
if (env.hasOwnProperty(key)) {
|
|
|
|
envPairs.push(key + "=" + env[key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// TODO Note envPairs is not currently used in child_process.cc. The PATH
|
|
|
|
// needs to be searched for the 'file' command if 'file' does not contain
|
|
|
|
// a '/' character.
|
|
|
|
child.spawn(file, args, envPairs);
|
|
|
|
return child;
|
|
|
|
};
|
|
|
|
|
2009-11-07 14:37:22 +01:00
|
|
|
process.assert = function (x, msg) {
|
|
|
|
if (!(x)) throw new Error(msg || "assertion error");
|
|
|
|
};
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
// From jQuery.extend in the jQuery JavaScript Library v1.3.2
|
|
|
|
// Copyright (c) 2009 John Resig
|
|
|
|
// Dual licensed under the MIT and GPL licenses.
|
|
|
|
// http://docs.jquery.com/License
|
2010-02-18 17:50:48 +01:00
|
|
|
// Modified for node.js (formely for copying properties correctly)
|
2009-10-29 23:34:10 +01:00
|
|
|
process.mixin = function() {
|
2009-12-22 23:11:54 +01:00
|
|
|
// copy reference to target object
|
2010-02-18 17:50:48 +01:00
|
|
|
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, source;
|
2009-12-22 23:11:54 +01:00
|
|
|
|
|
|
|
// Handle a deep copy situation
|
|
|
|
if ( typeof target === "boolean" ) {
|
|
|
|
deep = target;
|
|
|
|
target = arguments[1] || {};
|
|
|
|
// skip the boolean and the target
|
|
|
|
i = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle case when target is a string or something (possible in deep copy)
|
|
|
|
if ( typeof target !== "object" && !(typeof target === 'function') )
|
|
|
|
target = {};
|
|
|
|
|
|
|
|
// mixin process itself if only one argument is passed
|
|
|
|
if ( length == i ) {
|
|
|
|
target = GLOBAL;
|
|
|
|
--i;
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( ; i < length; i++ ) {
|
|
|
|
// Only deal with non-null/undefined values
|
2010-02-18 17:50:48 +01:00
|
|
|
if ( (source = arguments[i]) != null ) {
|
2009-12-22 23:11:54 +01:00
|
|
|
// Extend the base object
|
2010-02-18 17:50:48 +01:00
|
|
|
Object.getOwnPropertyNames(source).forEach(function(k){
|
2010-03-01 16:05:28 +01:00
|
|
|
var d = Object.getOwnPropertyDescriptor(source, k) || {value: source[k]};
|
2010-02-18 17:50:48 +01:00
|
|
|
if (d.get) {
|
|
|
|
target.__defineGetter__(k, d.get);
|
Fix bug in process.mixin where deep copies would not work at all.
Before, doing this:
var sys = require("sys");
var obj = {
one: 1,
two: 2,
three: {
value: 3
}
};
sys.p(process.mixin(true, {}, obj));
Would output this:
{
"two": 2,
"three": {
"one": 1,
"two": 2,
"three": {
"value": 3
},
"value": 3
},
"one": 1
}
When it should have outputed this:
{
"one": 1,
"two": 2,
"three": {
"value": 3
}
}
2010-02-22 06:47:15 +00:00
|
|
|
if (d.set) {
|
2010-02-18 17:50:48 +01:00
|
|
|
target.__defineSetter__(k, d.set);
|
Fix bug in process.mixin where deep copies would not work at all.
Before, doing this:
var sys = require("sys");
var obj = {
one: 1,
two: 2,
three: {
value: 3
}
};
sys.p(process.mixin(true, {}, obj));
Would output this:
{
"two": 2,
"three": {
"one": 1,
"two": 2,
"three": {
"value": 3
},
"value": 3
},
"one": 1
}
When it should have outputed this:
{
"one": 1,
"two": 2,
"three": {
"value": 3
}
}
2010-02-22 06:47:15 +00:00
|
|
|
}
|
2009-12-22 23:11:54 +01:00
|
|
|
}
|
2010-02-18 17:50:48 +01:00
|
|
|
else {
|
|
|
|
// Prevent never-ending loop
|
Fix bug in process.mixin where deep copies would not work at all.
Before, doing this:
var sys = require("sys");
var obj = {
one: 1,
two: 2,
three: {
value: 3
}
};
sys.p(process.mixin(true, {}, obj));
Would output this:
{
"two": 2,
"three": {
"one": 1,
"two": 2,
"three": {
"value": 3
},
"value": 3
},
"one": 1
}
When it should have outputed this:
{
"one": 1,
"two": 2,
"three": {
"value": 3
}
}
2010-02-22 06:47:15 +00:00
|
|
|
if (target === d.value) {
|
2010-02-18 17:50:48 +01:00
|
|
|
continue;
|
Fix bug in process.mixin where deep copies would not work at all.
Before, doing this:
var sys = require("sys");
var obj = {
one: 1,
two: 2,
three: {
value: 3
}
};
sys.p(process.mixin(true, {}, obj));
Would output this:
{
"two": 2,
"three": {
"one": 1,
"two": 2,
"three": {
"value": 3
},
"value": 3
},
"one": 1
}
When it should have outputed this:
{
"one": 1,
"two": 2,
"three": {
"value": 3
}
}
2010-02-22 06:47:15 +00:00
|
|
|
}
|
|
|
|
|
2010-02-18 17:50:48 +01:00
|
|
|
if (deep && d.value && typeof d.value === "object") {
|
|
|
|
target[k] = process.mixin(deep,
|
|
|
|
// Never move original objects, clone them
|
Fix bug in process.mixin where deep copies would not work at all.
Before, doing this:
var sys = require("sys");
var obj = {
one: 1,
two: 2,
three: {
value: 3
}
};
sys.p(process.mixin(true, {}, obj));
Would output this:
{
"two": 2,
"three": {
"one": 1,
"two": 2,
"three": {
"value": 3
},
"value": 3
},
"one": 1
}
When it should have outputed this:
{
"one": 1,
"two": 2,
"three": {
"value": 3
}
}
2010-02-22 06:47:15 +00:00
|
|
|
source[k] || (d.value.length != null ? [] : {})
|
2010-02-18 17:50:48 +01:00
|
|
|
, d.value);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
target[k] = d.value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2009-12-22 23:11:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// Return the modified object
|
|
|
|
return target;
|
2009-10-05 15:46:31 +02:00
|
|
|
};
|
|
|
|
|
2009-11-07 14:37:22 +01:00
|
|
|
// Event
|
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
var eventsModule = createInternalModule('events', function (exports) {
|
|
|
|
exports.EventEmitter = process.EventEmitter;
|
|
|
|
|
|
|
|
// process.EventEmitter is defined in src/events.cc
|
|
|
|
// process.EventEmitter.prototype.emit() is also defined there.
|
|
|
|
process.EventEmitter.prototype.addListener = function (type, listener) {
|
|
|
|
if (listener instanceof Function) {
|
|
|
|
if (!this._events) this._events = {};
|
|
|
|
if (!this._events.hasOwnProperty(type)) this._events[type] = [];
|
|
|
|
// To avoid recursion in the case that type == "newListeners"! Before
|
|
|
|
// adding it to the listeners, first emit "newListeners".
|
|
|
|
this.emit("newListener", type, listener);
|
|
|
|
this._events[type].push(listener);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
2009-12-06 11:36:22 +01:00
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
process.EventEmitter.prototype.removeListener = function (type, listener) {
|
|
|
|
if (listener instanceof Function) {
|
|
|
|
// does not use listeners(), so no side effect of creating _events[type]
|
|
|
|
if (!this._events || !this._events.hasOwnProperty(type)) return;
|
|
|
|
var list = this._events[type];
|
|
|
|
if (list.indexOf(listener) < 0) return;
|
|
|
|
list.splice(list.indexOf(listener), 1);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
};
|
2009-12-06 11:36:22 +01:00
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
process.EventEmitter.prototype.listeners = function (type) {
|
|
|
|
if (!this._events) this._events = {};
|
|
|
|
if (!this._events.hasOwnProperty(type)) this._events[type] = [];
|
|
|
|
return this._events[type];
|
|
|
|
};
|
2010-02-21 15:48:43 -08:00
|
|
|
|
|
|
|
exports.Promise = removed('Promise has been removed. See http://groups.google.com/group/nodejs/msg/0c483b891c56fea2 for more information.');
|
|
|
|
process.Promise = exports.Promise;
|
2010-01-15 12:46:08 -08:00
|
|
|
});
|
2009-11-07 14:37:22 +01:00
|
|
|
|
2010-01-15 12:46:08 -08:00
|
|
|
var events = eventsModule.exports;
|
2009-11-07 14:37:22 +01:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2010-01-18 10:27:27 -08:00
|
|
|
// nextTick()
|
|
|
|
|
|
|
|
var nextTickQueue = [];
|
|
|
|
var nextTickWatcher = new process.IdleWatcher();
|
2010-02-16 19:34:42 -08:00
|
|
|
// Only debugger has maximum priority. Below that is the nextTickWatcher.
|
|
|
|
nextTickWatcher.setPriority(process.EVMAXPRI-1);
|
2010-01-18 10:27:27 -08:00
|
|
|
|
|
|
|
nextTickWatcher.callback = function () {
|
|
|
|
var l = nextTickQueue.length;
|
|
|
|
while (l--) {
|
|
|
|
var cb = nextTickQueue.shift();
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
if (nextTickQueue.length == 0) nextTickWatcher.stop();
|
|
|
|
};
|
|
|
|
|
|
|
|
process.nextTick = function (callback) {
|
|
|
|
nextTickQueue.push(callback);
|
|
|
|
nextTickWatcher.start();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-10-14 17:56:12 -04:00
|
|
|
// Signal Handlers
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
function isSignal (event) {
|
|
|
|
return event.slice(0, 3) === 'SIG' && process.hasOwnProperty(event);
|
|
|
|
};
|
2009-10-14 17:56:12 -04:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
process.addListener("newListener", function (event) {
|
|
|
|
if (isSignal(event) && process.listeners(event).length === 0) {
|
|
|
|
var handler = new process.SignalHandler(process[event]);
|
|
|
|
handler.addListener("signal", function () {
|
|
|
|
process.emit(event);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
2009-10-14 17:56:12 -04:00
|
|
|
|
|
|
|
|
2009-06-08 15:30:10 +02:00
|
|
|
// Timers
|
2010-01-19 04:51:50 +11:00
|
|
|
function addTimerListener (callback) {
|
|
|
|
var timer = this;
|
|
|
|
// Special case the no param case to avoid the extra object creation.
|
|
|
|
if (arguments.length > 2) {
|
|
|
|
var args = Array.prototype.slice.call(arguments, 2);
|
|
|
|
timer.addListener("timeout", function(){
|
|
|
|
callback.apply(timer, args);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
timer.addListener("timeout", callback);
|
|
|
|
}
|
|
|
|
}
|
2009-06-08 15:30:10 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
GLOBAL.setTimeout = function (callback, after) {
|
2009-10-29 23:34:10 +01:00
|
|
|
var timer = new process.Timer();
|
2010-01-19 04:51:50 +11:00
|
|
|
addTimerListener.apply(timer, arguments);
|
2009-06-25 20:25:44 +02:00
|
|
|
timer.start(after, 0);
|
2009-06-08 15:30:10 +02:00
|
|
|
return timer;
|
2009-12-16 17:33:33 -05:00
|
|
|
};
|
2009-06-08 15:30:10 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
GLOBAL.setInterval = function (callback, repeat) {
|
2009-10-29 23:34:10 +01:00
|
|
|
var timer = new process.Timer();
|
2010-01-19 04:51:50 +11:00
|
|
|
addTimerListener.apply(timer, arguments);
|
2009-06-25 20:25:44 +02:00
|
|
|
timer.start(repeat, repeat);
|
2009-06-08 15:30:10 +02:00
|
|
|
return timer;
|
2009-12-16 17:33:33 -05:00
|
|
|
};
|
2009-06-08 15:30:10 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
GLOBAL.clearTimeout = function (timer) {
|
2010-01-03 19:45:17 -05:00
|
|
|
if (timer instanceof process.Timer) {
|
|
|
|
timer.stop();
|
|
|
|
}
|
2009-12-16 17:33:33 -05:00
|
|
|
};
|
2009-06-08 15:30:10 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
GLOBAL.clearInterval = GLOBAL.clearTimeout;
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-04-15 10:08:28 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
// Modules
|
2009-04-29 11:00:46 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
var debugLevel = 0;
|
2010-02-03 12:19:08 -08:00
|
|
|
if ("NODE_DEBUG" in process.env) debugLevel = 1;
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
function debug (x) {
|
|
|
|
if (debugLevel > 0) {
|
|
|
|
process.stdio.writeError(x + "\n");
|
|
|
|
}
|
2009-09-18 15:45:47 +02:00
|
|
|
}
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2010-02-17 01:06:26 -06:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
function readAll (fd, pos, content, encoding, callback) {
|
|
|
|
process.fs.read(fd, 4*1024, pos, encoding, function (err, chunk, bytesRead) {
|
|
|
|
if (err) {
|
|
|
|
if (callback) callback(err);
|
|
|
|
} else if (chunk) {
|
|
|
|
content += chunk;
|
|
|
|
pos += bytesRead;
|
|
|
|
readAll(fd, pos, content, encoding, callback);
|
|
|
|
} else {
|
|
|
|
process.fs.close(fd, function (err) {
|
|
|
|
if (callback) callback(err, content);
|
|
|
|
});
|
2010-02-19 16:02:30 -08:00
|
|
|
}
|
2010-03-01 10:14:49 -08:00
|
|
|
});
|
|
|
|
}
|
2010-01-07 11:34:42 +01:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
process.fs.readFile = function (path, encoding_, callback) {
|
2010-03-03 11:17:45 -07:00
|
|
|
var encoding = typeof(encoding_) == 'string' ? encoding_ : 'utf8';
|
2010-03-01 10:14:49 -08:00
|
|
|
var callback_ = arguments[arguments.length - 1];
|
|
|
|
var callback = (typeof(callback_) == 'function' ? callback_ : null);
|
|
|
|
process.fs.open(path, process.O_RDONLY, 0666, function (err, fd) {
|
|
|
|
if (err) {
|
|
|
|
if (callback) callback(err);
|
|
|
|
} else {
|
|
|
|
readAll(fd, 0, "", encoding, callback);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
2010-02-19 16:02:30 -08:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
process.fs.readFileSync = function (path, encoding) {
|
|
|
|
encoding = encoding || "utf8"; // default to utf8
|
2010-01-07 11:34:42 +01:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
debug('readFileSync open');
|
2010-01-07 11:34:42 +01:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
var fd = process.fs.open(path, process.O_RDONLY, 0666);
|
|
|
|
var content = '';
|
|
|
|
var pos = 0;
|
|
|
|
var r;
|
2010-02-19 16:02:30 -08:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
while ((r = process.fs.read(fd, 4*1024, pos, encoding)) && r[0]) {
|
|
|
|
debug('readFileSync read ' + r[1]);
|
|
|
|
content += r[0];
|
|
|
|
pos += r[1]
|
|
|
|
}
|
2010-02-19 16:02:30 -08:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
debug('readFileSync close');
|
2010-02-19 16:02:30 -08:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
process.fs.close(fd);
|
2009-12-06 10:50:03 +01:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
debug('readFileSync done');
|
2009-12-06 10:50:03 +01:00
|
|
|
|
2010-03-01 10:14:49 -08:00
|
|
|
return content;
|
|
|
|
};
|
2009-12-06 10:50:03 +01:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
var pathModule = createInternalModule("path", function (exports) {
|
|
|
|
exports.join = function () {
|
2009-12-22 16:24:32 +01:00
|
|
|
return exports.normalize(Array.prototype.join.call(arguments, "/"));
|
|
|
|
};
|
|
|
|
|
2010-01-03 23:24:25 -08:00
|
|
|
exports.normalizeArray = function (parts, keepBlanks) {
|
|
|
|
var directories = [], prev;
|
|
|
|
for (var i = 0, l = parts.length - 1; i <= l; i++) {
|
2009-12-22 16:24:32 +01:00
|
|
|
var directory = parts[i];
|
2010-01-03 23:24:25 -08:00
|
|
|
|
|
|
|
// if it's blank, but it's not the first thing, and not the last thing, skip it.
|
|
|
|
if (directory === "" && i !== 0 && i !== l && !keepBlanks) continue;
|
|
|
|
|
|
|
|
// if it's a dot, and there was some previous dir already, then skip it.
|
2010-01-08 12:46:13 -08:00
|
|
|
if (directory === "." && prev !== undefined) continue;
|
2010-01-03 23:24:25 -08:00
|
|
|
|
2009-12-22 16:24:32 +01:00
|
|
|
if (
|
|
|
|
directory === ".."
|
|
|
|
&& directories.length
|
2010-01-08 12:46:13 -08:00
|
|
|
&& prev !== ".."
|
|
|
|
&& prev !== undefined
|
|
|
|
&& (prev !== "" || keepBlanks)
|
2009-12-22 16:24:32 +01:00
|
|
|
) {
|
|
|
|
directories.pop();
|
2010-01-03 23:24:25 -08:00
|
|
|
prev = directories.slice(-1)[0]
|
2009-10-31 19:02:30 +01:00
|
|
|
} else {
|
2010-01-03 23:24:25 -08:00
|
|
|
if (prev === ".") directories.pop();
|
2009-12-22 16:24:32 +01:00
|
|
|
directories.push(directory);
|
2010-01-03 23:24:25 -08:00
|
|
|
prev = directory;
|
2009-09-18 15:45:47 +02:00
|
|
|
}
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
2009-12-22 16:24:32 +01:00
|
|
|
return directories;
|
2009-12-22 17:50:23 +01:00
|
|
|
};
|
2009-12-22 16:24:32 +01:00
|
|
|
|
2010-01-03 23:24:25 -08:00
|
|
|
exports.normalize = function (path, keepBlanks) {
|
|
|
|
return exports.normalizeArray(path.split("/"), keepBlanks).join("/");
|
2009-10-31 19:02:30 +01:00
|
|
|
};
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
exports.dirname = function (path) {
|
2010-01-08 12:46:13 -08:00
|
|
|
return path.substr(0, path.lastIndexOf("/")) || ".";
|
2009-10-31 19:02:30 +01:00
|
|
|
};
|
2009-09-28 17:12:28 +02:00
|
|
|
|
2010-01-08 12:46:13 -08:00
|
|
|
exports.filename = function () {
|
|
|
|
throw new Error("path.filename is deprecated. Please use path.basename instead.");
|
|
|
|
};
|
|
|
|
exports.basename = function (path, ext) {
|
|
|
|
var f = path.substr(path.lastIndexOf("/") + 1);
|
|
|
|
if (ext && f.substr(-1 * ext.length) === ext) {
|
|
|
|
f = f.substr(0, f.length - ext.length);
|
|
|
|
}
|
|
|
|
return f;
|
2009-10-31 19:02:30 +01:00
|
|
|
};
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2010-01-08 07:03:23 +00:00
|
|
|
exports.extname = function (path) {
|
2010-01-08 12:46:13 -08:00
|
|
|
var index = path.lastIndexOf('.');
|
|
|
|
return index < 0 ? '' : path.substring(index);
|
2010-01-08 07:03:23 +00:00
|
|
|
};
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
exports.exists = function (path, callback) {
|
2010-03-01 10:14:49 -08:00
|
|
|
process.fs.stat(path, function (err, stats) {
|
2010-02-19 16:02:30 -08:00
|
|
|
if (callback) callback(err ? false : true);
|
|
|
|
});
|
2009-10-31 19:02:30 +01:00
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
var path = pathModule.exports;
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
function existsSync (path) {
|
|
|
|
try {
|
2010-03-01 10:14:49 -08:00
|
|
|
process.fs.stat(path);
|
2010-02-19 09:37:20 -08:00
|
|
|
return true;
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2009-11-01 09:27:21 +01:00
|
|
|
process.paths = [ path.join(process.installPrefix, "lib/node/libraries")
|
|
|
|
];
|
2009-12-22 23:11:54 +01:00
|
|
|
|
2010-02-03 12:19:08 -08:00
|
|
|
if (process.env["HOME"]) {
|
|
|
|
process.paths.unshift(path.join(process.env["HOME"], ".node_libraries"));
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
|
|
|
|
2010-02-03 12:19:08 -08:00
|
|
|
if (process.env["NODE_PATH"]) {
|
|
|
|
process.paths = process.env["NODE_PATH"].split(":").concat(process.paths);
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
/* Sync unless callback given */
|
2009-10-31 19:47:41 +01:00
|
|
|
function findModulePath (id, dirs, callback) {
|
2009-10-31 19:02:30 +01:00
|
|
|
process.assert(dirs.constructor == Array);
|
|
|
|
|
2009-11-01 15:34:46 +01:00
|
|
|
if (/^https?:\/\//.exec(id)) {
|
2010-02-19 09:37:20 -08:00
|
|
|
if (callback) {
|
|
|
|
callback(id);
|
|
|
|
} else {
|
|
|
|
throw new Error("Sync http require not allowed.");
|
|
|
|
}
|
2009-11-01 15:34:46 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-11-04 12:39:08 +01:00
|
|
|
if (/\.(js|node)$/.exec(id)) {
|
2009-10-31 19:02:30 +01:00
|
|
|
throw new Error("No longer accepting filename extension in module names");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dirs.length == 0) {
|
2010-02-19 09:37:20 -08:00
|
|
|
if (callback) {
|
|
|
|
callback();
|
|
|
|
} else {
|
|
|
|
return; // sync returns null
|
|
|
|
}
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
2009-12-22 23:11:54 +01:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
var dir = dirs[0];
|
|
|
|
var rest = dirs.slice(1, dirs.length);
|
|
|
|
|
2009-11-02 00:34:16 +01:00
|
|
|
if (id.charAt(0) == '/') {
|
|
|
|
dir = '';
|
|
|
|
rest = [];
|
|
|
|
}
|
2009-10-31 19:02:30 +01:00
|
|
|
|
2009-11-02 00:34:16 +01:00
|
|
|
var locations = [
|
|
|
|
path.join(dir, id + ".js"),
|
|
|
|
path.join(dir, id + ".node"),
|
|
|
|
path.join(dir, id, "index.js"),
|
2009-12-16 17:33:33 -05:00
|
|
|
path.join(dir, id, "index.addon")
|
2009-11-02 00:34:16 +01:00
|
|
|
];
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
function searchLocations () {
|
2009-11-02 00:34:16 +01:00
|
|
|
var location = locations.shift();
|
2010-02-19 09:37:20 -08:00
|
|
|
if (!location) {
|
|
|
|
return findModulePath(id, rest, callback);
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
2009-11-02 00:34:16 +01:00
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
// if async
|
|
|
|
if (callback) {
|
|
|
|
path.exists(location, function (found) {
|
|
|
|
if (found) {
|
|
|
|
callback(location);
|
|
|
|
} else {
|
|
|
|
return searchLocations();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
// if sync
|
|
|
|
} else {
|
|
|
|
if (existsSync(location)) {
|
|
|
|
return location;
|
|
|
|
} else {
|
|
|
|
return searchLocations();
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
2010-02-19 09:37:20 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return searchLocations();
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
// sync - no i/o performed
|
|
|
|
function resolveModulePath(request, parent) {
|
2009-10-31 19:47:41 +01:00
|
|
|
var id, paths;
|
2009-11-02 21:21:02 +01:00
|
|
|
if (request.charAt(0) == "." && (request.charAt(1) == "/" || request.charAt(1) == ".")) {
|
2009-10-31 19:02:30 +01:00
|
|
|
// Relative request
|
2009-12-16 15:18:27 -08:00
|
|
|
var parentIdPath = path.dirname(parent.id +
|
2010-01-08 12:46:13 -08:00
|
|
|
(path.basename(parent.filename).match(/^index\.(js|addon)$/) ? "/" : ""));
|
2009-12-16 15:18:27 -08:00
|
|
|
id = path.join(parentIdPath, request);
|
2009-12-17 14:06:56 -08:00
|
|
|
// debug("RELATIVE: requested:"+request+" set ID to: "+id+" from "+parent.id+"("+parentIdPath+")");
|
2009-10-31 19:02:30 +01:00
|
|
|
paths = [path.dirname(parent.filename)];
|
|
|
|
} else {
|
2009-10-31 19:47:41 +01:00
|
|
|
id = request;
|
2009-12-17 14:06:56 -08:00
|
|
|
// debug("ABSOLUTE: id="+id);
|
2009-11-01 09:27:21 +01:00
|
|
|
paths = process.paths;
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
|
|
|
|
2010-02-04 22:28:04 +01:00
|
|
|
return [id, paths];
|
|
|
|
}
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
|
|
|
|
function loadModuleSync (request, parent) {
|
|
|
|
var resolvedModule = resolveModulePath(request, parent);
|
|
|
|
var id = resolvedModule[0];
|
|
|
|
var paths = resolvedModule[1];
|
|
|
|
|
|
|
|
debug("loadModuleSync REQUEST " + (request) + " parent: " + parent.id);
|
|
|
|
|
|
|
|
var cachedModule = internalModuleCache[id] || parent.moduleCache[id];
|
|
|
|
|
|
|
|
if (cachedModule) {
|
|
|
|
debug("found " + JSON.stringify(id) + " in cache");
|
|
|
|
return cachedModule.exports;
|
|
|
|
} else {
|
|
|
|
debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));
|
|
|
|
var filename = findModulePath(request, paths);
|
|
|
|
if (!filename) {
|
|
|
|
throw new Error("Cannot find module '" + request + "'");
|
|
|
|
} else {
|
|
|
|
var module = new Module(id, parent);
|
|
|
|
module.loadSync(filename);
|
|
|
|
return module.exports;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-19 11:25:40 -08:00
|
|
|
function loadModule (request, parent, callback) {
|
2010-02-04 22:28:04 +01:00
|
|
|
var
|
|
|
|
resolvedModule = resolveModulePath(request, parent),
|
|
|
|
id = resolvedModule[0],
|
|
|
|
paths = resolvedModule[1];
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
debug("loadModule REQUEST " + (request) + " parent: " + parent.id);
|
2010-02-04 22:28:04 +01:00
|
|
|
|
|
|
|
var cachedModule = internalModuleCache[id] || parent.moduleCache[id];
|
|
|
|
if (cachedModule) {
|
2009-10-31 19:47:41 +01:00
|
|
|
debug("found " + JSON.stringify(id) + " in cache");
|
2010-02-19 11:25:40 -08:00
|
|
|
if (callback) callback(null, cachedModule.exports);
|
2010-02-04 22:28:04 +01:00
|
|
|
} else {
|
2009-10-31 19:47:41 +01:00
|
|
|
debug("looking for " + JSON.stringify(id) + " in " + JSON.stringify(paths));
|
2009-10-31 19:02:30 +01:00
|
|
|
// Not in cache
|
|
|
|
findModulePath(request, paths, function (filename) {
|
|
|
|
if (!filename) {
|
2010-02-19 11:25:40 -08:00
|
|
|
var err = new Error("Cannot find module '" + request + "'");
|
|
|
|
if (callback) callback(err);
|
2009-09-18 15:45:47 +02:00
|
|
|
} else {
|
2010-02-04 22:28:04 +01:00
|
|
|
var module = new Module(id, parent);
|
2010-02-19 11:25:40 -08:00
|
|
|
module.load(filename, callback);
|
2009-09-18 15:45:47 +02:00
|
|
|
}
|
2009-10-31 19:02:30 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
|
|
|
|
Module.prototype.loadSync = function (filename) {
|
|
|
|
debug("loadSync " + JSON.stringify(filename) + " for module " + JSON.stringify(this.id));
|
|
|
|
|
|
|
|
process.assert(!this.loaded);
|
|
|
|
this.filename = filename;
|
|
|
|
|
|
|
|
if (filename.match(/\.node$/)) {
|
|
|
|
this._loadObjectSync(filename);
|
|
|
|
} else {
|
|
|
|
this._loadScriptSync(filename);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-02-19 11:25:40 -08:00
|
|
|
Module.prototype.load = function (filename, callback) {
|
2009-10-31 19:47:41 +01:00
|
|
|
debug("load " + JSON.stringify(filename) + " for module " + JSON.stringify(this.id));
|
2009-10-31 19:02:30 +01:00
|
|
|
|
|
|
|
process.assert(!this.loaded);
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
this.filename = filename;
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
if (filename.match(/\.node$/)) {
|
2010-02-19 11:25:40 -08:00
|
|
|
this._loadObject(filename, callback);
|
2009-08-31 11:14:34 +02:00
|
|
|
} else {
|
2010-02-19 11:25:40 -08:00
|
|
|
this._loadScript(filename, callback);
|
2009-08-31 11:14:34 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
|
|
|
|
Module.prototype._loadObjectSync = function (filename) {
|
|
|
|
this.loaded = true;
|
|
|
|
process.dlopen(filename, this.exports);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-02-19 11:25:40 -08:00
|
|
|
Module.prototype._loadObject = function (filename, callback) {
|
2009-08-31 11:14:34 +02:00
|
|
|
var self = this;
|
|
|
|
// XXX Not yet supporting loading from HTTP. would need to download the
|
2009-12-22 23:11:54 +01:00
|
|
|
// file, store it to tmp then run dlopen on it.
|
2010-02-19 11:25:40 -08:00
|
|
|
self.loaded = true;
|
|
|
|
process.dlopen(filename, self.exports); // FIXME synchronus
|
|
|
|
if (callback) callback(null, self.exports);
|
2009-08-31 11:14:34 +02:00
|
|
|
};
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
|
2010-02-19 11:25:40 -08:00
|
|
|
function cat (id, callback) {
|
2009-11-07 14:57:49 +01:00
|
|
|
if (id.match(/^http:\/\//)) {
|
2010-02-19 11:25:40 -08:00
|
|
|
loadModule('http', process.mainModule, function (err, http) {
|
|
|
|
if (err) {
|
|
|
|
if (callback) callback(err);
|
|
|
|
} else {
|
2010-02-19 16:26:48 -08:00
|
|
|
http.cat(id, callback);
|
2010-02-19 11:25:40 -08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
2010-03-01 10:14:49 -08:00
|
|
|
process.fs.readFile(id, callback);
|
2009-11-01 15:34:46 +01:00
|
|
|
}
|
2009-11-07 14:57:49 +01:00
|
|
|
}
|
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
|
|
|
|
Module.prototype._loadContent = function (content, filename) {
|
|
|
|
var self = this;
|
|
|
|
// remove shebang
|
|
|
|
content = content.replace(/^\#\!.*/, '');
|
|
|
|
|
2010-02-19 11:25:40 -08:00
|
|
|
function requireAsync (url, cb) {
|
|
|
|
loadModule(url, self, cb);
|
2010-02-19 09:37:20 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
function require (path) {
|
|
|
|
return loadModuleSync(path, self);
|
|
|
|
}
|
|
|
|
|
|
|
|
require.paths = process.paths;
|
|
|
|
require.async = requireAsync;
|
|
|
|
require.main = process.mainModule;
|
|
|
|
// create wrapper function
|
|
|
|
var wrapper = "(function (exports, require, module, __filename, __dirname) { "
|
|
|
|
+ content
|
|
|
|
+ "\n});";
|
|
|
|
|
|
|
|
try {
|
|
|
|
var compiledWrapper = process.compile(wrapper, filename);
|
2010-02-21 21:15:44 -08:00
|
|
|
var dirName = path.dirname(filename);
|
|
|
|
if (filename === process.argv[1])
|
|
|
|
process.checkBreak();
|
|
|
|
compiledWrapper.apply(self.exports, [self.exports, require, self, filename, dirName]);
|
2010-02-19 09:37:20 -08:00
|
|
|
} catch (e) {
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Module.prototype._loadScriptSync = function (filename) {
|
2010-03-01 10:14:49 -08:00
|
|
|
var content = process.fs.readFileSync(filename);
|
2010-02-19 09:37:20 -08:00
|
|
|
// remove shebang
|
|
|
|
content = content.replace(/^\#\!.*/, '');
|
|
|
|
|
|
|
|
var e = this._loadContent(content, filename);
|
|
|
|
if (e) {
|
|
|
|
throw e;
|
|
|
|
} else {
|
|
|
|
this.loaded = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-02-19 11:25:40 -08:00
|
|
|
Module.prototype._loadScript = function (filename, callback) {
|
2009-11-07 14:57:49 +01:00
|
|
|
var self = this;
|
2010-02-19 11:25:40 -08:00
|
|
|
cat(filename, function (err, content) {
|
2010-02-19 16:02:30 -08:00
|
|
|
debug('cat done');
|
2010-02-19 11:25:40 -08:00
|
|
|
if (err) {
|
|
|
|
if (callback) callback(err);
|
|
|
|
} else {
|
|
|
|
var e = self._loadContent(content, filename);
|
|
|
|
if (e) {
|
|
|
|
if (callback) callback(e);
|
|
|
|
} else {
|
|
|
|
self._waitChildrenLoad(function () {
|
|
|
|
self.loaded = true;
|
|
|
|
if (self.onload) self.onload();
|
|
|
|
if (callback) callback(null, self.exports);
|
|
|
|
});
|
|
|
|
}
|
2009-12-18 23:58:04 +01:00
|
|
|
}
|
2009-06-08 15:30:10 +02:00
|
|
|
});
|
|
|
|
};
|
2009-04-20 02:55:08 +02:00
|
|
|
|
2010-02-19 09:37:20 -08:00
|
|
|
|
|
|
|
Module.prototype._waitChildrenLoad = function (callback) {
|
2009-08-26 18:51:04 +02:00
|
|
|
var nloaded = 0;
|
2009-06-08 15:30:10 +02:00
|
|
|
var children = this.children;
|
|
|
|
for (var i = 0; i < children.length; i++) {
|
|
|
|
var child = children[i];
|
2009-08-26 18:02:45 +02:00
|
|
|
if (child.loaded) {
|
|
|
|
nloaded++;
|
|
|
|
} else {
|
2010-02-19 11:25:40 -08:00
|
|
|
child.onload = function () {
|
|
|
|
child.onload = null;
|
2009-08-26 18:02:45 +02:00
|
|
|
nloaded++;
|
|
|
|
if (children.length == nloaded && callback) callback();
|
2010-02-19 11:25:40 -08:00
|
|
|
};
|
2009-08-26 18:02:45 +02:00
|
|
|
}
|
2009-04-20 02:55:08 +02:00
|
|
|
}
|
2009-08-26 18:02:45 +02:00
|
|
|
if (children.length == nloaded && callback) callback();
|
2009-06-08 15:30:10 +02:00
|
|
|
};
|
|
|
|
|
2009-09-28 16:50:19 +02:00
|
|
|
|
|
|
|
process.exit = function (code) {
|
|
|
|
process.emit("exit");
|
2009-10-29 23:34:10 +01:00
|
|
|
process.reallyExit(code);
|
2009-09-28 16:50:19 +02:00
|
|
|
};
|
|
|
|
|
2009-10-31 19:02:30 +01:00
|
|
|
var cwd = process.cwd();
|
2009-09-18 15:45:47 +02:00
|
|
|
|
2010-02-03 12:19:08 -08:00
|
|
|
// Make process.argv[0] and process.argv[1] into full paths.
|
|
|
|
if (process.argv[0].indexOf('/') > 0) {
|
|
|
|
process.argv[0] = path.join(cwd, process.argv[0]);
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
2009-09-07 14:09:18 +02:00
|
|
|
|
2010-02-03 12:19:08 -08:00
|
|
|
if (process.argv[1].charAt(0) != "/" && !(/^http:\/\//).exec(process.argv[1])) {
|
|
|
|
process.argv[1] = path.join(cwd, process.argv[1]);
|
2009-10-31 19:02:30 +01:00
|
|
|
}
|
|
|
|
|
2009-11-07 14:57:49 +01:00
|
|
|
// Load the main module--the command line argument.
|
2010-02-04 22:28:04 +01:00
|
|
|
process.mainModule = new Module(".");
|
2010-02-19 16:02:30 -08:00
|
|
|
process.mainModule.load(process.argv[1], function (err) {
|
|
|
|
if (err) throw err;
|
|
|
|
});
|
2009-09-07 14:09:18 +02:00
|
|
|
|
2009-11-23 00:59:36 +01:00
|
|
|
// All our arguments are loaded. We've evaluated all of the scripts. We
|
|
|
|
// might even have created TCP servers. Now we enter the main eventloop. If
|
|
|
|
// there are no watchers on the loop (except for the ones that were
|
|
|
|
// ev_unref'd) then this function exits. As long as there are active
|
|
|
|
// watchers, it blocks.
|
|
|
|
process.loop();
|
|
|
|
|
|
|
|
process.emit("exit");
|
|
|
|
|
2010-01-31 11:13:30 -08:00
|
|
|
})
|