UNPKG

@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
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 };