@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.
Files changed (99) hide show
  1. package/CHANGELOG.md +56 -26
  2. package/dist/lib/esnext/common/errors.js +4 -5
  3. package/dist/lib/esnext/index.js +1 -0
  4. package/dist/lib/esnext/message/interfaces/PtlMessage.js +4 -0
  5. package/dist/lib/esnext/message/interfaces/index.js +1 -0
  6. package/dist/lib/esnext/message/request/AuthenticationByTokenRequest.js +2 -2
  7. package/dist/lib/esnext/message/request/AuthenticationRequest.js +2 -0
  8. package/dist/lib/esnext/message/request/ConfigurationRequest.js +3 -3
  9. package/dist/lib/esnext/message/response/AuthenticationTokenResponse.js +3 -11
  10. package/dist/lib/esnext/message/response/HTTPProxyResponse.js +0 -4
  11. package/dist/lib/esnext/message/response/Mdg2Response.js +4 -1
  12. package/dist/lib/esnext/message/response/PingResponse.js +0 -6
  13. package/dist/lib/esnext/message/response/index.js +0 -3
  14. package/dist/lib/esnext/mixins/AuthTokenRequestMixin.js +1 -1
  15. package/dist/lib/esnext/mixins/EndpointRequestMixin.js +7 -7
  16. package/dist/lib/esnext/mixins/HTTPProxyRequestMixin.js +1 -1
  17. package/dist/lib/esnext/mixins/OpenTelemetryMixin.js +2 -1
  18. package/dist/lib/esnext/mixins/PingMixin.js +5 -1
  19. package/dist/lib/esnext/mixins/RequestMixin.js +6 -1
  20. package/dist/lib/esnext/mixins/auth/AppAuthMixin.js +3 -3
  21. package/dist/lib/esnext/mixins/auth/SessionAuthMixin.js +4 -4
  22. package/dist/lib/esnext/mixins/auth/UserCredentialAuthMixin.js +3 -3
  23. package/dist/lib/esnext/mixins/auth/UserPasswordAuthMixin.js +3 -3
  24. package/dist/lib/esnext/mixins/connection/FrontgateWSMixin.js +11 -9
  25. package/dist/lib/esnext/mixins/subscription/DataObserver.js +1 -2
  26. package/dist/lib/esnext/mixins/subscription/EndpointSubscriptionMixin.js +13 -12
  27. package/dist/lib/esnext/mixins/subscription/RawSubscriptionMixin.js +28 -15
  28. package/dist/lib/esnext/version.js +1 -1
  29. package/dist/lib/node/common/errors.js +6 -7
  30. package/dist/lib/node/index.js +1 -0
  31. package/dist/lib/node/message/interfaces/PtlMessage.js +11 -0
  32. package/dist/lib/node/message/interfaces/index.js +1 -0
  33. package/dist/lib/node/message/request/AuthenticationByTokenRequest.js +2 -2
  34. package/dist/lib/node/message/request/AuthenticationRequest.js +2 -0
  35. package/dist/lib/node/message/request/ConfigurationRequest.js +3 -3
  36. package/dist/lib/node/message/response/AuthenticationTokenResponse.js +3 -11
  37. package/dist/lib/node/message/response/HTTPProxyResponse.js +0 -4
  38. package/dist/lib/node/message/response/Mdg2Response.js +4 -1
  39. package/dist/lib/node/message/response/PingResponse.js +0 -6
  40. package/dist/lib/node/message/response/index.js +0 -3
  41. package/dist/lib/node/mixins/AuthTokenRequestMixin.js +1 -1
  42. package/dist/lib/node/mixins/EndpointRequestMixin.js +7 -7
  43. package/dist/lib/node/mixins/HTTPProxyRequestMixin.js +1 -1
  44. package/dist/lib/node/mixins/OpenTelemetryMixin.js +2 -1
  45. package/dist/lib/node/mixins/PingMixin.js +5 -1
  46. package/dist/lib/node/mixins/RequestMixin.js +6 -1
  47. package/dist/lib/node/mixins/auth/AppAuthMixin.js +3 -3
  48. package/dist/lib/node/mixins/auth/SessionAuthMixin.js +4 -4
  49. package/dist/lib/node/mixins/auth/UserCredentialAuthMixin.js +3 -3
  50. package/dist/lib/node/mixins/auth/UserPasswordAuthMixin.js +3 -3
  51. package/dist/lib/node/mixins/connection/FrontgateWSMixin.js +11 -9
  52. package/dist/lib/node/mixins/subscription/DataObserver.js +1 -2
  53. package/dist/lib/node/mixins/subscription/EndpointSubscriptionMixin.js +12 -11
  54. package/dist/lib/node/mixins/subscription/RawSubscriptionMixin.js +27 -14
  55. package/dist/lib/node/version.js +1 -1
  56. package/dist/lib/types/common/errors.d.ts +4 -8
  57. package/dist/lib/types/common/interfaces/index.d.ts +0 -1
  58. package/dist/lib/types/index.d.ts +1 -0
  59. package/dist/lib/types/message/interfaces/PtlMessage.d.ts +486 -0
  60. package/dist/lib/types/message/interfaces/index.d.ts +1 -0
  61. package/dist/lib/types/message/request/AbstractMdg2Request.d.ts +3 -3
  62. package/dist/lib/types/message/request/AuthenticationByTokenRequest.d.ts +5 -2
  63. package/dist/lib/types/message/request/AuthenticationRequest.d.ts +10 -9
  64. package/dist/lib/types/message/request/AuthenticationTokenRequest.d.ts +2 -1
  65. package/dist/lib/types/message/request/CancelSubscriptionRequest.d.ts +2 -1
  66. package/dist/lib/types/message/request/ConfigurationRequest.d.ts +7 -2
  67. package/dist/lib/types/message/request/HTTPProxyRequest.d.ts +2 -2
  68. package/dist/lib/types/message/request/HighLevelRequest.d.ts +2 -2
  69. package/dist/lib/types/message/request/PingRequest.d.ts +2 -8
  70. package/dist/lib/types/message/request/TransportLayerClientRequestHeader.d.ts +3 -26
  71. package/dist/lib/types/message/response/AuthenticationTokenResponse.d.ts +3 -3
  72. package/dist/lib/types/message/response/HTTPProxyResponse.d.ts +8 -24
  73. package/dist/lib/types/message/response/HighLevelResponse.d.ts +3 -1
  74. package/dist/lib/types/message/response/Mdg2Response.d.ts +6 -4
  75. package/dist/lib/types/message/response/PingResponse.d.ts +2 -1
  76. package/dist/lib/types/message/response/index.d.ts +0 -3
  77. package/dist/lib/types/message/update/HighLevelUpdate.d.ts +3 -1
  78. package/dist/lib/types/mixins/auth/FetchAuthenticationMixin.d.ts +2 -2
  79. package/dist/lib/types/mixins/auth/FetchAuthenticationWithOptionalCompressionMixin.d.ts +2 -2
  80. package/dist/lib/types/mixins/connection/index.d.ts +9 -3
  81. package/dist/lib/types/mixins/subscription/DataObserver.d.ts +2 -3
  82. package/dist/lib/umd/mdg2.client.min.umd.js +1 -1
  83. package/dist/lib/umd/mdg2.client.umd.js +114 -99
  84. package/package.json +2 -2
  85. package/dist/lib/esnext/common/interfaces/PtlMessage.js +0 -1
  86. package/dist/lib/esnext/message/response/AuthenticationResponse.js +0 -1
  87. package/dist/lib/esnext/message/response/ConfigurationResponse.js +0 -1
  88. package/dist/lib/esnext/message/response/DisconnectionMessage.js +0 -1
  89. package/dist/lib/esnext/message/response/ErrorResponse.js +0 -9
  90. package/dist/lib/node/common/interfaces/PtlMessage.js +0 -2
  91. package/dist/lib/node/message/response/AuthenticationResponse.js +0 -2
  92. package/dist/lib/node/message/response/ConfigurationResponse.js +0 -2
  93. package/dist/lib/node/message/response/DisconnectionMessage.js +0 -2
  94. package/dist/lib/node/message/response/ErrorResponse.js +0 -13
  95. package/dist/lib/types/common/interfaces/PtlMessage.d.ts +0 -5
  96. package/dist/lib/types/message/response/AuthenticationResponse.d.ts +0 -37
  97. package/dist/lib/types/message/response/ConfigurationResponse.d.ts +0 -44
  98. package/dist/lib/types/message/response/DisconnectionMessage.d.ts +0 -7
  99. 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.3",
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 PingResponse {
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 (!response.Message.includes("AuthenticationTokenResponse")) {
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 (!response.Message.includes("HighLevelResponse")) {
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?.value ?? "",
1099
- processingTime: response.header?.processingTime ?? 0
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
- processingTime: chunkedData.reduce((acc, chunk) => acc + chunk.processingTime, 0)
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?.value ?? "",
1116
- processingTime: response.header?.processingTime ?? 0
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 ((msg.header?.flags ?? 0) & 8) === 8;
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.msg);
1323
+ this.#respondToMessage(errorResponse);
1336
1324
  }
1337
1325
  }
