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