evernode-js-client 0.6.39 → 0.6.41

Sign up to get free protection for your applications and to get access to all the features.
Binary file
package/index.js CHANGED
@@ -9189,7 +9189,7 @@ module.exports = { mask, unmask };
9189
9189
 
9190
9190
 
9191
9191
  try {
9192
- module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.napi.node");
9192
+ module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.napi1.node");
9193
9193
  } catch (e) {
9194
9194
  module.exports = __nccwpck_require__(2567);
9195
9195
  }
@@ -38321,7 +38321,7 @@ module.exports = isValidUTF8;
38321
38321
 
38322
38322
 
38323
38323
  try {
38324
- module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.napi1.node");
38324
+ module.exports = require(__nccwpck_require__.ab + "prebuilds/linux-x64/node.napi.node");
38325
38325
  } catch (e) {
38326
38326
  module.exports = __nccwpck_require__(9372);
38327
38327
  }
@@ -59814,9 +59814,13 @@ class BaseEvernodeClient {
59814
59814
  else if (!tx)
59815
59815
  console.log('handleEvernodeEvent: Invalid transaction.');
59816
59816
  else {
59817
- const ev = await this.extractEvernodeEvent(tx);
59818
- if (ev && this.#watchEvents.find(e => e === ev.name))
59819
- this.events.emit(ev.name, ev.data);
59817
+ try {
59818
+ const ev = await this.extractEvernodeEvent(tx);
59819
+ if (ev && this.#watchEvents.find(e => e === ev.name))
59820
+ this.events.emit(ev.name, ev.data);
59821
+ } catch (e) {
59822
+ console.log("Error occurred while handling Evernode events", e)
59823
+ }
59820
59824
  }
59821
59825
  }
59822
59826
 
@@ -60989,7 +60993,7 @@ const VOTE_VALIDATION_ERR = "VOTE_VALIDATION_ERR";
60989
60993
  const IPV6_FAMILY = 6;
60990
60994
 
60991
60995
  const MAX_HOST_LEDGER_OFFSET = 30;
60992
- const TX_RETRY_INTERVAL = 3000;
60996
+ const TX_RETRY_INTERVAL = 10000;
60993
60997
 
60994
60998
  class HostClient extends BaseEvernodeClient {
60995
60999
 
@@ -63572,17 +63576,19 @@ class StateHelpers {
63572
63576
  }
63573
63577
  }
63574
63578
  else if (Buffer.from(HookStateKeys.REWARD_INFO, 'hex').compare(stateKey) === 0) {
63579
+ let value = {
63580
+ epoch: stateData.readUInt8(EPOCH_OFFSET),
63581
+ savedMoment: stateData.readUInt32LE(SAVED_MOMENT_OFFSET),
63582
+ prevMomentActiveHostCount: stateData.readUInt32LE(PREV_MOMENT_ACTIVE_HOST_COUNT_OFFSET),
63583
+ curMomentActiveHostCount: stateData.readUInt32LE(CUR_MOMENT_ACTIVE_HOST_COUNT_OFFSET),
63584
+ epochPool: XflHelpers.toString(stateData.readBigInt64LE(EPOCH_POOL_OFFSET)),
63585
+ };
63586
+ if (stateData.length > HOST_MAX_LEASE_AMOUNT_OFFSET)
63587
+ value.hostMaxLeaseAmount = XflHelpers.toString(stateData.readBigInt64LE(HOST_MAX_LEASE_AMOUNT_OFFSET));
63575
63588
  return {
63576
63589
  type: this.StateTypes.SIGLETON,
63577
63590
  key: hexKey,
63578
- value: {
63579
- epoch: stateData.readUInt8(EPOCH_OFFSET),
63580
- savedMoment: stateData.readUInt32LE(SAVED_MOMENT_OFFSET),
63581
- prevMomentActiveHostCount: stateData.readUInt32LE(PREV_MOMENT_ACTIVE_HOST_COUNT_OFFSET),
63582
- curMomentActiveHostCount: stateData.readUInt32LE(CUR_MOMENT_ACTIVE_HOST_COUNT_OFFSET),
63583
- epochPool: XflHelpers.toString(stateData.readBigInt64LE(EPOCH_POOL_OFFSET)),
63584
- hostMaxLeaseAmount: XflHelpers.toString(stateData.readBigInt64LE(HOST_MAX_LEASE_AMOUNT_OFFSET))
63585
- }
63591
+ value: value
63586
63592
  }
63587
63593
  }
63588
63594
  else if (Buffer.from(HookStateKeys.MAX_TOLERABLE_DOWNTIME, 'hex').compare(stateKey) === 0) {
@@ -64977,7 +64983,13 @@ const API_REQ_TYPE = {
64977
64983
  TRANSACTIONS: 'transactions'
64978
64984
  }
64979
64985
 
64980
- const LEDGER_CLOSE_TIME = 1000
64986
+ const RESPONSE_WATCH_TIMEOUT = 1000
64987
+ const NETWORK_MODES = {
64988
+ INSUFFICIENT_NETWORK_MODE: 'InsufficientNetworkMode'
64989
+ }
64990
+
64991
+ const FUNCTIONING_SERVER_STATES = ['full', 'validating', 'proposing']
64992
+ const LEDGER_DESYNC_TIME = 20000
64981
64993
 
64982
64994
  class XrplApi {
64983
64995
 
@@ -65050,6 +65062,12 @@ class XrplApi {
65050
65062
 
65051
65063
  if (!client.isConnected())
65052
65064
  await client.connect();
65065
+
65066
+ const resp = await client.request({ command: 'server_state', ledger_index: "current" });
65067
+ const serverState = resp?.result?.state?.server_state;
65068
+
65069
+ if (!FUNCTIONING_SERVER_STATES.includes(serverState))
65070
+ throw "Client might have functioning issues."
65053
65071
  }
65054
65072
 
65055
65073
  async #initEventListeners(client) {
@@ -65085,56 +65103,75 @@ class XrplApi {
65085
65103
  }
65086
65104
  });
65087
65105
 
65106
+ let ledgerTimeout;
65107
+
65088
65108
  client.on('ledgerClosed', (ledger) => {
65109
+ if (ledgerTimeout) {
65110
+ clearTimeout(ledgerTimeout);
65111
+ }
65112
+
65113
+ ledgerTimeout = setTimeout(async () => {
65114
+ let serverState = await this.getServerState();
65115
+
65116
+ if (!FUNCTIONING_SERVER_STATES.includes(serverState)) {
65117
+ this.#events.emit(XrplApiEvents.SERVER_DESYNCED, { "event_type": "on_alert", "server_state": serverState });
65118
+ }
65119
+ clearTimeout(ledgerTimeout);
65120
+ }, LEDGER_DESYNC_TIME);
65121
+
65089
65122
  this.ledgerIndex = ledger.ledger_index;
65090
65123
  this.#events.emit(XrplApiEvents.LEDGER, ledger);
65091
65124
  });
65092
65125
 
65093
65126
  client.on("transaction", async (data) => {
65094
- if (data.validated) {
65095
- // NFTokenAcceptOffer transactions does not contain a Destination. So we check whether the accepted offer is created by which subscribed account
65096
- if (data.transaction.TransactionType === 'URITokenBuy') {
65097
- // We take all the offers created by subscribed accounts in previous ledger until we get the respective offer.
65098
- for (const subscription of this.#addressSubscriptions) {
65099
- const acc = new XrplAccount(subscription.address, null, { xrplApi: this });
65100
- // Here we access the offers that were there in this account based on the given ledger index.
65101
- const offers = await acc.getURITokens({ ledger_index: data.ledger_index - 1 });
65102
- // Filter out the matching URI token offer for the scenario.
65103
- const offer = offers.find(o => o.index === data.transaction.URITokenID && o.Amount);
65104
- // When we find the respective offer. We populate the destination and offer info and then we break the loop.
65105
- if (offer) {
65106
- // We populate some sell offer properties to the transaction to be sent with the event.
65107
- data.transaction.Destination = subscription.address;
65108
- // Replace the offer with the found offer object.
65109
- data.transaction.URITokenSellOffer = offer;
65110
- break;
65127
+ try {
65128
+ if (data.validated) {
65129
+ // NFTokenAcceptOffer transactions does not contain a Destination. So we check whether the accepted offer is created by which subscribed account
65130
+ if (data.transaction.TransactionType === 'URITokenBuy') {
65131
+ // We take all the offers created by subscribed accounts in previous ledger until we get the respective offer.
65132
+ for (const subscription of this.#addressSubscriptions) {
65133
+ const acc = new XrplAccount(subscription.address, null, { xrplApi: this });
65134
+ // Here we access the offers that were there in this account based on the given ledger index.
65135
+ const offers = await acc.getURITokens({ ledger_index: data.ledger_index - 1 });
65136
+ // Filter out the matching URI token offer for the scenario.
65137
+ const offer = offers.find(o => o.index === data.transaction.URITokenID && o.Amount);
65138
+ // When we find the respective offer. We populate the destination and offer info and then we break the loop.
65139
+ if (offer) {
65140
+ // We populate some sell offer properties to the transaction to be sent with the event.
65141
+ data.transaction.Destination = subscription.address;
65142
+ // Replace the offer with the found offer object.
65143
+ data.transaction.URITokenSellOffer = offer;
65144
+ break;
65145
+ }
65111
65146
  }
65112
65147
  }
65113
- }
65114
-
65115
- const matches = this.#addressSubscriptions.filter(s => s.address === data.transaction.Destination); // Only incoming transactions.
65116
- if (matches.length > 0) {
65117
- const tx = {
65118
- LedgerHash: data.ledger_hash,
65119
- LedgerIndex: data.ledger_index,
65120
- ...data.transaction
65121
- };
65122
65148
 
65123
- if (data.meta?.delivered_amount)
65124
- tx.DeliveredAmount = data.meta.delivered_amount;
65125
-
65126
- // Create an object copy. Otherwise xrpl client will mutate the transaction object,
65127
- const eventName = tx.TransactionType.toLowerCase();
65128
- // Emit the event only for successful transactions, Otherwise emit error.
65129
- if (data.engine_result === "tesSUCCESS") {
65130
- tx.Memos = TransactionHelper.deserializeMemos(tx.Memos);
65131
- tx.HookParameters = TransactionHelper.deserializeHookParams(tx.HookParameters);
65132
- matches.forEach(s => s.handler(eventName, tx));
65133
- }
65134
- else {
65135
- matches.forEach(s => s.handler(eventName, null, data.engine_result_message));
65149
+ const matches = this.#addressSubscriptions.filter(s => s.address === data.transaction.Destination); // Only incoming transactions.
65150
+ if (matches.length > 0) {
65151
+ const tx = {
65152
+ LedgerHash: data.ledger_hash,
65153
+ LedgerIndex: data.ledger_index,
65154
+ ...data.transaction
65155
+ };
65156
+
65157
+ if (data.meta?.delivered_amount)
65158
+ tx.DeliveredAmount = data.meta.delivered_amount;
65159
+
65160
+ // Create an object copy. Otherwise xrpl client will mutate the transaction object,
65161
+ const eventName = tx.TransactionType.toLowerCase();
65162
+ // Emit the event only for successful transactions, Otherwise emit error.
65163
+ if (data.engine_result === "tesSUCCESS") {
65164
+ tx.Memos = TransactionHelper.deserializeMemos(tx.Memos);
65165
+ tx.HookParameters = TransactionHelper.deserializeHookParams(tx.HookParameters);
65166
+ matches.forEach(s => s.handler(eventName, tx));
65167
+ }
65168
+ else {
65169
+ matches.forEach(s => s.handler(eventName, null, data.engine_result_message));
65170
+ }
65136
65171
  }
65137
65172
  }
65173
+ } catch (e) {
65174
+ console.log("Error occurred while listening to transactions.", e)
65138
65175
  }
65139
65176
  });
65140
65177
  }
@@ -65296,6 +65333,9 @@ class XrplApi {
65296
65333
  }
65297
65334
  catch (e) {
65298
65335
  this.#releaseConnection();
65336
+ if (e?.data?.error_message === NETWORK_MODES.INSUFFICIENT_NETWORK_MODE) {
65337
+ this.#events.emit(XrplApiEvents.SERVER_DESYNCED, { "event_type": "on_error", "error_code": e.data?.error_code, "error_message": e.data.error_message });
65338
+ }
65299
65339
  throw e;
65300
65340
  }
65301
65341
  }
@@ -65385,6 +65425,11 @@ class XrplApi {
65385
65425
  }
65386
65426
  }
65387
65427
 
65428
+ async getServerState(ledgerIdx = "current") {
65429
+ const resp = (await this.#handleClientRequest({ command: 'server_state', ledger_index: ledgerIdx }));
65430
+ return resp?.result?.state?.server_state;
65431
+ }
65432
+
65388
65433
  async getAccountInfo(address) {
65389
65434
  const resp = (await this.#handleClientRequest({ command: 'account_info', account: address }));
65390
65435
  return resp?.result?.account_data;
@@ -65511,7 +65556,7 @@ class XrplApi {
65511
65556
  if (lastLedger == null)
65512
65557
  throw 'Transaction must contain a LastLedgerSequence value for reliable submission.';
65513
65558
 
65514
- await new Promise(r => setTimeout(r, LEDGER_CLOSE_TIME));
65559
+ await new Promise(r => setTimeout(r, RESPONSE_WATCH_TIMEOUT));
65515
65560
 
65516
65561
  const latestLedger = await this.#getLedgerIndex();
65517
65562
 
@@ -65643,7 +65688,8 @@ const XrplApiEvents = {
65643
65688
  NFT_OFFER_CREATE: 'nftokencreateoffer',
65644
65689
  NFT_OFFER_ACCEPT: 'nftokenacceptoffer',
65645
65690
  URI_TOKEN_CREATE_SELL_OFFER: 'uritokencreateselloffer', // For Transfers
65646
- URI_TOKEN_BUY: 'uritokenbuy' // For Acquires
65691
+ URI_TOKEN_BUY: 'uritokenbuy', // For Acquires
65692
+ SERVER_DESYNCED: 'desynced'
65647
65693
  }
65648
65694
 
65649
65695
  const XrplConstants = {
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  ],
7
7
  "homepage": "https://github.com/HotPocketDev/evernode-js-client",
8
8
  "license": "SEE LICENSE IN https://raw.githubusercontent.com/EvernodeXRPL/evernode-resources/main/license/evernode-license.pdf",
9
- "version": "0.6.39",
9
+ "version": "0.6.41",
10
10
  "dependencies": {
11
11
  "elliptic": "6.5.4",
12
12
  "libsodium-wrappers": "0.7.10",
Binary file
Binary file