evernode-js-client 0.4.53 → 0.5.1

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 (3) hide show
  1. package/README.md +4 -0
  2. package/index.js +147 -8
  3. package/package.json +7 -1
package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # Evernode library for nodejs and browser.
2
+ Evernode library contains helper methods to interact with Evernode ecosystem.
3
+
4
+ - [Source code](https://github.com/HotPocketDev/evernode-js-client)
package/index.js CHANGED
@@ -11746,18 +11746,37 @@ class BaseEvernodeClient {
11746
11746
 
11747
11747
  }
11748
11748
 
11749
+ /**
11750
+ * Listens to the subscribed events. This will listen for the event without detaching the handler until it's 'off'.
11751
+ * @param {string} event Event name.
11752
+ * @param {function(event)} handler Callback function to handle the event.
11753
+ */
11749
11754
  on(event, handler) {
11750
11755
  this.events.on(event, handler);
11751
11756
  }
11752
11757
 
11758
+ /**
11759
+ * Listens to the subscribed events. This will listen only once and detach the handler.
11760
+ * @param {string} event Event name.
11761
+ * @param {function(event)} handler Callback function to handle the event.
11762
+ */
11753
11763
  once(event, handler) {
11754
11764
  this.events.once(event, handler);
11755
11765
  }
11756
11766
 
11767
+ /**
11768
+ * Detach the listener event.
11769
+ * @param {string} event Event name.
11770
+ * @param {function(event)} handler (optional) Can be sent if a specific handler need to be detached. All the handlers will be detached if not specified.
11771
+ */
11757
11772
  off(event, handler = null) {
11758
11773
  this.events.off(event, handler);
11759
11774
  }
11760
11775
 
11776
+ /**
11777
+ * Connects the client to xrpl server and do the config loading and subscriptions. 'subscribe' is called inside this.
11778
+ * @returns boolean value, 'true' if success.
11779
+ */
11761
11780
  async connect() {
11762
11781
  if (this.connected)
11763
11782
  return true;
@@ -11777,6 +11796,9 @@ class BaseEvernodeClient {
11777
11796
  return true;
11778
11797
  }
11779
11798
 
11799
+ /**
11800
+ * Disconnects the client to xrpl server and do the un-subscriptions. 'unsubscribe' is called inside this.
11801
+ */
11780
11802
  async disconnect() {
11781
11803
  await this.unsubscribe();
11782
11804
 
@@ -11784,14 +11806,24 @@ class BaseEvernodeClient {
11784
11806
  await this.xrplApi.disconnect();
11785
11807
  }
11786
11808
 
11809
+ /**
11810
+ * Subscribes to the registry client events.
11811
+ */
11787
11812
  async subscribe() {
11788
11813
  await this.xrplAcc.subscribe();
11789
11814
  }
11790
11815
 
11816
+ /**
11817
+ * Unsubscribes from the registry client events.
11818
+ */
11791
11819
  async unsubscribe() {
11792
11820
  await this.xrplAcc.unsubscribe();
11793
11821
  }
11794
11822
 
11823
+ /**
11824
+ * Get the EVR balance in the registry account.
11825
+ * @returns The available EVR amount as a 'string'.
11826
+ */
11795
11827
  async getEVRBalance() {
11796
11828
  const lines = await this.xrplAcc.getTrustLines(EvernodeConstants.EVR, this.config.evrIssuerAddress);
11797
11829
  if (lines.length > 0)
@@ -11800,6 +11832,10 @@ class BaseEvernodeClient {
11800
11832
  return '0';
11801
11833
  }
11802
11834
 
11835
+ /**
11836
+ * Get all XRPL hook states in the registry account.
11837
+ * @returns The list of hook states including Evernode configuration and hosts.
11838
+ */
11803
11839
  async getHookStates() {
11804
11840
  const regAcc = new XrplAccount(this.registryAddress, null, { xrplApi: this.xrplApi });
11805
11841
  const configs = await regAcc.getNamespaceEntries(EvernodeConstants.HOOK_NAMESPACE);
@@ -11809,6 +11845,11 @@ class BaseEvernodeClient {
11809
11845
  return [];
11810
11846
  }
11811
11847
 
11848
+ /**
11849
+ * Get the moment from the given XRP ledger index. (1 Moment - 1190 XRP ledgers).
11850
+ * @param {number} ledgerIndex [Optional] Ledger index to get the moment value.
11851
+ * @returns The moment of the given XPR ledger index as 'number'. Returns current moment if XRP ledger index is not given.
11852
+ */
11812
11853
  async getMoment(ledgerIndex = null) {
11813
11854
  const lv = ledgerIndex || this.xrplApi.ledgerIndex;
11814
11855
  const m = Math.floor((lv - this.config.momentBaseIdx) / this.config.momentSize);
@@ -11817,6 +11858,11 @@ class BaseEvernodeClient {
11817
11858
  return m;
11818
11859
  }
11819
11860
 
11861
+ /**
11862
+ * Get start XRP ledger index of the moment (of the given XRPL index).
11863
+ * @param {number} ledgerIndex [Optional] Ledger index to get the moment value.
11864
+ * @returns The XRP ledger index of the moment (of the given XRPL index) as a 'number'. Returns the current moment's start XRP ledger index if ledger index parameter is not given.
11865
+ */
11820
11866
  async getMomentStartIndex(ledgerIndex = null) {
11821
11867
  const lv = ledgerIndex || this.xrplApi.ledgerIndex;
11822
11868
  const m = Math.floor((lv - this.config.momentBaseIdx) / this.config.momentSize);
@@ -11825,6 +11871,10 @@ class BaseEvernodeClient {
11825
11871
  return this.config.momentBaseIdx + (m * this.config.momentSize);
11826
11872
  }
11827
11873
 
11874
+ /**
11875
+ * Get Evernode configuration
11876
+ * @returns An object with all the configuration and their values.
11877
+ */
11828
11878
  async #getEvernodeConfig() {
11829
11879
  let states = await this.getHookStates();
11830
11880
  const configStateKeys = {
@@ -11850,10 +11900,18 @@ class BaseEvernodeClient {
11850
11900
  return config;
11851
11901
  }
11852
11902
 
11903
+ /**
11904
+ * Loads the configs from XRPL hook and updates the in-memory config.
11905
+ */
11853
11906
  async refreshConfig() {
11854
11907
  this.config = await this.#getEvernodeConfig();
11855
11908
  }
11856
11909
 
11910
+ /**
11911
+ * Extracts transaction info and emits the Evernode event.
11912
+ * @param {object} tx XRPL transaction to be handled.
11913
+ * @param {any} error Error if there's any.
11914
+ */
11857
11915
  async #handleEvernodeEvent(tx, error) {
11858
11916
  if (error)
11859
11917
  console.error(error);
@@ -11866,6 +11924,11 @@ class BaseEvernodeClient {
11866
11924
  }
11867
11925
  }
11868
11926
 
11927
+ /**
11928
+ * Extracts the transaction info from a given transaction.
11929
+ * @param {object} tx Transaction to be deserialized and extracted.
11930
+ * @returns The event object in the format {name: '', data: {}}. Returns null if not handled. Note: You need to deserialize memos before passing the transaction to this function.
11931
+ */
11869
11932
  async extractEvernodeEvent(tx) {
11870
11933
  if (tx.TransactionType === 'NFTokenAcceptOffer' && tx.NFTokenSellOffer && tx.Memos.length >= 1 &&
11871
11934
  tx.Memos[0].type === MemoTypes.ACQUIRE_LEASE && tx.Memos[0].format === MemoFormats.BASE64 && tx.Memos[0].data) {
@@ -12082,7 +12145,11 @@ class BaseEvernodeClient {
12082
12145
  return null;
12083
12146
  }
12084
12147
 
12085
- // To get Host details from Hook States.
12148
+ /**
12149
+ * Get the registered host information.
12150
+ * @param {string} hostAddress [Optional] Address of the host.
12151
+ * @returns The registered host information object. Returns null is not registered.
12152
+ */
12086
12153
  async getHostInfo(hostAddress = this.xrplAcc.address) {
12087
12154
  try {
12088
12155
  const addrStateKey = StateHelpers.generateHostAddrStateKey(hostAddress);
@@ -12108,7 +12175,7 @@ class BaseEvernodeClient {
12108
12175
  }
12109
12176
  }
12110
12177
  catch (e) {
12111
- // If the exeption is entryNotFound from Rippled there's no entry for the host, So return null.
12178
+ // If the exception is entryNotFound from Rippled there's no entry for the host, So return null.
12112
12179
  if (e?.data?.error !== 'entryNotFound')
12113
12180
  throw e;
12114
12181
  }
@@ -12116,7 +12183,13 @@ class BaseEvernodeClient {
12116
12183
  return null;
12117
12184
  }
12118
12185
 
12119
- // To fetch records from host collection in Firestore database. (Pagination is applied - default page size :20)
12186
+ /**
12187
+ * Get all the hosts registered in Evernode. The result's are paginated. Default page size is 20. Note: Specifying both filter and pagination does not supported.
12188
+ * @param {object} filters [Optional] Filter criteria to filter the hosts. The filter key can be a either property of the host.
12189
+ * @param {number} pageSize [Optional] Page size for the results.
12190
+ * @param {string} nextPageToken [Optional] Next page's token, If received by the previous result set.
12191
+ * @returns The list of active hosts. The response will be in '{data: [], nextPageToken: ''}' only if there are more pages. Otherwise the response will only contain the host list.
12192
+ */
12120
12193
  async getHosts(filters = null, pageSize = null, nextPageToken = null) {
12121
12194
  const hosts = await this.#firestoreHandler.getHosts(filters, pageSize, nextPageToken);
12122
12195
  const curMomentStartIdx = await this.getMomentStartIndex();
@@ -12129,7 +12202,10 @@ class BaseEvernodeClient {
12129
12202
  return hosts;
12130
12203
  }
12131
12204
 
12132
- // To fetch all records from config collection in Firestore database.
12205
+ /**
12206
+ * Get all Evernode configuration without paginating.
12207
+ * @returns The list of configuration.
12208
+ */
12133
12209
  async getAllConfigs() {
12134
12210
  let fullConfigList = [];
12135
12211
  const configs = await this.#firestoreHandler.getConfigs();
@@ -12149,7 +12225,10 @@ class BaseEvernodeClient {
12149
12225
  return fullConfigList;
12150
12226
  }
12151
12227
 
12152
- // To fetch all records from host collection in Firestore database.
12228
+ /**
12229
+ * Get all the hosts without paginating.
12230
+ * @returns The list of hosts.
12231
+ */
12153
12232
  async getAllHosts() {
12154
12233
  let fullHostList = [];
12155
12234
  const hosts = await this.#firestoreHandler.getHosts();
@@ -12169,7 +12248,10 @@ class BaseEvernodeClient {
12169
12248
  return fullHostList;
12170
12249
  }
12171
12250
 
12172
- // To prune an inactive host/
12251
+ /**
12252
+ * Remove a host which is inactive for a long period. The inactivity is checked by Evernode it self and only pruned if inactive thresholds are met.
12253
+ * @param {string} hostAddress XRPL address of the host to be pruned.
12254
+ */
12173
12255
  async pruneDeadHost(hostAddress) {
12174
12256
  if (this.xrplAcc.address === this.registryAddress)
12175
12257
  throw 'Invalid function call';
@@ -12190,6 +12272,7 @@ module.exports = {
12190
12272
  BaseEvernodeClient
12191
12273
  }
12192
12274
 
12275
+
12193
12276
  /***/ }),
12194
12277
 
12195
12278
  /***/ 1437:
@@ -12574,10 +12657,18 @@ const RegistryEvents = {
12574
12657
 
12575
12658
  class RegistryClient extends BaseEvernodeClient {
12576
12659
 
12660
+ /**
12661
+ * Constructs a registry client instance.
12662
+ * @param {object} options [Optional] An object with 'rippledServer' URL and 'registryAddress'.
12663
+ */
12577
12664
  constructor(options = {}) {
12578
12665
  super((options.registryAddress || DefaultValues.registryAddress), null, Object.values(RegistryEvents), false, options);
12579
12666
  }
12580
12667
 
12668
+ /**
12669
+ * Gets all the active hosts registered in Evernode without paginating.
12670
+ * @returns The list of active hosts.
12671
+ */
12581
12672
  async getActiveHosts() {
12582
12673
  let fullHostList = [];
12583
12674
  const hosts = await this.getHosts();
@@ -12629,6 +12720,12 @@ const TenantEvents = {
12629
12720
 
12630
12721
  class TenantClient extends BaseEvernodeClient {
12631
12722
 
12723
+ /**
12724
+ * Constructs a tenant client instance.
12725
+ * @param {string} xrpAddress XRPL address of the tenant.
12726
+ * @param {string} XRPL secret of the tenant.
12727
+ * @param {object} options [Optional] An object with 'rippledServer' URL and 'registryAddress'.
12728
+ */
12632
12729
  constructor(xrpAddress, xrpSecret, options = {}) {
12633
12730
  super(xrpAddress, xrpSecret, Object.values(TenantEvents), false, options);
12634
12731
  }
@@ -12666,6 +12763,13 @@ class TenantClient extends BaseEvernodeClient {
12666
12763
  return host;
12667
12764
  }
12668
12765
 
12766
+ /**
12767
+ *
12768
+ * @param {string} hostAddress XRPL address of the host to acquire the lease.
12769
+ * @param {object} requirement The instance requirements and configuration.
12770
+ * @param {object} options [Optional] Options for the XRPL transaction.
12771
+ * @returns The transaction result.
12772
+ */
12669
12773
  async acquireLeaseSubmit(hostAddress, requirement, options = {}) {
12670
12774
 
12671
12775
  const hostAcc = await this.getLeaseHost(hostAddress);
@@ -12693,6 +12797,12 @@ class TenantClient extends BaseEvernodeClient {
12693
12797
  return this.xrplAcc.buyNft(selectedOfferIndex, [{ type: MemoTypes.ACQUIRE_LEASE, format: MemoFormats.BASE64, data: ecrypted }], options.transactionOptions);
12694
12798
  }
12695
12799
 
12800
+ /**
12801
+ * Watch for the acquire-success response after the acquire request is made.
12802
+ * @param {object} tx The transaction returned by the acquireLeaseSubmit function.
12803
+ * @param {object} options [Optional] Options for the XRPL transaction.
12804
+ * @returns An object including transaction details,instance info, and acquireReference Id.
12805
+ */
12696
12806
  async watchAcquireResponse(tx, options = {}) {
12697
12807
  console.log(`Waiting for acquire response... (txHash: ${tx.id})`);
12698
12808
 
@@ -12731,6 +12841,13 @@ class TenantClient extends BaseEvernodeClient {
12731
12841
  }
12732
12842
  }
12733
12843
 
12844
+ /**
12845
+ * Acquire an instance from a host
12846
+ * @param {string} hostAddress XRPL address of the host to acquire the lease.
12847
+ * @param {object} requirement The instance requirements and configuration.
12848
+ * @param {object} options [Optional] Options for the XRPL transaction.
12849
+ * @returns An object including transaction details,instance info, and acquireReference Id.
12850
+ */
12734
12851
  acquireLease(hostAddress, requirement, options = {}) {
12735
12852
  return new Promise(async (resolve, reject) => {
12736
12853
  const tx = await this.acquireLeaseSubmit(hostAddress, requirement, options).catch(error => {
@@ -12747,13 +12864,27 @@ class TenantClient extends BaseEvernodeClient {
12747
12864
  });
12748
12865
  }
12749
12866
 
12867
+ /**
12868
+ * This function is called by a tenant client to submit the extend lease transaction in certain host. This function will be called inside extendLease function. This function can take four parameters as follows.
12869
+ * @param {string} hostAddress XRPL account address of the host.
12870
+ * @param {number} amount Cost for the extended moments , in EVRs.
12871
+ * @param {string} tokenID Tenant received instance name. this name can be retrieve by performing acquire Lease.
12872
+ * @param {object} options This is an optional field and contains necessary details for the transactions.
12873
+ * @returns The transaction result.
12874
+ */
12750
12875
  async extendLeaseSubmit(hostAddress, amount, tokenID, options = {}) {
12751
12876
  const host = await this.getLeaseHost(hostAddress);
12752
12877
  return this.xrplAcc.makePayment(host.address, amount.toString(), EvernodeConstants.EVR, this.config.evrIssuerAddress,
12753
12878
  [{ type: MemoTypes.EXTEND_LEASE, format: MemoFormats.HEX, data: tokenID }], options.transactionOptions);
12754
12879
  }
12755
12880
 
12756
- async watchExtendResponse(tx, minLedgerIndex, options = {}) {
12881
+ /**
12882
+ * This function watches for an extendlease-success response(transaction) and returns the response or throws the error response on extendlease-error response from the host XRPL account. This function is called within the extendLease function.
12883
+ * @param {object} tx Response of extendLeaseSubmit.
12884
+ * @param {object} options This is an optional field and contains necessary details for the transactions.
12885
+ * @returns An object including transaction details.
12886
+ */
12887
+ async watchExtendResponse(tx, options = {}) {
12757
12888
  console.log(`Waiting for extend lease response... (txHash: ${tx.id})`);
12758
12889
 
12759
12890
  const failTimeout = setTimeout(() => {
@@ -12762,7 +12893,7 @@ class TenantClient extends BaseEvernodeClient {
12762
12893
 
12763
12894
  let relevantTx = null;
12764
12895
  while (!relevantTx) {
12765
- const txList = await this.xrplAcc.getAccountTrx(minLedgerIndex);
12896
+ const txList = await this.xrplAcc.getAccountTrx(tx.details.ledger_index);
12766
12897
  for (let t of txList) {
12767
12898
  t.tx.Memos = TransactionHelper.deserializeMemos(t.tx.Memos);
12768
12899
  const res = await this.extractEvernodeEvent(t.tx);
@@ -12790,6 +12921,14 @@ class TenantClient extends BaseEvernodeClient {
12790
12921
  }
12791
12922
  }
12792
12923
 
12924
+ /**
12925
+ * This function is called by a tenant client to extend an available instance in certain host. This function can take four parameters as follows.
12926
+ * @param {string} hostAddress XRPL account address of the host.
12927
+ * @param {number} moments 1190 ledgers (est. 1 hour).
12928
+ * @param {string} instanceName Tenant received instance name. this name can be retrieve by performing acquire Lease.
12929
+ * @param {object} options This is an optional field and contains necessary details for the transactions.
12930
+ * @returns An object including transaction details.
12931
+ */
12793
12932
  extendLease(hostAddress, moments, instanceName, options = {}) {
12794
12933
  return new Promise(async (resolve, reject) => {
12795
12934
  const tokenID = instanceName;
package/package.json CHANGED
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "name": "evernode-js-client",
3
- "version": "0.4.53",
3
+ "description": "Javascript client library for Evernode.",
4
+ "keywords": [
5
+ "Evernode"
6
+ ],
7
+ "homepage": "https://github.com/HotPocketDev/evernode-js-client",
8
+ "license": "MIT",
9
+ "version": "0.5.1",
4
10
  "dependencies": {
5
11
  "elliptic": "6.5.4",
6
12
  "ripple-address-codec": "4.2.0",