[Groonga-commit] groonga/express-kotoumi [master] Add receiver module to receive packed messages from the backend

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index