YUKI Hiroshi
null+****@clear*****
Thu Aug 1 13:46:38 JST 2013
YUKI Hiroshi 2013-08-01 13:46:38 +0900 (Thu, 01 Aug 2013) New Revision: ff5acac453e812a263bc994f838e4482f424d282 https://github.com/groonga/express-droonga/commit/ff5acac453e812a263bc994f838e4482f424d282 Message: Change definition style of API commands around socket.io Modified files: lib/adapter/command.js lib/adapter/socket.io.js Modified: lib/adapter/command.js (+12 -10) =================================================================== --- lib/adapter/command.js 2013-08-01 12:02:14 +0900 (854967b) +++ lib/adapter/command.js 2013-08-01 13:46:38 +0900 (628bbf3) @@ -5,12 +5,6 @@ function Command(options) { this._commandTypes = []; } Command.prototype = { - get requestConverter() { - return this._options.requestConverter; - }, - get responseConverter() { - return this._options.responseConverter; - }, isInstanceOf: function(commandType) { return ( commandType && @@ -32,6 +26,12 @@ function RequestResponse(options) { this._commandTypes.push(RequestResponse); } util.inherits(RequestResponse, Command); +Object.defineProperty(RequestResponse.prototype, 'onRequest', { + get: function() { return this._options.onRequest; } +}); +Object.defineProperty(RequestResponse.prototype, 'onResponse', { + get: function() { return this._options.onResponse; } +}); RequestResponse.isInstance = Command.isInstance; exports.RequestResponse = RequestResponse; @@ -41,6 +41,12 @@ function PublishSubscribe(options) { this._commandTypes.push(PublishSubscribe); } util.inherits(PublishSubscribe, Command); +Object.defineProperty(PublishSubscribe.prototype, 'onSubscribe', { + get: function() { return this._options.onSubscribe; } +}); +Object.defineProperty(PublishSubscribe.prototype, 'onPublish', { + get: function() { return this._options.onPublish; } +}); PublishSubscribe.isInstance = Command.isInstance; exports.PublishSubscribe = PublishSubscribe; @@ -49,10 +55,6 @@ exports.PublishSubscribe = PublishSubscribe; function HTTPCommand(options) { RequestResponse.apply(this, arguments); this._commandTypes.push(HTTPCommand); - // default handler - this._options.requestConverter = this._options.requestConverter || function(event, request) { - return [event, {}]; - }; } util.inherits(HTTPCommand, RequestResponse); HTTPCommand.isInstance = RequestResponse.isInstance; Modified: lib/adapter/socket.io.js (+66 -24) =================================================================== --- lib/adapter/socket.io.js 2013-08-01 12:02:14 +0900 (3b7bb0a) +++ lib/adapter/socket.io.js 2013-08-01 13:46:38 +0900 (d73ff4f) @@ -23,6 +23,39 @@ function sanitizeBackendMessage(envelope) { } exports.sanitizeBackendMessage = sanitizeBackendMessage; + +function DroongaProtocolConnectionWrapper(connection, callback, options) { + this._connection = connection; + this._callback = callback; + this._options = options; +} +DroongaProtocolConnectionWrapper.prototype = { + emit: function(event, data) { + this._conneciton.emitMessage(event, data, this._callback, this._options); + }, + destroy: function() { + delete this._connection; + delete this._callback; + delete this._options; + } +}; +exports.DroongaProtocolConnectionWrapper = DroongaProtocolConnectionWrapper; + + +function SocketIOClientSocketWrapper(socket) { + this._socket = socket; +} +SocketIOClientSocketWrapper.prototype = { + emit: function(event, data) { + this._socket.emit(event, data); + }, + destroy: function() { + delete this._socket; + } +}; +exports.SocketIOClientSocketWrapper = SocketIOClientSocketWrapper; + + exports.register = function(application, server, params) { params = params || {}; var connection = params.connection; @@ -41,16 +74,6 @@ exports.register = function(application, server, params) { clientOptions = clientOptions || {}; var event = commandName; - if (commandDefinition.requestConverter) { - try { - var result = commandDefinition.requestConverter(event, data); - event = result[0]; - data = result[1]; - } catch(error) { - socket.emit('error', error.message || error); - return; - } - } var callback = null; var options = {}; @@ -64,16 +87,20 @@ exports.register = function(application, server, params) { var responseEvent = envelope.type; var responseData = envelope.body; - if (commandDefinition.responseConverter) { - var result = commandDefinition.responseConverter(responseEvent, responseData); - responseEvent = result[0]; - responseData = result[1]; - } - + var wrappedSocket = new SocketIOClientSocketWrapper(socket); if (clientOptions.responseEvent) responseEvent = clientOptions.responseEvent; - socket.emit(responseEvent, responseData); + if (commandDefinition.onResponse) { + try { + commandDefinition.onResponse(responseData, wrappedSocket); + } catch(error) { + wrappedSocket.emit('error', error.message || error); + } + } else { + wrappedSocket.emit(responseEvent, responseData); + wrappedSocket.destroy(); + } }; options.timeout = DEFAULT_TIMEOUT; } else if (command.PublishSubscribe.isInstance(commandDefinition)) { @@ -81,7 +108,18 @@ exports.register = function(application, server, params) { } options.sessionId = socket.id; - connection.emitMessage(event, data, callback, options); + + var wrappedConection = new DroongaProtocolConnectionWrapper(connection, callback, options); + if (commandDefinition.onRequest) { + try { + commandDefinition.onRequest(data, wrappedConection); + } catch(error) { + wrappedConection.destroy(); + socket.emit('error', error.message || error); + } + } else { + wrappedConection.emit(event, data); + } }); } @@ -92,13 +130,17 @@ exports.register = function(application, server, params) { var event = commandName; var data = body; - if (commandDefinition.responseConverter) { - var result = commandDefinition.responseConverter(event, data); - event = result[0]; - data = result[1]; + var wrappedSocket = new SocketIOClientSocketWrapper(socket); + if (commandDefinition.onPublish) { + try { + commandDefinition.onPublish(data, wrappedSocket); + } catch(error) { + wrappedSocket.emit('error', error.message || error); + } + } else { + wrappedSocket.emit(event, data); + wrappedSocket.destroy(); } - - socket.emit(event, data); }); } -------------- next part -------------- HTML����������������������������... ダウンロード