@metamask-previews/network-controller 29.0.0-preview-9848b08 → 29.0.0-preview-1821148

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 (36) hide show
  1. package/CHANGELOG.md +5 -5
  2. package/dist/NetworkController.cjs.map +1 -1
  3. package/dist/NetworkController.d.cts +6 -17
  4. package/dist/NetworkController.d.cts.map +1 -1
  5. package/dist/NetworkController.d.mts +6 -17
  6. package/dist/NetworkController.d.mts.map +1 -1
  7. package/dist/NetworkController.mjs.map +1 -1
  8. package/dist/create-network-client.cjs +37 -6
  9. package/dist/create-network-client.cjs.map +1 -1
  10. package/dist/create-network-client.d.cts +8 -0
  11. package/dist/create-network-client.d.cts.map +1 -1
  12. package/dist/create-network-client.d.mts +8 -0
  13. package/dist/create-network-client.d.mts.map +1 -1
  14. package/dist/create-network-client.mjs +37 -6
  15. package/dist/create-network-client.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +1 -1
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +1 -1
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/rpc-service/rpc-service-requestable.cjs.map +1 -1
  23. package/dist/rpc-service/rpc-service-requestable.d.cts +0 -3
  24. package/dist/rpc-service/rpc-service-requestable.d.cts.map +1 -1
  25. package/dist/rpc-service/rpc-service-requestable.d.mts +0 -3
  26. package/dist/rpc-service/rpc-service-requestable.d.mts.map +1 -1
  27. package/dist/rpc-service/rpc-service-requestable.mjs.map +1 -1
  28. package/dist/rpc-service/rpc-service.cjs +25 -39
  29. package/dist/rpc-service/rpc-service.cjs.map +1 -1
  30. package/dist/rpc-service/rpc-service.d.cts +32 -8
  31. package/dist/rpc-service/rpc-service.d.cts.map +1 -1
  32. package/dist/rpc-service/rpc-service.d.mts +32 -8
  33. package/dist/rpc-service/rpc-service.d.mts.map +1 -1
  34. package/dist/rpc-service/rpc-service.mjs +21 -39
  35. package/dist/rpc-service/rpc-service.mjs.map +1 -1
  36. package/package.json +1 -1
@@ -10,9 +10,38 @@ const eth_json_rpc_provider_1 = require("@metamask/eth-json-rpc-provider");
10
10
  const eth_json_rpc_provider_2 = require("@metamask/eth-json-rpc-provider");
11
11
  const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
12
12
  const v2_1 = require("@metamask/json-rpc-engine/v2");
13
+ const rpc_service_1 = require("./rpc-service/rpc-service.cjs");
13
14
  const rpc_service_chain_1 = require("./rpc-service/rpc-service-chain.cjs");
14
15
  const types_1 = require("./types.cjs");
15
16
  const SECOND = 1000;
