[Groonga-commit] droonga/express-droonga at f63cdfc [master] Unsubscribe automatically when the client socket is disconnected

Back to archive index

YUKI Hiroshi null+****@clear*****
Wed Oct 23 19:19:01 JST 2013


YUKI Hiroshi	2013-10-23 19:19:01 +0900 (Wed, 23 Oct 2013)

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

  Message:
    Unsubscribe automatically when the client socket is disconnected

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

  Modified: lib/adapter/socket.io.js (+26 -30)
===================================================================
--- lib/adapter/socket.io.js    2013-10-23 19:00:34 +0900 (49ec678)
+++ lib/adapter/socket.io.js    2013-10-23 19:19:01 +0900 (cba9387)
@@ -74,7 +74,7 @@ exports.register = function(application, server, params) {
         }
 
         if (handlerOptions.onResponse && typeof handlerOptions.onResponse == 'function')
-          handlerOptions.onResponse();
+          handlerOptions.onResponse(data, responseData);
 
         var wrappedSocket = new wrapper.SocketIOClientSocketWrapper(socket, options);
         if (commandDefinition[responseHandler]) {
@@ -109,16 +109,17 @@ exports.register = function(application, server, params) {
     });
   }
 
-  var allSubscriberSockets = {};
+  var allSubscribers = {};
   function createNotificationHandler(notificationEvent, commandDefinition) {
     return (function(envelope) {
       var subscriberIds = envelope.to;
       if (!Array.isArray(subscriberIds))
         subscriberIds = [subscriberIds];
 
-      var subscriberSockets = allSubscriberSockets[notificationEvent] || {};
+      var subscribers = allSubscribers[notificationEvent] || {};
       subscriberIds.forEach(function(subscriberId) {
-        subscriberSocket = subscriberSockets[subscriberId];
+        subscriberSocket = subscribers[subscriberId];
+        subscriberSocket = subscriberSocket && subscriberSocket.socket;
         if (!subscriberSocket)
           return;
         try {
@@ -170,9 +171,6 @@ exports.register = function(application, server, params) {
     var subscriberId = connection.getRouteToSelf({ sessionId: socket.id });
     subscriberId = command.sha1sum(subscriberId);
 
-    var subscribeHandlers = {};
-    var unsubscribeHandlers = {};
-
     registeredCommands.forEach(function(registeredCommand) {
       if (command.PublishSubscribe.isInstance(registeredCommand.definition)) {
         var subscribeEvent = registeredCommand.name + '.subscribe';
@@ -182,38 +180,41 @@ exports.register = function(application, server, params) {
           unifiedCommandSet[unsubscribeEvent] = registeredCommand.definition;
 
         var notificationEvent = registeredCommand.definition.notification;
-        var subscriberSockets = allSubscriberSockets[notificationEvent] || {};
-        allSubscriberSockets[notificationEvent] = subscriberSockets;
+        var subscribers = allSubscribers[notificationEvent] || {};
+        allSubscribers[notificationEvent] = subscribers;
 
         var subscribeHandler = createClientMessageHandler(
             subscribeEvent,
             registeredCommand.definition,
             socket,
             {
-              onResponse: function() {
-                if (!subscriberSockets[subscriberId])
-                  subscriberSockets[subscriberId] = socket;
+              onResponse: function(subscribeMessageBody, responseBody) {
+                if (!subscribers[subscriberId]) {
+                  var subscriber = {
+                    socket:      socket,
+                    unsubscribe: function() {
+                      unsubscribeHandler.emit(unsubscribeEvent, subscribeMessageBody);
+                    }
+                  };
+                  subscribers[subscriberId] = subscriber
+                }
               }
             }
         );
         socket.on(subscribeEvent, subscribeHandler);
-        subscribeHandlers[subscribeEvent] = subscribeHandlers[subscribeEvent] || [];
-        subscribeHandlers[subscribeEvent].push(subscribeHandler);
 
         var unsubscribeHandler = createClientMessageHandler(
             unsubscribeEvent,
             registeredCommand.definition,
             socket,
             {
-              onResponse: function() {
-                if (subscriberSockets[subscriberId])
-                  delete subscriberSockets[subscriberId];
+              onResponse: function(unsubscribeMessageBody, responseBody) {
+                if (subscribers[subscriberId])
+                  delete subscribers[subscriberId];
               }
             }
         );
         socket.on(unsubscribeEvent, unsubscribeHandler);
-        unsubscribeHandlers[unsubscribeEvent] = unsubscribeHandlers[unsubscribeEvent] || [];
-        unsubscribeHandlers[unsubscribeEvent].push(unsubscribeHandler);
       } else {
         socket.on(registeredCommand.name,
                   createClientMessageHandler(registeredCommand.name,
@@ -226,17 +227,12 @@ exports.register = function(application, server, params) {
     connection.on('error', errorHandler);
 
     socket.on('disconnect', function() {
-/*
-      Object.keys(unsubscribeHandlers).forEach(function(event) {
-        unsubscribeHandlers[event].forEach(function(handler) {
-          handler(data);
-        });
-      });
-*/
-      Object.keys(allSubscriberSockets).forEach(function(notificationEvent) {
-        var subscriberSockets = allSubscriberSockets[notificationEvent];
-        if (subscriberSockets)
-          delete subscriberSockets[subscriberId];
+      Object.keys(allSubscribers).forEach(function(notificationEvent) {
+        var subscribers = allSubscribers[notificationEvent];
+        if (subscribers && subscribers[subscriberId]) {
+          subscribers[subscriberId].unsubscribe();
+          delete subscribers[subscriberId];
+        }
       });
       connection.removeListener('error', errorHandler);
       socket.removeAllListeners();
-------------- next part --------------
HTML����������������������������...
Download 



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