YUKI Hiroshi
null+****@clear*****
Wed Feb 6 12:16:31 JST 2013
YUKI Hiroshi 2013-02-06 12:16:31 +0900 (Wed, 06 Feb 2013) New Revision: 9362cd70011ca1c98b5b68138cd465e6c115953a https://github.com/groonga/express-kotoumi/commit/9362cd70011ca1c98b5b68138cd465e6c115953a Log: Introduce plugin system to socket.io adaptor Added files: lib/frontend/default-commands/socket.io.js Modified files: lib/frontend/socket.io-adaptor.js Added: lib/frontend/default-commands/socket.io.js (+10 -0) 100644 =================================================================== --- /dev/null +++ lib/frontend/default-commands/socket.io.js 2013-02-06 12:16:31 +0900 (6e13e95) @@ -0,0 +1,10 @@ +module.exports = { + 'status': {}, + 'search': {}, + 'createtable': {}, + 'removetable': {}, + 'createcolumn': {}, + 'removecolumn': {}, + 'loadrecord': {}, + 'loadrecords': {} +}; Modified: lib/frontend/socket.io-adaptor.js (+55 -29) =================================================================== --- lib/frontend/socket.io-adaptor.js 2013-02-06 11:55:31 +0900 (a571dd5) +++ lib/frontend/socket.io-adaptor.js 2013-02-06 12:16:31 +0900 (6eb7257) @@ -1,16 +1,5 @@ var socketIo = require('socket.io'); - -var commands = [ - 'status', - 'search', - 'createtable', - 'removetable', - 'createcolumn', - 'removecolumn', - 'loadrecord', - 'loadrecords', -]; -exports.commands = commands; +var defaultCommands = require('./default-commands/socket.io'); function deepClone(base) { if (!base || typeof base != 'object') @@ -23,13 +12,13 @@ function deepClone(base) { return cloned; } -function buildResultData(envelope) { +function sanitizeBackendMessage(envelope) { return { statusCode: envelope.statusCode, body: deepClone(envelope.body) }; } -exports.buildResultData = buildResultData; +exports.sanitizeBackendMessage = sanitizeBackendMessage; exports.register = function(application, server, params) { params = params || {}; @@ -37,18 +26,30 @@ exports.register = function(application, server, params) { if (!connection) throw new Error('Connection to the backend is required!'); - function createRequestHandler(command, socket) { + function createRequestHandler(command, socket, requestBuilder) { return (function(data) { + if (requestBuilder) + data = requestBuilder(data); connection.emitMessage(command, data); }); } - function createResultHandler(command, socket) { + function createBackendMessageHandler(socket) { return (function(envelope) { - if (/\.result/.test(envelope.type)) { - var data = buildResultData(envelope); - socket.emit(envelope.type, data); + var data; + + var resultTypeMatch = envelope.type.match(/^(.+)\.test$/); + if (resultTypeMatch && unifiedCommandSet[resultTypeMatch[1]]) { + var responseBuilder = unifiedCommandSet[resultTypeMatch[1]] + .responseBuilder; + if (responseBuilder) + data = responseBuilder(envelope); } + + if (!data) + data = sanitizeBackendMessage(envelope) + + socket.emit(envelope.type, data); }); } @@ -58,28 +59,53 @@ exports.register = function(application, server, params) { }); } + var commandSets = [defaultCommands].concat(params.plugins || []); + var unifiedCommandSet = {}; + commandSets.forEach(function(commandSet) { + if (typeof commandSet == 'string') + commandSet = require(commandSet); + + Object.keys(commandSet).forEach(function(command) { + var definition = commandSet[command]; + if (!definition || definition.method) // ignore REST command + return; + unifiedCommandSet[command] = definition; + }); + }); + + var registeredCommands = []; + Object.keys(unifiedCommandSet).forEach(function(command) { + var definition = unifiedCommandSet[command]; + if (!definition || typeof definition != 'object') // ignore not a command definition + return; + registeredCommands.push({ command: command, + definition: definition }); + }); + var io = socketIo.listen(server); io.sockets.on('connection', function(socket) { application.emit('connection', socket); var messageHandlers = []; - commands.concat(params.extraCommands || []) - .forEach(function(command) { - socket.on(command, createRequestHandler(command, socket)); - var handler = createResultHandler(command, socket); - messageHandlers.push(handler); - connection.on('message', handler); - }); + registeredCommands.forEach(function(command) { + socket.on(command.command, + createRequestHandler(command.command, + socket, + command.definition.requestBuilder)); + }); + + var backendMessageHandler = createBackendMessageHandler(socket); + connection.on('message', backendMessageHandler); var errorHandler = createErrorHandler(socket); connection.on('error', errorHandler); socket.on('disconnect', function() { - messageHandlers.forEach(function(handler) { - connection.removeListener('message', handler); - }); + connection.removeListener('message', backendMessageHandler); connection.removeListener('error', errorHandler); socket.removeAllListeners(); }); }); + + return registeredCommands; } -------------- next part -------------- HTML����������������������������...Download