@factset/frontgate-js-sdk 7.1.3 → 7.1.5
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 +56 -26
- 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 +0 -4
- 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 +0 -4
- 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 +8 -24
- 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/auth/FetchAuthenticationMixin.d.ts +2 -2
- package/dist/lib/types/mixins/auth/FetchAuthenticationWithOptionalCompressionMixin.d.ts +2 -2
- 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 +114 -99
- 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.5",
|
|
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) {
|
|
@@ -757,16 +751,12 @@
|
|
|
757
751
|
} catch (error) {
|
|
758
752
|
throw new Error(`Could not parse HTTPProxyResponse: ${error}`);
|
|
759
753
|
}
|
|
760
|
-
this.responseInfo = this.raw.info;
|
|
761
754
|
this.statusReason = this.raw.response.status_reason;
|
|
762
755
|
this.statusCode = this.raw.response.status_code.value;
|
|
763
756
|
}
|
|
764
757
|
get data() {
|
|
765
758
|
return this.responseData;
|
|
766
759
|
}
|
|
767
|
-
get meta() {
|
|
768
|
-
return this.responseData.meta;
|
|
769
|
-
}
|
|
770
760
|
get status() {
|
|
771
761
|
return {
|
|
772
762
|
code: this.statusCode,
|
|
@@ -782,7 +772,7 @@
|
|
|
782
772
|
*
|
|
783
773
|
* This is a special response without header and job id.
|
|
784
774
|
*/
|
|
785
|
-
var PingResponse = class
|
|
775
|
+
var PingResponse = class {
|
|
786
776
|
static {
|
|
787
777
|
this.NAME = "Foundation::PingResponse";
|
|
788
778
|
}
|
|
@@ -790,8 +780,6 @@
|
|
|
790
780
|
this.VERSION = 2;
|
|
791
781
|
}
|
|
792
782
|
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
783
|
this._timeReceivedResponse = Date.now();
|
|
796
784
|
this._timeAtSender = Number(timeToMilliseconds(raw.time_at_sender.microseconds));
|
|
797
785
|
this._timeFromRequest = Number(timeToMilliseconds(raw.time_from_request.microseconds));
|
|
@@ -1043,7 +1031,7 @@
|
|
|
1043
1031
|
await this.hooks.callHook("frontgateConnection:sendMessage", msg);
|
|
1044
1032
|
const promise = new Promise((resolve, reject) => {
|
|
1045
1033
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
1046
|
-
if (
|
|
1034
|
+
if (response.Message !== "Foundation::AuthenticationTokenResponse") {
|
|
1047
1035
|
reject(JSON.stringify(response));
|
|
1048
1036
|
return;
|
|
1049
1037
|
}
|
|
@@ -1089,21 +1077,21 @@
|
|
|
1089
1077
|
const hookResponse = () => {
|
|
1090
1078
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
1091
1079
|
try {
|
|
1092
|
-
if (
|
|
1080
|
+
if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
|
|
1093
1081
|
reject(JSON.stringify(response));
|
|
1094
1082
|
return;
|
|
1095
1083
|
}
|
|
1096
1084
|
if (!this.#hasNextChunk(response)) {
|
|
1097
1085
|
chunkedData.push({
|
|
1098
|
-
body: response.body
|
|
1099
|
-
processingTime: response.header
|
|
1086
|
+
body: response.body.value,
|
|
1087
|
+
processingTime: response.header.processing_time
|
|
1100
1088
|
});
|
|
1101
1089
|
const hlResponse = new HighLevelResponse({
|
|
1102
1090
|
...response,
|
|
1103
1091
|
body: { value: chunkedData.map((chunk) => chunk.body).join("") },
|
|
1104
1092
|
header: {
|
|
1105
1093
|
...response.header,
|
|
1106
|
-
|
|
1094
|
+
processing_time: chunkedData.reduce((acc, chunk) => acc + chunk.processingTime, 0)
|
|
1107
1095
|
}
|
|
1108
1096
|
});
|
|
1109
1097
|
resolve({
|
|
@@ -1112,8 +1100,8 @@
|
|
|
1112
1100
|
});
|
|
1113
1101
|
} else {
|
|
1114
1102
|
chunkedData.push({
|
|
1115
|
-
body: response.body
|
|
1116
|
-
processingTime: response.header
|
|
1103
|
+
body: response.body.value,
|
|
1104
|
+
processingTime: response.header.processing_time
|
|
1117
1105
|
});
|
|
1118
1106
|
hookResponse();
|
|
1119
1107
|
}
|
|
@@ -1127,7 +1115,7 @@
|
|
|
1127
1115
|
return useTimeout(timeOutInMs, `Request timeout reached (${timeOutInMs} ms) for ${msg.message.Message}`, promise);
|
|
1128
1116
|
}
|
|
1129
1117
|
#hasNextChunk(msg) {
|
|
1130
|
-
return (
|
|
1118
|
+
return (msg.header.flags & 8) === 8;
|
|
1131
1119
|
}
|
|
1132
1120
|
};
|
|
1133
1121
|
};
|
|
@@ -1332,19 +1320,19 @@
|
|
|
1332
1320
|
this.#ws?.send(data.msg);
|
|
1333
1321
|
} catch (e) {
|
|
1334
1322
|
const errorResponse = this.#createErrorMessage(e, msg);
|
|
1335
|
-
this.#respondToMessage(errorResponse
|
|
1323
|
+
this.#respondToMessage(errorResponse);
|
|
1336
1324
|
}
|
|
1337
1325
|
}
|
|
1338
1326
|
#respondToMessage(msgObj) {
|
|
1339
|
-
if (
|
|
1327
|
+
if (hasJobIdInHeader(msgObj)) {
|
|
1340
1328
|
this.hooks.callHook(`frontgateConnection:response:${msgObj.header.id_job}`, msgObj);
|
|
1341
1329
|
return;
|
|
1342
1330
|
}
|
|
1343
|
-
if (
|
|
1331
|
+
if (isServiceAndNotationBased(msgObj)) {
|
|
1344
1332
|
this.hooks.callHook(`frontgateConnection:response:${msgObj.header.id_service}-${msgObj.id_notation}`, msgObj);
|
|
1345
1333
|
return;
|
|
1346
1334
|
}
|
|
1347
|
-
if (
|
|
1335
|
+
if (hasJobIdInRoot(msgObj)) {
|
|
1348
1336
|
this.hooks.callHook(`frontgateConnection:response:${msgObj.id_job}`, msgObj);
|
|
1349
1337
|
return;
|
|
1350
1338
|
}
|
|
@@ -1375,13 +1363,15 @@
|
|
|
1375
1363
|
msg.header.authentication_identifiers.id_user ||= this.#idUser;
|
|
1376
1364
|
}
|
|
1377
1365
|
#createErrorMessage(error, msg) {
|
|
1378
|
-
return
|
|
1366
|
+
return {
|
|
1379
1367
|
Message: "Foundation::ErrorResponse",
|
|
1380
1368
|
Version: 1,
|
|
1381
|
-
|
|
1382
|
-
|
|
1369
|
+
header: {},
|
|
1370
|
+
id_job: msg.header?.id_job ?? -1,
|
|
1371
|
+
processing_time: 0,
|
|
1372
|
+
reason: { value: 8 },
|
|
1383
1373
|
details: error
|
|
1384
|
-
}
|
|
1374
|
+
};
|
|
1385
1375
|
}
|
|
1386
1376
|
#applyDefaultsToConfig(oldConf) {
|
|
1387
1377
|
const maxIdleIntervalInS = oldConf.maximumIdleIntervalInS ?? 60;
|
|
@@ -2421,6 +2411,14 @@
|
|
|
2421
2411
|
});
|
|
2422
2412
|
};
|
|
2423
2413
|
//#endregion
|
|
2414
|
+
//#region src/common/errors.ts
|
|
2415
|
+
var UnexpectedResponseError = class extends Error {
|
|
2416
|
+
constructor(response) {
|
|
2417
|
+
super(`Unexpected response: ${response.Message}`);
|
|
2418
|
+
this.response = response;
|
|
2419
|
+
}
|
|
2420
|
+
};
|
|
2421
|
+
//#endregion
|
|
2424
2422
|
//#region src/mixins/RequestMixin.ts
|
|
2425
2423
|
var requests = () => {
|
|
2426
2424
|
const mixinRequestable = (Base) => {
|
|
@@ -2433,8 +2431,12 @@
|
|
|
2433
2431
|
callbackId: ""
|
|
2434
2432
|
};
|
|
2435
2433
|
await this.hooks.callHook("frontgateConnection:sendMessage", msg);
|
|
2436
|
-
const promise = new Promise((resolve) => {
|
|
2434
|
+
const promise = new Promise((resolve, reject) => {
|
|
2437
2435
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
2436
|
+
if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
|
|
2437
|
+
reject(new UnexpectedResponseError(response));
|
|
2438
|
+
return;
|
|
2439
|
+
}
|
|
2438
2440
|
resolve(new Mdg2Response(response));
|
|
2439
2441
|
});
|
|
2440
2442
|
});
|
|
@@ -2491,9 +2493,9 @@
|
|
|
2491
2493
|
const promise = new Promise((resolve, reject) => {
|
|
2492
2494
|
this.hooks.callHook("frontgateConnection:sendMessage", subscriptionMsg).then(() => {
|
|
2493
2495
|
this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (response) => {
|
|
2494
|
-
if (
|
|
2496
|
+
if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
|
|
2495
2497
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2496
|
-
reject(new
|
|
2498
|
+
reject(new UnexpectedResponseError(response));
|
|
2497
2499
|
return;
|
|
2498
2500
|
}
|
|
2499
2501
|
let hlResponseData;
|
|
@@ -2517,7 +2519,7 @@
|
|
|
2517
2519
|
return;
|
|
2518
2520
|
}
|
|
2519
2521
|
let removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (update) => {
|
|
2520
|
-
if (
|
|
2522
|
+
if (update.Message !== "Foundation::HighLevelUpdate" && update.Message !== "HighLevelUpdate") {
|
|
2521
2523
|
if (update.Message.includes("SubscriptionLoss")) {
|
|
2522
2524
|
this.log(LogLevel.DEBUG, `Received: ${update.Message}`);
|
|
2523
2525
|
setTimeout(() => {
|
|
@@ -2527,7 +2529,7 @@
|
|
|
2527
2529
|
return;
|
|
2528
2530
|
}
|
|
2529
2531
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2530
|
-
observer.pushError(new
|
|
2532
|
+
observer.pushError(new UnexpectedResponseError(update));
|
|
2531
2533
|
removeMessageUpdateHook();
|
|
2532
2534
|
return;
|
|
2533
2535
|
}
|
|
@@ -2536,7 +2538,7 @@
|
|
|
2536
2538
|
hlUpdate = new HighLevelUpdate(update);
|
|
2537
2539
|
} catch (e) {
|
|
2538
2540
|
this.log(LogLevel.ERROR, `Failed to parse response: ${update.body.value}`);
|
|
2539
|
-
observer.pushError(e);
|
|
2541
|
+
observer.pushError(new Error("Failed to parse response", { cause: e }));
|
|
2540
2542
|
return;
|
|
2541
2543
|
}
|
|
2542
2544
|
observer.pushPatchData(hlUpdate.data);
|
|
@@ -2548,8 +2550,8 @@
|
|
|
2548
2550
|
let removeResubscribeHookOnce;
|
|
2549
2551
|
const resubscribePromise = new Promise((res, rej) => {
|
|
2550
2552
|
removeResubscribeHookOnce = this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (resp) => {
|
|
2551
|
-
if (
|
|
2552
|
-
const err = new
|
|
2553
|
+
if (resp.Message !== "Foundation::HighLevelResponse" && resp.Message !== "HighLevelResponse") {
|
|
2554
|
+
const err = new UnexpectedResponseError(resp);
|
|
2553
2555
|
this.log(LogLevel.ERROR, `Unexpected response: ${resp.Message}`);
|
|
2554
2556
|
removeMessageUpdateHook();
|
|
2555
2557
|
rej(err);
|
|
@@ -2572,7 +2574,7 @@
|
|
|
2572
2574
|
return;
|
|
2573
2575
|
}
|
|
2574
2576
|
removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${resp.header.id_job}`, (update) => {
|
|
2575
|
-
if (
|
|
2577
|
+
if (update.Message !== "Foundation::HighLevelUpdate" && update.Message !== "HighLevelUpdate") {
|
|
2576
2578
|
if (update.Message.includes("SubscriptionLoss")) {
|
|
2577
2579
|
this.log(LogLevel.DEBUG, `Received: ${update.Message}`);
|
|
2578
2580
|
setTimeout(() => {
|
|
@@ -2581,7 +2583,7 @@
|
|
|
2581
2583
|
return;
|
|
2582
2584
|
}
|
|
2583
2585
|
this.log(LogLevel.ERROR, `Unexpected response: ${update.Message}`);
|
|
2584
|
-
const err = new
|
|
2586
|
+
const err = new UnexpectedResponseError(update);
|
|
2585
2587
|
observer.pushError(err);
|
|
2586
2588
|
return;
|
|
2587
2589
|
}
|
|
@@ -2590,7 +2592,7 @@
|
|
|
2590
2592
|
hlUpdate = new HighLevelUpdate(update);
|
|
2591
2593
|
} catch (e) {
|
|
2592
2594
|
this.log(LogLevel.ERROR, `Failed to parse response: ${update.body.value}`);
|
|
2593
|
-
observer.pushError(e);
|
|
2595
|
+
observer.pushError(new Error("Failed to parse response", { cause: e }));
|
|
2594
2596
|
return;
|
|
2595
2597
|
}
|
|
2596
2598
|
observer.pushPatchData(hlUpdate.data);
|
|
@@ -2603,10 +2605,7 @@
|
|
|
2603
2605
|
} catch (e) {
|
|
2604
2606
|
removeResubscribeHookOnce?.();
|
|
2605
2607
|
subscriptionZombie = true;
|
|
2606
|
-
observer.pushError(new
|
|
2607
|
-
Message: "Resubscribe failed",
|
|
2608
|
-
Error: e
|
|
2609
|
-
}));
|
|
2608
|
+
observer.pushError(new Error("Resubscribe failed", { cause: e }));
|
|
2610
2609
|
}
|
|
2611
2610
|
};
|
|
2612
2611
|
const removeReconnectHook = this.hooks.hook("reconnect:success", resubscribe);
|
|
@@ -2690,18 +2689,25 @@
|
|
|
2690
2689
|
await this.hooks.callHook("frontgateConnection:sendMessage", subscriptionMsg);
|
|
2691
2690
|
const promise = new Promise((resolve, reject) => {
|
|
2692
2691
|
this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (response) => {
|
|
2693
|
-
if (response.Message.includes("Error") || response.Message.includes("PermissionDenied")) {
|
|
2692
|
+
if (response.Message.includes("Error") || response.Message.includes("PermissionDenied") || !hasJobIdInHeader(response)) {
|
|
2694
2693
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2695
|
-
reject(
|
|
2694
|
+
reject(new UnexpectedResponseError(response));
|
|
2696
2695
|
return;
|
|
2697
2696
|
}
|
|
2698
|
-
|
|
2699
|
-
|
|
2697
|
+
let subscriptionKey = response.header.id_job.toString();
|
|
2698
|
+
let idService = -1;
|
|
2699
|
+
let idNotation = -1;
|
|
2700
|
+
if (subscriptionType === "connection" && isServiceAndNotationBased(response)) {
|
|
2701
|
+
idService = response.header.id_service;
|
|
2702
|
+
idNotation = response.id_notation;
|
|
2703
|
+
subscriptionKey = `${idService}-${idNotation}`;
|
|
2704
|
+
}
|
|
2705
|
+
const cancelationRequest = typeof CancelationRequestConstructor === "undefined" ? new CancelSubscriptionRequest(response.header.id_job) : new CancelationRequestConstructor(idService, idNotation);
|
|
2700
2706
|
const observer = new FrontgateClientDataObserver(response.header.id_job, response);
|
|
2701
2707
|
let removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${subscriptionKey}`, (update) => {
|
|
2702
|
-
if (update.Message
|
|
2708
|
+
if (update.Message === "Foundation::ErrorResponse") {
|
|
2703
2709
|
this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
|
|
2704
|
-
observer.pushError(new
|
|
2710
|
+
observer.pushError(new UnexpectedResponseError(update));
|
|
2705
2711
|
return;
|
|
2706
2712
|
}
|
|
2707
2713
|
observer.pushData(update);
|
|
@@ -2712,20 +2718,24 @@
|
|
|
2712
2718
|
await this.hooks.callHook("frontgateConnection:sendMessage", subscriptionMsg);
|
|
2713
2719
|
const resubscribePromise = new Promise((res, rej) => {
|
|
2714
2720
|
this.hooks.hookOnce(`frontgateConnection:response:${subscriptionMsg.callbackId}`, (resubscribeResponse) => {
|
|
2715
|
-
if (resubscribeResponse.Message
|
|
2716
|
-
const err = new
|
|
2721
|
+
if (resubscribeResponse.Message === "Foundation::ErrorResponse" || !hasJobIdInHeader(resubscribeResponse)) {
|
|
2722
|
+
const err = new UnexpectedResponseError(resubscribeResponse);
|
|
2717
2723
|
this.log(LogLevel.ERROR, `Unexpected resp: ${resubscribeResponse.Message}`);
|
|
2718
2724
|
rej(err);
|
|
2719
2725
|
return;
|
|
2720
2726
|
}
|
|
2721
|
-
|
|
2722
|
-
|
|
2727
|
+
let resubscriptionKey = response.header.id_job.toString();
|
|
2728
|
+
if (subscriptionType === "connection" && isServiceAndNotationBased(resubscribeResponse)) {
|
|
2729
|
+
idService = resubscribeResponse.header.id_service;
|
|
2730
|
+
idNotation = resubscribeResponse.id_notation;
|
|
2731
|
+
resubscriptionKey = `${idService}-${idNotation}`;
|
|
2732
|
+
}
|
|
2733
|
+
const resubscriptionCancelationRequest = typeof CancelationRequestConstructor === "undefined" ? new CancelSubscriptionRequest(resubscribeResponse.header.id_job) : new CancelationRequestConstructor(idService, idNotation);
|
|
2723
2734
|
observer.idJob = resubscribeResponse.header.id_job;
|
|
2724
2735
|
removeMessageUpdateHook = this.hooks.hook(`frontgateConnection:response:${resubscriptionKey}`, (update) => {
|
|
2725
|
-
if (update.Message
|
|
2736
|
+
if (update.Message === "Foundation::ErrorResponse") {
|
|
2726
2737
|
this.log(LogLevel.ERROR, `Unexpected response: ${update.Message}`);
|
|
2727
|
-
|
|
2728
|
-
observer.pushError(err);
|
|
2738
|
+
observer.pushError(new UnexpectedResponseError(update));
|
|
2729
2739
|
return;
|
|
2730
2740
|
}
|
|
2731
2741
|
observer.unsubscribe = () => {
|
|
@@ -2756,10 +2766,7 @@
|
|
|
2756
2766
|
try {
|
|
2757
2767
|
await useTimeout(timeOutInMs, "Request timeout reached", resubscribePromise);
|
|
2758
2768
|
} catch (e) {
|
|
2759
|
-
observer.pushError(new
|
|
2760
|
-
Message: "Reconnect failed",
|
|
2761
|
-
Error: e
|
|
2762
|
-
}));
|
|
2769
|
+
observer.pushError(new Error("Reconnect Failed", { cause: e }));
|
|
2763
2770
|
}
|
|
2764
2771
|
});
|
|
2765
2772
|
observer.unsubscribe = () => {
|
|
@@ -2883,7 +2890,7 @@
|
|
|
2883
2890
|
const data = applyJsonPatch(this.data, update);
|
|
2884
2891
|
super.pushData(data);
|
|
2885
2892
|
} catch (e) {
|
|
2886
|
-
super.pushError(new
|
|
2893
|
+
super.pushError(new Error("Failed to apply patch", { cause: e }));
|
|
2887
2894
|
}
|
|
2888
2895
|
}
|
|
2889
2896
|
};
|
|
@@ -3221,7 +3228,7 @@
|
|
|
3221
3228
|
* @param ownVersion version which should be checked against
|
|
3222
3229
|
*/
|
|
3223
3230
|
function _makeCompatibilityCheck(ownVersion) {
|
|
3224
|
-
const acceptedVersions = new Set([ownVersion]);
|
|
3231
|
+
const acceptedVersions = /* @__PURE__ */ new Set([ownVersion]);
|
|
3225
3232
|
const rejectedVersions = /* @__PURE__ */ new Set();
|
|
3226
3233
|
const myVersionMatch = ownVersion.match(re);
|
|
3227
3234
|
if (!myVersionMatch) return () => false;
|
|
@@ -4013,7 +4020,7 @@
|
|
|
4013
4020
|
constructor(...args) {
|
|
4014
4021
|
super(...args);
|
|
4015
4022
|
this.hooks.hook("frontgateConnection:beforeSerializeMessage", (msg) => {
|
|
4016
|
-
if (msg
|
|
4023
|
+
if (isPtlMessageWithHeader(msg)) trace.getTracer("frontgate-js-sdk").startActiveSpan("frontgateConnection:sendMessage", (span) => {
|
|
4017
4024
|
const spanHeader = this.#createSpanHeader(span.spanContext());
|
|
4018
4025
|
if (spanHeader) msg.header = {
|
|
4019
4026
|
...msg.header,
|
|
@@ -4083,7 +4090,7 @@
|
|
|
4083
4090
|
const promise = new Promise((resolve, reject) => {
|
|
4084
4091
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
4085
4092
|
try {
|
|
4086
|
-
if (
|
|
4093
|
+
if (response.Message !== "Foundation::HTTPProxyResponse") {
|
|
4087
4094
|
reject(JSON.stringify(response));
|
|
4088
4095
|
return;
|
|
4089
4096
|
}
|
|
@@ -4118,8 +4125,12 @@
|
|
|
4118
4125
|
callbackId: "PingResponse"
|
|
4119
4126
|
};
|
|
4120
4127
|
await this.hooks.callHook("frontgateConnection:sendMessage", msg);
|
|
4121
|
-
const promise = new Promise((resolve) => {
|
|
4128
|
+
const promise = new Promise((resolve, reject) => {
|
|
4122
4129
|
this.hooks.hookOnce(`frontgateConnection:response:${msg.callbackId}`, (response) => {
|
|
4130
|
+
if (response.Message !== "Foundation::PingResponse") {
|
|
4131
|
+
reject(JSON.stringify(response));
|
|
4132
|
+
return;
|
|
4133
|
+
}
|
|
4123
4134
|
resolve(new PingResponse(response));
|
|
4124
4135
|
});
|
|
4125
4136
|
});
|
|
@@ -4455,7 +4466,8 @@ close: () => {
|
|
|
4455
4466
|
if (disabledFeatures && disabledFeatures.length > 0) for (const disabledFeature of disabledFeatures) this.#addDisabledFeature(featureName, disabledFeature);
|
|
4456
4467
|
if (disabledFeatureGroups && disabledFeatureGroups.length > 0) for (const disabledFeatureGroup of disabledFeatureGroups) this.#addDisabledGroup(featureName, disabledFeatureGroup);
|
|
4457
4468
|
}
|
|
4458
|
-
|
|
4469
|
+
const MixedConstructor = mixinFactory(this.#clientConstructor);
|
|
4470
|
+
return new FrontgateClientBuilder(MixedConstructor, this.#alreadyUsedMethods, this.#disabledFeatures, this.#disabledGroups);
|
|
4459
4471
|
}
|
|
4460
4472
|
build(conf) {
|
|
4461
4473
|
return new this.#clientConstructor(conf);
|
|
@@ -4477,7 +4489,6 @@ close: () => {
|
|
|
4477
4489
|
exports.DEFAULT_TIMEOUT_IN_MS = DEFAULT_TIMEOUT_IN_MS;
|
|
4478
4490
|
exports.DefaultHosts = DefaultHosts;
|
|
4479
4491
|
exports.DeploymentStage = DeploymentStage;
|
|
4480
|
-
exports.ErrorResponse = ErrorResponse;
|
|
4481
4492
|
exports.FLAG_HAS_NEXT_CHUNK = FLAG_HAS_NEXT_CHUNK;
|
|
4482
4493
|
exports.FrontgateClient = FrontgateClient;
|
|
4483
4494
|
exports.FrontgateClientBuilder = FrontgateClientBuilder;
|
|
@@ -4510,7 +4521,11 @@ close: () => {
|
|
|
4510
4521
|
exports.fetchAuth = fetchAuth;
|
|
4511
4522
|
exports.fetchAuthWithOptionalCompressor = fetchAuthWithOptionalCompressor;
|
|
4512
4523
|
exports.getBytesFromBuffer = getBytesFromBuffer;
|
|
4524
|
+
exports.hasJobIdInHeader = hasJobIdInHeader;
|
|
4525
|
+
exports.hasJobIdInRoot = hasJobIdInRoot;
|
|
4513
4526
|
exports.httpProxyRequest = httpProxyRequest;
|
|
4527
|
+
exports.isPtlMessageWithHeader = isPtlMessageWithHeader;
|
|
4528
|
+
exports.isServiceAndNotationBased = isServiceAndNotationBased;
|
|
4514
4529
|
exports.levels = levels;
|
|
4515
4530
|
exports.logger = logger;
|
|
4516
4531
|
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.5",
|
|
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 {};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ErrorResponse = void 0;
|
|
4
|
-
const Mdg2Response_1 = require("./Mdg2Response");
|
|
5
|
-
class ErrorResponse extends Mdg2Response_1.Mdg2Response {
|
|
6
|
-
get reason() {
|
|
7
|
-
return this.raw.details;
|
|
8
|
-
}
|
|
9
|
-
get jobId() {
|
|
10
|
-
return this.raw.id_job;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
exports.ErrorResponse = ErrorResponse;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { PtlMessage } from '../../common/interfaces';
|
|
2
|
-
export interface AuthenticationResponse extends PtlMessage {
|
|
3
|
-
result: {
|
|
4
|
-
responses: [
|
|
5
|
-
{
|
|
6
|
-
salt: {
|
|
7
|
-
value: {
|
|
8
|
-
b64: string;
|
|
9
|
-
};
|
|
10
|
-
};
|
|
11
|
-
salted_hash_1: string;
|
|
12
|
-
salted_hash_2: string;
|
|
13
|
-
salted_hash_3: string;
|
|
14
|
-
}
|
|
15
|
-
];
|
|
16
|
-
};
|
|
17
|
-
challenge: {
|
|
18
|
-
challenge: {
|
|
19
|
-
b64: string;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
id_user: number;
|
|
23
|
-
authentication: {
|
|
24
|
-
salt: {
|
|
25
|
-
value: {
|
|
26
|
-
b64: string;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
encrypted_secrets: [
|
|
30
|
-
{
|
|
31
|
-
encrypted_secret: {
|
|
32
|
-
b64: string;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
];
|
|
36
|
-
};
|
|
37
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { PtlMessage } from '../../common/interfaces';
|
|
2
|
-
export interface ConfigurationResponse extends PtlMessage {
|
|
3
|
-
server_info: {
|
|
4
|
-
description: string;
|
|
5
|
-
software: string;
|
|
6
|
-
os: string;
|
|
7
|
-
uuid: {
|
|
8
|
-
id_1: string;
|
|
9
|
-
id_2: string;
|
|
10
|
-
};
|
|
11
|
-
};
|
|
12
|
-
payload_info: {
|
|
13
|
-
payload_type: {
|
|
14
|
-
value: number;
|
|
15
|
-
};
|
|
16
|
-
payload_content: string;
|
|
17
|
-
stripe_set: {
|
|
18
|
-
number_stripes: number;
|
|
19
|
-
bit_array: [];
|
|
20
|
-
};
|
|
21
|
-
deployment_stage: {
|
|
22
|
-
value: number;
|
|
23
|
-
};
|
|
24
|
-
payload_details: {
|
|
25
|
-
payload: [];
|
|
26
|
-
};
|
|
27
|
-
location: string;
|
|
28
|
-
operation_mode: {
|
|
29
|
-
value: number;
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
feature_flags_granted: {
|
|
33
|
-
value: string;
|
|
34
|
-
};
|
|
35
|
-
load: {
|
|
36
|
-
capacity: number;
|
|
37
|
-
idle: number;
|
|
38
|
-
};
|
|
39
|
-
maximum_idle_interval: string;
|
|
40
|
-
maximum_receivable_message_size: number;
|
|
41
|
-
time_at_server: {
|
|
42
|
-
microseconds: string;
|
|
43
|
-
};
|
|
44
|
-
}
|