diffusion
Version:
Diffusion JavaScript client
71 lines (56 loc) • 2.51 kB
JavaScript
var CommandHeader = require('services/command-header');
var logger = require('util/logger');
var log = logger.create("ServiceLocator");
function ServiceLocator(internalSession, serialisers, serviceAdapter) {
this.obtain = function(service) {
var requestSerialiser = serialisers.get(service.request);
var responseSerialiser = serialisers.get(service.response);
var reference = {
send : function(req, callback) {
callback = callback || function() {};
var handler = {
onOpen : function(cid) {
var header = new CommandHeader(service.id, cid);
try {
serviceAdapter.sendRequest(header, req, requestSerialiser);
} catch (e) {
callback(e);
throw e;
}
},
onResponse : function(cid, input) {
var response;
try {
response = responseSerialiser.read(input);
} catch (e) {
log.debug("Failed to deserialise response from " + service.name, e.stack);
callback(e);
return true;
}
try {
callback(null, response);
} catch (e) {
log.debug("Request callback for service '" + service.name + "' threw an error", e.stack);
try {
callback(e);
} catch (e) {
log.debug("Failed to notify callback error for service '" + service.name + "'", e);
}
}
return true;
},
onDiscard : function(cid, err) {
callback(err);
}
};
var conversations = internalSession.getConversationSet();
var cid = conversations.newConversation(handler, callback);
return function() {
conversations.discard(cid, new Error("Cancelled"));
};
}
};
return reference;
};
}
module.exports = ServiceLocator;