diffusion
Version:
Diffusion JavaScript client
129 lines (105 loc) • 4.42 kB
JavaScript
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;