1338
1326
  #respondToMessage(msgObj) {
1339
- if (typeof msgObj.header?.id_job !== "undefined") {
1327
+ if (hasJobIdInHeader(msgObj)) {
1340
1328
  this.hooks.callHook(`frontgateConnection:response:${msgObj.header.id_job}`, msgObj);
1341
1329
  return;
1342
1330
  }
1343
- if (typeof msgObj.header?.id_service !== "undefined" && typeof msgObj.id_notation !== "undefined") {
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 (typeof msgObj.id_job !== "undefined") {
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 new ErrorResponse({
1366
+ return {
1379
1367
  Message: "Foundation::ErrorResponse",
1380
1368
  Version: 1,
1381
- id_job: msg.header?.id_job,
1382
- reason: 8,
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 (!response.Message.includes("HighLevelResponse")) {
2496
+ if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
2495
2497
  this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
2496
- reject(new ErrorResponse(JSON.stringify(response)));
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 (!update.Message.includes("HighLevelUpdate")) {
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 ErrorResponse(JSON.stringify(update)));
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 (!resp.Message.includes("HighLevelResponse")) {
2552
- const err = new ErrorResponse(resp);
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 (!update.Message.includes("HighLevelUpdate")) {
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 ErrorResponse(update);
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 ErrorResponse({
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(/* @__PURE__ */ new Error(`Unexpected response: ${response.Message}`));
2694
+ reject(new UnexpectedResponseError(response));
2696
2695
  return;
2697
2696
  }
2698
- const subscriptionKey = subscriptionType === "connection" ? `${response.header.id_service}-${request.getPtlMessage().id_notation}` : response.header.id_job;
2699
- const cancelationRequest = typeof CancelationRequestConstructor === "undefined" ? new CancelSubscriptionRequest(response.header.id_job) : new CancelationRequestConstructor(response.header.id_service, request.getPtlMessage().id_notation);
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.includes("Error") || update.Message.includes("PermissionDenied")) {
2708
+ if (update.Message === "Foundation::ErrorResponse") {
2703
2709
  this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
2704
- observer.pushError(new ErrorResponse(JSON.stringify(update)));
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.includes("Error") || resubscribeResponse.Message.includes("PermissionDenied")) {
2716
- const err = new ErrorResponse(resubscribeResponse);
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
- const resubscriptionKey = subscriptionType === "connection" ? `${resubscribeResponse.header.id_service}-${request.getPtlMessage().id_notation}` : resubscribeResponse.header.id_job;
2722
- const resubscriptionCancelationRequest = typeof CancelationRequestConstructor === "undefined" ? new CancelSubscriptionRequest(resubscribeResponse.header.id_job) : new CancelationRequestConstructor(resubscribeResponse.header.id_service, request.getPtlMessage().id_notation);
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.includes("Error") || update.Message.includes("PermissionDenied")) {
2736
+ if (update.Message === "Foundation::ErrorResponse") {
2726
2737
  this.log(LogLevel.ERROR, `Unexpected response: ${update.Message}`);
2727
- const err = new ErrorResponse(update);
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 ErrorResponse({
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 ErrorResponse(e.message));
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.header) trace.getTracer("frontgate-js-sdk").startActiveSpan("frontgateConnection:sendMessage", (span) => {
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 (!response.Message.includes("HTTPProxyResponse")) {
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
- return new FrontgateClientBuilder(mixinFactory(this.#clientConstructor), this.#alreadyUsedMethods, this.#disabledFeatures, this.#disabledGroups);
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.3",
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": "^7.1.1",
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,9 +0,0 @@
1
- import { Mdg2Response } from './Mdg2Response';
2
- export class ErrorResponse extends Mdg2Response {
3
- get reason() {
4
- return this.raw.details;
5
- }
6
- get jobId() {
7
- return this.raw.id_job;
8
- }
9
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,5 +0,0 @@
1
- export interface PtlMessage {
2
- Message: string;
3
- Version: number;
4
- [prop: string]: any;
5
- }
@@ -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
- }