[Groonga-commit] groonga/express-kotoumi [master] Introduce plugin system to socket.io adaptor

Back to archive index

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 



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