UNPKG

diffusion

Version:

Diffusion JavaScript client

129 lines (105 loc) 4.42 kB
var Services = require('services/services'); var Emitter = require('events/emitter'); var Result = require('events/result'); var CloseReason = require('client/close-reason'); var ResponseHandlerState = { REGISTERING : 0, ACTIVE : 1, CLOSED : 2 }; function responseHandler(internal, adapter, deregistration) { var state = ResponseHandlerState.REGISTERING; var close; return { onDiscard : function(cid, err) { if (err instanceof CloseReason) { adapter.close(); } else { adapter.close(err); } state = ResponseHandlerState.CLOSED; }, onOpen : function(cid) { close = function close() { var emitter = new Emitter(); var result = new Result(emitter); if (state !== ResponseHandlerState.CLOSED) { deregistration(cid, function(err) { if (err) { internal.getConversationSet().discard(cid, err); emitter.error(err); } else { internal.getConversationSet().respondIfPresent(cid, ResponseHandlerState.CLOSED); emitter.emit('complete'); } }); } else { emitter.error(new Error('Handler already closed')); } return result; }; }, onResponse : function(cid, response) { switch (response) { case ResponseHandlerState.ACTIVE: adapter.active(close, cid); state = response; return false; case ResponseHandlerState.CLOSED: adapter.close(); state = response; return true; default: return adapter.respond(response); } } }; } function registrationCallback(conversationSet, cid, emitter) { return function(err) { if (err) { conversationSet.discard(cid, err); emitter.error(err); } else { conversationSet.respondIfPresent(cid, ResponseHandlerState.ACTIVE); emitter.emit('complete'); } }; } function registerHandler(internal, params, adapter, reg, dereg) { var conversationSet = internal.getConversationSet(); var serviceLocator = internal.getServiceLocator(); var registration = serviceLocator.obtain(reg); var deregistration = serviceLocator.obtain(dereg); var cid = conversationSet.newConversation(responseHandler(internal, adapter, function(cid, callback) { deregistration.send(params, callback); })); var emitter = new Emitter(); var result = new Result(emitter); registration.send({ params : params, cid : cid }, registrationCallback(conversationSet, cid, emitter)); return result; } module.exports.responseHandler = responseHandler; module.exports.registrationCallback = registrationCallback; module.exports.registerHandler = registerHandler; module.exports.registerMessageHandler = function registerMessageHandler(internal, params, adapter) { return registerHandler(internal, params, adapter, Services.MESSAGE_RECEIVER_CONTROL_REGISTRATION, Services.MESSAGE_RECEIVER_CONTROL_DEREGISTRATION); }; module.exports.registerRequestHandler = function registerMessageHandler(internal, params, adapter) { return registerHandler(internal, params, adapter, Services.MESSAGING_RECEIVER_CONTROL_REGISTRATION, Services.MESSAGING_RECEIVER_CONTROL_DEREGISTRATION); }; module.exports.registerServerHandler = function registerServerHandler(internal, params, adapter) { return registerHandler(internal, params, adapter, Services.SERVER_CONTROL_REGISTRATION, Services.SERVER_CONTROL_DEREGISTRATION); }; module.exports.registerTopicHandler = function registerTopicHandler(internal, params, adapter) { return registerHandler(internal, params, adapter, Services.TOPIC_CONTROL_REGISTRATION, Services.TOPIC_CONTROL_DEREGISTRATION); }; module.exports.ResponseHandlerState = ResponseHandlerState;