UNPKG

@metamask/multichain-network-controller

Version:
1 lines 5.08 kB
{"version":3,"file":"MultichainNetworkService.cjs","sourceRoot":"","sources":["../../src/MultichainNetworkService/MultichainNetworkService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uDAA+C;AAE/C,mCAA+B;AAE/B,0DAK6B;AAG7B;;GAEG;AACH,MAAa,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,IAAA,cAAK,EAAC,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;AAzFD,4DAyFC;;AAxCC;;;;;;GAMG;AACH,KAAK,8DACH,UAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,qCAAsB,EAAC,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,gDAAiC,CAAC,EAAE,4CAA6B;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,IAAA,oBAAM,EAAC,IAAI,EAAE,2CAA4B,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"]}