17
+ /**
18
+ * Classifies the error that was being retried when retries were exhausted.
19
+ *
20
+ * @param error - The error from the last retry attempt.
21
+ * @returns A classification string, or `undefined` if the error doesn't match
22
+ * any known category.
23
+ */
24
+ function classifyRetryReason(error) {
25
+ if (!(error instanceof Error)) {
26
+ return undefined;
27
+ }
28
+ if ((0, rpc_service_1.isConnectionError)(error)) {
29
+ return 'connection_failed';
30
+ }
31
+ if ((0, rpc_service_1.isJsonParseError)(error)) {
32
+ return 'response_not_json';
33
+ }
34
+ if ((0, rpc_service_1.isHttpServerError)(error)) {
35
+ return 'non_successful_response';
36
+ }
37
+ if ((0, rpc_service_1.isTimeoutError)(error)) {
38
+ return 'timed_out';
39
+ }
40
+ if ((0, rpc_service_1.isConnectionResetError)(error)) {
41
+ return 'connection_reset';
42
+ }
43
+ return undefined;
44
+ }
16
45
  /**
17
46
  * Create a JSON RPC network client for a specific network.
18
47
  *
@@ -182,19 +211,21 @@ function createRpcServiceChain({ id, primaryEndpointUrl, configuration, getRpcSe
182
211
  error,
183
212
  });
184
213
  });
185
- rpcServiceChain.onDegraded(({ rpcMethodName, degradedType, retriedError, ...rest }) => {
214
+ rpcServiceChain.onDegraded(({ rpcMethodName, ...rest }) => {
186
215
  const error = getError(rest);
216
+ const type = error === undefined ? 'slow_success' : 'retries_exhausted';
187
217
  messenger.publish('NetworkController:rpcEndpointChainDegraded', {
188
218
  chainId: configuration.chainId,
189
219
  networkClientId: id,
190
220
  error,
191
221
  rpcMethodName,
192
- degradedType,
193
- retriedError,
222
+ type,
223
+ retryReason: error === undefined ? undefined : classifyRetryReason(error),
194
224
  });
195
225
  });
196
- rpcServiceChain.onServiceDegraded(({ endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, rpcMethodName, degradedType, retriedError, ...rest }) => {
226
+ rpcServiceChain.onServiceDegraded(({ endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, rpcMethodName, ...rest }) => {
197
227
  const error = getError(rest);
228
+ const type = error === undefined ? 'slow_success' : 'retries_exhausted';
198
229
  messenger.publish('NetworkController:rpcEndpointDegraded', {
199
230
  chainId: configuration.chainId,
200
231
  networkClientId: id,
@@ -202,8 +233,8 @@ function createRpcServiceChain({ id, primaryEndpointUrl, configuration, getRpcSe
202
233
  endpointUrl,
203
234
  error,
204
235
  rpcMethodName,
205
- degradedType,
206
- retriedError,
236
+ type,
237
+ retryReason: error === undefined ? undefined : classifyRetryReason(error),
207
238
  });
208
239
  });
209
240
  rpcServiceChain.onAvailable(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"create-network-client.cjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONNECTIVITY_STATUSES } from '@metamask/connectivity-controller';\nimport type {\n CockatielFailureReason,\n InfuraNetworkType,\n} from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\nimport type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport { InternalProvider } from '@metamask/eth-json-rpc-provider';\nimport { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider';\nimport { asV2Middleware } from '@metamask/json-rpc-engine';\nimport {\n createScaffoldMiddleware,\n JsonRpcEngineV2,\n} from '@metamask/json-rpc-engine/v2';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptions } from './rpc-service/rpc-service';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\ntype RpcApiMiddleware = JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string }>\n>;\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.getBlockTrackerOptions - Factory for constructing block tracker\n * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The network client.\n */\nexport function createNetworkClient({\n id,\n configuration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): NetworkClient {\n const primaryEndpointUrl =\n configuration.type === NetworkClientType.Infura\n ? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`\n : configuration.rpcUrl;\n const rpcServiceChain = createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n });\n\n let rpcApiMiddleware: RpcApiMiddleware;\n if (configuration.type === NetworkClientType.Infura) {\n rpcApiMiddleware = asV2Middleware(\n createInfuraMiddleware({\n rpcService: rpcServiceChain,\n options: {\n source: 'metamask',\n },\n }),\n );\n } else {\n rpcApiMiddleware = createFetchMiddleware({ rpcService: rpcServiceChain });\n }\n\n const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);\n\n const blockTracker = createBlockTracker({\n networkClientType: configuration.type,\n endpointUrl: primaryEndpointUrl,\n getOptions: getBlockTrackerOptions,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: configuration.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: configuration.chainId,\n rpcApiMiddleware,\n });\n\n const provider: Provider = new InternalProvider({\n engine: JsonRpcEngineV2.create({\n middleware: [networkMiddleware],\n }),\n });\n\n const destroy = (): void => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n blockTracker.destroy();\n };\n\n return { configuration, provider, blockTracker, destroy };\n}\n\n/**\n * Creates an RPC service chain, which represents the primary endpoint URL for\n * the network as well as its failover URLs.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.primaryEndpointUrl - The primary endpoint URL.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The RPC service chain.\n */\nfunction createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpointUrls: [string, ...string[]] = isRpcFailoverEnabled\n ? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]\n : [primaryEndpointUrl];\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n const rpcServiceConfigurations = availableEndpointUrls.map((endpointUrl) => ({\n ...getRpcServiceOptions(endpointUrl),\n endpointUrl,\n logger,\n isOffline,\n }));\n\n /**\n * Extracts the error from Cockatiel's `FailureReason` type received in\n * circuit breaker event handlers.\n *\n * The `FailureReason` object can have two possible shapes:\n * - `{ error: Error }` - When the RPC service throws an error (the common\n * case for RPC failures).\n * - `{ value: T }` - When the RPC service returns a value that the retry\n * filter policy considers a failure.\n *\n * @param value - The event data object from the circuit breaker event\n * listener (after destructuring known properties like `endpointUrl`). This\n * represents Cockatiel's `FailureReason` type.\n * @returns The error or failure value, or `undefined` if neither property\n * exists (which shouldn't happen in practice unless the circuit breaker is\n * manually isolated).\n */\n const getError = (\n value: CockatielFailureReason<unknown> | Record<never, never>,\n ): Error | unknown | undefined => {\n if ('error' in value) {\n return value.error;\n } else if ('value' in value) {\n return value.value;\n }\n return undefined;\n };\n\n const rpcServiceChain = new RpcServiceChain([\n rpcServiceConfigurations[0],\n ...rpcServiceConfigurations.slice(1),\n ]);\n\n rpcServiceChain.onBreak((data) => {\n const error = getError(data);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointChainUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n });\n });\n\n rpcServiceChain.onServiceBreak(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n ...rest\n }) => {\n const error = getError(rest);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n });\n },\n );\n\n rpcServiceChain.onDegraded(\n ({ rpcMethodName, degradedType, retriedError, ...rest }) => {\n const error = getError(rest);\n messenger.publish('NetworkController:rpcEndpointChainDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n rpcMethodName,\n degradedType,\n retriedError,\n });\n },\n );\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n degradedType,\n retriedError,\n ...rest\n }) => {\n const error = getError(rest);\n\n messenger.publish('NetworkController:rpcEndpointDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n rpcMethodName,\n degradedType,\n retriedError,\n });\n },\n );\n\n rpcServiceChain.onAvailable(() => {\n messenger.publish('NetworkController:rpcEndpointChainAvailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n });\n });\n\n rpcServiceChain.onServiceRetry(\n ({\n attempt,\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n }) => {\n messenger.publish('NetworkController:rpcEndpointRetried', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n attempt,\n });\n },\n );\n\n return rpcServiceChain;\n}\n\n/**\n * Create the block tracker for the network.\n *\n * @param args - The arguments.\n * @param args.networkClientType - The type of the network client (\"infura\" or\n * \"custom\").\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.getOptions - Factory for the block tracker options.\n * @param args.provider - The EIP-1193 provider for the network's JSON-RPC\n * middleware stack.\n * @returns The created block tracker.\n */\nfunction createBlockTracker({\n networkClientType,\n endpointUrl,\n getOptions,\n provider,\n}: {\n networkClientType: NetworkClientType;\n endpointUrl: string;\n getOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n provider: InternalProvider;\n}): PollingBlockTracker {\n const testOptions =\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? { pollingInterval: SECOND }\n : {};\n\n return new PollingBlockTracker({\n ...testOptions,\n ...getOptions(endpointUrl),\n provider,\n });\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: InternalProvider;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n return JsonRpcEngineV2.create({\n middleware: [\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcRequest, Json> => {\n return ({ request, next }) => {\n if (request.method === 'eth_chainId') {\n return chainId;\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return JsonRpcEngineV2.create({\n middleware: [\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json\n> {\n return async ({ request, next }) => {\n if (request.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n };\n}\n"]}
1
+ {"version":3,"file":"create-network-client.cjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONNECTIVITY_STATUSES } from '@metamask/connectivity-controller';\nimport type {\n CockatielFailureReason,\n InfuraNetworkType,\n} from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\nimport type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport { InternalProvider } from '@metamask/eth-json-rpc-provider';\nimport { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider';\nimport { asV2Middleware } from '@metamask/json-rpc-engine';\nimport {\n createScaffoldMiddleware,\n JsonRpcEngineV2,\n} from '@metamask/json-rpc-engine/v2';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptions } from './rpc-service/rpc-service';\nimport {\n isConnectionError,\n isConnectionResetError,\n isJsonParseError,\n isHttpServerError,\n isTimeoutError,\n} from './rpc-service/rpc-service';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * Why the degraded event was emitted.\n */\nexport type DegradedEventType = 'slow_success' | 'retries_exhausted';\n\n/**\n * The category of error that was retried until retries were exhausted.\n */\nexport type RetryReason =\n | 'connection_failed'\n | 'response_not_json'\n | 'non_successful_response'\n | 'timed_out'\n | 'connection_reset';\n\n/**\n * Classifies the error that was being retried when retries were exhausted.\n *\n * @param error - The error from the last retry attempt.\n * @returns A classification string, or `undefined` if the error doesn't match\n * any known category.\n */\nfunction classifyRetryReason(error: unknown): RetryReason | undefined {\n if (!(error instanceof Error)) {\n return undefined;\n }\n if (isConnectionError(error)) {\n return 'connection_failed';\n }\n if (isJsonParseError(error)) {\n return 'response_not_json';\n }\n if (isHttpServerError(error)) {\n return 'non_successful_response';\n }\n if (isTimeoutError(error)) {\n return 'timed_out';\n }\n if (isConnectionResetError(error)) {\n return 'connection_reset';\n }\n return undefined;\n}\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\ntype RpcApiMiddleware = JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string }>\n>;\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.getBlockTrackerOptions - Factory for constructing block tracker\n * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The network client.\n */\nexport function createNetworkClient({\n id,\n configuration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): NetworkClient {\n const primaryEndpointUrl =\n configuration.type === NetworkClientType.Infura\n ? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`\n : configuration.rpcUrl;\n const rpcServiceChain = createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n });\n\n let rpcApiMiddleware: RpcApiMiddleware;\n if (configuration.type === NetworkClientType.Infura) {\n rpcApiMiddleware = asV2Middleware(\n createInfuraMiddleware({\n rpcService: rpcServiceChain,\n options: {\n source: 'metamask',\n },\n }),\n );\n } else {\n rpcApiMiddleware = createFetchMiddleware({ rpcService: rpcServiceChain });\n }\n\n const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);\n\n const blockTracker = createBlockTracker({\n networkClientType: configuration.type,\n endpointUrl: primaryEndpointUrl,\n getOptions: getBlockTrackerOptions,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: configuration.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: configuration.chainId,\n rpcApiMiddleware,\n });\n\n const provider: Provider = new InternalProvider({\n engine: JsonRpcEngineV2.create({\n middleware: [networkMiddleware],\n }),\n });\n\n const destroy = (): void => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n blockTracker.destroy();\n };\n\n return { configuration, provider, blockTracker, destroy };\n}\n\n/**\n * Creates an RPC service chain, which represents the primary endpoint URL for\n * the network as well as its failover URLs.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.primaryEndpointUrl - The primary endpoint URL.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The RPC service chain.\n */\nfunction createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpointUrls: [string, ...string[]] = isRpcFailoverEnabled\n ? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]\n : [primaryEndpointUrl];\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n const rpcServiceConfigurations = availableEndpointUrls.map((endpointUrl) => ({\n ...getRpcServiceOptions(endpointUrl),\n endpointUrl,\n logger,\n isOffline,\n }));\n\n /**\n * Extracts the error from Cockatiel's `FailureReason` type received in\n * circuit breaker event handlers.\n *\n * The `FailureReason` object can have two possible shapes:\n * - `{ error: Error }` - When the RPC service throws an error (the common\n * case for RPC failures).\n * - `{ value: T }` - When the RPC service returns a value that the retry\n * filter policy considers a failure.\n *\n * @param value - The event data object from the circuit breaker event\n * listener (after destructuring known properties like `endpointUrl`). This\n * represents Cockatiel's `FailureReason` type.\n * @returns The error or failure value, or `undefined` if neither property\n * exists (which shouldn't happen in practice unless the circuit breaker is\n * manually isolated).\n */\n const getError = (\n value: CockatielFailureReason<unknown> | Record<never, never>,\n ): Error | unknown | undefined => {\n if ('error' in value) {\n return value.error;\n } else if ('value' in value) {\n return value.value;\n }\n return undefined;\n };\n\n const rpcServiceChain = new RpcServiceChain([\n rpcServiceConfigurations[0],\n ...rpcServiceConfigurations.slice(1),\n ]);\n\n rpcServiceChain.onBreak((data) => {\n const error = getError(data);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointChainUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n });\n });\n\n rpcServiceChain.onServiceBreak(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n ...rest\n }) => {\n const error = getError(rest);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n });\n },\n );\n\n rpcServiceChain.onDegraded(({ rpcMethodName, ...rest }) => {\n const error = getError(rest);\n const type: DegradedEventType =\n error === undefined ? 'slow_success' : 'retries_exhausted';\n messenger.publish('NetworkController:rpcEndpointChainDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n rpcMethodName,\n type,\n retryReason: error === undefined ? undefined : classifyRetryReason(error),\n });\n });\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n ...rest\n }) => {\n const error = getError(rest);\n const type: DegradedEventType =\n error === undefined ? 'slow_success' : 'retries_exhausted';\n\n messenger.publish('NetworkController:rpcEndpointDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n rpcMethodName,\n type,\n retryReason:\n error === undefined ? undefined : classifyRetryReason(error),\n });\n },\n );\n\n rpcServiceChain.onAvailable(() => {\n messenger.publish('NetworkController:rpcEndpointChainAvailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n });\n });\n\n rpcServiceChain.onServiceRetry(\n ({\n attempt,\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n }) => {\n messenger.publish('NetworkController:rpcEndpointRetried', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n attempt,\n });\n },\n );\n\n return rpcServiceChain;\n}\n\n/**\n * Create the block tracker for the network.\n *\n * @param args - The arguments.\n * @param args.networkClientType - The type of the network client (\"infura\" or\n * \"custom\").\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.getOptions - Factory for the block tracker options.\n * @param args.provider - The EIP-1193 provider for the network's JSON-RPC\n * middleware stack.\n * @returns The created block tracker.\n */\nfunction createBlockTracker({\n networkClientType,\n endpointUrl,\n getOptions,\n provider,\n}: {\n networkClientType: NetworkClientType;\n endpointUrl: string;\n getOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n provider: InternalProvider;\n}): PollingBlockTracker {\n const testOptions =\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? { pollingInterval: SECOND }\n : {};\n\n return new PollingBlockTracker({\n ...testOptions,\n ...getOptions(endpointUrl),\n provider,\n });\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: InternalProvider;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n return JsonRpcEngineV2.create({\n middleware: [\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcRequest, Json> => {\n return ({ request, next }) => {\n if (request.method === 'eth_chainId') {\n return chainId;\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return JsonRpcEngineV2.create({\n middleware: [\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json\n> {\n return async ({ request, next }) => {\n if (request.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n };\n}\n"]}
@@ -3,6 +3,14 @@ import type { Logger } from "loglevel";
3
3
  import type { NetworkClientId, NetworkControllerMessenger } from "./NetworkController.cjs";
4
4
  import type { RpcServiceOptions } from "./rpc-service/rpc-service.cjs";
5
5
  import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.cjs";
6
+ /**
7
+ * Why the degraded event was emitted.
8
+ */
9
+ export type DegradedEventType = 'slow_success' | 'retries_exhausted';
10
+ /**
11
+ * The category of error that was retried until retries were exhausted.
12
+ */
13
+ export type RetryReason = 'connection_failed' | 'response_not_json' | 'non_successful_response' | 'timed_out' | 'connection_reset';
6
14
  /**
7
15
  * The pair of provider / block tracker that can be used to interface with the
8
16
  * network and respond to new activity.
@@ -1 +1 @@
1
- {"version":3,"file":"create-network-client.d.cts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAwB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA4B;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AAEnE,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC;IAChE,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
1
+ {"version":3,"file":"create-network-client.d.cts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAwB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA4B;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AASnE,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,yBAAyB,GACzB,WAAW,GACX,kBAAkB,CAAC;AA+BvB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC;IAChE,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
@@ -3,6 +3,14 @@ import type { Logger } from "loglevel";
3
3
  import type { NetworkClientId, NetworkControllerMessenger } from "./NetworkController.mjs";
4
4
  import type { RpcServiceOptions } from "./rpc-service/rpc-service.mjs";
5
5
  import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.mjs";
6
+ /**
7
+ * Why the degraded event was emitted.
8
+ */
9
+ export type DegradedEventType = 'slow_success' | 'retries_exhausted';
10
+ /**
11
+ * The category of error that was retried until retries were exhausted.
12
+ */
13
+ export type RetryReason = 'connection_failed' | 'response_not_json' | 'non_successful_response' | 'timed_out' | 'connection_reset';
6
14
  /**
7
15
  * The pair of provider / block tracker that can be used to interface with the
8
16
  * network and respond to new activity.
@@ -1 +1 @@
1
- {"version":3,"file":"create-network-client.d.mts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAwB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA4B;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AAEnE,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC;IAChE,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
1
+ {"version":3,"file":"create-network-client.d.mts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAwB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA4B;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AASnE,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,yBAAyB,GACzB,WAAW,GACX,kBAAkB,CAAC;AA+BvB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC;IAChE,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
@@ -7,9 +7,38 @@ import { InternalProvider } from "@metamask/eth-json-rpc-provider";
7
7
  import { providerFromMiddlewareV2 } from "@metamask/eth-json-rpc-provider";
8
8
  import { asV2Middleware } from "@metamask/json-rpc-engine";
9
9
  import { createScaffoldMiddleware, JsonRpcEngineV2 } from "@metamask/json-rpc-engine/v2";
10
+ import { isConnectionError, isConnectionResetError, isJsonParseError, isHttpServerError, isTimeoutError } from "./rpc-service/rpc-service.mjs";
10
11
  import { RpcServiceChain } from "./rpc-service/rpc-service-chain.mjs";
11
12
  import { NetworkClientType } from "./types.mjs";
12
13
  const SECOND = 1000;
14
+ /**
15
+ * Classifies the error that was being retried when retries were exhausted.
16
+ *
17
+ * @param error - The error from the last retry attempt.
18
+ * @returns A classification string, or `undefined` if the error doesn't match
19
+ * any known category.
20
+ */
21
+ function classifyRetryReason(error) {
22
+ if (!(error instanceof Error)) {
23
+ return undefined;
24
+ }
25
+ if (isConnectionError(error)) {
26
+ return 'connection_failed';
27
+ }
28
+ if (isJsonParseError(error)) {
29
+ return 'response_not_json';
30
+ }
31
+ if (isHttpServerError(error)) {
32
+ return 'non_successful_response';
33
+ }
34
+ if (isTimeoutError(error)) {
35
+ return 'timed_out';
36
+ }
37
+ if (isConnectionResetError(error)) {
38
+ return 'connection_reset';
39
+ }
40
+ return undefined;
41
+ }
13
42
  /**
14
43
  * Create a JSON RPC network client for a specific network.
15
44
  *
@@ -178,19 +207,21 @@ function createRpcServiceChain({ id, primaryEndpointUrl, configuration, getRpcSe
178
207
  error,
179
208
  });
180
209
  });
181
- rpcServiceChain.onDegraded(({ rpcMethodName, degradedType, retriedError, ...rest }) => {
210
+ rpcServiceChain.onDegraded(({ rpcMethodName, ...rest }) => {
182
211
  const error = getError(rest);
212
+ const type = error === undefined ? 'slow_success' : 'retries_exhausted';
183
213
  messenger.publish('NetworkController:rpcEndpointChainDegraded', {
184
214
  chainId: configuration.chainId,
185
215
  networkClientId: id,
186
216
  error,
187
217
  rpcMethodName,
188
- degradedType,
189
- retriedError,
218
+ type,
219
+ retryReason: error === undefined ? undefined : classifyRetryReason(error),
190
220
  });
191
221
  });
192
- rpcServiceChain.onServiceDegraded(({ endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, rpcMethodName, degradedType, retriedError, ...rest }) => {
222
+ rpcServiceChain.onServiceDegraded(({ endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, rpcMethodName, ...rest }) => {
193
223
  const error = getError(rest);
224
+ const type = error === undefined ? 'slow_success' : 'retries_exhausted';
194
225
  messenger.publish('NetworkController:rpcEndpointDegraded', {
195
226
  chainId: configuration.chainId,
196
227
  networkClientId: id,
@@ -198,8 +229,8 @@ function createRpcServiceChain({ id, primaryEndpointUrl, configuration, getRpcSe
198
229
  endpointUrl,
199
230
  error,
200
231
  rpcMethodName,
201
- degradedType,
202
- retriedError,
232
+ type,
233
+ retryReason: error === undefined ? undefined : classifyRetryReason(error),
203
234
  });
204
235
  });
205
236
  rpcServiceChain.onAvailable(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"create-network-client.mjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONNECTIVITY_STATUSES } from '@metamask/connectivity-controller';\nimport type {\n CockatielFailureReason,\n InfuraNetworkType,\n} from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\nimport type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport { InternalProvider } from '@metamask/eth-json-rpc-provider';\nimport { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider';\nimport { asV2Middleware } from '@metamask/json-rpc-engine';\nimport {\n createScaffoldMiddleware,\n JsonRpcEngineV2,\n} from '@metamask/json-rpc-engine/v2';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptions } from './rpc-service/rpc-service';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\ntype RpcApiMiddleware = JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string }>\n>;\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.getBlockTrackerOptions - Factory for constructing block tracker\n * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The network client.\n */\nexport function createNetworkClient({\n id,\n configuration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): NetworkClient {\n const primaryEndpointUrl =\n configuration.type === NetworkClientType.Infura\n ? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`\n : configuration.rpcUrl;\n const rpcServiceChain = createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n });\n\n let rpcApiMiddleware: RpcApiMiddleware;\n if (configuration.type === NetworkClientType.Infura) {\n rpcApiMiddleware = asV2Middleware(\n createInfuraMiddleware({\n rpcService: rpcServiceChain,\n options: {\n source: 'metamask',\n },\n }),\n );\n } else {\n rpcApiMiddleware = createFetchMiddleware({ rpcService: rpcServiceChain });\n }\n\n const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);\n\n const blockTracker = createBlockTracker({\n networkClientType: configuration.type,\n endpointUrl: primaryEndpointUrl,\n getOptions: getBlockTrackerOptions,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: configuration.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: configuration.chainId,\n rpcApiMiddleware,\n });\n\n const provider: Provider = new InternalProvider({\n engine: JsonRpcEngineV2.create({\n middleware: [networkMiddleware],\n }),\n });\n\n const destroy = (): void => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n blockTracker.destroy();\n };\n\n return { configuration, provider, blockTracker, destroy };\n}\n\n/**\n * Creates an RPC service chain, which represents the primary endpoint URL for\n * the network as well as its failover URLs.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.primaryEndpointUrl - The primary endpoint URL.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The RPC service chain.\n */\nfunction createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpointUrls: [string, ...string[]] = isRpcFailoverEnabled\n ? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]\n : [primaryEndpointUrl];\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n const rpcServiceConfigurations = availableEndpointUrls.map((endpointUrl) => ({\n ...getRpcServiceOptions(endpointUrl),\n endpointUrl,\n logger,\n isOffline,\n }));\n\n /**\n * Extracts the error from Cockatiel's `FailureReason` type received in\n * circuit breaker event handlers.\n *\n * The `FailureReason` object can have two possible shapes:\n * - `{ error: Error }` - When the RPC service throws an error (the common\n * case for RPC failures).\n * - `{ value: T }` - When the RPC service returns a value that the retry\n * filter policy considers a failure.\n *\n * @param value - The event data object from the circuit breaker event\n * listener (after destructuring known properties like `endpointUrl`). This\n * represents Cockatiel's `FailureReason` type.\n * @returns The error or failure value, or `undefined` if neither property\n * exists (which shouldn't happen in practice unless the circuit breaker is\n * manually isolated).\n */\n const getError = (\n value: CockatielFailureReason<unknown> | Record<never, never>,\n ): Error | unknown | undefined => {\n if ('error' in value) {\n return value.error;\n } else if ('value' in value) {\n return value.value;\n }\n return undefined;\n };\n\n const rpcServiceChain = new RpcServiceChain([\n rpcServiceConfigurations[0],\n ...rpcServiceConfigurations.slice(1),\n ]);\n\n rpcServiceChain.onBreak((data) => {\n const error = getError(data);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointChainUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n });\n });\n\n rpcServiceChain.onServiceBreak(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n ...rest\n }) => {\n const error = getError(rest);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n });\n },\n );\n\n rpcServiceChain.onDegraded(\n ({ rpcMethodName, degradedType, retriedError, ...rest }) => {\n const error = getError(rest);\n messenger.publish('NetworkController:rpcEndpointChainDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n rpcMethodName,\n degradedType,\n retriedError,\n });\n },\n );\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n degradedType,\n retriedError,\n ...rest\n }) => {\n const error = getError(rest);\n\n messenger.publish('NetworkController:rpcEndpointDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n rpcMethodName,\n degradedType,\n retriedError,\n });\n },\n );\n\n rpcServiceChain.onAvailable(() => {\n messenger.publish('NetworkController:rpcEndpointChainAvailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n });\n });\n\n rpcServiceChain.onServiceRetry(\n ({\n attempt,\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n }) => {\n messenger.publish('NetworkController:rpcEndpointRetried', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n attempt,\n });\n },\n );\n\n return rpcServiceChain;\n}\n\n/**\n * Create the block tracker for the network.\n *\n * @param args - The arguments.\n * @param args.networkClientType - The type of the network client (\"infura\" or\n * \"custom\").\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.getOptions - Factory for the block tracker options.\n * @param args.provider - The EIP-1193 provider for the network's JSON-RPC\n * middleware stack.\n * @returns The created block tracker.\n */\nfunction createBlockTracker({\n networkClientType,\n endpointUrl,\n getOptions,\n provider,\n}: {\n networkClientType: NetworkClientType;\n endpointUrl: string;\n getOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n provider: InternalProvider;\n}): PollingBlockTracker {\n const testOptions =\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? { pollingInterval: SECOND }\n : {};\n\n return new PollingBlockTracker({\n ...testOptions,\n ...getOptions(endpointUrl),\n provider,\n });\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: InternalProvider;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n return JsonRpcEngineV2.create({\n middleware: [\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcRequest, Json> => {\n return ({ request, next }) => {\n if (request.method === 'eth_chainId') {\n return chainId;\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return JsonRpcEngineV2.create({\n middleware: [\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json\n> {\n return async ({ request, next }) => {\n if (request.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n };\n}\n"]}
1
+ {"version":3,"file":"create-network-client.mjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONNECTIVITY_STATUSES } from '@metamask/connectivity-controller';\nimport type {\n CockatielFailureReason,\n InfuraNetworkType,\n} from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\nimport type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport { InternalProvider } from '@metamask/eth-json-rpc-provider';\nimport { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider';\nimport { asV2Middleware } from '@metamask/json-rpc-engine';\nimport {\n createScaffoldMiddleware,\n JsonRpcEngineV2,\n} from '@metamask/json-rpc-engine/v2';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptions } from './rpc-service/rpc-service';\nimport {\n isConnectionError,\n isConnectionResetError,\n isJsonParseError,\n isHttpServerError,\n isTimeoutError,\n} from './rpc-service/rpc-service';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * Why the degraded event was emitted.\n */\nexport type DegradedEventType = 'slow_success' | 'retries_exhausted';\n\n/**\n * The category of error that was retried until retries were exhausted.\n */\nexport type RetryReason =\n | 'connection_failed'\n | 'response_not_json'\n | 'non_successful_response'\n | 'timed_out'\n | 'connection_reset';\n\n/**\n * Classifies the error that was being retried when retries were exhausted.\n *\n * @param error - The error from the last retry attempt.\n * @returns A classification string, or `undefined` if the error doesn't match\n * any known category.\n */\nfunction classifyRetryReason(error: unknown): RetryReason | undefined {\n if (!(error instanceof Error)) {\n return undefined;\n }\n if (isConnectionError(error)) {\n return 'connection_failed';\n }\n if (isJsonParseError(error)) {\n return 'response_not_json';\n }\n if (isHttpServerError(error)) {\n return 'non_successful_response';\n }\n if (isTimeoutError(error)) {\n return 'timed_out';\n }\n if (isConnectionResetError(error)) {\n return 'connection_reset';\n }\n return undefined;\n}\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\ntype RpcApiMiddleware = JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string }>\n>;\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.getBlockTrackerOptions - Factory for constructing block tracker\n * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The network client.\n */\nexport function createNetworkClient({\n id,\n configuration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): NetworkClient {\n const primaryEndpointUrl =\n configuration.type === NetworkClientType.Infura\n ? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`\n : configuration.rpcUrl;\n const rpcServiceChain = createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n });\n\n let rpcApiMiddleware: RpcApiMiddleware;\n if (configuration.type === NetworkClientType.Infura) {\n rpcApiMiddleware = asV2Middleware(\n createInfuraMiddleware({\n rpcService: rpcServiceChain,\n options: {\n source: 'metamask',\n },\n }),\n );\n } else {\n rpcApiMiddleware = createFetchMiddleware({ rpcService: rpcServiceChain });\n }\n\n const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);\n\n const blockTracker = createBlockTracker({\n networkClientType: configuration.type,\n endpointUrl: primaryEndpointUrl,\n getOptions: getBlockTrackerOptions,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: configuration.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: configuration.chainId,\n rpcApiMiddleware,\n });\n\n const provider: Provider = new InternalProvider({\n engine: JsonRpcEngineV2.create({\n middleware: [networkMiddleware],\n }),\n });\n\n const destroy = (): void => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n blockTracker.destroy();\n };\n\n return { configuration, provider, blockTracker, destroy };\n}\n\n/**\n * Creates an RPC service chain, which represents the primary endpoint URL for\n * the network as well as its failover URLs.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.primaryEndpointUrl - The primary endpoint URL.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The RPC service chain.\n */\nfunction createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpointUrls: [string, ...string[]] = isRpcFailoverEnabled\n ? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]\n : [primaryEndpointUrl];\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n const rpcServiceConfigurations = availableEndpointUrls.map((endpointUrl) => ({\n ...getRpcServiceOptions(endpointUrl),\n endpointUrl,\n logger,\n isOffline,\n }));\n\n /**\n * Extracts the error from Cockatiel's `FailureReason` type received in\n * circuit breaker event handlers.\n *\n * The `FailureReason` object can have two possible shapes:\n * - `{ error: Error }` - When the RPC service throws an error (the common\n * case for RPC failures).\n * - `{ value: T }` - When the RPC service returns a value that the retry\n * filter policy considers a failure.\n *\n * @param value - The event data object from the circuit breaker event\n * listener (after destructuring known properties like `endpointUrl`). This\n * represents Cockatiel's `FailureReason` type.\n * @returns The error or failure value, or `undefined` if neither property\n * exists (which shouldn't happen in practice unless the circuit breaker is\n * manually isolated).\n */\n const getError = (\n value: CockatielFailureReason<unknown> | Record<never, never>,\n ): Error | unknown | undefined => {\n if ('error' in value) {\n return value.error;\n } else if ('value' in value) {\n return value.value;\n }\n return undefined;\n };\n\n const rpcServiceChain = new RpcServiceChain([\n rpcServiceConfigurations[0],\n ...rpcServiceConfigurations.slice(1),\n ]);\n\n rpcServiceChain.onBreak((data) => {\n const error = getError(data);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointChainUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n });\n });\n\n rpcServiceChain.onServiceBreak(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n ...rest\n }) => {\n const error = getError(rest);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n });\n },\n );\n\n rpcServiceChain.onDegraded(({ rpcMethodName, ...rest }) => {\n const error = getError(rest);\n const type: DegradedEventType =\n error === undefined ? 'slow_success' : 'retries_exhausted';\n messenger.publish('NetworkController:rpcEndpointChainDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n rpcMethodName,\n type,\n retryReason: error === undefined ? undefined : classifyRetryReason(error),\n });\n });\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n ...rest\n }) => {\n const error = getError(rest);\n const type: DegradedEventType =\n error === undefined ? 'slow_success' : 'retries_exhausted';\n\n messenger.publish('NetworkController:rpcEndpointDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n rpcMethodName,\n type,\n retryReason:\n error === undefined ? undefined : classifyRetryReason(error),\n });\n },\n );\n\n rpcServiceChain.onAvailable(() => {\n messenger.publish('NetworkController:rpcEndpointChainAvailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n });\n });\n\n rpcServiceChain.onServiceRetry(\n ({\n attempt,\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n }) => {\n messenger.publish('NetworkController:rpcEndpointRetried', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n attempt,\n });\n },\n );\n\n return rpcServiceChain;\n}\n\n/**\n * Create the block tracker for the network.\n *\n * @param args - The arguments.\n * @param args.networkClientType - The type of the network client (\"infura\" or\n * \"custom\").\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.getOptions - Factory for the block tracker options.\n * @param args.provider - The EIP-1193 provider for the network's JSON-RPC\n * middleware stack.\n * @returns The created block tracker.\n */\nfunction createBlockTracker({\n networkClientType,\n endpointUrl,\n getOptions,\n provider,\n}: {\n networkClientType: NetworkClientType;\n endpointUrl: string;\n getOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n provider: InternalProvider;\n}): PollingBlockTracker {\n const testOptions =\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? { pollingInterval: SECOND }\n : {};\n\n return new PollingBlockTracker({\n ...testOptions,\n ...getOptions(endpointUrl),\n provider,\n });\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: InternalProvider;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n return JsonRpcEngineV2.create({\n middleware: [\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcRequest, Json> => {\n return ({ request, next }) => {\n if (request.method === 'eth_chainId') {\n return chainId;\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: RpcApiMiddleware;\n}): JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string; skipCache: boolean }>\n> {\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return JsonRpcEngineV2.create({\n middleware: [\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json\n> {\n return async ({ request, next }) => {\n if (request.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA6CA,6DAM6B;AAL3B,qIAAA,gCAAgC,OAAA;AAChC,oIAAA,+BAA+B,OAAA;AAC/B,gHAAA,WAAW,OAAA;AACX,sHAAA,iBAAiB,OAAA;AACjB,oHAAA,eAAe,OAAA;AAEjB,kDAA4B;AAO5B,qCAA4C;AAAnC,0GAAA,iBAAiB,OAAA;AAK1B,6DAA8D;AAArD,gHAAA,iBAAiB,OAAA","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkFields,\n UpdateNetworkFields,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetSelectedChainIdAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerAddNetworkAction,\n NetworkControllerRemoveNetworkAction,\n NetworkControllerUpdateNetworkAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n NetworkControllerRpcEndpointChainUnavailableEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n NetworkControllerRpcEndpointChainDegradedEvent,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointChainAvailableEvent,\n NetworkControllerRpcEndpointRetriedEvent,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\nexport type { AbstractRpcService } from './rpc-service/abstract-rpc-service';\nexport type { RpcServiceRequestable } from './rpc-service/rpc-service-requestable';\nexport type { DegradedType, RetriedError } from './rpc-service/rpc-service';\nexport { isConnectionError } from './rpc-service/rpc-service';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA6CA,6DAM6B;AAL3B,qIAAA,gCAAgC,OAAA;AAChC,oIAAA,+BAA+B,OAAA;AAC/B,gHAAA,WAAW,OAAA;AACX,sHAAA,iBAAiB,OAAA;AACjB,oHAAA,eAAe,OAAA;AAEjB,kDAA4B;AAO5B,qCAA4C;AAAnC,0GAAA,iBAAiB,OAAA;AAK1B,6DAA8D;AAArD,gHAAA,iBAAiB,OAAA","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkFields,\n UpdateNetworkFields,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetSelectedChainIdAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerAddNetworkAction,\n NetworkControllerRemoveNetworkAction,\n NetworkControllerUpdateNetworkAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n NetworkControllerRpcEndpointChainUnavailableEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n NetworkControllerRpcEndpointChainDegradedEvent,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointChainAvailableEvent,\n NetworkControllerRpcEndpointRetriedEvent,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\nexport type { AbstractRpcService } from './rpc-service/abstract-rpc-service';\nexport type { RpcServiceRequestable } from './rpc-service/rpc-service-requestable';\nexport type { DegradedEventType, RetryReason } from './create-network-client';\nexport { isConnectionError } from './rpc-service/rpc-service';\n"]}
package/dist/index.d.cts CHANGED
@@ -8,6 +8,6 @@ export { NetworkClientType } from "./types.cjs";
8
8
  export type { NetworkClient } from "./create-network-client.cjs";
9
9
  export type { AbstractRpcService } from "./rpc-service/abstract-rpc-service.cjs";
10
10
  export type { RpcServiceRequestable } from "./rpc-service/rpc-service-requestable.cjs";
11
- export type { DegradedType, RetriedError } from "./rpc-service/rpc-service.cjs";
11
+ export type { DegradedEventType, RetryReason } from "./create-network-client.cjs";
12
12
  export { isConnectionError } from "./rpc-service/rpc-service.cjs";
13
13
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,yDAAyD,EACzD,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,sCAAkC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,sCAAkC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,yDAAyD,EACzD,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,oCAAgC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,sCAAkC"}
package/dist/index.d.mts CHANGED
@@ -8,6 +8,6 @@ export { NetworkClientType } from "./types.mjs";
8
8
  export type { NetworkClient } from "./create-network-client.mjs";
9
9
  export type { AbstractRpcService } from "./rpc-service/abstract-rpc-service.mjs";
10
10
  export type { RpcServiceRequestable } from "./rpc-service/rpc-service-requestable.mjs";
11
- export type { DegradedType, RetriedError } from "./rpc-service/rpc-service.mjs";
11
+ export type { DegradedEventType, RetryReason } from "./create-network-client.mjs";
12
12
  export { isConnectionError } from "./rpc-service/rpc-service.mjs";
13
13
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,yDAAyD,EACzD,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,sCAAkC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,sCAAkC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,wBAAwB,EAAE,iDAA6C;AACrF,YAAY,EACV,KAAK,EACL,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,EACjC,uCAAuC,EACvC,sCAAsC,EACtC,qCAAqC,EACrC,uCAAuC,EACvC,kCAAkC,EAClC,oCAAoC,EACpC,uBAAuB,EACvB,+BAA+B,EAC/B,kCAAkC,EAClC,2CAA2C,EAC3C,+CAA+C,EAC/C,yCAAyC,EACzC,8CAA8C,EAC9C,mDAAmD,EACnD,sCAAsC,EACtC,uCAAuC,EACvC,iCAAiC,EACjC,oCAAoC,EACpC,oCAAoC,EACpC,yDAAyD,EACzD,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iDAAiD,EACjD,4CAA4C,EAC5C,8CAA8C,EAC9C,yCAAyC,EACzC,+CAA+C,EAC/C,wCAAwC,GACzC,gCAA4B;AAC7B,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,GAChB,gCAA4B;AAC7B,gCAA4B;AAC5B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAgB;AACtD,YAAY,EACV,0BAA0B,EAC1B,gCAAgC,EAChC,gCAAgC,GACjC,oBAAgB;AACjB,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAC5C,YAAY,EAAE,aAAa,EAAE,oCAAgC;AAC7D,YAAY,EAAE,kBAAkB,EAAE,+CAA2C;AAC7E,YAAY,EAAE,qBAAqB,EAAE,kDAA8C;AACnF,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,oCAAgC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,sCAAkC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6CA,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,EAChB,gCAA4B;AAC7B,gCAA4B;AAO5B,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAK5C,OAAO,EAAE,iBAAiB,EAAE,sCAAkC","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkFields,\n UpdateNetworkFields,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetSelectedChainIdAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerAddNetworkAction,\n NetworkControllerRemoveNetworkAction,\n NetworkControllerUpdateNetworkAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n NetworkControllerRpcEndpointChainUnavailableEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n NetworkControllerRpcEndpointChainDegradedEvent,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointChainAvailableEvent,\n NetworkControllerRpcEndpointRetriedEvent,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\nexport type { AbstractRpcService } from './rpc-service/abstract-rpc-service';\nexport type { RpcServiceRequestable } from './rpc-service/rpc-service-requestable';\nexport type { DegradedType, RetriedError } from './rpc-service/rpc-service';\nexport { isConnectionError } from './rpc-service/rpc-service';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6CA,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,WAAW,EACX,iBAAiB,EACjB,eAAe,EAChB,gCAA4B;AAC7B,gCAA4B;AAO5B,OAAO,EAAE,iBAAiB,EAAE,oBAAgB;AAK5C,OAAO,EAAE,iBAAiB,EAAE,sCAAkC","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkFields,\n UpdateNetworkFields,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerNetworkAddedEvent,\n NetworkControllerNetworkRemovedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetSelectedChainIdAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerAddNetworkAction,\n NetworkControllerRemoveNetworkAction,\n NetworkControllerUpdateNetworkAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n NetworkControllerRpcEndpointChainUnavailableEvent,\n NetworkControllerRpcEndpointUnavailableEvent,\n NetworkControllerRpcEndpointChainDegradedEvent,\n NetworkControllerRpcEndpointDegradedEvent,\n NetworkControllerRpcEndpointChainAvailableEvent,\n NetworkControllerRpcEndpointRetriedEvent,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\nexport type { AbstractRpcService } from './rpc-service/abstract-rpc-service';\nexport type { RpcServiceRequestable } from './rpc-service/rpc-service-requestable';\nexport type { DegradedEventType, RetryReason } from './create-network-client';\nexport { isConnectionError } from './rpc-service/rpc-service';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-service-requestable.cjs","sourceRoot":"","sources":["../../src/rpc-service/rpc-service-requestable.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServicePolicy } from '@metamask/controller-utils';\nimport type {\n Json,\n JsonRpcParams,\n JsonRpcRequest,\n JsonRpcResponse,\n} from '@metamask/utils';\n\nimport type { DegradedType, RetriedError } from './rpc-service';\nimport type {\n CockatielEventToEventListenerWithData,\n ExcludeCockatielEventData,\n ExtendCockatielEventData,\n ExtractCockatielEventData,\n FetchOptions,\n} from './shared';\n\n/**\n * The interface for a service class responsible for making a request to a\n * target, whether that is a single RPC endpoint or an RPC endpoint in an RPC\n * service chain.\n */\nexport type RpcServiceRequestable = {\n /**\n * Listens for when the RPC service retries the request.\n *\n * @param listener - The callback to be called when the retry occurs.\n * @returns What {@link ServicePolicy.onRetry} returns.\n * @see {@link createServicePolicy}\n */\n onRetry(\n listener: CockatielEventToEventListenerWithData<\n ServicePolicy['onRetry'],\n { endpointUrl: string }\n >,\n ): ReturnType<ServicePolicy['onRetry']>;\n\n /**\n * Listens for when the RPC service retries the request too many times in a\n * row.\n *\n * @param listener - The callback to be called when the circuit is broken.\n * @returns What {@link ServicePolicy.onBreak} returns.\n * @see {@link createServicePolicy}\n */\n onBreak(\n listener: (\n data: ExcludeCockatielEventData<\n ExtendCockatielEventData<\n ExtractCockatielEventData<ServicePolicy['onBreak']>,\n { endpointUrl: string }\n >,\n 'isolated'\n >,\n ) => void,\n ): ReturnType<ServicePolicy['onBreak']>;\n\n /**\n * Listens for when the policy underlying this RPC service detects a slow\n * request.\n *\n * @param listener - The callback to be called when the request is slow.\n * @returns What {@link ServicePolicy.onDegraded} returns.\n * @see {@link createServicePolicy}\n */\n onDegraded(\n listener: CockatielEventToEventListenerWithData<\n ServicePolicy['onDegraded'],\n {\n endpointUrl: string;\n rpcMethodName: string;\n degradedType: DegradedType;\n retriedError?: RetriedError;\n }\n >,\n ): ReturnType<ServicePolicy['onDegraded']>;\n\n /**\n * Listens for when the policy underlying this RPC service is available.\n *\n * @param listener - The callback to be called when the request is available.\n * @returns What {@link ServicePolicy.onDegraded} returns.\n * @see {@link createServicePolicy}\n */\n onAvailable(\n listener: CockatielEventToEventListenerWithData<\n ServicePolicy['onAvailable'],\n { endpointUrl: string }\n >,\n ): ReturnType<ServicePolicy['onAvailable']>;\n\n /**\n * Makes a request to the target.\n */\n request<Params extends JsonRpcParams, Result extends Json>(\n jsonRpcRequest: Readonly<JsonRpcRequest<Params>>,\n fetchOptions?: FetchOptions,\n ): Promise<JsonRpcResponse<Result | null>>;\n};\n"]}
1
+ {"version":3,"file":"rpc-service-requestable.cjs","sourceRoot":"","sources":["../../src/rpc-service/rpc-service-requestable.ts"],"names":[],"mappings":"","sourcesContent":["import type { ServicePolicy } from '@metamask/controller-utils';\nimport type {\n Json,\n JsonRpcParams,\n JsonRpcRequest,\n JsonRpcResponse,\n} from '@metamask/utils';\n\nimport type {\n CockatielEventToEventListenerWithData,\n ExcludeCockatielEventData,\n ExtendCockatielEventData,\n ExtractCockatielEventData,\n FetchOptions,\n} from './shared';\n\n/**\n * The interface for a service class responsible for making a request to a\n * target, whether that is a single RPC endpoint or an RPC endpoint in an RPC\n * service chain.\n */\nexport type RpcServiceRequestable = {\n /**\n * Listens for when the RPC service retries the request.\n *\n * @param listener - The callback to be called when the retry occurs.\n * @returns What {@link ServicePolicy.onRetry} returns.\n * @see {@link createServicePolicy}\n */\n onRetry(\n listener: CockatielEventToEventListenerWithData<\n ServicePolicy['onRetry'],\n { endpointUrl: string }\n >,\n ): ReturnType<ServicePolicy['onRetry']>;\n\n /**\n * Listens for when the RPC service retries the request too many times in a\n * row.\n *\n * @param listener - The callback to be called when the circuit is broken.\n * @returns What {@link ServicePolicy.onBreak} returns.\n * @see {@link createServicePolicy}\n */\n onBreak(\n listener: (\n data: ExcludeCockatielEventData<\n ExtendCockatielEventData<\n ExtractCockatielEventData<ServicePolicy['onBreak']>,\n { endpointUrl: string }\n >,\n 'isolated'\n >,\n ) => void,\n ): ReturnType<ServicePolicy['onBreak']>;\n\n /**\n * Listens for when the policy underlying this RPC service detects a slow\n * request.\n *\n * @param listener - The callback to be called when the request is slow.\n * @returns What {@link ServicePolicy.onDegraded} returns.\n * @see {@link createServicePolicy}\n */\n onDegraded(\n listener: CockatielEventToEventListenerWithData<\n ServicePolicy['onDegraded'],\n { endpointUrl: string; rpcMethodName: string }\n >,\n ): ReturnType<ServicePolicy['onDegraded']>;\n\n /**\n * Listens for when the policy underlying this RPC service is available.\n *\n * @param listener - The callback to be called when the request is available.\n * @returns What {@link ServicePolicy.onDegraded} returns.\n * @see {@link createServicePolicy}\n */\n onAvailable(\n listener: CockatielEventToEventListenerWithData<\n ServicePolicy['onAvailable'],\n { endpointUrl: string }\n >,\n ): ReturnType<ServicePolicy['onAvailable']>;\n\n /**\n * Makes a request to the target.\n */\n request<Params extends JsonRpcParams, Result extends Json>(\n jsonRpcRequest: Readonly<JsonRpcRequest<Params>>,\n fetchOptions?: FetchOptions,\n ): Promise<JsonRpcResponse<Result | null>>;\n};\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { ServicePolicy } from "@metamask/controller-utils";
2
2
  import type { Json, JsonRpcParams, JsonRpcRequest, JsonRpcResponse } from "@metamask/utils";
3
- import type { DegradedType, RetriedError } from "./rpc-service.cjs";
4
3
  import type { CockatielEventToEventListenerWithData, ExcludeCockatielEventData, ExtendCockatielEventData, ExtractCockatielEventData, FetchOptions } from "./shared.cjs";
5
4
  /**
6
5
  * The interface for a service class responsible for making a request to a
@@ -40,8 +39,6 @@ export type RpcServiceRequestable = {
40
39
  onDegraded(listener: CockatielEventToEventListenerWithData<ServicePolicy['onDegraded'], {
41
40
  endpointUrl: string;
42
41
  rpcMethodName: string;
43
- degradedType: DegradedType;
44
- retriedError?: RetriedError;
45
42
  }>): ReturnType<ServicePolicy['onDegraded']>;
46
43
  /**
47
44
  * Listens for when the policy underlying this RPC service is available.
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-service-requestable.d.cts","sourceRoot":"","sources":["../../src/rpc-service/rpc-service-requestable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,cAAc,EACd,eAAe,EAChB,wBAAwB;AAEzB,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,0BAAsB;AAChE,OAAO,KAAK,EACV,qCAAqC,EACrC,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACb,qBAAiB;AAElB;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;OAMG;IACH,OAAO,CACL,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,SAAS,CAAC,EACxB;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,OAAO,CACL,QAAQ,EAAE,CACR,IAAI,EAAE,yBAAyB,CAC7B,wBAAwB,CACtB,yBAAyB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EACnD;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,EACD,UAAU,CACX,KACE,IAAI,GACR,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,YAAY,CAAC,EAC3B;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,YAAY,CAAC;QAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,CACF,GACA,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,WAAW,CACT,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,aAAa,CAAC,EAC5B;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5C;;OAEG;IACH,OAAO,CAAC,MAAM,SAAS,aAAa,EAAE,MAAM,SAAS,IAAI,EACvD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAChD,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CAC5C,CAAC"}
1
+ {"version":3,"file":"rpc-service-requestable.d.cts","sourceRoot":"","sources":["../../src/rpc-service/rpc-service-requestable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,cAAc,EACd,eAAe,EAChB,wBAAwB;AAEzB,OAAO,KAAK,EACV,qCAAqC,EACrC,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACb,qBAAiB;AAElB;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;OAMG;IACH,OAAO,CACL,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,SAAS,CAAC,EACxB;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,OAAO,CACL,QAAQ,EAAE,CACR,IAAI,EAAE,yBAAyB,CAC7B,wBAAwB,CACtB,yBAAyB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EACnD;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,EACD,UAAU,CACX,KACE,IAAI,GACR,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,YAAY,CAAC,EAC3B;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAC/C,GACA,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,WAAW,CACT,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,aAAa,CAAC,EAC5B;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5C;;OAEG;IACH,OAAO,CAAC,MAAM,SAAS,aAAa,EAAE,MAAM,SAAS,IAAI,EACvD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAChD,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CAC5C,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import type { ServicePolicy } from "@metamask/controller-utils";
2
2
  import type { Json, JsonRpcParams, JsonRpcRequest, JsonRpcResponse } from "@metamask/utils";
3
- import type { DegradedType, RetriedError } from "./rpc-service.mjs";
4
3
  import type { CockatielEventToEventListenerWithData, ExcludeCockatielEventData, ExtendCockatielEventData, ExtractCockatielEventData, FetchOptions } from "./shared.mjs";
5
4
  /**
6
5
  * The interface for a service class responsible for making a request to a
@@ -40,8 +39,6 @@ export type RpcServiceRequestable = {
40
39
  onDegraded(listener: CockatielEventToEventListenerWithData<ServicePolicy['onDegraded'], {
41
40
  endpointUrl: string;
42
41
  rpcMethodName: string;
43
- degradedType: DegradedType;
44
- retriedError?: RetriedError;
45
42
  }>): ReturnType<ServicePolicy['onDegraded']>;
46
43
  /**
47
44
  * Listens for when the policy underlying this RPC service is available.
@@ -1 +1 @@
1
- {"version":3,"file":"rpc-service-requestable.d.mts","sourceRoot":"","sources":["../../src/rpc-service/rpc-service-requestable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,cAAc,EACd,eAAe,EAChB,wBAAwB;AAEzB,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,0BAAsB;AAChE,OAAO,KAAK,EACV,qCAAqC,EACrC,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACb,qBAAiB;AAElB;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;OAMG;IACH,OAAO,CACL,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,SAAS,CAAC,EACxB;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,OAAO,CACL,QAAQ,EAAE,CACR,IAAI,EAAE,yBAAyB,CAC7B,wBAAwB,CACtB,yBAAyB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EACnD;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,EACD,UAAU,CACX,KACE,IAAI,GACR,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,YAAY,CAAC,EAC3B;QACE,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,YAAY,CAAC;QAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,CACF,GACA,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,WAAW,CACT,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,aAAa,CAAC,EAC5B;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5C;;OAEG;IACH,OAAO,CAAC,MAAM,SAAS,aAAa,EAAE,MAAM,SAAS,IAAI,EACvD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAChD,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CAC5C,CAAC"}
1
+ {"version":3,"file":"rpc-service-requestable.d.mts","sourceRoot":"","sources":["../../src/rpc-service/rpc-service-requestable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mCAAmC;AAChE,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,cAAc,EACd,eAAe,EAChB,wBAAwB;AAEzB,OAAO,KAAK,EACV,qCAAqC,EACrC,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACb,qBAAiB;AAElB;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;;OAMG;IACH,OAAO,CACL,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,SAAS,CAAC,EACxB;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,OAAO,CACL,QAAQ,EAAE,CACR,IAAI,EAAE,yBAAyB,CAC7B,wBAAwB,CACtB,yBAAyB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EACnD;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,EACD,UAAU,CACX,KACE,IAAI,GACR,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC;;;;;;;OAOG;IACH,UAAU,CACR,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,YAAY,CAAC,EAC3B;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAC/C,GACA,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,WAAW,CACT,QAAQ,EAAE,qCAAqC,CAC7C,aAAa,CAAC,aAAa,CAAC,EAC5B;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CACxB,GACA,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5C;;OAEG;IACH,OAAO,CAAC,MAAM,SAAS,aAAa,EAAE,MAAM,SAAS,IAAI,EACvD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAChD,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CAC5C,CAAC"}