{"version":3,"file":"MultichainNetworkService.mjs","sourceRoot":"","sources":["../../src/MultichainNetworkService/MultichainNetworkService.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,8BAA8B;;;AAI/C,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,iCAAiC,EACjC,6BAA6B,EAC9B,gCAA4B;AAG7B;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAKnC,YAAY,EACV,KAAK,EAAE,aAAa,EACpB,SAAS,GAIV;;QAVQ,kDAAqB;QAErB,sDAAmB;QAS1B,uBAAA,IAAI,mCAAU,aAAa,MAAA,CAAC;QAC5B,uBAAA,IAAI,uCAAc,SAAS,IAAI,EAAE,MAAA,CAAC;IACpC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,oBAAoB,CACxB,UAA2B;QAE3B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,IAAI,uBAAA,IAAI,2CAAW,EAAE,CAAC;YACzC,OAAO,uBAAA,IAAI,gGAA2B,MAA/B,IAAI,EAA4B,UAAU,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,uBAAA,IAAI,2CAAW,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAA,IAAI,gGAA2B,MAA/B,IAAI,EAA4B,KAAK,CAAC,CAAC,CAC/D,CAAC;QAEF,MAAM,gBAAgB,GAA2B;YAC/C,cAAc,EAAE,YAAY,CAAC,OAAO,CAClC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CACtC;SACF,CAAC;QAEF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CA0CF;;AAxCC;;;;;;GAMG;AACH,KAAK,8DACH,UAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,uCAAO,MAAX,IAAI,EAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE;YACjD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,CAAC,iCAAiC,CAAC,EAAE,6BAA6B;gBAClE,MAAM,EAAE,kBAAkB;aAC3B;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAE5C,MAAM,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC","sourcesContent":["import { assert } from '@metamask/superstruct';\nimport type { CaipAccountId } from '@metamask/utils';\nimport { chunk } from 'lodash';\n\nimport {\n  ActiveNetworksResponseStruct,\n  buildActiveNetworksUrl,\n  MULTICHAIN_ACCOUNTS_CLIENT_HEADER,\n  MULTICHAIN_ACCOUNTS_CLIENT_ID,\n} from '../api/accounts-api';\nimport type { ActiveNetworksResponse } from '../api/accounts-api';\n\n/**\n * Service responsible for fetching network activity data from the API.\n */\nexport class MultichainNetworkService {\n  readonly #fetch: typeof fetch;\n\n  readonly #batchSize: number;\n\n  constructor({\n    fetch: fetchFunction,\n    batchSize,\n  }: {\n    fetch: typeof fetch;\n    batchSize?: number;\n  }) {\n    this.#fetch = fetchFunction;\n    this.#batchSize = batchSize ?? 20;\n  }\n\n  /**\n   * Fetches active networks for the given account IDs.\n   * Automatically handles batching requests to comply with URL length limitations.\n   *\n   * @param accountIds - Array of CAIP-10 account IDs to fetch activity for.\n   * @returns Promise resolving to the combined active networks response.\n   * @throws Error if the response format is invalid or the request fails.\n   */\n  async fetchNetworkActivity(\n    accountIds: CaipAccountId[],\n  ): Promise<ActiveNetworksResponse> {\n    if (accountIds.length === 0) {\n      return { activeNetworks: [] };\n    }\n\n    if (accountIds.length <= this.#batchSize) {\n      return this.#fetchNetworkActivityBatch(accountIds);\n    }\n\n    const batches = chunk(accountIds, this.#batchSize);\n    const batchResults = await Promise.all(\n      batches.map((batch) => this.#fetchNetworkActivityBatch(batch)),\n    );\n\n    const combinedResponse: ActiveNetworksResponse = {\n      activeNetworks: batchResults.flatMap(\n        (response) => response.activeNetworks,\n      ),\n    };\n\n    return combinedResponse;\n  }\n\n  /**\n   * Internal method to fetch a single batch of account IDs.\n   *\n   * @param accountIds - Batch of account IDs to fetch\n   * @returns Promise resolving to the active networks response for this batch\n   * @throws Error if the response format is invalid or the request fails\n   */\n  async #fetchNetworkActivityBatch(\n    accountIds: CaipAccountId[],\n  ): Promise<ActiveNetworksResponse> {\n    try {\n      const url = buildActiveNetworksUrl(accountIds);\n\n      const response = await this.#fetch(url.toString(), {\n        method: 'GET',\n        headers: {\n          [MULTICHAIN_ACCOUNTS_CLIENT_HEADER]: MULTICHAIN_ACCOUNTS_CLIENT_ID,\n          Accept: 'application/json',\n        },\n      });\n\n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`);\n      }\n\n      const data: unknown = await response.json();\n\n      assert(data, ActiveNetworksResponseStruct);\n      return data;\n    } catch (error) {\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          throw new Error('Request timeout: Failed to fetch active networks');\n        }\n        throw error;\n      }\n\n      throw new Error(`Failed to fetch active networks: ${String(error)}`);\n    }\n  }\n}\n"]}