enigma-bbs/core/door.js

68 lines
1.4 KiB
JavaScript

/* jslint node: true */
'use strict';
var spawn = require('child_process').spawn;
var events = require('events');
var _ = require('lodash');
var pty = require('pty.js');
exports.Door = Door;
function Door(client, exeInfo) {
events.EventEmitter.call(this);
this.client = client;
this.exeInfo = exeInfo;
this.exeInfo.encoding = this.exeInfo.encoding || 'cp437';
// exeInfo.cmd
// exeInfo.args[]
// exeInfo.env{}
// exeInfo.cwd
// exeInfo.encoding
}
require('util').inherits(Door, events.EventEmitter);
Door.prototype.run = function() {
var self = this;
var door = pty.spawn(self.exeInfo.cmd, self.exeInfo.args, {
cols : self.client.term.termWidth,
rows : self.client.term.termHeight,
// :TODO: cwd
env : self.exeInfo.env,
});
// :TODO: can we pause the stream, write our own "Loading...", then on resume?
//door.pipe(self.client.term.output);
self.client.term.output.pipe(door);
// :TODO: do this with pluggable pipe/filter classes
door.setEncoding(this.exeInfo.encoding);
door.on('data', function doorData(data) {
self.client.term.write(data);
});
door.on('close', function closed() {
self.client.term.output.unpipe(door);
self.client.term.output.resume();
});
door.on('exit', function exited(code) {
self.client.log.info( { code : code }, 'Door exited');
door.removeAllListeners();
self.emit('finished');
});
};