{"version":3,"file":"MultichainTransactionsTracker.cjs","sourceRoot":"","sources":["../src/MultichainTransactionsTracker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,yCAAkC;AAQlC,4BAA4B;AAC5B,MAAM,8BAA8B,GAAG,CAAC,GAAG,IAAI,CAAC;AAEhD;;;;;;GAMG;AACH,MAAa,6BAA6B;IAUxC,YACE,0BAGkB;QAbX,wDAAgB;QAEhB,oEAGU;QAEnB,sDAAiD,EAAE,EAAC;QAQlD,uBAAA,IAAI,qDAAuB,0BAA0B,MAAA,CAAC;QAEtD,uBAAA,IAAI,yCAAW,IAAI,eAAM,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxC,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,8BAA8B,CAAC,MAAA,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,uBAAA,IAAI,6CAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,uBAAA,IAAI,6CAAQ,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,SAAiB;QACzB,OAAO,SAAS,IAAI,uBAAA,IAAI,mDAAc,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,SAAiB;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;SAC/D;IACH,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CACH,SAAiB,EACjB,SAAiB,EACjB,aAAgC,EAAE,KAAK,EAAE,EAAE,EAAE;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YAC9B,uBAAA,IAAI,mDAAc,CAAC,SAAS,CAAC,GAAG;gBAC9B,WAAW,EAAE,CAAC;gBACd,SAAS;gBACT,UAAU;aACX,CAAC;SACH;IACH,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,SAAiB;QACvB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,uBAAA,IAAI,mDAAc,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,4BAA4B,CAAC,SAAiB;QAClD,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEnC,MAAM,IAAI,GAAG,uBAAA,IAAI,mDAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC;QACnE,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC;QAEpD,IAAI,oBAAoB,IAAI,UAAU,EAAE;YACtC,MAAM,uBAAA,IAAI,yDAAoB,MAAxB,IAAI,EAAqB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3D,uBAAA,IAAI,mDAAc,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;SACxD;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,OAAO,CAAC,UAAU,CACtB,MAAM,CAAC,IAAI,CAAC,uBAAA,IAAI,mDAAc,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACtD,MAAM,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AA3HD,sEA2HC","sourcesContent":["import type { PaginationOptions } from './MultichainTransactionsController';\nimport { Poller } from './Poller';\n\ntype TransactionInfo = {\n  lastUpdated: number;\n  blockTime: number;\n  pagination: PaginationOptions;\n};\n\n// Every 5s in milliseconds.\nconst TRANSACTIONS_TRACKING_INTERVAL = 5 * 1000;\n\n/**\n * This class manages the tracking and periodic updating of transactions for multiple blockchain accounts.\n *\n * The tracker uses a polling mechanism to periodically check and update transactions\n * for all tracked accounts, respecting each account's specific block time to determine\n * when updates are needed.\n */\nexport class MultichainTransactionsTracker {\n  readonly #poller: Poller;\n\n  readonly #updateTransactions: (\n    accountId: string,\n    pagination: PaginationOptions,\n  ) => Promise<void>;\n\n  #transactions: Record<string, TransactionInfo> = {};\n\n  constructor(\n    updateTransactionsCallback: (\n      accountId: string,\n      pagination: PaginationOptions,\n    ) => Promise<void>,\n  ) {\n    this.#updateTransactions = updateTransactionsCallback;\n\n    this.#poller = new Poller(() => {\n      this.updateTransactions().catch((error) => {\n        console.error('Failed to update transactions:', error);\n      });\n    }, TRANSACTIONS_TRACKING_INTERVAL);\n  }\n\n  /**\n   * Starts the tracking process.\n   */\n  start(): void {\n    this.#poller.start();\n  }\n\n  /**\n   * Stops the tracking process.\n   */\n  stop(): void {\n    this.#poller.stop();\n  }\n\n  /**\n   * Checks if an account ID is being tracked.\n   *\n   * @param accountId - The account ID.\n   * @returns True if the account is being tracked, false otherwise.\n   */\n  isTracked(accountId: string) {\n    return accountId in this.#transactions;\n  }\n\n  /**\n   * Asserts that an account ID is being tracked.\n   *\n   * @param accountId - The account ID.\n   * @throws If the account ID is not being tracked.\n   */\n  assertBeingTracked(accountId: string) {\n    if (!this.isTracked(accountId)) {\n      throw new Error(`Account is not being tracked: ${accountId}`);\n    }\n  }\n\n  /**\n   * Starts tracking a new account ID. This method has no effect on already tracked\n   * accounts.\n   *\n   * @param accountId - The account ID.\n   * @param blockTime - The block time (used when refreshing the account transactions).\n   * @param pagination - Options for paginating transaction results. Defaults to { limit: 10 }.\n   */\n  track(\n    accountId: string,\n    blockTime: number,\n    pagination: PaginationOptions = { limit: 10 },\n  ) {\n    if (!this.isTracked(accountId)) {\n      this.#transactions[accountId] = {\n        lastUpdated: 0,\n        blockTime,\n        pagination,\n      };\n    }\n  }\n\n  /**\n   * Stops tracking a tracked account ID.\n   *\n   * @param accountId - The account ID.\n   * @throws If the account ID is not being tracked.\n   */\n  untrack(accountId: string) {\n    this.assertBeingTracked(accountId);\n    delete this.#transactions[accountId];\n  }\n\n  /**\n   * Update the transactions for a tracked account ID.\n   *\n   * @param accountId - The account ID.\n   * @throws If the account ID is not being tracked.\n   */\n  async updateTransactionsForAccount(accountId: string) {\n    this.assertBeingTracked(accountId);\n\n    const info = this.#transactions[accountId];\n    const isOutdated = Date.now() - info.lastUpdated >= info.blockTime;\n    const hasNoTransactionsYet = info.lastUpdated === 0;\n\n    if (hasNoTransactionsYet || isOutdated) {\n      await this.#updateTransactions(accountId, info.pagination);\n      this.#transactions[accountId].lastUpdated = Date.now();\n    }\n  }\n\n  /**\n   * Update the transactions of all tracked accounts\n   */\n  async updateTransactions() {\n    await Promise.allSettled(\n      Object.keys(this.#transactions).map(async (accountId) => {\n        await this.updateTransactionsForAccount(accountId);\n      }),\n    );\n  }\n}\n"]}