view modules/mod_http.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 62cbb1c49bc5
children 023f767662d3
line wrap: on
line source

var sites = {};

var http = require('http');

var fs = require('fs');
var dir = require('./configuration').pluginsDir;
var files = fs.readdirSync(dir + '/http');
var regex = /^mod_.*\.js/;

var Script = process.binding('evals').Script;
var sandbox = {
	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;

	fs.readFile(dir + '/http/' + file, function(err, data) {
		if (err) {
			console.log('ERROR: loading http module “'+file+'”.'); // FIXME: file is always the last file of the list…
			return;
		}

		Script.runInNewContext(data, sandbox, dir + '/http/' + file); // FIXME: the same.
		var module = sandbox.exports;
		sandbox.exports = {};

		for (var j in module) {
			if (typeof sites[j] != 'undefined')
				console.log('WARNING: module http/'+j+' already loaded.');

			sites[j] = module[j];
		}
	});
}

http.createServer(function (req, res) {
	var sent = false;
	for (var i in sites) {
		var site = sites[i];
		if (!site.url.test(req.url))
			continue;

		sent = site.func(req, res);
		return;
	}
	if (!sent) {
		res.writeHead(404, {'Content-Type': 'text/plain'});
		res.end('Error 404');
	}
}).listen(8484);