YUKI Hiroshi
null+****@clear*****
Mon Jan 28 13:15:10 JST 2013
YUKI Hiroshi 2013-01-28 13:15:10 +0900 (Mon, 28 Jan 2013) New Revision: bc6bfa33747ed6bc434c6bd46c400c42891e8d3f https://github.com/groonga/express-kotoumi/commit/bc6bfa33747ed6bc434c6bd46c400c42891e8d3f Log: Add receiver module to receive packed messages from the backend Added files: lib/backend/receiver.js test/backend-receiver.test.js Added: lib/backend/receiver.js (+44 -0) 100644 =================================================================== --- /dev/null +++ lib/backend/receiver.js 2013-01-28 13:15:10 +0900 (8b9fb85) @@ -0,0 +1,44 @@ +var net = require('net'); +var EventEmitter = require('events').EventEmitter; +var msgpack = require('msgpack'); + +function Receiver(port) { + this.port = port || undefined; + this._init(); +} + +Receiver.prototype = new EventEmitter(); + +Receiver.prototype._init = function() { + this._server = net.createServer(this._onConnect.bind(this)); +}; + +Receiver.prototype._onConnect = function(socket) { + var messageStream = new msgpack.Stream(socket); + messageStream.on('msg', this._onMessageReceive.bind(this)); +}; + +Receiver.prototype._onMessageReceive = function(message) { + this.emit(message.tag, message.data); +}; + +Receiver.prototype.listen = function(callback) { + if (this.port) { + this._server.listen(this.port, callback); + } else { + this._server.listen((function(){ + this.port = this._server.address().port; + callback(); + }).bind(this)); + } +}; + +Receiver.prototype.close = function() { + if (this._server) { + this._server.close(); + this._server = undefined; + } + this.port = undefined; +}; + +module.exports = Receiver; Added: test/backend-receiver.test.js (+72 -0) 100644 =================================================================== --- /dev/null +++ test/backend-receiver.test.js 2013-01-28 13:15:10 +0900 (f32e75a) @@ -0,0 +1,72 @@ +var assert = require('chai').assert; +var nodemock = require('nodemock'); +var net = require('net'); +var msgpack = require('msgpack'); +var Deferred = require('jsdeferred').Deferred; + +var utils = require('./test-utils'); + +var Receiver = require('../lib/backend/receiver').Receiver; + +function connectTo(port) { + var deferred = new Deferred(); + var clientSocket = new net.Socket(); + clientSocket.on('error', function(error){ + clientSocket.destroy(); + deferred.fail(error); + }); + clientSocket.connect(receiver.port, 'localhost', function(){ + deferred.call(clientSocket); + }); + return deferred; +} + +function sendPacketTo(packet, port) { + return connectTo(receiver.port) + .next(function(clientSocket) { + var packedPacket = msgpack.pack(packet); + clientSocket.write(new Buffer(packedPacket)); + return clientSocket; + }) + .next(function(clientSocket) { + clientSocket.close(); + }); +} + +suite('Receiver', function() { + var receiver; + + teardown(function() { + if (receiver) { + receiver.close(); + receiver = undefined; + } + }); + + test('receiving packed message', function(done) { + var mockedReceiver = nodemock.mock('receive') + .takes({ message: true }); + + receiver = new Receiver(); + receiver.on('kotoumi.message', function(data) { + mockedReceiver.receive(data); + }); + + Deferred + .wait(0.01) + .next(function() { + assert.notEqual(receiver.port, undefined); + + var rawPacket = { tag: 'kotoumi.message', data: { message: true } }; + return sendPacketTo(rawPacket, receiver.port); + }) + .next(function() { + mockedReceiver.assertThrows(); + done(); + }) + .error(function(error) { + done(error); + }); + }); +}); + -------------- next part -------------- HTML����������������������������...Download