YUKI Hiroshi
null+****@clear*****
Thu Feb 7 16:32:25 JST 2013
YUKI Hiroshi 2013-02-07 16:32:25 +0900 (Thu, 07 Feb 2013) New Revision: 1abd0bd3d0bcd81e6fcbd738d59fa83b54ab6f34 https://github.com/groonga/express-kotoumi/commit/1abd0bd3d0bcd81e6fcbd738d59fa83b54ab6f34 Log: Define plugin commands as instance of model classes Added files: lib/model.js Modified files: index.js lib/frontend/default-commands/rest.js lib/frontend/default-commands/socket.io.js lib/frontend/socket.io-adaptor.js Modified: index.js (+2 -0) =================================================================== --- index.js 2013-02-07 11:36:46 +0900 (f915723) +++ index.js 2013-02-07 16:32:25 +0900 (3f1cb3f) @@ -30,3 +30,5 @@ express.application.kotoumi = function(params) { this.connection = connection; this.emitMessage = connection.emitMessage.bind(connection); // shorthand } + +exports.model = require('./lib/model'); Modified: lib/frontend/default-commands/rest.js (+25 -24) =================================================================== --- lib/frontend/default-commands/rest.js 2013-02-07 11:36:46 +0900 (7070c21) +++ lib/frontend/default-commands/rest.js 2013-02-07 16:32:25 +0900 (09ba9ae) @@ -1,42 +1,43 @@ +var model = require('../../model'); var requestBuilders = require('./rest-request-builder'); module.exports = { -// 'status': { +// 'status': new model.REST({ // path: '/status/:target', -// requestBuilder: requestBuilders.status -// }, - 'search': { +// toBackend: requestBuilders.status +// }), + 'search': new model.REST({ path: '/tables/:tableName', - requestBuilder: requestBuilders.search - } //, -// 'createtable': { + toBackend: requestBuilders.search + }) //, +// 'createtable': new model.REST({ // method: 'PUT', // path: '/tables/:tableName', -// requestBuilder: requestBuilders.createTable -// }, -// 'removetable': { +// toBackend: requestBuilders.createTable +// }), +// 'removetable': new model.REST({ // method: 'DELETE', // path: '/tables/:tableName', -// requestBuilder: requestBuilders.removeTable -// }, -// 'createcolumn': { +// toBackend: requestBuilders.removeTable +// }), +// 'createcolumn': new model.REST({ // method: 'PUT', // path: '/tables/:tableName/columns/:columnName', -// requestBuilder: requestBuilders.createColumn -// }, -// 'removecolumn': { +// toBackend: requestBuilders.createColumn +// }), +// 'removecolumn': new model.REST({ // method: 'DELETE', // path: '/tables/:tableName/columns/:columnName', -// requestBuilder: requestBuilders.removeColumn -// }, -// 'loadrecord': { +// toBackend: requestBuilders.removeColumn +// }), +// 'loadrecord': new model.REST({ // method: 'PUT', // path: '/tables/:tableName/records/:key', -// requestBuilder: requestBuilders.loadRecord -// }, -// 'loadrecords': { +// toBackend: requestBuilders.loadRecord +// }), +// 'loadrecords': new model.REST({ // method: 'PUT', // path: '/tables/:tableName/records', -// requestBuilder: requestBuilders.loadRecords -// } +// toBackend: requestBuilders.loadRecords +// }) }; Modified: lib/frontend/default-commands/socket.io.js (+3 -1) =================================================================== --- lib/frontend/default-commands/socket.io.js 2013-02-07 11:36:46 +0900 (cba20fb) +++ lib/frontend/default-commands/socket.io.js 2013-02-07 16:32:25 +0900 (52b5fb4) @@ -1,6 +1,8 @@ +var model = require('../../model'); + module.exports = { // 'status': {}, - 'search': {}//, + 'search': new model.RequestResponse()//, // 'createtable': {}, // 'removetable': {}, // 'createcolumn': {}, Modified: lib/frontend/socket.io-adaptor.js (+11 -9) =================================================================== --- lib/frontend/socket.io-adaptor.js 2013-02-07 11:36:46 +0900 (3568411) +++ lib/frontend/socket.io-adaptor.js 2013-02-07 16:32:25 +0900 (24c563f) @@ -1,4 +1,5 @@ var socketIo = require('socket.io'); +var model = require('../model'); var defaultCommands = require('./default-commands/socket.io'); function deepClone(base) { @@ -29,11 +30,14 @@ exports.register = function(application, server, params) { if (!server) throw new Error('A server instance is required!'); - function createRequestHandler(command, socket, requestBuilder) { + function createRequestHandler(commandName, socket) { return (function(data) { - if (requestBuilder) - data = requestBuilder(data); - connection.emitMessage(command, data); + var commandDefinition = unifiedCommandSet[commandName]; + + if (commandDefinition.requestBuilder) + data = commandDefinition.requestBuilder(data); + + connection.emitMessage(commandName, data, callback, options); }); } @@ -72,7 +76,7 @@ exports.register = function(application, server, params) { Object.keys(commandSet).forEach(function(command) { var definition = commandSet[command]; - if (!definition || definition.method) // ignore REST command + if (!model.isA(definition, model.SocketCommand)) return; unifiedCommandSet[command] = definition; }); @@ -81,7 +85,7 @@ exports.register = function(application, server, params) { var registeredCommands = []; Object.keys(unifiedCommandSet).forEach(function(command) { var definition = unifiedCommandSet[command]; - if (!definition || typeof definition != 'object') // ignore not a command definition + if (!model.isA(definition, model.SocketCommand)) return; registeredCommands.push({ command: command, definition: definition }); @@ -94,9 +98,7 @@ exports.register = function(application, server, params) { var messageHandlers = []; registeredCommands.forEach(function(command) { socket.on(command.command, - createRequestHandler(command.command, - socket, - command.definition.requestBuilder)); + createRequestHandler(command.command, socket)); }); var backendMessageHandler = createBackendMessageHandler(socket); Added: lib/model.js (+75 -0) 100644 =================================================================== --- /dev/null +++ lib/model.js 2013-02-07 16:32:25 +0900 (052309b) @@ -0,0 +1,75 @@ +function CommandModel(options) { + this._options = options || {}; + this._modelTypes = []; +} +CommandModel.prototype = { + get toBackend() { + return this._options.toBackend; + }, + get toClient() { + return this._options.toClient; + } +}; + +function isA(modelInstance, modelType) { + return ( + modelInstance && + modelInstance._modelTypes && + modelInstance._modelTypes.indexOf(modelType) > -1 + ); +} + + +function RequestResponse(options) { + CommandModel.apply(this, arguments); + this._modelTypes.push(RequestResponse); +} +RequestResponse.prototype = new CommandModel(); +expors.RequestResponse = RequestResponse; + + +function PublishSubscribe(options) { + CommandModel.apply(this, arguments); + this._modelTypes.push(PublishSubscribe); +} +PublishSubscribe.prototype = new CommandModel(); +expors.PublishSubscribe = PublishSubscribe; + + + +function REST(options) { + RequestResponse.apply(this, arguments); + this._modelTypes.push(REST); +} +REST.prototype = new RequestResponse(); +Object.defineProperty(REST.prototype, 'path', { + get: function() { return this._options.path; } +}); +Object.defineProperty(REST.prototype, 'method', { + get: function() { return this._options.method || 'GET'; } +}); +expors.REST = REST; + + + +function SocketCommand() { +} +expors.SocketCommand = SocketCommand; + + +function SocketRequestResponse(options) { + RequestResponse.apply(this, arguments); + this._modelTypes.push(SocketCommand); + this._modelTypes.push(SocketRequestResponse); +} +SocketRequestResponse.prototype = new RequestResponse(); +expors.SocketRequestResponse = SocketRequestResponse; + + +function SocketPublishSubscribe(options) { + PublishSubscribe.apply(this, arguments); + this._modelTypes.push(SocketCommand); + this._modelTypes.push(SocketPublishSubscribe); +} +SocketPublishSubscribe.prototype = new PublishSubscribe(); +expors.SocketPublishSubscribe = SocketPublishSubscribe; -------------- next part -------------- HTML����������������������������...Download