@factset/frontgate-js-sdk 7.1.4 → 7.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -24
- package/dist/lib/esnext/common/errors.js +4 -5
- package/dist/lib/esnext/index.js +1 -0
- package/dist/lib/esnext/message/interfaces/PtlMessage.js +4 -0
- package/dist/lib/esnext/message/interfaces/index.js +1 -0
- package/dist/lib/esnext/message/request/AuthenticationByTokenRequest.js +2 -2
- package/dist/lib/esnext/message/request/AuthenticationRequest.js +2 -0
- package/dist/lib/esnext/message/request/ConfigurationRequest.js +3 -3
- package/dist/lib/esnext/message/response/AuthenticationTokenResponse.js +3 -11
- package/dist/lib/esnext/message/response/HTTPProxyResponse.js +3 -0
- package/dist/lib/esnext/message/response/Mdg2Response.js +4 -1
- package/dist/lib/esnext/message/response/PingResponse.js +0 -6
- package/dist/lib/esnext/message/response/index.js +0 -3
- package/dist/lib/esnext/mixins/AuthTokenRequestMixin.js +1 -1
- package/dist/lib/esnext/mixins/EndpointRequestMixin.js +7 -7
- package/dist/lib/esnext/mixins/HTTPProxyRequestMixin.js +1 -1
- package/dist/lib/esnext/mixins/OpenTelemetryMixin.js +2 -1
- package/dist/lib/esnext/mixins/PingMixin.js +5 -1
- package/dist/lib/esnext/mixins/RequestMixin.js +6 -1
- package/dist/lib/esnext/mixins/auth/AppAuthMixin.js +3 -3
- package/dist/lib/esnext/mixins/auth/SessionAuthMixin.js +4 -4
- package/dist/lib/esnext/mixins/auth/UserCredentialAuthMixin.js +3 -3
- package/dist/lib/esnext/mixins/auth/UserPasswordAuthMixin.js +3 -3
- package/dist/lib/esnext/mixins/connection/FrontgateWSMixin.js +11 -9
- package/dist/lib/esnext/mixins/subscription/DataObserver.js +1 -2
- package/dist/lib/esnext/mixins/subscription/EndpointSubscriptionMixin.js +13 -12
- package/dist/lib/esnext/mixins/subscription/RawSubscriptionMixin.js +28 -15
- package/dist/lib/esnext/version.js +1 -1
- package/dist/lib/node/common/errors.js +6 -7
- package/dist/lib/node/index.js +1 -0
- package/dist/lib/node/message/interfaces/PtlMessage.js +11 -0
- package/dist/lib/node/message/interfaces/index.js +1 -0
- package/dist/lib/node/message/request/AuthenticationByTokenRequest.js +2 -2
- package/dist/lib/node/message/request/AuthenticationRequest.js +2 -0
- package/dist/lib/node/message/request/ConfigurationRequest.js +3 -3
- package/dist/lib/node/message/response/AuthenticationTokenResponse.js +3 -11
- package/dist/lib/node/message/response/HTTPProxyResponse.js +3 -0
- package/dist/lib/node/message/response/Mdg2Response.js +4 -1
- package/dist/lib/node/message/response/PingResponse.js +0 -6
- package/dist/lib/node/message/response/index.js +0 -3
- package/dist/lib/node/mixins/AuthTokenRequestMixin.js +1 -1
- package/dist/lib/node/mixins/EndpointRequestMixin.js +7 -7
- package/dist/lib/node/mixins/HTTPProxyRequestMixin.js +1 -1
- package/dist/lib/node/mixins/OpenTelemetryMixin.js +2 -1
- package/dist/lib/node/mixins/PingMixin.js +5 -1
- package/dist/lib/node/mixins/RequestMixin.js +6 -1
- package/dist/lib/node/mixins/auth/AppAuthMixin.js +3 -3
- package/dist/lib/node/mixins/auth/SessionAuthMixin.js +4 -4
- package/dist/lib/node/mixins/auth/UserCredentialAuthMixin.js +3 -3
- package/dist/lib/node/mixins/auth/UserPasswordAuthMixin.js +3 -3
- package/dist/lib/node/mixins/connection/FrontgateWSMixin.js +11 -9
- package/dist/lib/node/mixins/subscription/DataObserver.js +1 -2
- package/dist/lib/node/mixins/subscription/EndpointSubscriptionMixin.js +12 -11
- package/dist/lib/node/mixins/subscription/RawSubscriptionMixin.js +27 -14
- package/dist/lib/node/version.js +1 -1
- package/dist/lib/types/common/errors.d.ts +4 -8
- package/dist/lib/types/common/interfaces/index.d.ts +0 -1
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/lib/types/message/interfaces/PtlMessage.d.ts +486 -0
- package/dist/lib/types/message/interfaces/index.d.ts +1 -0
- package/dist/lib/types/message/request/AbstractMdg2Request.d.ts +3 -3
- package/dist/lib/types/message/request/AuthenticationByTokenRequest.d.ts +5 -2
- package/dist/lib/types/message/request/AuthenticationRequest.d.ts +10 -9
- package/dist/lib/types/message/request/AuthenticationTokenRequest.d.ts +2 -1
- package/dist/lib/types/message/request/CancelSubscriptionRequest.d.ts +2 -1
- package/dist/lib/types/message/request/ConfigurationRequest.d.ts +7 -2
- package/dist/lib/types/message/request/HTTPProxyRequest.d.ts +2 -2
- package/dist/lib/types/message/request/HighLevelRequest.d.ts +2 -2
- package/dist/lib/types/message/request/PingRequest.d.ts +2 -8
- package/dist/lib/types/message/request/TransportLayerClientRequestHeader.d.ts +3 -26
- package/dist/lib/types/message/response/AuthenticationTokenResponse.d.ts +3 -3
- package/dist/lib/types/message/response/HTTPProxyResponse.d.ts +6 -3
- package/dist/lib/types/message/response/HighLevelResponse.d.ts +3 -1
- package/dist/lib/types/message/response/Mdg2Response.d.ts +6 -4
- package/dist/lib/types/message/response/PingResponse.d.ts +2 -1
- package/dist/lib/types/message/response/index.d.ts +0 -3
- package/dist/lib/types/message/update/HighLevelUpdate.d.ts +3 -1
- package/dist/lib/types/mixins/connection/index.d.ts +9 -3
- package/dist/lib/types/mixins/subscription/DataObserver.d.ts +2 -3
- package/dist/lib/umd/mdg2.client.min.umd.js +1 -1
- package/dist/lib/umd/mdg2.client.umd.js +172 -150
- package/package.json +2 -2
- package/dist/lib/esnext/common/interfaces/PtlMessage.js +0 -1
- package/dist/lib/esnext/message/response/AuthenticationResponse.js +0 -1
- package/dist/lib/esnext/message/response/ConfigurationResponse.js +0 -1
- package/dist/lib/esnext/message/response/DisconnectionMessage.js +0 -1
- package/dist/lib/esnext/message/response/ErrorResponse.js +0 -9
- package/dist/lib/node/common/interfaces/PtlMessage.js +0 -2
- package/dist/lib/node/message/response/AuthenticationResponse.js +0 -2
- package/dist/lib/node/message/response/ConfigurationResponse.js +0 -2
- package/dist/lib/node/message/response/DisconnectionMessage.js +0 -2
- package/dist/lib/node/message/response/ErrorResponse.js +0 -13
- package/dist/lib/types/common/interfaces/PtlMessage.d.ts +0 -5
- package/dist/lib/types/message/response/AuthenticationResponse.d.ts +0 -37
- package/dist/lib/types/message/response/ConfigurationResponse.d.ts +0 -44
- package/dist/lib/types/message/response/DisconnectionMessage.d.ts +0 -7
- package/dist/lib/types/message/response/ErrorResponse.d.ts +0 -5
|
@@ -202,9 +202,15 @@
|
|
|
202
202
|
return time.toString().slice(0, -3);
|
|
203
203
|
}
|
|
204
204
|
//#endregion
|
|
205
|
+
//#region src/message/interfaces/PtlMessage.ts
|
|
206
|
+
var hasJobIdInRoot = (msg) => typeof msg.id_job !== "undefined";
|
|
207
|
+
var hasJobIdInHeader = (msg) => typeof msg.header?.id_job !== "undefined";
|
|
208
|
+
var isServiceAndNotationBased = (msg) => typeof msg.header?.id_service !== "undefined" && typeof msg.id_notation !== "undefined";
|
|
209
|
+
var isPtlMessageWithHeader = (msg) => msg.header !== void 0;
|
|
210
|
+
//#endregion
|
|
205
211
|
//#region src/version.ts
|
|
206
212
|
var PACKAGE_JSON = {
|
|
207
|
-
version: "7.1.
|
|
213
|
+
version: "7.1.6",
|
|
208
214
|
package: "@factset/frontgate-js-sdk"
|
|
209
215
|
};
|
|
210
216
|
//#endregion
|
|
@@ -411,8 +417,8 @@
|
|
|
411
417
|
maximum_idle_interval: this.maximumIdleInterval,
|
|
412
418
|
maximum_receivable_message_size: 1048576,
|
|
413
419
|
flags: 0,
|
|
414
|
-
cache_authentication_salt: { value:
|
|
415
|
-
cache_authentication_encrypted_secret: { encrypted_secret:
|
|
420
|
+
cache_authentication_salt: { value: { b64: "" } },
|
|
421
|
+
cache_authentication_encrypted_secret: { encrypted_secret: { b64: "" } }
|
|
416
422
|
};
|
|
417
423
|
}
|
|
418
424
|
};
|
|
@@ -662,6 +668,26 @@
|
|
|
662
668
|
}
|
|
663
669
|
};
|
|
664
670
|
//#endregion
|
|
671
|
+
//#region src/message/response/AuthenticationTokenResponse.ts
|
|
672
|
+
var AuthenticationTokenResponse = class {
|
|
673
|
+
constructor(raw) {
|
|
674
|
+
this.token = raw.token.value.b64;
|
|
675
|
+
this.expiry = parseInt(timeToMilliseconds(raw.expiry.microseconds), 10);
|
|
676
|
+
}
|
|
677
|
+
/**
|
|
678
|
+
* Base64 Encoded Authentication Token
|
|
679
|
+
*/
|
|
680
|
+
getToken() {
|
|
681
|
+
return this.token;
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Authentication Token Expiry Time (Unix Timestamp in Milliseconds)
|
|
685
|
+
*/
|
|
686
|
+
getExpiry() {
|
|
687
|
+
return this.expiry;
|
|
688
|
+
}
|
|
689
|
+
};
|
|
690
|
+
//#endregion
|
|
665
691
|
//#region src/message/response/Mdg2Response.ts
|
|
666
692
|
var Mdg2Response = class {
|
|
667
693
|
constructor(msg) {
|
|
@@ -677,7 +703,8 @@
|
|
|
677
703
|
return this.raw.header.id_job;
|
|
678
704
|
}
|
|
679
705
|
get serviceId() {
|
|
680
|
-
return this.raw.header.id_service;
|
|
706
|
+
if (this.raw.Message === "Foundation::HTTPProxyResponse" || this.raw.Message === "Foundation::HighLevelResponse") return this.raw.header.id_service;
|
|
707
|
+
throw new Error("Invalid message type");
|
|
681
708
|
}
|
|
682
709
|
isUpdateMessage() {
|
|
683
710
|
if (!Object.hasOwnProperty.call(this.raw, "header")) return false;
|
|
@@ -689,39 +716,6 @@
|
|
|
689
716
|
}
|
|
690
717
|
};
|
|
691
718
|
//#endregion
|
|
692
|
-
//#region src/message/response/AuthenticationTokenResponse.ts
|
|
693
|
-
var AuthenticationTokenResponse = class extends Mdg2Response {
|
|
694
|
-
constructor(raw) {
|
|
695
|
-
super(raw);
|
|
696
|
-
if (!this.raw.token.value.b64) throw new Error("Token not set in AuthenticationTokenResponse");
|
|
697
|
-
if (!this.raw.expiry.microseconds) throw new Error("Expiry not set in AuthenticationTokenResponse");
|
|
698
|
-
this.token = this.raw.token.value.b64;
|
|
699
|
-
this.expiry = parseInt(timeToMilliseconds(this.raw.expiry.microseconds), 10);
|
|
700
|
-
}
|
|
701
|
-
/**
|
|
702
|
-
* Base64 Encoded Authentication Token
|
|
703
|
-
*/
|
|
704
|
-
getToken() {
|
|
705
|
-
return this.token;
|
|
706
|
-
}
|
|
707
|
-
/**
|
|
708
|
-
* Authentication Token Expiry Time (Unix Timestamp in Milliseconds)
|
|
709
|
-
*/
|
|
710
|
-
getExpiry() {
|
|
711
|
-
return this.expiry;
|
|
712
|
-
}
|
|
713
|
-
};
|
|
714
|
-
//#endregion
|
|
715
|
-
//#region src/message/response/ErrorResponse.ts
|
|
716
|
-
var ErrorResponse = class extends Mdg2Response {
|
|
717
|
-
get reason() {
|
|
718
|
-
return this.raw.details;
|
|
719
|
-
}
|
|
720
|
-
get jobId() {
|
|
721
|
-
return this.raw.id_job;
|
|
722
|
-
}
|
|
723
|
-
};
|
|
724
|
-
//#endregion
|
|
725
719
|
//#region src/message/response/HighLevelResponse.ts
|
|
726
720
|
var HighLevelResponse = class extends Mdg2Response {
|
|
727
721
|
constructor(raw) {
|
|
@@ -767,6 +761,9 @@
|
|
|
767
761
|
get meta() {
|
|
768
762
|
return this.responseData.meta;
|
|
769
763
|
}
|
|
764
|
+
get info() {
|
|
765
|
+
return this.responseInfo;
|
|
766
|
+
}
|
|
770
767
|
get status() {
|
|
771
768
|
return {
|
|
772
769
|
code: this.statusCode,
|
|
@@ -782,7 +779,7 @@
|
|
|
782
779
|
*
|
|
783
780
|
* This is a special response without header and job id.
|
|
784
781
|
*/
|
|
785
|
-
var PingResponse = class
|
|
782
|
+
var PingResponse = class {
|
|
786
783
|
static {
|
|
787
784
|
this.NAME = "Foundation::PingResponse";
|
|
788
785
|
}
|
|
@@ -790,8 +787,6 @@
|
|
|
790
787
|
this.VERSION = 2;
|
|
791
788
|
}
|
|
792
789
|
constructor(raw) {
|
|
793
|
-
if (raw.Message !== PingResponse.NAME) throw new Error(`Unsupported message=${raw.Message}`);
|
|
794
|
-
if (raw.Version !== PingResponse.VERSION) throw new Error(`Unsupported version=${raw.Version} for message=${raw.Message}`);
|
|
795
790
|
this._timeReceivedResponse = Date.now();
|
|
796
791
|
this._timeAtSender = Number(timeToMilliseconds(raw.time_at_sender.microseconds));
|
|
797
792
|
this._timeFromRequest = Number(timeToMilliseconds(raw.time_from_request.microseconds));
|
|
@@ -1043,7 +1038,7 @@
|
|
|
1043
1038
|
await this.hooks.callHook("frontgateConnection:sendMessage", msg);
|
|
1044
1039
|
const promise = new Promise((resolve, reject) => {
|
|
1045
1040
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
1046
|
-
if (
|
|
1041
|
+
if (response.Message !== "Foundation::AuthenticationTokenResponse") {
|
|
1047
1042
|
reject(JSON.stringify(response));
|
|
1048
1043
|
return;
|
|
1049
1044
|
}
|
|
@@ -1089,21 +1084,21 @@
|
|
|
1089
1084
|
const hookResponse = () => {
|
|
1090
1085
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
1091
1086
|
try {
|
|
1092
|
-
if (
|
|
1087
|
+
if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
|
|
1093
1088
|
reject(JSON.stringify(response));
|
|
1094
1089
|
return;
|
|
1095
1090
|
}
|
|
1096
1091
|
if (!this.#hasNextChunk(response)) {
|
|
1097
1092
|
chunkedData.push({
|
|
1098
|
-
body: response.body
|
|
1099
|
-
processingTime: response.header
|
|
1093
|
+
body: response.body.value,
|
|
1094
|
+
processingTime: response.header.processing_time
|
|
1100
1095
|
});
|
|
1101
1096
|
const hlResponse = new HighLevelResponse({
|
|
1102
1097
|
...response,
|
|
1103
1098
|
body: { value: chunkedData.map((chunk) => chunk.body).join("") },
|
|
1104
1099
|
header: {
|
|
1105
1100
|
...response.header,
|
|
1106
|
-
|
|
1101
|
+
processing_time: chunkedData.reduce((acc, chunk) => acc + chunk.processingTime, 0)
|
|
1107
1102
|
}
|
|
1108
1103
|
});
|
|
1109
1104
|
resolve({
|
|
@@ -1112,8 +1107,8 @@
|
|
|
1112
1107
|
});
|
|
1113
1108
|
} else {
|
|
1114
1109
|
chunkedData.push({
|
|
1115
|
-
body: response.body
|
|
1116
|
-
processingTime: response.header
|
|
1110
|
+
body: response.body.value,
|
|
1111
|
+
processingTime: response.header.processing_time
|
|
1117
1112
|
});
|
|
1118
1113
|
hookResponse();
|
|
1119
1114
|
}
|
|
@@ -1127,7 +1122,7 @@
|
|
|
1127
1122
|
return useTimeout(timeOutInMs, `Request timeout reached (${timeOutInMs} ms) for ${msg.message.Message}`, promise);
|
|
1128
1123
|
}
|
|
1129
1124
|
#hasNextChunk(msg) {
|
|
1130
|
-
return (
|
|
1125
|
+
return (msg.header.flags & 8) === 8;
|
|
1131
1126
|
}
|
|
1132
1127
|
};
|
|
1133
1128
|
};
|
|
@@ -1332,19 +1327,19 @@
|
|
|
1332
1327
|
this.#ws?.send(data.msg);
|
|
1333
1328
|
} catch (e) {
|
|
1334
1329
|
const errorResponse = this.#createErrorMessage(e, msg);
|
|
1335
|
-
this.#respondToMessage(errorResponse
|
|
1330
|
+
this.#respondToMessage(errorResponse);
|
|
1336
1331
|
}
|
|
1337
1332
|
}
|
|
1338
1333
|
#respondToMessage(msgObj) {
|
|
1339
|
-
if (
|
|
1334
|
+
if (hasJobIdInHeader(msgObj)) {
|
|
1340
1335
|
this.hooks.callHook(`frontgateConnection:response:${msgObj.header.id_job}`, msgObj);
|
|
1341
1336
|
return;
|
|
1342
1337
|
}
|
|
1343
|
-
if (
|
|
1338
|
+
if (isServiceAndNotationBased(msgObj)) {
|
|
1344
1339
|
this.hooks.callHook(`frontgateConnection:response:${msgObj.header.id_service}-${msgObj.id_notation}`, msgObj);
|
|
1345
1340
|
return;
|
|
1346
1341
|
}
|
|
1347
|
-
if (
|
|
1342
|
+
if (hasJobIdInRoot(msgObj)) {
|
|
1348
1343
|
this.hooks.callHook(`frontgateConnection:response:${msgObj.id_job}`, msgObj);
|
|
1349
1344
|
return;
|
|
1350
1345
|
}
|
|
@@ -1375,13 +1370,15 @@
|
|
|
1375
1370
|
msg.header.authentication_identifiers.id_user ||= this.#idUser;
|
|
1376
1371
|
}
|
|
1377
1372
|
#createErrorMessage(error, msg) {
|
|
1378
|
-
return
|
|
1373
|
+
return {
|
|
1379
1374
|
Message: "Foundation::ErrorResponse",
|
|
1380
1375
|
Version: 1,
|
|
1381
|
-
|
|
1382
|
-
|
|
1376
|
+
header: {},
|
|
1377
|
+
id_job: msg.header?.id_job ?? -1,
|
|
1378
|
+
processing_time: 0,
|
|
1379
|
+
reason: { value: 8 },
|
|
1383
1380
|
details: error
|
|
1384
|
-
}
|
|
1381
|
+
};
|
|
1385
1382
|
}
|
|
1386
1383
|
#applyDefaultsToConfig(oldConf) {
|
|
1387
1384
|
const maxIdleIntervalInS = oldConf.maximumIdleIntervalInS ?? 60;
|
|
@@ -2421,6 +2418,14 @@
|
|
|
2421
2418
|
});
|
|
2422
2419
|
};
|
|
2423
2420
|
//#endregion
|
|
2421
|
+
//#region src/common/errors.ts
|
|
2422
|
+
var UnexpectedResponseError = class extends Error {
|
|
2423
|
+
constructor(response) {
|
|
2424
|
+
super(`Unexpected response: ${response.Message}`);
|
|
2425
|
+
this.response = response;
|
|
2426
|
+
}
|
|
2427
|
+
};
|
|
2428
|
+
//#endregion
|
|
2424
2429
|
//#region src/mixins/RequestMixin.ts
|
|
2425
2430
|
var requests = () => {
|
|
2426
2431
|
const mixinRequestable = (Base) => {
|
|
@@ -2433,8 +2438,12 @@
|
|
|
2433
2438
|
callbackId: ""
|
|
2434
2439
|
};
|
|
2435
2440
|
await this.hooks.callHook("frontgateConnection:sendMessage", msg);
|
|
2436
|
-
const promise = new Promise((resolve) => {
|
|
2441
|
+
const promise = new Promise((resolve, reject) => {
|
|
2437
2442
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
2443
|
+
if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
|
|
2444
|
+
reject(new UnexpectedResponseError(response));
|
|
2445
|
+
return;
|
|
2446
|
+
}
|
|
2438
2447
|
resolve(new Mdg2Response(response));
|
|
2439
2448
|
});
|
|
2440
2449
|
});
|
|
@@ -2491,9 +2500,9 @@
|
|
|
2491
2500
|
const promise = new Promise((resolve, reject) => {
|
|
2492
2501
|
this.hooks.callHook("frontgateConnection:sendMessage", subscriptionMsg).then(() => {
|
|
2493
2502
|
this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (response) => {
|
|
2494
|
-
if (
|
|
2503
|
+
if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
|
|
2495
2504
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2496
|
-
reject(new
|
|
2505
|
+
reject(new UnexpectedResponseError(response));
|
|
2497
2506
|
return;
|
|
2498
2507
|
}
|
|
2499
2508
|
let hlResponseData;
|
|
@@ -2517,7 +2526,7 @@
|
|
|
2517
2526
|
return;
|
|
2518
2527
|
}
|
|
2519
2528
|
let removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (update) => {
|
|
2520
|
-
if (
|
|
2529
|
+
if (update.Message !== "Foundation::HighLevelUpdate" && update.Message !== "HighLevelUpdate") {
|
|
2521
2530
|
if (update.Message.includes("SubscriptionLoss")) {
|
|
2522
2531
|
this.log(LogLevel.DEBUG, `Received: ${update.Message}`);
|
|
2523
2532
|
setTimeout(() => {
|
|
@@ -2527,7 +2536,7 @@
|
|
|
2527
2536
|
return;
|
|
2528
2537
|
}
|
|
2529
2538
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2530
|
-
observer.pushError(new
|
|
2539
|
+
observer.pushError(new UnexpectedResponseError(update));
|
|
2531
2540
|
removeMessageUpdateHook();
|
|
2532
2541
|
return;
|
|
2533
2542
|
}
|
|
@@ -2536,7 +2545,7 @@
|
|
|
2536
2545
|
hlUpdate = new HighLevelUpdate(update);
|
|
2537
2546
|
} catch (e) {
|
|
2538
2547
|
this.log(LogLevel.ERROR, `Failed to parse response: ${update.body.value}`);
|
|
2539
|
-
observer.pushError(e);
|
|
2548
|
+
observer.pushError(new Error("Failed to parse response", { cause: e }));
|
|
2540
2549
|
return;
|
|
2541
2550
|
}
|
|
2542
2551
|
observer.pushPatchData(hlUpdate.data);
|
|
@@ -2548,8 +2557,8 @@
|
|
|
2548
2557
|
let removeResubscribeHookOnce;
|
|
2549
2558
|
const resubscribePromise = new Promise((res, rej) => {
|
|
2550
2559
|
removeResubscribeHookOnce = this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (resp) => {
|
|
2551
|
-
if (
|
|
2552
|
-
const err = new
|
|
2560
|
+
if (resp.Message !== "Foundation::HighLevelResponse" && resp.Message !== "HighLevelResponse") {
|
|
2561
|
+
const err = new UnexpectedResponseError(resp);
|
|
2553
2562
|
this.log(LogLevel.ERROR, `Unexpected response: ${resp.Message}`);
|
|
2554
2563
|
removeMessageUpdateHook();
|
|
2555
2564
|
rej(err);
|
|
@@ -2572,7 +2581,7 @@
|
|
|
2572
2581
|
return;
|
|
2573
2582
|
}
|
|
2574
2583
|
removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${resp.header.id_job}`, (update) => {
|
|
2575
|
-
if (
|
|
2584
|
+
if (update.Message !== "Foundation::HighLevelUpdate" && update.Message !== "HighLevelUpdate") {
|
|
2576
2585
|
if (update.Message.includes("SubscriptionLoss")) {
|
|
2577
2586
|
this.log(LogLevel.DEBUG, `Received: ${update.Message}`);
|
|
2578
2587
|
setTimeout(() => {
|
|
@@ -2581,7 +2590,7 @@
|
|
|
2581
2590
|
return;
|
|
2582
2591
|
}
|
|
2583
2592
|
this.log(LogLevel.ERROR, `Unexpected response: ${update.Message}`);
|
|
2584
|
-
const err = new
|
|
2593
|
+
const err = new UnexpectedResponseError(update);
|
|
2585
2594
|
observer.pushError(err);
|
|
2586
2595
|
return;
|
|
2587
2596
|
}
|
|
@@ -2590,7 +2599,7 @@
|
|
|
2590
2599
|
hlUpdate = new HighLevelUpdate(update);
|
|
2591
2600
|
} catch (e) {
|
|
2592
2601
|
this.log(LogLevel.ERROR, `Failed to parse response: ${update.body.value}`);
|
|
2593
|
-
observer.pushError(e);
|
|
2602
|
+
observer.pushError(new Error("Failed to parse response", { cause: e }));
|
|
2594
2603
|
return;
|
|
2595
2604
|
}
|
|
2596
2605
|
observer.pushPatchData(hlUpdate.data);
|
|
@@ -2603,10 +2612,7 @@
|
|
|
2603
2612
|
} catch (e) {
|
|
2604
2613
|
removeResubscribeHookOnce?.();
|
|
2605
2614
|
subscriptionZombie = true;
|
|
2606
|
-
observer.pushError(new
|
|
2607
|
-
Message: "Resubscribe failed",
|
|
2608
|
-
Error: e
|
|
2609
|
-
}));
|
|
2615
|
+
observer.pushError(new Error("Resubscribe failed", { cause: e }));
|
|
2610
2616
|
}
|
|
2611
2617
|
};
|
|
2612
2618
|
const removeReconnectHook = this.hooks.hook("reconnect:success", resubscribe);
|
|
@@ -2690,18 +2696,25 @@
|
|
|
2690
2696
|
await this.hooks.callHook("frontgateConnection:sendMessage", subscriptionMsg);
|
|
2691
2697
|
const promise = new Promise((resolve, reject) => {
|
|
2692
2698
|
this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (response) => {
|
|
2693
|
-
if (response.Message.includes("Error") || response.Message.includes("PermissionDenied")) {
|
|
2699
|
+
if (response.Message.includes("Error") || response.Message.includes("PermissionDenied") || !hasJobIdInHeader(response)) {
|
|
2694
2700
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2695
|
-
reject(
|
|
2701
|
+
reject(new UnexpectedResponseError(response));
|
|
2696
2702
|
return;
|
|
2697
2703
|
}
|
|
2698
|
-
|
|
2699
|
-
|
|
2704
|
+
let subscriptionKey = response.header.id_job.toString();
|
|
2705
|
+
let idService = -1;
|
|
2706
|
+
let idNotation = -1;
|
|
2707
|
+
if (subscriptionType === "connection" && isServiceAndNotationBased(response)) {
|
|
2708
|
+
idService = response.header.id_service;
|
|
2709
|
+
idNotation = response.id_notation;
|
|
2710
|
+
subscriptionKey = `${idService}-${idNotation}`;
|
|
2711
|
+
}
|
|
2712
|
+
const cancelationRequest = typeof CancelationRequestConstructor === "undefined" ? new CancelSubscriptionRequest(response.header.id_job) : new CancelationRequestConstructor(idService, idNotation);
|
|
2700
2713
|
const observer = new FrontgateClientDataObserver(response.header.id_job, response);
|
|
2701
2714
|
let removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${subscriptionKey}`, (update) => {
|
|
2702
|
-
if (update.Message
|
|
2715
|
+
if (update.Message === "Foundation::ErrorResponse") {
|
|
2703
2716
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2704
|
-
observer.pushError(new
|
|
2717
|
+
observer.pushError(new UnexpectedResponseError(update));
|
|
2705
2718
|
return;
|
|
2706
2719
|
}
|
|
2707
2720
|
observer.pushData(update);
|
|
@@ -2712,20 +2725,24 @@
|
|
|
2712
2725
|
await this.hooks.callHook("frontgateConnection:sendMessage", subscriptionMsg);
|
|
2713
2726
|
const resubscribePromise = new Promise((res, rej) => {
|
|
2714
2727
|
this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (resubscribeResponse) => {
|
|
2715
|
-
if (resubscribeResponse.Message
|
|
2716
|
-
const err = new
|
|
2728
|
+
if (resubscribeResponse.Message === "Foundation::ErrorResponse" || !hasJobIdInHeader(resubscribeResponse)) {
|
|
2729
|
+
const err = new UnexpectedResponseError(resubscribeResponse);
|
|
2717
2730
|
this.log(LogLevel.ERROR, `Unexpected resp: ${resubscribeResponse.Message}`);
|
|
2718
2731
|
rej(err);
|
|
2719
2732
|
return;
|
|
2720
2733
|
}
|
|
2721
|
-
|
|
2722
|
-
|
|
2734
|
+
let resubscriptionKey = response.header.id_job.toString();
|
|
2735
|
+
if (subscriptionType === "connection" && isServiceAndNotationBased(resubscribeResponse)) {
|
|
2736
|
+
idService = resubscribeResponse.header.id_service;
|
|
2737
|
+
idNotation = resubscribeResponse.id_notation;
|
|
2738
|
+
resubscriptionKey = `${idService}-${idNotation}`;
|
|
2739
|
+
}
|
|
2740
|
+
const resubscriptionCancelationRequest = typeof CancelationRequestConstructor === "undefined" ? new CancelSubscriptionRequest(resubscribeResponse.header.id_job) : new CancelationRequestConstructor(idService, idNotation);
|
|
2723
2741
|
observer.idJob = resubscribeResponse.header.id_job;
|
|
2724
2742
|
removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${resubscriptionKey}`, (update) => {
|
|
2725
|
-
if (update.Message
|
|
2743
|
+
if (update.Message === "Foundation::ErrorResponse") {
|
|
2726
2744
|
this.log(LogLevel.ERROR, `Unexpected response: ${update.Message}`);
|
|
2727
|
-
|
|
2728
|
-
observer.pushError(err);
|
|
2745
|
+
observer.pushError(new UnexpectedResponseError(update));
|
|
2729
2746
|
return;
|
|
2730
2747
|
}
|
|
2731
2748
|
observer.unsubscribe = () => {
|
|
@@ -2756,10 +2773,7 @@
|
|
|
2756
2773
|
try {
|
|
2757
2774
|
await useTimeout(timeOutInMs, "Request timeout reached", resubscribePromise);
|
|
2758
2775
|
} catch (e) {
|
|
2759
|
-
observer.pushError(new
|
|
2760
|
-
Message: "Reconnect failed",
|
|
2761
|
-
Error: e
|
|
2762
|
-
}));
|
|
2776
|
+
observer.pushError(new Error("Reconnect Failed", { cause: e }));
|
|
2763
2777
|
}
|
|
2764
2778
|
});
|
|
2765
2779
|
observer.unsubscribe = () => {
|
|
@@ -2883,7 +2897,7 @@
|
|
|
2883
2897
|
const data = applyJsonPatch(this.data, update);
|
|
2884
2898
|
super.pushData(data);
|
|
2885
2899
|
} catch (e) {
|
|
2886
|
-
super.pushError(new
|
|
2900
|
+
super.pushError(new Error("Failed to apply patch", { cause: e }));
|
|
2887
2901
|
}
|
|
2888
2902
|
}
|
|
2889
2903
|
};
|
|
@@ -3313,62 +3327,6 @@
|
|
|
3313
3327
|
if (api) delete api[type];
|
|
3314
3328
|
}
|
|
3315
3329
|
//#endregion
|
|
3316
|
-
//#region node_modules/@opentelemetry/api/build/esm/context/context.js
|
|
3317
|
-
/**
|
|
3318
|
-
* Get a key to uniquely identify a context value
|
|
3319
|
-
*
|
|
3320
|
-
* @since 1.0.0
|
|
3321
|
-
*/
|
|
3322
|
-
function createContextKey(description) {
|
|
3323
|
-
return Symbol.for(description);
|
|
3324
|
-
}
|
|
3325
|
-
/**
|
|
3326
|
-
* The root context is used as the default parent context when there is no active context
|
|
3327
|
-
*
|
|
3328
|
-
* @since 1.0.0
|
|
3329
|
-
*/
|
|
3330
|
-
var ROOT_CONTEXT = new class BaseContext {
|
|
3331
|
-
/**
|
|
3332
|
-
* Construct a new context which inherits values from an optional parent context.
|
|
3333
|
-
*
|
|
3334
|
-
* @param parentContext a context from which to inherit values
|
|
3335
|
-
*/
|
|
3336
|
-
constructor(parentContext) {
|
|
3337
|
-
const self = this;
|
|
3338
|
-
self._currentContext = parentContext ? new Map(parentContext) : /* @__PURE__ */ new Map();
|
|
3339
|
-
self.getValue = (key) => self._currentContext.get(key);
|
|
3340
|
-
self.setValue = (key, value) => {
|
|
3341
|
-
const context = new BaseContext(self._currentContext);
|
|
3342
|
-
context._currentContext.set(key, value);
|
|
3343
|
-
return context;
|
|
3344
|
-
};
|
|
3345
|
-
self.deleteValue = (key) => {
|
|
3346
|
-
const context = new BaseContext(self._currentContext);
|
|
3347
|
-
context._currentContext.delete(key);
|
|
3348
|
-
return context;
|
|
3349
|
-
};
|
|
3350
|
-
}
|
|
3351
|
-
}();
|
|
3352
|
-
//#endregion
|
|
3353
|
-
//#region node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js
|
|
3354
|
-
var NoopContextManager = class {
|
|
3355
|
-
active() {
|
|
3356
|
-
return ROOT_CONTEXT;
|
|
3357
|
-
}
|
|
3358
|
-
with(_context, fn, thisArg, ...args) {
|
|
3359
|
-
return fn.call(thisArg, ...args);
|
|
3360
|
-
}
|
|
3361
|
-
bind(_context, target) {
|
|
3362
|
-
return target;
|
|
3363
|
-
}
|
|
3364
|
-
enable() {
|
|
3365
|
-
return this;
|
|
3366
|
-
}
|
|
3367
|
-
disable() {
|
|
3368
|
-
return this;
|
|
3369
|
-
}
|
|
3370
|
-
};
|
|
3371
|
-
//#endregion
|
|
3372
3330
|
//#region node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js
|
|
3373
3331
|
/**
|
|
3374
3332
|
* Component Logger which is meant to be used as part of any component which
|
|
@@ -3510,6 +3468,62 @@
|
|
|
3510
3468
|
}
|
|
3511
3469
|
};
|
|
3512
3470
|
//#endregion
|
|
3471
|
+
//#region node_modules/@opentelemetry/api/build/esm/context/context.js
|
|
3472
|
+
/**
|
|
3473
|
+
* Get a key to uniquely identify a context value
|
|
3474
|
+
*
|
|
3475
|
+
* @since 1.0.0
|
|
3476
|
+
*/
|
|
3477
|
+
function createContextKey(description) {
|
|
3478
|
+
return Symbol.for(description);
|
|
3479
|
+
}
|
|
3480
|
+
/**
|
|
3481
|
+
* The root context is used as the default parent context when there is no active context
|
|
3482
|
+
*
|
|
3483
|
+
* @since 1.0.0
|
|
3484
|
+
*/
|
|
3485
|
+
var ROOT_CONTEXT = new class BaseContext {
|
|
3486
|
+
/**
|
|
3487
|
+
* Construct a new context which inherits values from an optional parent context.
|
|
3488
|
+
*
|
|
3489
|
+
* @param parentContext a context from which to inherit values
|
|
3490
|
+
*/
|
|
3491
|
+
constructor(parentContext) {
|
|
3492
|
+
const self = this;
|
|
3493
|
+
self._currentContext = parentContext ? new Map(parentContext) : /* @__PURE__ */ new Map();
|
|
3494
|
+
self.getValue = (key) => self._currentContext.get(key);
|
|
3495
|
+
self.setValue = (key, value) => {
|
|
3496
|
+
const context = new BaseContext(self._currentContext);
|
|
3497
|
+
context._currentContext.set(key, value);
|
|
3498
|
+
return context;
|
|
3499
|
+
};
|
|
3500
|
+
self.deleteValue = (key) => {
|
|
3501
|
+
const context = new BaseContext(self._currentContext);
|
|
3502
|
+
context._currentContext.delete(key);
|
|
3503
|
+
return context;
|
|
3504
|
+
};
|
|
3505
|
+
}
|
|
3506
|
+
}();
|
|
3507
|
+
//#endregion
|
|
3508
|
+
//#region node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js
|
|
3509
|
+
var NoopContextManager = class {
|
|
3510
|
+
active() {
|
|
3511
|
+
return ROOT_CONTEXT;
|
|
3512
|
+
}
|
|
3513
|
+
with(_context, fn, thisArg, ...args) {
|
|
3514
|
+
return fn.call(thisArg, ...args);
|
|
3515
|
+
}
|
|
3516
|
+
bind(_context, target) {
|
|
3517
|
+
return target;
|
|
3518
|
+
}
|
|
3519
|
+
enable() {
|
|
3520
|
+
return this;
|
|
3521
|
+
}
|
|
3522
|
+
disable() {
|
|
3523
|
+
return this;
|
|
3524
|
+
}
|
|
3525
|
+
};
|
|
3526
|
+
//#endregion
|
|
3513
3527
|
//#region node_modules/@opentelemetry/api/build/esm/api/context.js
|
|
3514
3528
|
var API_NAME$1 = "context";
|
|
3515
3529
|
var NOOP_CONTEXT_MANAGER = new NoopContextManager();
|
|
@@ -4013,7 +4027,7 @@
|
|
|
4013
4027
|
constructor(...args) {
|
|
4014
4028
|
super(...args);
|
|
4015
4029
|
this.hooks.hook("frontgateConnection:beforeSerializeMessage", (msg) => {
|
|
4016
|
-
if (msg
|
|
4030
|
+
if (isPtlMessageWithHeader(msg)) trace.getTracer("frontgate-js-sdk").startActiveSpan("frontgateConnection:sendMessage", (span) => {
|
|
4017
4031
|
const spanHeader = this.#createSpanHeader(span.spanContext());
|
|
4018
4032
|
if (spanHeader) msg.header = {
|
|
4019
4033
|
...msg.header,
|
|
@@ -4083,7 +4097,7 @@
|
|
|
4083
4097
|
const promise = new Promise((resolve, reject) => {
|
|
4084
4098
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
4085
4099
|
try {
|
|
4086
|
-
if (
|
|
4100
|
+
if (response.Message !== "Foundation::HTTPProxyResponse") {
|
|
4087
4101
|
reject(JSON.stringify(response));
|
|
4088
4102
|
return;
|
|
4089
4103
|
}
|
|
@@ -4118,8 +4132,12 @@
|
|
|
4118
4132
|
callbackId: "PingResponse"
|
|
4119
4133
|
};
|
|
4120
4134
|
await this.hooks.callHook("frontgateConnection:sendMessage", msg);
|
|
4121
|
-
const promise = new Promise((resolve) => {
|
|
4135
|
+
const promise = new Promise((resolve, reject) => {
|
|
4122
4136
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
4137
|
+
if (response.Message !== "Foundation::PingResponse") {
|
|
4138
|
+
reject(JSON.stringify(response));
|
|
4139
|
+
return;
|
|
4140
|
+
}
|
|
4123
4141
|
resolve(new PingResponse(response));
|
|
4124
4142
|
});
|
|
4125
4143
|
});
|
|
@@ -4455,7 +4473,8 @@ close: () => {
|
|
|
4455
4473
|
if (disabledFeatures && disabledFeatures.length > 0) for (const disabledFeature of disabledFeatures) this.#addDisabledFeature(featureName, disabledFeature);
|
|
4456
4474
|
if (disabledFeatureGroups && disabledFeatureGroups.length > 0) for (const disabledFeatureGroup of disabledFeatureGroups) this.#addDisabledGroup(featureName, disabledFeatureGroup);
|
|
4457
4475
|
}
|
|
4458
|
-
|
|
4476
|
+
const MixedConstructor = mixinFactory(this.#clientConstructor);
|
|
4477
|
+
return new FrontgateClientBuilder(MixedConstructor, this.#alreadyUsedMethods, this.#disabledFeatures, this.#disabledGroups);
|
|
4459
4478
|
}
|
|
4460
4479
|
build(conf) {
|
|
4461
4480
|
return new this.#clientConstructor(conf);
|
|
@@ -4477,7 +4496,6 @@ close: () => {
|
|
|
4477
4496
|
exports.DEFAULT_TIMEOUT_IN_MS = DEFAULT_TIMEOUT_IN_MS;
|
|
4478
4497
|
exports.DefaultHosts = DefaultHosts;
|
|
4479
4498
|
exports.DeploymentStage = DeploymentStage;
|
|
4480
|
-
exports.ErrorResponse = ErrorResponse;
|
|
4481
4499
|
exports.FLAG_HAS_NEXT_CHUNK = FLAG_HAS_NEXT_CHUNK;
|
|
4482
4500
|
exports.FrontgateClient = FrontgateClient;
|
|
4483
4501
|
exports.FrontgateClientBuilder = FrontgateClientBuilder;
|
|
@@ -4510,7 +4528,11 @@ close: () => {
|
|
|
4510
4528
|
exports.fetchAuth = fetchAuth;
|
|
4511
4529
|
exports.fetchAuthWithOptionalCompressor = fetchAuthWithOptionalCompressor;
|
|
4512
4530
|
exports.getBytesFromBuffer = getBytesFromBuffer;
|
|
4531
|
+
exports.hasJobIdInHeader = hasJobIdInHeader;
|
|
4532
|
+
exports.hasJobIdInRoot = hasJobIdInRoot;
|
|
4513
4533
|
exports.httpProxyRequest = httpProxyRequest;
|
|
4534
|
+
exports.isPtlMessageWithHeader = isPtlMessageWithHeader;
|
|
4535
|
+
exports.isServiceAndNotationBased = isServiceAndNotationBased;
|
|
4514
4536
|
exports.levels = levels;
|
|
4515
4537
|
exports.logger = logger;
|
|
4516
4538
|
exports.messageCompressor = messageCompressor;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@factset/frontgate-js-sdk",
|
|
3
3
|
"author": "Factset GmbH",
|
|
4
|
-
"version": "7.1.
|
|
4
|
+
"version": "7.1.6",
|
|
5
5
|
"description": "Typescript based client to request and subscribe values from mdg2 (frontgate)",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"main": "./dist/lib/node/index.js",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@typescript-eslint/eslint-plugin": "^8.38.0",
|
|
72
72
|
"@vitest/coverage-v8": "^4.0.0",
|
|
73
73
|
"concurrently": "^10.0.0",
|
|
74
|
-
"conventional-changelog": "^
|
|
74
|
+
"conventional-changelog": "^8.0.0",
|
|
75
75
|
"cross-env": "^10.0.0",
|
|
76
76
|
"eslint": "^9.31.0",
|
|
77
77
|
"eslint-config-prettier": "^10.1.8",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|