YUKI Hiroshi
null+****@clear*****
Thu Feb 7 17:26:53 JST 2013
YUKI Hiroshi 2013-02-07 17:26:53 +0900 (Thu, 07 Feb 2013) New Revision: 83bd23d867d866dfe836dcf551b97ae091b5bc1a https://github.com/groonga/express-kotoumi/commit/83bd23d867d866dfe836dcf551b97ae091b5bc1a Log: Rewrite socket.io adaptor around request-response and publish-subscribe model commands Modified files: lib/frontend/socket.io-adaptor.js Modified: lib/frontend/socket.io-adaptor.js (+31 -14) =================================================================== --- lib/frontend/socket.io-adaptor.js 2013-02-07 17:18:12 +0900 (ab25b8e) +++ lib/frontend/socket.io-adaptor.js 2013-02-07 17:26:53 +0900 (0bfece8) @@ -2,6 +2,8 @@ var socketIo = require('socket.io'); var model = require('../model'); var defaultCommands = require('./default-commands/socket.io'); +var DEFAULT_TIMEOUT = 10 * 1000; + function deepClone(base) { if (!base || typeof base != 'object') return base; @@ -30,28 +32,41 @@ exports.register = function(application, server, params) { if (!server) throw new Error('A server instance is required!'); - function createRequestHandler(commandName, socket) { + function createClientMessageHandler(commandName, socket) { return (function(data) { var commandDefinition = unifiedCommandSet[commandName]; if (commandDefinition.toBackend) commandName, data = commandDefinition.toBackend(commandName, data); + var callback = null; + var options = {}; + if (model.isA(commandDefinition, model.RequestResponse)) { + callback = function(envelope) { + var event = event.type; + var data = envelope.body; + + if (commandDefinition.toClient) + event, data = commandDefinition.toClient(event, data); + + socket.emit(event, data); + }; + options.timeout = DEFAULT_TIMEOUT; + } + connection.emitMessage(commandName, data, callback, options); }); } - function createBackendMessageHandler(socket) { + function createPublishedMessageHandler(commandName, socket) { return (function(envelope) { + var commandDefinition = unifiedCommandSet[commandName]; + var event = envelope.type; + var data = envelope.body; - var data; - var resultTypeMatch = envelope.type.match(/^(.+)\.result$/); - if (resultTypeMatch && unifiedCommandSet[resultTypeMatch[1]]) { - var command = unifiedCommandSet[resultTypeMatch[1]]; - if (command.toClient) - event, data = command.toClient(envelope.type, envelope.body); - } + if (commandDefinition.toClient) + event, data = commandDefinition.toClient(event, body); socket.emit(event, data); }); @@ -90,17 +105,19 @@ exports.register = function(application, server, params) { var messageHandlers = []; registeredCommands.forEach(function(command) { socket.on(command.command, - createRequestHandler(command.command, socket)); - }); + createClientMessageHandler(command.command, socket)); - var backendMessageHandler = createBackendMessageHandler(socket); - connection.on('message', backendMessageHandler); + if (model.isA(command.definition, model.PublishSubscribe)) { + var publishedMessageHandler = createPublishedMessageHandler(socket); + connection.on('publish', publishedMessageHandler); + } + }); var errorHandler = createErrorHandler(socket); connection.on('error', errorHandler); socket.on('disconnect', function() { - connection.removeListener('message', backendMessageHandler); + connection.removeListener('publish', publishedMessageHandler); connection.removeListener('error', errorHandler); socket.removeAllListeners(); }); -------------- next part -------------- HTML����������������������������...Download