diff modules.js @ 41:bc717575e66a

Much better handling of modules.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 20 Feb 2011 15:51:12 +0100
parents b2faacfefb90
children 023f767662d3
line wrap: on
line diff
--- a/modules.js
+++ b/modules.js
@@ -1,18 +1,46 @@
 var modules = exports;
 
-var files = require('fs').readdirSync('modules');
+var fs = require('fs');
+var dir = require('./configuration').pluginsDir;
+var files = fs.readdirSync(dir);
 var regex = /^mod_.*\.js/;
 
+var Script = process.binding('evals').Script;
+var sandbox = {
+	process: process,
+	config: require('./configuration'),
+	xmpp: require('xmpp'),
+	errors: require('./errors'),
+	forms: require('./forms'),
+	makeError: require('./errors').makeError,
+	notifs: require('./notifs'),
+	NS: require('./namespaces'),
+	require: require,
+	storage: require('./storage'),
+	toBareJID: require('./fdsq').toBareJID,
+	exports: {}
+};
+
 for (var i in files) {
 	var file = files[i];
 	if (!regex.test(file))
 		continue;
 
-	var module = require('./modules/' + files[i]);
-	for (var j in module) {
-		if (typeof modules[j] != 'undefined')
-			console.log('WARNING: module '+j+' already loaded.');
+	fs.readFile(dir + '/' + file, function(err, data) {
+		if (err) {
+			console.log('ERROR: loading module “'+file+'”.'); // FIXME: file is always the last file of the list…
+			return;
+		}
 
-		modules[j] = module[j];
-	}
+		Script.runInNewContext(data, sandbox, dir + '/' + file); // FIXME: the same.
+		var module = sandbox.exports;
+		sandbox.exports = {};
+
+		for (var j in module) {
+			if (typeof modules[j] != 'undefined')
+				console.log('WARNING: module '+j+' already loaded.');
+
+			modules[j] = module[j];
+		}
+	});
 }