@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.
71 lines (70 loc) • 3.18 kB
JavaScript
import { __awaiter, __rest } from "tslib";
import { BaseRequest } from "../../core/base-request";
import { isEventOfType } from "../../core/helpers";
import { EventTypes } from "../../core/event-types";
import { requestFailureHandler, serviceOpenedFailureHandler, sessionTerminatedHandler, sessionStartUpFailureHandler } from "../../core/message-handlers";
export class GenericRequestImpl extends BaseRequest {
constructor(sessionManager, config, operationArgs) {
super(sessionManager, config, operationArgs);
this.sessionManager = sessionManager;
this.config = config;
this.operationArgs = operationArgs;
}
get api() {
const that = this;
return {
get id() {
return that.requestId;
},
get settings() {
return {
operation: that.config.operation,
service: that.config.service,
operationArgs: that.operationArgs,
};
},
get status() {
return that._status;
},
open: that.open.bind(that),
close: that.closeRequest.bind(that),
onRequestStatusChanged: that.onRequestStatusChanged.bind(that),
};
}
open(options) {
const _super = Object.create(null, {
openRequest: { get: () => super.openRequest }
});
return __awaiter(this, void 0, void 0, function* () {
const _a = options !== null && options !== void 0 ? options : {}, { messageProcessor } = _a, otherOptions = __rest(_a, ["messageProcessor"]);
if (typeof messageProcessor !== "function") {
throw new Error("messageProcessor must be a function");
}
this.userMessageProcessor = messageProcessor;
yield _super.openRequest.call(this, Object.assign(Object.assign({}, otherOptions), { messageProcessor: this.messageProcessor.bind(this) }));
});
}
messageProcessor(eventMessage) {
return __awaiter(this, void 0, void 0, function* () {
try {
const error = [
sessionStartUpFailureHandler(eventMessage),
sessionTerminatedHandler(eventMessage),
serviceOpenedFailureHandler(eventMessage),
requestFailureHandler(eventMessage),
].find(({ match }) => match);
const processorResult = yield this.userMessageProcessor(eventMessage.eventType, eventMessage.message);
if (error) {
return { action: "fail", error: error.data };
}
if (isEventOfType(eventMessage, EventTypes.Response)) {
return { action: 'complete' };
}
return processorResult.continue ? { action: 'continue' } : { action: 'close' };
}
catch (error) {
return { action: 'fail', error: error instanceof Error ? error : new Error(String(error)) };
}
});
}
}