[Groonga-commit] groonga/express-droonga at ff5acac [master] Change definition style of API commands around socket.io

Back to archive index

YUKI Hiroshi null+****@clear*****
Thu Aug 1 13:46:38 JST 2013


YUKI Hiroshi	2013-08-01 13:46:38 +0900 (Thu, 01 Aug 2013)

  New Revision: ff5acac453e812a263bc994f838e4482f424d282
  https://github.com/groonga/express-droonga/commit/ff5acac453e812a263bc994f838e4482f424d282

  Message:
    Change definition style of API commands around socket.io

  Modified files:
    lib/adapter/command.js
    lib/adapter/socket.io.js

  Modified: lib/adapter/command.js (+12 -10)
===================================================================
--- lib/adapter/command.js    2013-08-01 12:02:14 +0900 (854967b)
+++ lib/adapter/command.js    2013-08-01 13:46:38 +0900 (628bbf3)
@@ -5,12 +5,6 @@ function Command(options) {
   this._commandTypes = [];
 }
 Command.prototype = {
-  get requestConverter() {
-    return this._options.requestConverter;
-  },
-  get responseConverter() {
-    return this._options.responseConverter;
-  },
   isInstanceOf: function(commandType) {
     return (
       commandType &&
@@ -32,6 +26,12 @@ function RequestResponse(options) {
   this._commandTypes.push(RequestResponse);
 }
 util.inherits(RequestResponse, Command);
+Object.defineProperty(RequestResponse.prototype, 'onRequest', {
+  get: function() { return this._options.onRequest; }
+});
+Object.defineProperty(RequestResponse.prototype, 'onResponse', {
+  get: function() { return this._options.onResponse; }
+});
 RequestResponse.isInstance = Command.isInstance;
 exports.RequestResponse = RequestResponse;
 
@@ -41,6 +41,12 @@ function PublishSubscribe(options) {
   this._commandTypes.push(PublishSubscribe);
 }
 util.inherits(PublishSubscribe, Command);
+Object.defineProperty(PublishSubscribe.prototype, 'onSubscribe', {
+  get: function() { return this._options.onSubscribe; }
+});
+Object.defineProperty(PublishSubscribe.prototype, 'onPublish', {
+  get: function() { return this._options.onPublish; }
+});
 PublishSubscribe.isInstance = Command.isInstance;
 exports.PublishSubscribe = PublishSubscribe;
 
@@ -49,10 +55,6 @@ exports.PublishSubscribe = PublishSubscribe;
 function HTTPCommand(options) {
   RequestResponse.apply(this, arguments);
   this._commandTypes.push(HTTPCommand);
-  // default handler
-  this._options.requestConverter = this._options.requestConverter || function(event, request) {
-    return [event, {}];
-  };
 }
 util.inherits(HTTPCommand, RequestResponse);
 HTTPCommand.isInstance = RequestResponse.isInstance;

  Modified: lib/adapter/socket.io.js (+66 -24)
===================================================================
--- lib/adapter/socket.io.js    2013-08-01 12:02:14 +0900 (3b7bb0a)
+++ lib/adapter/socket.io.js    2013-08-01 13:46:38 +0900 (d73ff4f)
@@ -23,6 +23,39 @@ function sanitizeBackendMessage(envelope) {
 }
 exports.sanitizeBackendMessage = sanitizeBackendMessage;
 
+
+function DroongaProtocolConnectionWrapper(connection, callback, options) {
+  this._connection = connection;
+  this._callback = callback;
+  this._options = options;
+}
+DroongaProtocolConnectionWrapper.prototype = {
+  emit: function(event, data) {
+    this._conneciton.emitMessage(event, data, this._callback, this._options);
+  },
+  destroy: function() {
+    delete this._connection;
+    delete this._callback;
+    delete this._options;
+  }
+};
+exports.DroongaProtocolConnectionWrapper = DroongaProtocolConnectionWrapper;
+
+
+function SocketIOClientSocketWrapper(socket) {
+  this._socket = socket;
+}
+SocketIOClientSocketWrapper.prototype = {
+  emit: function(event, data) {
+    this._socket.emit(event, data);
+  },
+  destroy: function() {
+    delete this._socket;
+  }
+};
+exports.SocketIOClientSocketWrapper = SocketIOClientSocketWrapper;
+
+
 exports.register = function(application, server, params) {
   params = params || {};
   var connection = params.connection;
@@ -41,16 +74,6 @@ exports.register = function(application, server, params) {
       clientOptions = clientOptions || {};
 
       var event = commandName;
-      if (commandDefinition.requestConverter) {
-        try {
-          var result = commandDefinition.requestConverter(event, data);
-          event = result[0];
-          data = result[1];
-        } catch(error) {
-          socket.emit('error', error.message || error);
-          return;
-        }
-      }
 
       var callback = null;
       var options = {};
@@ -64,16 +87,20 @@ exports.register = function(application, server, params) {
           var responseEvent = envelope.type;
           var responseData = envelope.body;
 
-          if (commandDefinition.responseConverter) {
-            var result = commandDefinition.responseConverter(responseEvent, responseData);
-            responseEvent = result[0];
-            responseData = result[1];
-          }
-
+          var wrappedSocket = new SocketIOClientSocketWrapper(socket);
           if (clientOptions.responseEvent)
             responseEvent = clientOptions.responseEvent;
 
-          socket.emit(responseEvent, responseData);
+          if (commandDefinition.onResponse) {
+            try {
+              commandDefinition.onResponse(responseData, wrappedSocket);
+            } catch(error) {
+              wrappedSocket.emit('error', error.message || error);
+            }
+          } else {
+            wrappedSocket.emit(responseEvent, responseData);
+            wrappedSocket.destroy();
+          }
         };
         options.timeout = DEFAULT_TIMEOUT;
       } else if (command.PublishSubscribe.isInstance(commandDefinition)) {
@@ -81,7 +108,18 @@ exports.register = function(application, server, params) {
       }
 
       options.sessionId = socket.id;
-      connection.emitMessage(event, data, callback, options);
+
+      var wrappedConection = new DroongaProtocolConnectionWrapper(connection, callback, options);
+      if (commandDefinition.onRequest) {
+        try {
+          commandDefinition.onRequest(data, wrappedConection);
+        } catch(error) {
+          wrappedConection.destroy();
+          socket.emit('error', error.message || error);
+        }
+      } else {
+        wrappedConection.emit(event, data);
+      }
     });
   }
 
@@ -92,13 +130,17 @@ exports.register = function(application, server, params) {
       var event = commandName;
       var data = body;
 
-      if (commandDefinition.responseConverter) {
-        var result = commandDefinition.responseConverter(event, data);
-        event = result[0];
-        data = result[1];
+      var wrappedSocket = new SocketIOClientSocketWrapper(socket);
+      if (commandDefinition.onPublish) {
+        try {
+          commandDefinition.onPublish(data, wrappedSocket);
+        } catch(error) {
+          wrappedSocket.emit('error', error.message || error);
+        }
+      } else {
+        wrappedSocket.emit(event, data);
+        wrappedSocket.destroy();
       }
-
-      socket.emit(event, data);
     });
   }
 
-------------- next part --------------
HTML����������������������������...
Download 



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