@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.
Files changed (97) hide show
  1. package/CHANGELOG.md +50 -24
  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 +3 -0
  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 +3 -0
  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 +6 -3
  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/connection/index.d.ts +9 -3
  79. package/dist/lib/types/mixins/subscription/DataObserver.d.ts +2 -3
  80. package/dist/lib/umd/mdg2.client.min.umd.js +1 -1
  81. package/dist/lib/umd/mdg2.client.umd.js +172 -150
  82. package/package.json +2 -2
  83. package/dist/lib/esnext/common/interfaces/PtlMessage.js +0 -1
  84. package/dist/lib/esnext/message/response/AuthenticationResponse.js +0 -1
  85. package/dist/lib/esnext/message/response/ConfigurationResponse.js +0 -1
  86. package/dist/lib/esnext/message/response/DisconnectionMessage.js +0 -1
  87. package/dist/lib/esnext/message/response/ErrorResponse.js +0 -9
  88. package/dist/lib/node/common/interfaces/PtlMessage.js +0 -2
  89. package/dist/lib/node/message/response/AuthenticationResponse.js +0 -2
  90. package/dist/lib/node/message/response/ConfigurationResponse.js +0 -2
  91. package/dist/lib/node/message/response/DisconnectionMessage.js +0 -2
  92. package/dist/lib/node/message/response/ErrorResponse.js +0 -13
  93. package/dist/lib/types/common/interfaces/PtlMessage.d.ts +0 -5
  94. package/dist/lib/types/message/response/AuthenticationResponse.d.ts +0 -37
  95. package/dist/lib/types/message/response/ConfigurationResponse.d.ts +0 -44
  96. package/dist/lib/types/message/response/DisconnectionMessage.d.ts +0 -7
  97. 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.4",
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 PingResponse {
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 (!response.Message.includes("AuthenticationTokenResponse")) {
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 (!response.Message.includes("HighLevelResponse")) {
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?.value ?? "",
1099
- processingTime: response.header?.processingTime ?? 0
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
- processingTime: chunkedData.reduce((acc, chunk) => acc + chunk.processingTime, 0)
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?.value ?? "",
1116
- processingTime: response.header?.processingTime ?? 0
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 ((msg.header?.flags ?? 0) & 8) === 8;
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.msg);
1330
+ this.#respondToMessage(errorResponse);
1336
1331
  }
1337
1332
  }
1338
1333
  #respondToMessage(msgObj) {
1339
- if (typeof msgObj.header?.id_job !== "undefined") {
1334
+ if (hasJobIdInHeader(msgObj)) {
1340
1335
  this.hooks.callHook(`frontgateConnection:response:${msgObj.header.id_job}`, msgObj);
1341
1336
  return;
1342
1337
  }
1343
- if (typeof msgObj.header?.id_service !== "undefined" && typeof msgObj.id_notation !== "undefined") {
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 (typeof msgObj.id_job !== "undefined") {
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 new ErrorResponse({
1373
+ return {
1379
1374
  Message: "Foundation::ErrorResponse",
1380
1375
  Version: 1,
1381
- id_job: msg.header?.id_job,
1382
- reason: 8,
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 (!response.Message.includes("HighLevelResponse")) {
2503
+ if (response.Message !== "Foundation::HighLevelResponse" && response.Message !== "HighLevelResponse") {
2495
2504
  this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
2496
- reject(new ErrorResponse(JSON.stringify(response)));
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 (!update.Message.includes("HighLevelUpdate")) {
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 ErrorResponse(JSON.stringify(update)));
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 (!resp.Message.includes("HighLevelResponse")) {
2552
- const err = new ErrorResponse(resp);
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 (!update.Message.includes("HighLevelUpdate")) {
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 ErrorResponse(update);
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 ErrorResponse({
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(/* @__PURE__ */ new Error(`Unexpected response: ${response.Message}`));
2701
+ reject(new UnexpectedResponseError(response));
2696
2702
  return;
2697
2703
  }
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);
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.includes("Error") || update.Message.includes("PermissionDenied")) {
2715
+ if (update.Message === "Foundation::ErrorResponse") {
2703
2716
  this.log(LogLevel.ERROR, `Unexpected response: ${response.Message}`);
2704
- observer.pushError(new ErrorResponse(JSON.stringify(update)));
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.includes("Error") || resubscribeResponse.Message.includes("PermissionDenied")) {
2716
- const err = new ErrorResponse(resubscribeResponse);
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
- 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);
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.includes("Error") || update.Message.includes("PermissionDenied")) {
2743
+ if (update.Message === "Foundation::ErrorResponse") {
2726
2744
  this.log(LogLevel.ERROR, `Unexpected response: ${update.Message}`);
2727
- const err = new ErrorResponse(update);
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 ErrorResponse({
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 ErrorResponse(e.message));
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.header) trace.getTracer("frontgate-js-sdk").startActiveSpan("frontgateConnection:sendMessage", (span) => {
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 (!response.Message.includes("HTTPProxyResponse")) {
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
- return new FrontgateClientBuilder(mixinFactory(this.#clientConstructor), this.#alreadyUsedMethods, this.#disabledFeatures, this.#disabledGroups);
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",
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": "^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 });