UNPKG

happner

Version:

distributed application engine with evented storage and mesh services

95 lines (69 loc) 2.29 kB
var repl = require('repl') , net = require('net') , fs = require('fs') ; var running = false; // one per process var server, log; // First Mesh to call repl.start has instance module.exports.create = function (instance) { if (!instance._mesh.config.repl) { if (process.env.UNROOT_ON_REPL) delete global.$happner; return; } if (running) return; var config = instance._mesh.config.repl; running = true; log = log || instance.log.createLogger('Repl'); log.$$TRACE('create()'); // This occurs before components start. // They can remain isolated but repl can still have access to all as follows // START_AS_ROOTED=1 UNROOT_ON_REPL=1 node my_mesh_nodes.js var happner = global.$happner; if (process.env.UNROOT_ON_REPL) delete global.$happner; server = net.createServer(function (socket) { log.info('connection on %s', config.socket); var r = repl.start({ prompt: instance._mesh.config.name + '> ', input: socket, output: socket, terminal: true, ignoreUndefined: (typeof config.ignoreUndefined == 'undefined') ? false : config.ignoreUndefined, useGlobal: true, useColors: (typeof config.useColors == 'undefined') ? true : config.useColors }); if (happner) r.context.$happner = happner; r.context.localnode = instance; // default callback stub gets result back across the socket r.context.$callback = function TypicalCallbackStub(err, res) { if (err) { socket.write('ERROR:\n' + (err.stack || err.toString()) + '\n'); return; } socket.write('RESULT:\n' + JSON.stringify(res, null, 2) + '\n'); } socket.on('close', function () { log.info('connection departed %s', config.socket); }); socket.on('error', function (err) { }); }); server.listen(config.socket, function () { // console.log('ok') }); server.on('error', function (err) { log.error('server error', err); }); server.on('listening', function () { log.info('listening at %s', config.socket); }); var clearFd = function () { if (config.socket) { try { log.$$DEBUG('deleting %s', config.socket); fs.unlinkSync(config.socket); } catch (e) { } } } process.on('exit', clearFd); }