@glue42/bbg-market-data
Version:
A high-level API that wraps existing Glue42 Bloomberg Bridge Market Data interop methods. The API is based on the jBloomberg open source wrapper.
289 lines (288 loc) • 16.8 kB
JavaScript
import { __assign, __awaiter, __generator } from "tslib";
import CallbackRegistryFactory from "callback-registry";
import { PromiseWrapper } from "../promise-wrapper";
import { extractErrorMessage } from "./../utils";
var ON_EVENT = "bbg-event";
var MdfBridge = (function () {
function MdfBridge(interop, apiId, apiVersion, protocolMethods, logger) {
this.interop = interop;
this.apiId = apiId;
this.apiVersion = apiVersion;
this.protocolMethods = protocolMethods;
this.logger = logger;
this.registry = CallbackRegistryFactory();
this.registerEventsCallbackPW = new PromiseWrapper();
this.eventsCallbackMethodName = "OnBBGRequestData_" + this.apiVersion + "_" + this.apiId;
this.registerEventsCallbackMethod();
}
Object.defineProperty(MdfBridge.prototype, "eventsCallbackMethod", {
get: function () {
return this.eventsCallbackMethodName;
},
enumerable: false,
configurable: true
});
MdfBridge.prototype.ready = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, this.registerEventsCallbackPW.promise];
case 1:
_a.sent();
return [2];
}
});
});
};
MdfBridge.prototype.onEvent = function (requestId, handler) {
if (typeof requestId != "string") {
throw new Error("requestId must be a string.");
}
if (typeof handler != "function") {
throw new Error("handler must be function.");
}
var _handler = function (_a) {
var requestCorrelationId = _a.requestCorrelationId, msg = _a.msg;
if (requestCorrelationId === requestId) {
handler(msg);
}
};
return this.registry.add(ON_EVENT, _handler);
};
MdfBridge.prototype.createRequest = function (args) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, this.invokeCreateRequest(this.protocolMethods.CreateRequest, args, "MDF API failed to create the non-subscription request with id \"" + args.requestCorrelationId + "\".")];
case 1:
_a.sent();
return [2];
}
});
});
};
MdfBridge.prototype.createSubscriptionRequest = function (args) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, this.invokeCreateRequest(this.protocolMethods.CreateSubscriptionRequest, args, "MDF API failed to create the subscription request with id \"" + args.requestCorrelationId + "\".")];
case 1:
_a.sent();
return [2];
}
});
});
};
MdfBridge.prototype.closeRequest = function (requestId, reason) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function () {
var invocationArgs, methodDef, defaultErrorMessage, returned, terminalResults, thisRequestResult, errorMessage, error_1, errorMessage;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
invocationArgs = {
requestCorrelationIds: [requestId],
reason: reason,
};
methodDef = this.protocolMethods.CancelRequests;
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.info("Attempting to invoke interop method \"" + methodDef.name + "\" with args " + JSON.stringify(invocationArgs));
defaultErrorMessage = "MDF API failed to close request with id \"" + requestId + "\".";
_e.label = 1;
case 1:
_e.trys.push([1, 3, , 4]);
return [4, this.interop.invoke(methodDef, invocationArgs)];
case 2:
returned = (_e.sent()).returned;
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.info("Successfully invoked interop method \"" + methodDef.name + "\" - " + JSON.stringify(returned));
terminalResults = (_c = returned.Result) !== null && _c !== void 0 ? _c : returned.result;
thisRequestResult = (Array.isArray(terminalResults) ? terminalResults : []).find(function (_a) {
var correlationId = _a.correlationId;
return correlationId === requestId;
});
if (thisRequestResult == null || thisRequestResult.success !== true) {
errorMessage = typeof (thisRequestResult === null || thisRequestResult === void 0 ? void 0 : thisRequestResult.message) === "string" ? thisRequestResult.message : defaultErrorMessage;
return [2, Promise.reject(new Error(errorMessage))];
}
return [3, 4];
case 3:
error_1 = _e.sent();
errorMessage = extractErrorMessage(error_1, defaultErrorMessage);
(_d = this.logger) === null || _d === void 0 ? void 0 : _d.warn("Failed to invoke interop method \"" + methodDef.name + "\" - " + errorMessage);
return [2, Promise.reject(new Error(errorMessage))];
case 4: return [2];
}
});
});
};
MdfBridge.prototype.closeSession = function (sessionName) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function () {
var invocationArgs, methodDef, returned, terminalResult, errorMessage, error_2, errorMessage;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
invocationArgs = {
sessionName: sessionName,
};
methodDef = this.protocolMethods.CloseSession;
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.info("Attempting to invoke interop method \"" + methodDef.name + "\" with args " + JSON.stringify(invocationArgs));
_e.label = 1;
case 1:
_e.trys.push([1, 3, , 4]);
return [4, this.interop.invoke(methodDef, invocationArgs)];
case 2:
returned = (_e.sent()).returned;
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.info("Successfully invoked interop method " + methodDef.name + " - " + JSON.stringify(returned));
terminalResult = (_c = returned.Result) !== null && _c !== void 0 ? _c : returned.result;
if (terminalResult == null || terminalResult.success === false) {
errorMessage = typeof (terminalResult === null || terminalResult === void 0 ? void 0 : terminalResult.message) === "string"
? terminalResult.message
: "MDF API failed to close session \"" + sessionName + "\".";
return [2, Promise.reject(new Error(errorMessage))];
}
return [3, 4];
case 3:
error_2 = _e.sent();
errorMessage = extractErrorMessage(error_2);
(_d = this.logger) === null || _d === void 0 ? void 0 : _d.warn("Failed to invoke interop method \"" + methodDef.name + "\" - " + errorMessage);
return [2, Promise.reject(new Error(errorMessage))];
case 4: return [2];
}
});
});
};
MdfBridge.prototype.subscribeForConnectionStatus = function (retryPeriodMsecs, subscriber) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var methodDef, subscription, handleData_1, handleError_1, handleClose_1, error_3, errorMsg;
var _this = this;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
methodDef = this.protocolMethods.SubscribeStatus;
_d.label = 1;
case 1:
_d.trys.push([1, 3, , 4]);
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.info("Attempting to subscribe to \"" + methodDef.name + "\".");
return [4, this.interop.subscribe(methodDef, {
arguments: { settings: { retryPeriodMsecs: retryPeriodMsecs } },
})];
case 2:
subscription = _d.sent();
handleData_1 = function (_a) {
var SubscriptionStatus = _a.SubscriptionStatus;
return subscriber.onData(SubscriptionStatus);
};
handleError_1 = function () { return subscriber.onError(); };
handleClose_1 = function () { return subscriber.onClose(); };
subscription.onData(function (_a) {
var _b;
var data = _a.data;
(_b = _this.logger) === null || _b === void 0 ? void 0 : _b.trace("Stream \"" + methodDef.name + "\" subscription data - " + JSON.stringify(data));
handleData_1(data);
});
subscription.onFailed(function (error) {
var _a;
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.warn("Stream \"" + methodDef.name + "\" subscription failed - " + JSON.stringify(error));
handleError_1();
});
subscription.onClosed(function (info) {
var _a;
(_a = _this.logger) === null || _a === void 0 ? void 0 : _a.info("Stream \"" + methodDef.name + "\" subscription closed - " + JSON.stringify(info));
handleClose_1();
});
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.info("Successfully subscribed to \"" + methodDef.name + "\".");
return [3, 4];
case 3:
error_3 = _d.sent();
errorMsg = extractErrorMessage(error_3);
(_c = this.logger) === null || _c === void 0 ? void 0 : _c.error("Failed to subscribe to \"" + methodDef.name + "\" - " + errorMsg);
subscriber.onError();
return [3, 4];
case 4: return [2];
}
});
});
};
MdfBridge.prototype.registerEventsCallbackMethod = function () {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var invocationHandler, error_4, errorMessage, kindMessage;
var _this = this;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
invocationHandler = function (data) {
_this.registry.execute(ON_EVENT, data);
};
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.info("Attempting to register events callback \"" + this.eventsCallbackMethodName + "\".");
_d.label = 1;
case 1:
_d.trys.push([1, 3, , 4]);
return [4, this.interop.register(this.eventsCallbackMethodName, invocationHandler)];
case 2:
_d.sent();
this.registerEventsCallbackPW.resolve();
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.info("Successfully registered events callback \"" + this.eventsCallbackMethodName + "\".");
return [3, 4];
case 3:
error_4 = _d.sent();
errorMessage = extractErrorMessage(error_4);
kindMessage = "Failed to register events callback \"" + this.eventsCallbackMethodName + "\" - " + errorMessage;
(_c = this.logger) === null || _c === void 0 ? void 0 : _c.error(kindMessage);
this.registerEventsCallbackPW.reject(new Error(kindMessage));
return [3, 4];
case 4: return [2];
}
});
});
};
MdfBridge.prototype.invokeCreateRequest = function (methodDef, args, defaultErrorMessage) {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function () {
var invocationArgs, invokeOptions, argsToLog, returned, terminalResult, errorMessage, error_5, errorMessage;
return __generator(this, function (_e) {
switch (_e.label) {
case 0: return [4, this.ready()];
case 1:
_e.sent();
invocationArgs = __assign(__assign({}, args), { callbackMethod: this.eventsCallbackMethodName });
invokeOptions = {
methodResponseTimeoutMs: 180 * 1000,
};
argsToLog = {
settings: args.settings,
requestCorrelationId: args.requestCorrelationId,
operation: args.operation,
operationArgs: args.operationArgs,
subscriptions: args.subscriptions,
};
delete argsToLog.settings.sessionIdentityOptions;
delete argsToLog.settings.sessionOptions;
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.info("Attempting to invoke interop method \"" + methodDef.name + "\" with args " + JSON.stringify(argsToLog));
_e.label = 2;
case 2:
_e.trys.push([2, 4, , 5]);
return [4, this.interop.invoke(methodDef, invocationArgs, "best", invokeOptions)];
case 3:
returned = (_e.sent()).returned;
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.info("Successfully invoked interop method \"" + methodDef.name + "\" - " + JSON.stringify(returned));
terminalResult = (_c = returned.Result) !== null && _c !== void 0 ? _c : returned.result;
if (terminalResult == null || terminalResult.success === false) {
errorMessage = typeof (terminalResult === null || terminalResult === void 0 ? void 0 : terminalResult.message) === "string" ? terminalResult.message : defaultErrorMessage;
return [2, Promise.reject(new Error(errorMessage))];
}
return [3, 5];
case 4:
error_5 = _e.sent();
errorMessage = extractErrorMessage(error_5, defaultErrorMessage);
(_d = this.logger) === null || _d === void 0 ? void 0 : _d.warn("Failed to invoke interop method \"" + methodDef.name + "\" - " + errorMessage);
return [2, Promise.reject(new Error(errorMessage))];
case 5: return [2];
}
});
});
};
return MdfBridge;
}());
export { MdfBridge };