var EventEmitter = require("events").EventEmitter; var net = require("net"); var util = require("util"); var emitLines = function(buffer, emitter){ var pos = buffer.indexOf("\n"); while(~pos){ emitter.emit("line", buffer.substring(0, pos)); buffer = buffer.substring(pos + 1); pos = buffer.indexOf("\n"); } return buffer; }; var cmdsrv = function(options){ EventEmitter.call(this); options = options || {}; this.port = options["port"] || 3223; if(!this.port || typeof(this.port) !== "number"){ throw new Error("cmdsrv: `port` paramter must be a 'number'"); } this.caseSensitive = options["caseSensitive"] || false; this.delimiter = options["delimiter"] || " "; var self = this; this.tokenize = options["tokenizer"] || function(line){ return line.split(self.delimiter); }; var self = this; this.server = net.createServer(function(connection){ self.handle(connection); }); }; util.inherits(cmdsrv, EventEmitter); cmdsrv.prototype.handle = function(connection){ var self = this; var buffer = ""; this.emit("connection", connection); connection.on("line", function(line){ line = line.trim(); self.emit("line", connection, line) var parts = self.tokenize(line); if(!parts.length){ return; } if(!self.caseSensitive){ parts[0] = parts[0].toLowerCase(); } var cmd = parts.shift(); parts.unshift(connection); parts.unshift(cmd); self.emit.apply(self, parts); }); connection.on("data", function(data){ buffer += data; buffer = emitLines(buffer, connection); }); connection.on("end", function(){ buffer = emitLines(buffer, connection); if(buffer){ connection.emit("line", buffer); } }); connection.on("error", function(err){ self.emit("error", err); }); }; cmdsrv.prototype.start = function(callback){ var self = this; callback = callback || function(){ console.log("cmdsrv listening on port " + self.port); } this.server.listen(this.port, callback); }; return module.exports = cmdsrv;