UNPKG

diffusion

Version:

Diffusion JavaScript client

71 lines (56 loc) 2.51 kB
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;