@amityco/ts-sdk 7.19.0 → 7.19.1-50d637a.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt.d.ts","sourceRoot":"","sources":["../../../src/core/transports/mqtt.ts"],"names":[],"mappings":"AAEA,OAAa,EAAE,cAAc,EAAsB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgBtF,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,cAAc,CAWjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,aAAc,MAAM,KAAG,gBAiHtD,CAAC"}
1
+ {"version":3,"file":"mqtt.d.ts","sourceRoot":"","sources":["../../../src/core/transports/mqtt.ts"],"names":[],"mappings":"AAEA,OAAa,EAAE,cAAc,EAAsB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqBtF,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,cAAc,CAWjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,aAAc,MAAM,KAAG,gBA6JtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mqtt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mqtt.test.d.ts","sourceRoot":"","sources":["../../../../src/core/transports/tests/mqtt.test.ts"],"names":[],"mappings":""}
package/dist/index.cjs.js CHANGED
@@ -4727,6 +4727,10 @@ const getDeviceInfo = () => {
4727
4727
  const QOS_FAILURE_CODE = 128;
4728
4728
  const RETRY_BASE_TIMEOUT = 1000;
4729
4729
  const RETRY_MAX_TIMEOUT = 8000;
4730
+ // Subscription-level retry constants (separate from connection-level reconnect)
4731
+ const MAX_RETRIES = 2;
4732
+ const SUB_RETRY_BASE_DELAY = 1000;
4733
+ const SUB_RETRY_MAX_DELAY = 5000;
4730
4734
  var MqttError;
4731
4735
  (function (MqttError) {
4732
4736
  MqttError[MqttError["IDENTIFIER_REJECTED"] = 2] = "IDENTIFIER_REJECTED";
@@ -4747,6 +4751,7 @@ function getMqttOptions(params) {
4747
4751
  */
4748
4752
  const createMqttTransport = (endpoint) => {
4749
4753
  let mqttClient;
4754
+ const retryState = new Map();
4750
4755
  async function connect(params) {
4751
4756
  const clientId = await getMQTTClientId(params.userId);
4752
4757
  if (mqttClient) {
@@ -4775,8 +4780,47 @@ const createMqttTransport = (endpoint) => {
4775
4780
  // Double the reconnect period for each attempt
4776
4781
  mqttClient.options.reconnectPeriod = Math.min((mqttClient.options.reconnectPeriod || RETRY_BASE_TIMEOUT) * 2, RETRY_MAX_TIMEOUT);
4777
4782
  });
4783
+ mqttClient.on('close', () => {
4784
+ retryState.forEach(({ timer }) => clearTimeout(timer));
4785
+ retryState.clear();
4786
+ });
4778
4787
  return new Promise(resolve => mqttClient.once('connect', () => resolve()));
4779
4788
  }
4789
+ function attemptSubscribe(topic, attempt, callback) {
4790
+ const callbackWrapper = (error, granted) => {
4791
+ var _a;
4792
+ const failed = error || ((_a = granted[0]) === null || _a === void 0 ? void 0 : _a.qos) === QOS_FAILURE_CODE;
4793
+ if (failed) {
4794
+ if (attempt < MAX_RETRIES) {
4795
+ const delay = Math.min(2 ** attempt * SUB_RETRY_BASE_DELAY, SUB_RETRY_MAX_DELAY);
4796
+ console.warn(`Failed to subscribe to topic ${topic} (attempt ${attempt + 1}/${MAX_RETRIES + 1}). Retrying in ${delay}ms.`);
4797
+ const timer = setTimeout(() => {
4798
+ attemptSubscribe(topic, attempt + 1, callback);
4799
+ }, delay);
4800
+ retryState.set(topic, { timer, callback });
4801
+ }
4802
+ else {
4803
+ retryState.delete(topic);
4804
+ const ascError = error
4805
+ ? new ASCError(error.message, 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */)
4806
+ : new ASCUnknownError(800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
4807
+ console.warn(`Failed to subscribe to topic ${topic} after ${MAX_RETRIES + 1} attempts`, ascError);
4808
+ callback === null || callback === void 0 ? void 0 : callback(ascError);
4809
+ }
4810
+ }
4811
+ else {
4812
+ retryState.delete(topic);
4813
+ console.log(`Subscribed to topic ${topic}`);
4814
+ callback === null || callback === void 0 ? void 0 : callback();
4815
+ }
4816
+ };
4817
+ if (mqttClient) {
4818
+ mqttClient.subscribe(topic, { qos: 0 }, callbackWrapper);
4819
+ }
4820
+ else {
4821
+ callbackWrapper(new Error('No connection to broker'), []);
4822
+ }
4823
+ }
4780
4824
  return {
4781
4825
  connect,
4782
4826
  async disconnect() {
@@ -4805,33 +4849,18 @@ const createMqttTransport = (endpoint) => {
4805
4849
  mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.removeAllListeners();
4806
4850
  },
4807
4851
  subscribe(topic, callback) {
4808
- const callbackWrapper = (error, granted) => {
4809
- var _a;
4810
- // In MQTT.js, when you subscribe to a topic with QoS 0, the granted parameter
4811
- // in the callback will typically be empty or undefined
4812
- if (error || ((_a = granted[0]) === null || _a === void 0 ? void 0 : _a.qos) === QOS_FAILURE_CODE) {
4813
- const ascError = error
4814
- ? new ASCError(error.message, 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */)
4815
- : // TODO throw the actual error, once BE can tell us the actual error code
4816
- new ASCUnknownError(800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
4817
- // Use warning lv instead of error lv to prevent misunderstanding of user
4818
- console.warn(`Failed to subscribe to topic ${topic}`, ascError);
4819
- callback === null || callback === void 0 ? void 0 : callback(ascError);
4820
- }
4821
- else {
4822
- console.log(`Subscribed to topic ${topic}`);
4823
- callback === null || callback === void 0 ? void 0 : callback();
4824
- }
4825
- };
4826
- if (mqttClient) {
4827
- mqttClient.subscribe(topic, { qos: 0 }, callbackWrapper);
4828
- }
4829
- else {
4830
- callbackWrapper(new Error('No connection to broker'), []);
4831
- }
4832
- return () => mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.unsubscribe(topic);
4852
+ attemptSubscribe(topic, 0, callback);
4853
+ return () => this.unsubscribe(topic);
4833
4854
  },
4834
4855
  unsubscribe(topic) {
4856
+ var _a;
4857
+ const pending = retryState.get(topic);
4858
+ if (pending !== undefined) {
4859
+ clearTimeout(pending.timer);
4860
+ retryState.delete(topic);
4861
+ const cancellationError = new ASCError('Subscription retry cancelled due to unsubscribe call', 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
4862
+ (_a = pending.callback) === null || _a === void 0 ? void 0 : _a.call(pending, cancellationError);
4863
+ }
4835
4864
  mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.unsubscribe(topic);
4836
4865
  },
4837
4866
  };
@@ -13203,7 +13232,7 @@ const getWatchSessionStorage = () => {
13203
13232
  return storageInstance;
13204
13233
  };
13205
13234
 
13206
- const privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHo80SecH7FuF2\nhFYnb+l26/VN8UMLXAQFLnxciNTEwkGVFMpdezlH8rU2HtUJL4RETogbAOLVY0XM\njs6sPn8G1nALmh9qeDpUtVqFOVtBHxEZ910TLOtQiunjqJKO5nWdqZ71EC3OFluR\niGQkO84BiIFbv37ub7xl3S8XarbtKoLcyVpkDHi+1wx1pgCAn6gtBUgckPL5NR8j\nLseabl3HAXQfhTCKo4tmOFM2Dxwl1IUMmIJrJg/aIU/U0tj/1Eoo7mG0JcNWX19l\nW3EecCbi0ncCJOrkUdwlBrcjaMayaX/ubEwyUeTGiLdyc4L3GRLHjyK8xgVNXRMH\nbZWJ2a5NAgMBAAECggEASxuE+35zTFO/XydKgmvIGcWL9FbgMlXb7Vcf0nBoG945\nbiz0NVc2paraIhJXc608xbYF3qLmtAE1MVBI0ORyRdBHNxY024l/6H6SH60Ed+uI\nM4ysp5ourY6Vj+DLwpdRiI9YDjqYAQDIUmhNxJP7XPhOMoZI6st+xZQBM34ic/bv\nAMSJm9OZphSp3+qXVkFZztr2mxD2EZSJJLYxi8BCdgM2qhazalbcJ6zDKHCZWVWm\n8RRxDGldyMb/237JxETzP40tAlzOZDmBAbUgEnurDJ93RVDIE3rbZUshwgeQd18a\nem096mWgvB1AIKYgsTAR3pw+V19YWAjq/glP6fz8wQKBgQD/oQq+ukKF0PRgBeM5\ngeTjSwsdGppQLmf5ndujvoiz/TpdjDEPu6R8kigQr1rG2t4K/yfdZoI8RdmJD1al\n3Q7N9hofooSy4rj6E3txzWZCHJjHad2cnCp/O26HiReGAl7wTcfTmNdiFHhZQzm5\nJBkvWAiwuvQMNfEbnXxw6/vIDwKBgQDH7fX8gsc77JLvAWgp1MaQN/sbqVb6JeT1\nFQfR8E/WFCSmzQBtNzd5KgYuCeelwr/8DyYytvN2BzCYZXp73gI1jF3YlW5jVn74\nOY6TwQ095digwo6Z0yuxopdIOApKgAkL9PRKgNrqAf3NAyMua6lOGifzjDojC3KU\nfylQmxMn4wKBgHp2B9O/H0dEBw5JQ8W0+JX6yWQz7mEjGiR2/1W+XXb8hQ1zr709\nw1r6Gb+EghRpnZ3fBpYGGbYOMFx8wKHM+N6qW3F0ReX8v2juFGE8aRSa5oYBrWzt\nU16Idjbv8hj84cZ1PJmdyvDtpYn9rpWHOZl4rxEbPvbqkIsOMyNVqdT5AoGAOSge\nmwIIU2le2FVeohbibXiToWTYKMuMmURZ5/r72AgKMmWJKbAPe+Q3wBG01/7FRBpQ\noU8Ma0HC8s6QJbliiEyIx9JwrJWd1vkdecBHONrtA4ibm/5zD2WcOllLF+FitLhi\n3qnX6+6F0IaFGFBPJrTzlv0P4dTz/OAdv52V7GECgYEA2TttOKBAqWllgOaZOkql\nLVMJVmgR7s6tLi1+cEP8ZcapV9aRbRzTAKXm4f8AEhtlG9F9kCOvHYCYGi6JaiWJ\nZkHjeex3T+eE6Di6y5Bm/Ift5jtVhJ4jCVwHOKTMej79NPUFTJfv8hCo29haBDv6\nRXFrv+T21KCcw8k3sJeJWWQ=\n-----END PRIVATE KEY-----";
13235
+ const privateKey = "MIIEpQIBAAKCAQEAwAEc/oZgYIvKSUG/C3mONYLR4ZPgAjMEX4bJ+xqqakUDRtqlNO+eZs2blQ1Ko0DBkqPExyQezvjibH5W2UZBV5RaBTlTcNVKTToMBEGesAfaEcM3qUyQHxdbFYZv6P4sb14dcwxTQ8usmaV8ooiR1Fcaso5ZWYcZ8Hb46FbQ7OoVumsBtPWwfZ4f003o5VCl6AIM6lcLv9UDLlFVYhE+PeXpRHtfWlGqxMvqC9oinlwhL6nWv6VjQXW4nhcib72dPBzfHT7k/PMKto2SxALYdb68ENiAGuJLWi3AUHSyYCJK2w7wIlWfJUAI0v26ub10IpExr6D5QuW2577jjP93iwIDAQABAoIBAFWfqXhwIIatkFY+9Z1+ZcbDQimgsmMIsUiQaX6Lk7e0cxOj6czDlxYtVtaPiNtow2pLkjNkjkCqiP7tEHnwdK9DvylZOTa2R15NJpK3WLcTqVIGhsn/FL5owfvFah6zSsmXZParZm5zY9NZE03ALZhOB9/cz0e3kf/EbpfeL2mW7MApyiUt5i09ycchroOpcWp73ipIxvgigtZyUGFmsQicWhUs28F0D7w4Qfk76yG3nqXeb+BAMhCaIaa/k/aAxhiZG/ygEQWQrcC8gfe+jyicMAQPDEVS9YuUMGsLjIjKuVLZzp2xirQnhc2i2zVNEIvG6soprPOBEMQugzrtX5ECgYEA3b7KAbBIbDl1e4ZSCWhHdHkiWVZHaopsR/LhqDDNhXjWjq3AesgV6k0j9EdziMn/HmmOso0bz99GTV3JZf4A9ztTLumJlkHbdVtlgOqSjrFLj12rH9KXTheyIhWSpUmm8+WB1xasFbqpvJaGo7F3pd2Fqj1XR4mp5BO7c/t7LJ0CgYEA3aouEzXQ9THRKYocdfY69EI1Il1t/d/RSqqd9BxEjxBgxkM13ZiYIn/R4WW/nCUrlmhxG44Aa2Gob4Ahfsui2xKTg/g/3Zk/rAxAEGkfOLGoenaJMD41fH4wUq3FRYwkvnaMb9Hd6f/TlBHslIRa2NN58bSBGJCyBP2b59+2+EcCgYEAixDVRXvV37GlYUOa/XVdosk5Zoe6oDGRuQm0xbNdoUBoZvDHDvme7ONWEiQha/8qtVsD+CyQ7awcPfb8kK9c0bBt+bTS6d4BkTcxkEkMgtrkBVR8Nqfu5jXsLH4VCv4G61zbMhZw8+ut+az5YX2yCN7Frj9sFlxapMRPQmzMEe0CgYEAumsAzM8ZqNv4mAK65Mnr0rhLj1cbxcKRdUYACOgtEFQpzxN/HZnTeFAe5nx3pI3uFlRHq3DFEYnT6dHMWaJQmAULYpVIwMi9L6gtyJ9fzoI6uqMtxRDMUqKdaSsTGOY/kJ6KhQ/unXi1K3XXjR+yd1+C0q+HUm1+CYxvrZYLfskCgYEArsEy+IQOiqniJ0NE2vVUF+UK/IRZaic9YKcpov5Ot7Vvzm/MnnW4N1ljVskocETBWMmPUvNSExVjPebi+rxd8fa5kY8BJScPTzMFbunZn/wjtGdcM10qdlVQ9doG61A/9P3ezFKCfS4AvF/H/59LcSx2Bh28fp3/efiVIOpVd4Y=";
13207
13236
  /*
13208
13237
  * The crypto algorithm used for importing key and signing string
13209
13238
  */
package/dist/index.esm.js CHANGED
@@ -20803,6 +20803,10 @@ const getDeviceInfo = () => {
20803
20803
  const QOS_FAILURE_CODE = 128;
20804
20804
  const RETRY_BASE_TIMEOUT = 1000;
20805
20805
  const RETRY_MAX_TIMEOUT = 8000;
20806
+ // Subscription-level retry constants (separate from connection-level reconnect)
20807
+ const MAX_RETRIES = 2;
20808
+ const SUB_RETRY_BASE_DELAY = 1000;
20809
+ const SUB_RETRY_MAX_DELAY = 5000;
20806
20810
  var MqttError;
20807
20811
  (function (MqttError) {
20808
20812
  MqttError[MqttError["IDENTIFIER_REJECTED"] = 2] = "IDENTIFIER_REJECTED";
@@ -20823,6 +20827,7 @@ function getMqttOptions(params) {
20823
20827
  */
20824
20828
  const createMqttTransport = (endpoint) => {
20825
20829
  let mqttClient;
20830
+ const retryState = new Map();
20826
20831
  async function connect(params) {
20827
20832
  const clientId = await getMQTTClientId(params.userId);
20828
20833
  if (mqttClient) {
@@ -20851,8 +20856,47 @@ const createMqttTransport = (endpoint) => {
20851
20856
  // Double the reconnect period for each attempt
20852
20857
  mqttClient.options.reconnectPeriod = Math.min((mqttClient.options.reconnectPeriod || RETRY_BASE_TIMEOUT) * 2, RETRY_MAX_TIMEOUT);
20853
20858
  });
20859
+ mqttClient.on('close', () => {
20860
+ retryState.forEach(({ timer }) => clearTimeout(timer));
20861
+ retryState.clear();
20862
+ });
20854
20863
  return new Promise(resolve => mqttClient.once('connect', () => resolve()));
20855
20864
  }
20865
+ function attemptSubscribe(topic, attempt, callback) {
20866
+ const callbackWrapper = (error, granted) => {
20867
+ var _a;
20868
+ const failed = error || ((_a = granted[0]) === null || _a === void 0 ? void 0 : _a.qos) === QOS_FAILURE_CODE;
20869
+ if (failed) {
20870
+ if (attempt < MAX_RETRIES) {
20871
+ const delay = Math.min(2 ** attempt * SUB_RETRY_BASE_DELAY, SUB_RETRY_MAX_DELAY);
20872
+ console.warn(`Failed to subscribe to topic ${topic} (attempt ${attempt + 1}/${MAX_RETRIES + 1}). Retrying in ${delay}ms.`);
20873
+ const timer = setTimeout(() => {
20874
+ attemptSubscribe(topic, attempt + 1, callback);
20875
+ }, delay);
20876
+ retryState.set(topic, { timer, callback });
20877
+ }
20878
+ else {
20879
+ retryState.delete(topic);
20880
+ const ascError = error
20881
+ ? new ASCError(error.message, 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */)
20882
+ : new ASCUnknownError(800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
20883
+ console.warn(`Failed to subscribe to topic ${topic} after ${MAX_RETRIES + 1} attempts`, ascError);
20884
+ callback === null || callback === void 0 ? void 0 : callback(ascError);
20885
+ }
20886
+ }
20887
+ else {
20888
+ retryState.delete(topic);
20889
+ console.log(`Subscribed to topic ${topic}`);
20890
+ callback === null || callback === void 0 ? void 0 : callback();
20891
+ }
20892
+ };
20893
+ if (mqttClient) {
20894
+ mqttClient.subscribe(topic, { qos: 0 }, callbackWrapper);
20895
+ }
20896
+ else {
20897
+ callbackWrapper(new Error('No connection to broker'), []);
20898
+ }
20899
+ }
20856
20900
  return {
20857
20901
  connect,
20858
20902
  async disconnect() {
@@ -20881,33 +20925,18 @@ const createMqttTransport = (endpoint) => {
20881
20925
  mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.removeAllListeners();
20882
20926
  },
20883
20927
  subscribe(topic, callback) {
20884
- const callbackWrapper = (error, granted) => {
20885
- var _a;
20886
- // In MQTT.js, when you subscribe to a topic with QoS 0, the granted parameter
20887
- // in the callback will typically be empty or undefined
20888
- if (error || ((_a = granted[0]) === null || _a === void 0 ? void 0 : _a.qos) === QOS_FAILURE_CODE) {
20889
- const ascError = error
20890
- ? new ASCError(error.message, 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */)
20891
- : // TODO throw the actual error, once BE can tell us the actual error code
20892
- new ASCUnknownError(800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
20893
- // Use warning lv instead of error lv to prevent misunderstanding of user
20894
- console.warn(`Failed to subscribe to topic ${topic}`, ascError);
20895
- callback === null || callback === void 0 ? void 0 : callback(ascError);
20896
- }
20897
- else {
20898
- console.log(`Subscribed to topic ${topic}`);
20899
- callback === null || callback === void 0 ? void 0 : callback();
20900
- }
20901
- };
20902
- if (mqttClient) {
20903
- mqttClient.subscribe(topic, { qos: 0 }, callbackWrapper);
20904
- }
20905
- else {
20906
- callbackWrapper(new Error('No connection to broker'), []);
20907
- }
20908
- return () => mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.unsubscribe(topic);
20928
+ attemptSubscribe(topic, 0, callback);
20929
+ return () => this.unsubscribe(topic);
20909
20930
  },
20910
20931
  unsubscribe(topic) {
20932
+ var _a;
20933
+ const pending = retryState.get(topic);
20934
+ if (pending !== undefined) {
20935
+ clearTimeout(pending.timer);
20936
+ retryState.delete(topic);
20937
+ const cancellationError = new ASCError('Subscription retry cancelled due to unsubscribe call', 800000 /* Amity.ClientError.UNKNOWN_ERROR */, "error" /* Amity.ErrorLevel.ERROR */);
20938
+ (_a = pending.callback) === null || _a === void 0 ? void 0 : _a.call(pending, cancellationError);
20939
+ }
20911
20940
  mqttClient === null || mqttClient === void 0 ? void 0 : mqttClient.unsubscribe(topic);
20912
20941
  },
20913
20942
  };
@@ -29295,7 +29324,7 @@ const getWatchSessionStorage = () => {
29295
29324
  return storageInstance;
29296
29325
  };
29297
29326
 
29298
- const privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHo80SecH7FuF2\nhFYnb+l26/VN8UMLXAQFLnxciNTEwkGVFMpdezlH8rU2HtUJL4RETogbAOLVY0XM\njs6sPn8G1nALmh9qeDpUtVqFOVtBHxEZ910TLOtQiunjqJKO5nWdqZ71EC3OFluR\niGQkO84BiIFbv37ub7xl3S8XarbtKoLcyVpkDHi+1wx1pgCAn6gtBUgckPL5NR8j\nLseabl3HAXQfhTCKo4tmOFM2Dxwl1IUMmIJrJg/aIU/U0tj/1Eoo7mG0JcNWX19l\nW3EecCbi0ncCJOrkUdwlBrcjaMayaX/ubEwyUeTGiLdyc4L3GRLHjyK8xgVNXRMH\nbZWJ2a5NAgMBAAECggEASxuE+35zTFO/XydKgmvIGcWL9FbgMlXb7Vcf0nBoG945\nbiz0NVc2paraIhJXc608xbYF3qLmtAE1MVBI0ORyRdBHNxY024l/6H6SH60Ed+uI\nM4ysp5ourY6Vj+DLwpdRiI9YDjqYAQDIUmhNxJP7XPhOMoZI6st+xZQBM34ic/bv\nAMSJm9OZphSp3+qXVkFZztr2mxD2EZSJJLYxi8BCdgM2qhazalbcJ6zDKHCZWVWm\n8RRxDGldyMb/237JxETzP40tAlzOZDmBAbUgEnurDJ93RVDIE3rbZUshwgeQd18a\nem096mWgvB1AIKYgsTAR3pw+V19YWAjq/glP6fz8wQKBgQD/oQq+ukKF0PRgBeM5\ngeTjSwsdGppQLmf5ndujvoiz/TpdjDEPu6R8kigQr1rG2t4K/yfdZoI8RdmJD1al\n3Q7N9hofooSy4rj6E3txzWZCHJjHad2cnCp/O26HiReGAl7wTcfTmNdiFHhZQzm5\nJBkvWAiwuvQMNfEbnXxw6/vIDwKBgQDH7fX8gsc77JLvAWgp1MaQN/sbqVb6JeT1\nFQfR8E/WFCSmzQBtNzd5KgYuCeelwr/8DyYytvN2BzCYZXp73gI1jF3YlW5jVn74\nOY6TwQ095digwo6Z0yuxopdIOApKgAkL9PRKgNrqAf3NAyMua6lOGifzjDojC3KU\nfylQmxMn4wKBgHp2B9O/H0dEBw5JQ8W0+JX6yWQz7mEjGiR2/1W+XXb8hQ1zr709\nw1r6Gb+EghRpnZ3fBpYGGbYOMFx8wKHM+N6qW3F0ReX8v2juFGE8aRSa5oYBrWzt\nU16Idjbv8hj84cZ1PJmdyvDtpYn9rpWHOZl4rxEbPvbqkIsOMyNVqdT5AoGAOSge\nmwIIU2le2FVeohbibXiToWTYKMuMmURZ5/r72AgKMmWJKbAPe+Q3wBG01/7FRBpQ\noU8Ma0HC8s6QJbliiEyIx9JwrJWd1vkdecBHONrtA4ibm/5zD2WcOllLF+FitLhi\n3qnX6+6F0IaFGFBPJrTzlv0P4dTz/OAdv52V7GECgYEA2TttOKBAqWllgOaZOkql\nLVMJVmgR7s6tLi1+cEP8ZcapV9aRbRzTAKXm4f8AEhtlG9F9kCOvHYCYGi6JaiWJ\nZkHjeex3T+eE6Di6y5Bm/Ift5jtVhJ4jCVwHOKTMej79NPUFTJfv8hCo29haBDv6\nRXFrv+T21KCcw8k3sJeJWWQ=\n-----END PRIVATE KEY-----";
29327
+ const privateKey = "MIIEpQIBAAKCAQEAwAEc/oZgYIvKSUG/C3mONYLR4ZPgAjMEX4bJ+xqqakUDRtqlNO+eZs2blQ1Ko0DBkqPExyQezvjibH5W2UZBV5RaBTlTcNVKTToMBEGesAfaEcM3qUyQHxdbFYZv6P4sb14dcwxTQ8usmaV8ooiR1Fcaso5ZWYcZ8Hb46FbQ7OoVumsBtPWwfZ4f003o5VCl6AIM6lcLv9UDLlFVYhE+PeXpRHtfWlGqxMvqC9oinlwhL6nWv6VjQXW4nhcib72dPBzfHT7k/PMKto2SxALYdb68ENiAGuJLWi3AUHSyYCJK2w7wIlWfJUAI0v26ub10IpExr6D5QuW2577jjP93iwIDAQABAoIBAFWfqXhwIIatkFY+9Z1+ZcbDQimgsmMIsUiQaX6Lk7e0cxOj6czDlxYtVtaPiNtow2pLkjNkjkCqiP7tEHnwdK9DvylZOTa2R15NJpK3WLcTqVIGhsn/FL5owfvFah6zSsmXZParZm5zY9NZE03ALZhOB9/cz0e3kf/EbpfeL2mW7MApyiUt5i09ycchroOpcWp73ipIxvgigtZyUGFmsQicWhUs28F0D7w4Qfk76yG3nqXeb+BAMhCaIaa/k/aAxhiZG/ygEQWQrcC8gfe+jyicMAQPDEVS9YuUMGsLjIjKuVLZzp2xirQnhc2i2zVNEIvG6soprPOBEMQugzrtX5ECgYEA3b7KAbBIbDl1e4ZSCWhHdHkiWVZHaopsR/LhqDDNhXjWjq3AesgV6k0j9EdziMn/HmmOso0bz99GTV3JZf4A9ztTLumJlkHbdVtlgOqSjrFLj12rH9KXTheyIhWSpUmm8+WB1xasFbqpvJaGo7F3pd2Fqj1XR4mp5BO7c/t7LJ0CgYEA3aouEzXQ9THRKYocdfY69EI1Il1t/d/RSqqd9BxEjxBgxkM13ZiYIn/R4WW/nCUrlmhxG44Aa2Gob4Ahfsui2xKTg/g/3Zk/rAxAEGkfOLGoenaJMD41fH4wUq3FRYwkvnaMb9Hd6f/TlBHslIRa2NN58bSBGJCyBP2b59+2+EcCgYEAixDVRXvV37GlYUOa/XVdosk5Zoe6oDGRuQm0xbNdoUBoZvDHDvme7ONWEiQha/8qtVsD+CyQ7awcPfb8kK9c0bBt+bTS6d4BkTcxkEkMgtrkBVR8Nqfu5jXsLH4VCv4G61zbMhZw8+ut+az5YX2yCN7Frj9sFlxapMRPQmzMEe0CgYEAumsAzM8ZqNv4mAK65Mnr0rhLj1cbxcKRdUYACOgtEFQpzxN/HZnTeFAe5nx3pI3uFlRHq3DFEYnT6dHMWaJQmAULYpVIwMi9L6gtyJ9fzoI6uqMtxRDMUqKdaSsTGOY/kJ6KhQ/unXi1K3XXjR+yd1+C0q+HUm1+CYxvrZYLfskCgYEArsEy+IQOiqniJ0NE2vVUF+UK/IRZaic9YKcpov5Ot7Vvzm/MnnW4N1ljVskocETBWMmPUvNSExVjPebi+rxd8fa5kY8BJScPTzMFbunZn/wjtGdcM10qdlVQ9doG61A/9P3ezFKCfS4AvF/H/59LcSx2Bh28fp3/efiVIOpVd4Y=";
29299
29328
  /*
29300
29329
  * The crypto algorithm used for importing key and signing string
29301
29330
  */