From 10f8b87ba4d1fef71acab7f3c8df10a0d66a9ed8 Mon Sep 17 00:00:00 2001 From: bmc Date: Tue, 16 Oct 2012 22:34:31 -0500 Subject: [PATCH] move implementation code out of test file --- index.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- test/index.js | 81 +++------------------------------------------------ 3 files changed, 85 insertions(+), 78 deletions(-) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..a5f18d8 --- /dev/null +++ b/index.js @@ -0,0 +1,80 @@ +var Readable = require('readable-stream'); +var EventEmitter = require('events').EventEmitter; +var state = { + init: 0, + waiting: 2 +}; + +var Context = function(stream) { + EventEmitter.call(this); + this.stream = new Readable(); + this.stream.wrap(stream); + this.state = state.init; + this.msg = ""; + var self = this; + this.stream.on('readable', function() { + //always keep the 'leftover' part of the message + self.msg = self.read(); + }); + this.msg = this.read(); + this.variables = {}; +}; + +require('util').inherits(Context, EventEmitter); + +Context.prototype.read = function() { + var buffer = this.stream.read(); + if(!buffer) return this.msg; + this.msg += buffer.toString('utf8'); + if(!~this.msg.indexOf('\n\n')) return this.msg; //we don't have whole message + //TODO if more than one message comes in (unlikely) we need to split + if(this.state === state.init) { + this.readVariables(this.msg); + } else if(this.state === state.waiting) { + this.readResponse(this.msg); + } + return ""; +}; + +Context.prototype.readVariables = function(msg) { + var lines = msg.split('\n'); + for(var i = 0; i < lines.length; i++) { + var line = lines[i]; + var split = line.split(':') + var name = split[0]; + var value = split[1]; + this.variables[name] = (value||'').trim(); + } + this.emit('variables', this.variables); + this.setState(state.waiting); + return ""; +}; + +Context.prototype.readResponse = function(msg) { + var lines = msg.split('\n'); + if(lines.length > 2) { + lines.pop(); //discard last line + } + lines.pop(); //discard blank line + msg = lines.join('\n'); + var parsed = /^(\d{3})(?: result=)(.*)/.exec(msg); + this.emit('response', {code: parsed[1], result: parsed[2]}); +}; + +Context.prototype.setState = function(state) { + this.state = state; +}; + +Context.prototype.send = function(msg) { + this.stream.write(msg); +}; + +Context.prototype.exec = function() { + var args = Array.prototype.slice.call(arguments, 0); + this.send('EXEC ' + args.join(' ') + '\n'); +} + +module.exports = { + Context: Context, + state: state +} diff --git a/package.json b/package.json index 3009837..5f1de78 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "type": "git", "url": "git://github.com/brianc/node-agi.git" }, - "main": "lib/", + "main": "index.js", "scripts": { "test": "mocha -R tap" }, diff --git a/test/index.js b/test/index.js index 2c1b7f7..38adcde 100644 --- a/test/index.js +++ b/test/index.js @@ -1,81 +1,7 @@ -var Readable = require('readable-stream'); -var EventEmitter = require('events').EventEmitter; -var state = { - init: 0, - waiting: 2 -}; - -var Context = function(stream) { - EventEmitter.call(this); - this.stream = new Readable(); - this.stream.wrap(stream); - this.state = state.init; - this.msg = ""; - var self = this; - this.stream.on('readable', function() { - //always keep the 'leftover' part of the message - self.msg = self.read(); - }); - this.msg = this.read(); - this.variables = {}; -}; - -require('util').inherits(Context, EventEmitter); - -Context.prototype.read = function() { - var buffer = this.stream.read(); - if(!buffer) return this.msg; - this.msg += buffer.toString('utf8'); - if(!~this.msg.indexOf('\n\n')) return this.msg; //we don't have whole message - //TODO if more than one message comes in (unlikely) we need to split - if(this.state === state.init) { - this.readVariables(this.msg); - } else if(this.state === state.waiting) { - this.readResponse(this.msg); - } - return ""; -}; - -Context.prototype.readVariables = function(msg) { - var lines = msg.split('\n'); - for(var i = 0; i < lines.length; i++) { - var line = lines[i]; - var split = line.split(':') - var name = split[0]; - var value = split[1]; - this.variables[name] = (value||'').trim(); - } - this.emit('variables', this.variables); - this.setState(state.waiting); - return ""; -}; - -Context.prototype.readResponse = function(msg) { - var lines = msg.split('\n'); - if(lines.length > 2) { - lines.pop(); //discard last line - } - lines.pop(); //discard blank line - msg = lines.join('\n'); - var parsed = /^(\d{3})(?: result=)(.*)/.exec(msg); - this.emit('response', {code: parsed[1], result: parsed[2]}); -}; - -Context.prototype.setState = function(state) { - this.state = state; -}; - -Context.prototype.send = function(msg) { - this.stream.write(msg); -}; - -Context.prototype.exec = function() { - var args = Array.prototype.slice.call(arguments, 0); - this.send('EXEC ' + args.join(' ') + '\n'); -} - var MemoryStream = require('memstream').MemoryStream; var expect = require('expect.js'); +var Context = require('./../').Context; +var state = require('./../').state; //helpers var writeVars = function(stream) { @@ -83,7 +9,8 @@ var writeVars = function(stream) { stream.write('agi_uniqueid: 13507138.14\n'); stream.write('agi_arg_1: test\n'); stream.write('\n\n'); -} +}; + var context = function(cb) { var stream = new MemoryStream(); var ctx = new Context(stream);