@metamask-previews/network-controller 34.0.0-preview-d548cc9a9 → 34.0.0-preview-6c0186513
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.
- package/dist/NetworkController-method-action-types.cjs.map +1 -1
- package/dist/NetworkController-method-action-types.d.cts.map +1 -1
- package/dist/NetworkController-method-action-types.d.mts.map +1 -1
- package/dist/NetworkController-method-action-types.mjs.map +1 -1
- package/dist/NetworkController.cjs +39 -39
- package/dist/NetworkController.cjs.map +1 -1
- package/dist/NetworkController.d.cts.map +1 -1
- package/dist/NetworkController.d.mts.map +1 -1
- package/dist/NetworkController.mjs.map +1 -1
- package/dist/create-auto-managed-network-client.cjs +2 -2
- package/dist/create-auto-managed-network-client.cjs.map +1 -1
- package/dist/create-auto-managed-network-client.d.cts.map +1 -1
- package/dist/create-auto-managed-network-client.d.mts.map +1 -1
- package/dist/create-auto-managed-network-client.mjs.map +1 -1
- package/dist/create-network-client.cjs +13 -13
- package/dist/create-network-client.cjs.map +1 -1
- package/dist/create-network-client.d.cts.map +1 -1
- package/dist/create-network-client.d.mts.map +1 -1
- package/dist/create-network-client.mjs +1 -1
- package/dist/create-network-client.mjs.map +1 -1
- package/dist/index.cjs +12 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/rpc-service/abstract-rpc-service.cjs.map +1 -1
- package/dist/rpc-service/abstract-rpc-service.d.cts.map +1 -1
- package/dist/rpc-service/abstract-rpc-service.d.mts.map +1 -1
- package/dist/rpc-service/abstract-rpc-service.mjs.map +1 -1
- package/dist/rpc-service/rpc-service-chain.cjs +4 -4
- package/dist/rpc-service/rpc-service-chain.cjs.map +1 -1
- package/dist/rpc-service/rpc-service-chain.d.cts.map +1 -1
- package/dist/rpc-service/rpc-service-chain.d.mts.map +1 -1
- package/dist/rpc-service/rpc-service-chain.mjs.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.cjs.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.d.cts.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.d.mts.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.mjs.map +1 -1
- package/dist/rpc-service/rpc-service.cjs +2 -2
- package/dist/rpc-service/rpc-service.cjs.map +1 -1
- package/dist/rpc-service/rpc-service.d.cts.map +1 -1
- package/dist/rpc-service/rpc-service.d.mts.map +1 -1
- package/dist/rpc-service/rpc-service.mjs.map +1 -1
- package/dist/rpc-service-analytics.cjs +2 -2
- package/dist/rpc-service-analytics.cjs.map +1 -1
- package/dist/rpc-service-analytics.d.cts.map +1 -1
- package/dist/rpc-service-analytics.d.mts.map +1 -1
- package/dist/rpc-service-analytics.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createAutoManagedNetworkClient = void 0;
|
|
4
|
-
const
|
|
4
|
+
const create_network_client_js_1 = require("./create-network-client.cjs");
|
|
5
5
|
/**
|
|
6
6
|
* The name of the method on both the provider and block tracker proxy which can
|
|
7
7
|
* be used to get the underlying provider or block tracker from the network
|
|
@@ -45,7 +45,7 @@ function createAutoManagedNetworkClient({ networkClientId, networkClientConfigur
|
|
|
45
45
|
let rpcFailoverMode = givenRpcFailoverMode;
|
|
46
46
|
let networkClient;
|
|
47
47
|
const ensureNetworkClientCreated = () => {
|
|
48
|
-
networkClient ?? (networkClient = (0,
|
|
48
|
+
networkClient ?? (networkClient = (0, create_network_client_js_1.createNetworkClient)({
|
|
49
49
|
id: networkClientId,
|
|
50
50
|
configuration: networkClientConfiguration,
|
|
51
51
|
getRpcServiceOptions,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-auto-managed-network-client.cjs","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":";;;AAKA,uEAA8D;AAa9D;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,YAAY,CAAC;AA8B9C;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,8BAA8B,CAE5C,EACA,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,GAAG,GAGvB,EAAE,CAAC,CAAC,EAAE,CAAC,EACT,SAAS,EACT,eAAe,EAAE,oBAAoB,EACrC,MAAM,GAaP;IACC,IAAI,eAAe,GAAG,oBAAoB,CAAC;IAC3C,IAAI,aAAwC,CAAC;IAE7C,MAAM,0BAA0B,GAAG,GAAkB,EAAE;QACrD,aAAa,KAAb,aAAa,GAAK,IAAA,2CAAmB,EAAC;YACpC,EAAE,EAAE,eAAe;YACnB,aAAa,EAAE,0BAA0B;YACzC,oBAAoB;YACpB,sBAAsB;YACtB,SAAS;YACT,eAAe;YACf,MAAM;SACP,CAAC,EAAC;QAEH,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,oBAAoB,EAAE;QACpD,GAAG,CACD,OAAgB,EAChB,YAAyB,EACzB,QAAiB;YAKjB,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,aAAa,EAAE,QAAQ,CAAC;YACjC,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAElD,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;gBAC7B,+DAA+D;gBAC/D,cAAc;gBACd,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAqC,CAAC,CAAC;gBAC9D,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,kEAAkE;oBAClE,2DAA2D;oBAC3D,gDAAgD;oBAChD,OAAO,UAAyB,GAAG,IAAe;wBAChD,mEAAmE;wBACnE,gEAAgE;wBAChE,sBAAsB;wBACtB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAChE,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,8DAA8D;QAC9D,GAAG,CAAC,OAAY,EAAE,YAAyB;YACzC,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAClD,OAAO,YAAY,IAAI,QAAQ,CAAC;QAClC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAA4C,IAAI,KAAK,CAC1E,oBAAoB,EACpB;QACE,GAAG,CACD,OAAgB,EAChB,YAAyB,EACzB,QAAiB;YAKjB,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,aAAa,EAAE,YAAY,CAAC;YACrC,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAEtD,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;gBACjC,+DAA+D;gBAC/D,cAAc;gBACd,MAAM,KAAK,GAAG,YAAY,CAAC,YAAyC,CAAC,CAAC;gBACtE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,kEAAkE;oBAClE,2DAA2D;oBAC3D,gDAAgD;oBAChD,OAAO,UAAyB,GAAG,IAAe;wBAChD,wDAAwD;wBACxD,+DAA+D;wBAC/D,kCAAkC;wBAClC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpE,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,8DAA8D;QAC9D,GAAG,CAAC,OAAY,EAAE,YAAyB;YACzC,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,YAAY,EAAE,GAAG,0BAA0B,EAAE,CAAC;YACtD,OAAO,YAAY,IAAI,YAAY,CAAC;QACtC,CAAC;KACF,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,aAAa,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,kBAAmC,EAAQ,EAAE;QACvE,eAAe,GAAG,kBAAkB,CAAC;QACrC,OAAO,EAAE,CAAC;QACV,aAAa,GAAG,SAAS,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,0BAA0B;QACzC,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,iBAAiB;QAC/B,OAAO;QACP,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAnKD,wEAmKC","sourcesContent":["import type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { Json } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type { NetworkClient } from './create-network-client';\nimport { createNetworkClient } from './create-network-client';\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptionsWithDefaults } from './rpc-service/rpc-service';\nimport type { RpcFailoverMode } from './selectors';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\n\n/**\n * The name of the method on both the provider and block tracker proxy which can\n * be used to get the underlying provider or block tracker from the network\n * client, when it is initialized.\n */\nconst REFLECTIVE_PROPERTY_NAME = '__target__';\n\n/**\n * Represents a proxy object which wraps a target object. As a proxy, it allows\n * for accessing and setting all of the properties that the target object\n * supports, but also supports an extra propertyName (`__target__`) to access\n * the target itself.\n *\n * @template Type - The type of the target object. It is assumed that this type\n * will be constant even when the target is swapped.\n */\nexport type ProxyWithAccessibleTarget<TargetType> = TargetType & {\n [REFLECTIVE_PROPERTY_NAME]: TargetType;\n};\n\n/**\n * An object that provides the same interface as a network client but where the\n * network client is not initialized until either the provider or block tracker\n * is first accessed.\n */\nexport type AutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n> = {\n configuration: Configuration;\n provider: ProxyWithAccessibleTarget<Provider>;\n blockTracker: ProxyWithAccessibleTarget<BlockTracker>;\n destroy: () => void;\n setRpcFailoverMode: (rpcFailoverMode: RpcFailoverMode) => void;\n};\n\n/**\n * By default, the provider and block provider proxies will point to nothing.\n * This is impossible when using the Proxy API, as the target object has to be\n * something, so this object represents that \"something\".\n */\nconst UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };\n\n/**\n * This function creates two proxies, one that wraps a provider and another that\n * wraps a block tracker. These proxies are unique in that both will be \"empty\"\n * at first; that is, neither will point to a functional provider or block\n * tracker. Instead, as soon as a method or event is accessed on either object\n * that requires a network request to function, a network client is created on\n * the fly and the method or event in question is then forwarded to whichever\n * part of the network client is serving as the receiver. The network client is\n * then cached for subsequent usages.\n *\n * @param args - The arguments.\n * @param args.networkClientId - The ID that will be assigned to the new network\n * client in the registry.\n * @param args.networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @param args.logger - A `loglevel` logger.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>({\n networkClientId,\n networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions = (): Omit<\n PollingBlockTrackerOptions,\n 'provider'\n > => ({}),\n messenger,\n rpcFailoverMode: givenRpcFailoverMode,\n logger,\n}: {\n networkClientId: NetworkClientId;\n networkClientConfiguration: Configuration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions?: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): AutoManagedNetworkClient<Configuration> {\n let rpcFailoverMode = givenRpcFailoverMode;\n let networkClient: NetworkClient | undefined;\n\n const ensureNetworkClientCreated = (): NetworkClient => {\n networkClient ??= createNetworkClient({\n id: networkClientId,\n configuration: networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n rpcFailoverMode,\n logger,\n });\n\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?\",\n );\n }\n\n return networkClient;\n };\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | Provider\n | ((this: unknown, ...args: unknown[]) => Promise<Json> | undefined)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n const { provider } = ensureNetworkClientCreated();\n\n if (propertyName in provider) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = provider[propertyName as keyof typeof provider];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]): Promise<Json> {\n // @ts-expect-error We don't care that `this` may not be compatible\n // with the signature of the method being called, as technically\n // it can be anything.\n return value.apply(this === receiver ? provider : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { provider } = ensureNetworkClientCreated();\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | BlockTracker\n | ((this: unknown, ...args: unknown[]) => unknown)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n const { blockTracker } = ensureNetworkClientCreated();\n\n if (propertyName in blockTracker) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = blockTracker[propertyName as keyof typeof blockTracker];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]) {\n // @ts-expect-error We don't care that `this` may not be\n // compatible with the signature of the method being called, as\n // technically it can be anything.\n return value.apply(this === receiver ? blockTracker : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { blockTracker } = ensureNetworkClientCreated();\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = (): void => {\n networkClient?.destroy();\n };\n\n const setRpcFailoverMode = (newRpcFailoverMode: RpcFailoverMode): void => {\n rpcFailoverMode = newRpcFailoverMode;\n destroy();\n networkClient = undefined;\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n setRpcFailoverMode,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create-auto-managed-network-client.cjs","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":";;;AAKA,0EAAiE;AAajE;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,YAAY,CAAC;AA8B9C;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,8BAA8B,CAE5C,EACA,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,GAAG,GAGvB,EAAE,CAAC,CAAC,EAAE,CAAC,EACT,SAAS,EACT,eAAe,EAAE,oBAAoB,EACrC,MAAM,GAaP;IACC,IAAI,eAAe,GAAG,oBAAoB,CAAC;IAC3C,IAAI,aAAwC,CAAC;IAE7C,MAAM,0BAA0B,GAAG,GAAkB,EAAE;QACrD,aAAa,KAAb,aAAa,GAAK,IAAA,8CAAmB,EAAC;YACpC,EAAE,EAAE,eAAe;YACnB,aAAa,EAAE,0BAA0B;YACzC,oBAAoB;YACpB,sBAAsB;YACtB,SAAS;YACT,eAAe;YACf,MAAM;SACP,CAAC,EAAC;QAEH,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,oBAAoB,EAAE;QACpD,GAAG,CACD,OAAgB,EAChB,YAAyB,EACzB,QAAiB;YAKjB,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,aAAa,EAAE,QAAQ,CAAC;YACjC,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAElD,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;gBAC7B,+DAA+D;gBAC/D,cAAc;gBACd,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAqC,CAAC,CAAC;gBAC9D,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,kEAAkE;oBAClE,2DAA2D;oBAC3D,gDAAgD;oBAChD,OAAO,UAAyB,GAAG,IAAe;wBAChD,mEAAmE;wBACnE,gEAAgE;wBAChE,sBAAsB;wBACtB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAChE,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,8DAA8D;QAC9D,GAAG,CAAC,OAAY,EAAE,YAAyB;YACzC,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAClD,OAAO,YAAY,IAAI,QAAQ,CAAC;QAClC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAA4C,IAAI,KAAK,CAC1E,oBAAoB,EACpB;QACE,GAAG,CACD,OAAgB,EAChB,YAAyB,EACzB,QAAiB;YAKjB,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,aAAa,EAAE,YAAY,CAAC;YACrC,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAEtD,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;gBACjC,+DAA+D;gBAC/D,cAAc;gBACd,MAAM,KAAK,GAAG,YAAY,CAAC,YAAyC,CAAC,CAAC;gBACtE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,kEAAkE;oBAClE,2DAA2D;oBAC3D,gDAAgD;oBAChD,OAAO,UAAyB,GAAG,IAAe;wBAChD,wDAAwD;wBACxD,+DAA+D;wBAC/D,kCAAkC;wBAClC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpE,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,8DAA8D;QAC9D,GAAG,CAAC,OAAY,EAAE,YAAyB;YACzC,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,YAAY,EAAE,GAAG,0BAA0B,EAAE,CAAC;YACtD,OAAO,YAAY,IAAI,YAAY,CAAC;QACtC,CAAC;KACF,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,aAAa,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,kBAAmC,EAAQ,EAAE;QACvE,eAAe,GAAG,kBAAkB,CAAC;QACrC,OAAO,EAAE,CAAC;QACV,aAAa,GAAG,SAAS,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,0BAA0B;QACzC,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,iBAAiB;QAC/B,OAAO;QACP,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAnKD,wEAmKC","sourcesContent":["import type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { Json } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type { NetworkClient } from './create-network-client.js';\nimport { createNetworkClient } from './create-network-client.js';\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController.js';\nimport type { RpcServiceOptionsWithDefaults } from './rpc-service/rpc-service.js';\nimport type { RpcFailoverMode } from './selectors.js';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types.js';\n\n/**\n * The name of the method on both the provider and block tracker proxy which can\n * be used to get the underlying provider or block tracker from the network\n * client, when it is initialized.\n */\nconst REFLECTIVE_PROPERTY_NAME = '__target__';\n\n/**\n * Represents a proxy object which wraps a target object. As a proxy, it allows\n * for accessing and setting all of the properties that the target object\n * supports, but also supports an extra propertyName (`__target__`) to access\n * the target itself.\n *\n * @template Type - The type of the target object. It is assumed that this type\n * will be constant even when the target is swapped.\n */\nexport type ProxyWithAccessibleTarget<TargetType> = TargetType & {\n [REFLECTIVE_PROPERTY_NAME]: TargetType;\n};\n\n/**\n * An object that provides the same interface as a network client but where the\n * network client is not initialized until either the provider or block tracker\n * is first accessed.\n */\nexport type AutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n> = {\n configuration: Configuration;\n provider: ProxyWithAccessibleTarget<Provider>;\n blockTracker: ProxyWithAccessibleTarget<BlockTracker>;\n destroy: () => void;\n setRpcFailoverMode: (rpcFailoverMode: RpcFailoverMode) => void;\n};\n\n/**\n * By default, the provider and block provider proxies will point to nothing.\n * This is impossible when using the Proxy API, as the target object has to be\n * something, so this object represents that \"something\".\n */\nconst UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };\n\n/**\n * This function creates two proxies, one that wraps a provider and another that\n * wraps a block tracker. These proxies are unique in that both will be \"empty\"\n * at first; that is, neither will point to a functional provider or block\n * tracker. Instead, as soon as a method or event is accessed on either object\n * that requires a network request to function, a network client is created on\n * the fly and the method or event in question is then forwarded to whichever\n * part of the network client is serving as the receiver. The network client is\n * then cached for subsequent usages.\n *\n * @param args - The arguments.\n * @param args.networkClientId - The ID that will be assigned to the new network\n * client in the registry.\n * @param args.networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @param args.logger - A `loglevel` logger.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>({\n networkClientId,\n networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions = (): Omit<\n PollingBlockTrackerOptions,\n 'provider'\n > => ({}),\n messenger,\n rpcFailoverMode: givenRpcFailoverMode,\n logger,\n}: {\n networkClientId: NetworkClientId;\n networkClientConfiguration: Configuration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions?: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): AutoManagedNetworkClient<Configuration> {\n let rpcFailoverMode = givenRpcFailoverMode;\n let networkClient: NetworkClient | undefined;\n\n const ensureNetworkClientCreated = (): NetworkClient => {\n networkClient ??= createNetworkClient({\n id: networkClientId,\n configuration: networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n rpcFailoverMode,\n logger,\n });\n\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?\",\n );\n }\n\n return networkClient;\n };\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | Provider\n | ((this: unknown, ...args: unknown[]) => Promise<Json> | undefined)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n const { provider } = ensureNetworkClientCreated();\n\n if (propertyName in provider) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = provider[propertyName as keyof typeof provider];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]): Promise<Json> {\n // @ts-expect-error We don't care that `this` may not be compatible\n // with the signature of the method being called, as technically\n // it can be anything.\n return value.apply(this === receiver ? provider : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { provider } = ensureNetworkClientCreated();\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | BlockTracker\n | ((this: unknown, ...args: unknown[]) => unknown)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n const { blockTracker } = ensureNetworkClientCreated();\n\n if (propertyName in blockTracker) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = blockTracker[propertyName as keyof typeof blockTracker];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]) {\n // @ts-expect-error We don't care that `this` may not be\n // compatible with the signature of the method being called, as\n // technically it can be anything.\n return value.apply(this === receiver ? blockTracker : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { blockTracker } = ensureNetworkClientCreated();\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = (): void => {\n networkClient?.destroy();\n };\n\n const setRpcFailoverMode = (newRpcFailoverMode: RpcFailoverMode): void => {\n rpcFailoverMode = newRpcFailoverMode;\n destroy();\n networkClient = undefined;\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n setRpcFailoverMode,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-auto-managed-network-client.d.cts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAIvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,
|
|
1
|
+
{"version":3,"file":"create-auto-managed-network-client.d.cts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAIvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA+B;AAChC,OAAO,KAAK,EAAE,6BAA6B,EAAE,sCAAqC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAuB;AACtD,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAmB;AAEpB;;;;GAIG;AACH,QAAA,MAAM,wBAAwB,eAAe,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,MAAM,yBAAyB,CAAC,UAAU,IAAI,UAAU,GAAG;IAC/D,CAAC,wBAAwB,CAAC,EAAE,UAAU,CAAC;CACxC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAClC,aAAa,SAAS,0BAA0B,IAC9C;IACF,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC9C,YAAY,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAC;CAChE,CAAC;AASF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,SAAS,0BAA0B,EAChD,EACA,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,sBAGS,EACT,SAAS,EACT,eAAe,EAAE,oBAAoB,EACrC,MAAM,GACP,EAAE;IACD,eAAe,EAAE,eAAe,CAAC;IACjC,0BAA0B,EAAE,aAAa,CAAC;IAC1C,oBAAoB,CAAC,EAAE,CACrB,cAAc,EAAE,MAAM,KACnB,6BAA6B,CAAC;IACnC,sBAAsB,CAAC,EAAE,CACvB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,wBAAwB,CAAC,aAAa,CAAC,CA0I1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-auto-managed-network-client.d.mts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAIvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,
|
|
1
|
+
{"version":3,"file":"create-auto-managed-network-client.d.mts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAE9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAIvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA+B;AAChC,OAAO,KAAK,EAAE,6BAA6B,EAAE,sCAAqC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAuB;AACtD,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAmB;AAEpB;;;;GAIG;AACH,QAAA,MAAM,wBAAwB,eAAe,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,MAAM,yBAAyB,CAAC,UAAU,IAAI,UAAU,GAAG;IAC/D,CAAC,wBAAwB,CAAC,EAAE,UAAU,CAAC;CACxC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAClC,aAAa,SAAS,0BAA0B,IAC9C;IACF,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC9C,YAAY,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAC;CAChE,CAAC;AASF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,SAAS,0BAA0B,EAChD,EACA,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,sBAGS,EACT,SAAS,EACT,eAAe,EAAE,oBAAoB,EACrC,MAAM,GACP,EAAE;IACD,eAAe,EAAE,eAAe,CAAC;IACjC,0BAA0B,EAAE,aAAa,CAAC;IAC1C,oBAAoB,CAAC,EAAE,CACrB,cAAc,EAAE,MAAM,KACnB,6BAA6B,CAAC;IACnC,sBAAsB,CAAC,EAAE,CACvB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,wBAAwB,CAAC,aAAa,CAAC,CA0I1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-auto-managed-network-client.mjs","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { Json } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type { NetworkClient } from './create-network-client';\nimport { createNetworkClient } from './create-network-client';\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptionsWithDefaults } from './rpc-service/rpc-service';\nimport type { RpcFailoverMode } from './selectors';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\n\n/**\n * The name of the method on both the provider and block tracker proxy which can\n * be used to get the underlying provider or block tracker from the network\n * client, when it is initialized.\n */\nconst REFLECTIVE_PROPERTY_NAME = '__target__';\n\n/**\n * Represents a proxy object which wraps a target object. As a proxy, it allows\n * for accessing and setting all of the properties that the target object\n * supports, but also supports an extra propertyName (`__target__`) to access\n * the target itself.\n *\n * @template Type - The type of the target object. It is assumed that this type\n * will be constant even when the target is swapped.\n */\nexport type ProxyWithAccessibleTarget<TargetType> = TargetType & {\n [REFLECTIVE_PROPERTY_NAME]: TargetType;\n};\n\n/**\n * An object that provides the same interface as a network client but where the\n * network client is not initialized until either the provider or block tracker\n * is first accessed.\n */\nexport type AutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n> = {\n configuration: Configuration;\n provider: ProxyWithAccessibleTarget<Provider>;\n blockTracker: ProxyWithAccessibleTarget<BlockTracker>;\n destroy: () => void;\n setRpcFailoverMode: (rpcFailoverMode: RpcFailoverMode) => void;\n};\n\n/**\n * By default, the provider and block provider proxies will point to nothing.\n * This is impossible when using the Proxy API, as the target object has to be\n * something, so this object represents that \"something\".\n */\nconst UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };\n\n/**\n * This function creates two proxies, one that wraps a provider and another that\n * wraps a block tracker. These proxies are unique in that both will be \"empty\"\n * at first; that is, neither will point to a functional provider or block\n * tracker. Instead, as soon as a method or event is accessed on either object\n * that requires a network request to function, a network client is created on\n * the fly and the method or event in question is then forwarded to whichever\n * part of the network client is serving as the receiver. The network client is\n * then cached for subsequent usages.\n *\n * @param args - The arguments.\n * @param args.networkClientId - The ID that will be assigned to the new network\n * client in the registry.\n * @param args.networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @param args.logger - A `loglevel` logger.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>({\n networkClientId,\n networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions = (): Omit<\n PollingBlockTrackerOptions,\n 'provider'\n > => ({}),\n messenger,\n rpcFailoverMode: givenRpcFailoverMode,\n logger,\n}: {\n networkClientId: NetworkClientId;\n networkClientConfiguration: Configuration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions?: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): AutoManagedNetworkClient<Configuration> {\n let rpcFailoverMode = givenRpcFailoverMode;\n let networkClient: NetworkClient | undefined;\n\n const ensureNetworkClientCreated = (): NetworkClient => {\n networkClient ??= createNetworkClient({\n id: networkClientId,\n configuration: networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n rpcFailoverMode,\n logger,\n });\n\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?\",\n );\n }\n\n return networkClient;\n };\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | Provider\n | ((this: unknown, ...args: unknown[]) => Promise<Json> | undefined)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n const { provider } = ensureNetworkClientCreated();\n\n if (propertyName in provider) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = provider[propertyName as keyof typeof provider];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]): Promise<Json> {\n // @ts-expect-error We don't care that `this` may not be compatible\n // with the signature of the method being called, as technically\n // it can be anything.\n return value.apply(this === receiver ? provider : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { provider } = ensureNetworkClientCreated();\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | BlockTracker\n | ((this: unknown, ...args: unknown[]) => unknown)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n const { blockTracker } = ensureNetworkClientCreated();\n\n if (propertyName in blockTracker) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = blockTracker[propertyName as keyof typeof blockTracker];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]) {\n // @ts-expect-error We don't care that `this` may not be\n // compatible with the signature of the method being called, as\n // technically it can be anything.\n return value.apply(this === receiver ? blockTracker : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { blockTracker } = ensureNetworkClientCreated();\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = (): void => {\n networkClient?.destroy();\n };\n\n const setRpcFailoverMode = (newRpcFailoverMode: RpcFailoverMode): void => {\n rpcFailoverMode = newRpcFailoverMode;\n destroy();\n networkClient = undefined;\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n setRpcFailoverMode,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create-auto-managed-network-client.mjs","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,oCAAmC;AAajE;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,YAAY,CAAC;AA8B9C;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,8BAA8B,CAE5C,EACA,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,sBAAsB,GAAG,GAGvB,EAAE,CAAC,CAAC,EAAE,CAAC,EACT,SAAS,EACT,eAAe,EAAE,oBAAoB,EACrC,MAAM,GAaP;IACC,IAAI,eAAe,GAAG,oBAAoB,CAAC;IAC3C,IAAI,aAAwC,CAAC;IAE7C,MAAM,0BAA0B,GAAG,GAAkB,EAAE;QACrD,aAAa,KAAb,aAAa,GAAK,mBAAmB,CAAC;YACpC,EAAE,EAAE,eAAe;YACnB,aAAa,EAAE,0BAA0B;YACzC,oBAAoB;YACpB,sBAAsB;YACtB,SAAS;YACT,eAAe;YACf,MAAM;SACP,CAAC,EAAC;QAEH,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,oBAAoB,EAAE;QACpD,GAAG,CACD,OAAgB,EAChB,YAAyB,EACzB,QAAiB;YAKjB,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,aAAa,EAAE,QAAQ,CAAC;YACjC,CAAC;YAED,MAAM,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAElD,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;gBAC7B,+DAA+D;gBAC/D,cAAc;gBACd,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAqC,CAAC,CAAC;gBAC9D,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,kEAAkE;oBAClE,2DAA2D;oBAC3D,gDAAgD;oBAChD,OAAO,UAAyB,GAAG,IAAe;wBAChD,mEAAmE;wBACnE,gEAAgE;wBAChE,sBAAsB;wBACtB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAChE,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,8DAA8D;QAC9D,GAAG,CAAC,OAAY,EAAE,YAAyB;YACzC,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,QAAQ,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAClD,OAAO,YAAY,IAAI,QAAQ,CAAC;QAClC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAA4C,IAAI,KAAK,CAC1E,oBAAoB,EACpB;QACE,GAAG,CACD,OAAgB,EAChB,YAAyB,EACzB,QAAiB;YAKjB,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,aAAa,EAAE,YAAY,CAAC;YACrC,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,GAAG,0BAA0B,EAAE,CAAC;YAEtD,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;gBACjC,+DAA+D;gBAC/D,cAAc;gBACd,MAAM,KAAK,GAAG,YAAY,CAAC,YAAyC,CAAC,CAAC;gBACtE,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBAChC,kEAAkE;oBAClE,2DAA2D;oBAC3D,gDAAgD;oBAChD,OAAO,UAAyB,GAAG,IAAe;wBAChD,wDAAwD;wBACxD,+DAA+D;wBAC/D,kCAAkC;wBAClC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACpE,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,8DAA8D;QAC9D,GAAG,CAAC,OAAY,EAAE,YAAyB;YACzC,IAAI,YAAY,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,YAAY,EAAE,GAAG,0BAA0B,EAAE,CAAC;YACtD,OAAO,YAAY,IAAI,YAAY,CAAC;QACtC,CAAC;KACF,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,aAAa,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,kBAAmC,EAAQ,EAAE;QACvE,eAAe,GAAG,kBAAkB,CAAC;QACrC,OAAO,EAAE,CAAC;QACV,aAAa,GAAG,SAAS,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,0BAA0B;QACzC,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,iBAAiB;QAC/B,OAAO;QACP,kBAAkB;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { Json } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type { NetworkClient } from './create-network-client.js';\nimport { createNetworkClient } from './create-network-client.js';\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController.js';\nimport type { RpcServiceOptionsWithDefaults } from './rpc-service/rpc-service.js';\nimport type { RpcFailoverMode } from './selectors.js';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types.js';\n\n/**\n * The name of the method on both the provider and block tracker proxy which can\n * be used to get the underlying provider or block tracker from the network\n * client, when it is initialized.\n */\nconst REFLECTIVE_PROPERTY_NAME = '__target__';\n\n/**\n * Represents a proxy object which wraps a target object. As a proxy, it allows\n * for accessing and setting all of the properties that the target object\n * supports, but also supports an extra propertyName (`__target__`) to access\n * the target itself.\n *\n * @template Type - The type of the target object. It is assumed that this type\n * will be constant even when the target is swapped.\n */\nexport type ProxyWithAccessibleTarget<TargetType> = TargetType & {\n [REFLECTIVE_PROPERTY_NAME]: TargetType;\n};\n\n/**\n * An object that provides the same interface as a network client but where the\n * network client is not initialized until either the provider or block tracker\n * is first accessed.\n */\nexport type AutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n> = {\n configuration: Configuration;\n provider: ProxyWithAccessibleTarget<Provider>;\n blockTracker: ProxyWithAccessibleTarget<BlockTracker>;\n destroy: () => void;\n setRpcFailoverMode: (rpcFailoverMode: RpcFailoverMode) => void;\n};\n\n/**\n * By default, the provider and block provider proxies will point to nothing.\n * This is impossible when using the Proxy API, as the target object has to be\n * something, so this object represents that \"something\".\n */\nconst UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };\n\n/**\n * This function creates two proxies, one that wraps a provider and another that\n * wraps a block tracker. These proxies are unique in that both will be \"empty\"\n * at first; that is, neither will point to a functional provider or block\n * tracker. Instead, as soon as a method or event is accessed on either object\n * that requires a network request to function, a network client is created on\n * the fly and the method or event in question is then forwarded to whichever\n * part of the network client is serving as the receiver. The network client is\n * then cached for subsequent usages.\n *\n * @param args - The arguments.\n * @param args.networkClientId - The ID that will be assigned to the new network\n * client in the registry.\n * @param args.networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @param args.logger - A `loglevel` logger.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>({\n networkClientId,\n networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions = (): Omit<\n PollingBlockTrackerOptions,\n 'provider'\n > => ({}),\n messenger,\n rpcFailoverMode: givenRpcFailoverMode,\n logger,\n}: {\n networkClientId: NetworkClientId;\n networkClientConfiguration: Configuration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions?: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): AutoManagedNetworkClient<Configuration> {\n let rpcFailoverMode = givenRpcFailoverMode;\n let networkClient: NetworkClient | undefined;\n\n const ensureNetworkClientCreated = (): NetworkClient => {\n networkClient ??= createNetworkClient({\n id: networkClientId,\n configuration: networkClientConfiguration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n rpcFailoverMode,\n logger,\n });\n\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?\",\n );\n }\n\n return networkClient;\n };\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | Provider\n | ((this: unknown, ...args: unknown[]) => Promise<Json> | undefined)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n const { provider } = ensureNetworkClientCreated();\n\n if (propertyName in provider) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = provider[propertyName as keyof typeof provider];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]): Promise<Json> {\n // @ts-expect-error We don't care that `this` may not be compatible\n // with the signature of the method being called, as technically\n // it can be anything.\n return value.apply(this === receiver ? provider : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { provider } = ensureNetworkClientCreated();\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n get(\n _target: unknown,\n propertyName: PropertyKey,\n receiver: unknown,\n ):\n | BlockTracker\n | ((this: unknown, ...args: unknown[]) => unknown)\n | undefined {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n const { blockTracker } = ensureNetworkClientCreated();\n\n if (propertyName in blockTracker) {\n // Typecast: We know that `[propertyName]` is a propertyName on\n // `provider`.\n const value = blockTracker[propertyName as keyof typeof blockTracker];\n if (typeof value === 'function') {\n // Ensure that the method on the provider is called with `this` as\n // the target, *not* the proxy (which happens by default) —\n // this allows private properties to be accessed\n return function (this: unknown, ...args: unknown[]) {\n // @ts-expect-error We don't care that `this` may not be\n // compatible with the signature of the method being called, as\n // technically it can be anything.\n return value.apply(this === receiver ? blockTracker : this, args);\n };\n }\n return value;\n }\n\n return undefined;\n },\n\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n has(_target: any, propertyName: PropertyKey): boolean {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n const { blockTracker } = ensureNetworkClientCreated();\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = (): void => {\n networkClient?.destroy();\n };\n\n const setRpcFailoverMode = (newRpcFailoverMode: RpcFailoverMode): void => {\n rpcFailoverMode = newRpcFailoverMode;\n destroy();\n networkClient = undefined;\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n setRpcFailoverMode,\n };\n}\n"]}
|
|
@@ -11,9 +11,9 @@ 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
13
|
const utils_1 = require("@metamask/utils");
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
14
|
+
const rpc_service_chain_js_1 = require("./rpc-service/rpc-service-chain.cjs");
|
|
15
|
+
const rpc_service_js_1 = require("./rpc-service/rpc-service.cjs");
|
|
16
|
+
const types_js_1 = require("./types.cjs");
|
|
17
17
|
const SECOND = 1000;
|
|
18
18
|
/**
|
|
19
19
|
* Classifies the error that was being retried when retries were exhausted.
|
|
@@ -25,19 +25,19 @@ function classifyRetryReason(error) {
|
|
|
25
25
|
if (!(error instanceof Error)) {
|
|
26
26
|
return 'unknown';
|
|
27
27
|
}
|
|
28
|
-
if ((0,
|
|
28
|
+
if ((0, rpc_service_js_1.isConnectionError)(error)) {
|
|
29
29
|
return 'connection_failed';
|
|
30
30
|
}
|
|
31
|
-
if ((0,
|
|
31
|
+
if ((0, rpc_service_js_1.isJsonParseError)(error)) {
|
|
32
32
|
return 'response_not_json';
|
|
33
33
|
}
|
|
34
|
-
if ((0,
|
|
34
|
+
if ((0, rpc_service_js_1.isHttpServerError)(error)) {
|
|
35
35
|
return 'non_successful_http_status';
|
|
36
36
|
}
|
|
37
|
-
if ((0,
|
|
37
|
+
if ((0, rpc_service_js_1.isTimeoutError)(error)) {
|
|
38
38
|
return 'timed_out';
|
|
39
39
|
}
|
|
40
|
-
if ((0,
|
|
40
|
+
if ((0, rpc_service_js_1.isConnectionResetError)(error)) {
|
|
41
41
|
return 'connection_reset';
|
|
42
42
|
}
|
|
43
43
|
return 'unknown';
|
|
@@ -63,7 +63,7 @@ exports.classifyRetryReason = classifyRetryReason;
|
|
|
63
63
|
* @returns The network client.
|
|
64
64
|
*/
|
|
65
65
|
function createNetworkClient({ id, configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, rpcFailoverMode, logger, }) {
|
|
66
|
-
const primaryEndpointUrl = configuration.type ===
|
|
66
|
+
const primaryEndpointUrl = configuration.type === types_js_1.NetworkClientType.Infura
|
|
67
67
|
? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`
|
|
68
68
|
: configuration.rpcUrl;
|
|
69
69
|
const rpcServiceChain = createRpcServiceChain({
|
|
@@ -76,7 +76,7 @@ function createNetworkClient({ id, configuration, getRpcServiceOptions, getBlock
|
|
|
76
76
|
logger,
|
|
77
77
|
});
|
|
78
78
|
let rpcApiMiddleware;
|
|
79
|
-
if (configuration.type ===
|
|
79
|
+
if (configuration.type === types_js_1.NetworkClientType.Infura) {
|
|
80
80
|
rpcApiMiddleware = (0, json_rpc_engine_1.asV2Middleware)((0, eth_json_rpc_infura_1.createInfuraMiddleware)({
|
|
81
81
|
rpcService: rpcServiceChain,
|
|
82
82
|
options: {
|
|
@@ -94,7 +94,7 @@ function createNetworkClient({ id, configuration, getRpcServiceOptions, getBlock
|
|
|
94
94
|
getOptions: getBlockTrackerOptions,
|
|
95
95
|
provider: rpcProvider,
|
|
96
96
|
});
|
|
97
|
-
const networkMiddleware = configuration.type ===
|
|
97
|
+
const networkMiddleware = configuration.type === types_js_1.NetworkClientType.Infura
|
|
98
98
|
? createInfuraNetworkMiddleware({
|
|
99
99
|
blockTracker,
|
|
100
100
|
chainId: configuration.chainId,
|
|
@@ -245,7 +245,7 @@ function createRpcServiceChain({ id, primaryEndpointUrl, configuration, getRpcSe
|
|
|
245
245
|
}
|
|
246
246
|
return undefined;
|
|
247
247
|
};
|
|
248
|
-
const rpcServiceChain = new
|
|
248
|
+
const rpcServiceChain = new rpc_service_chain_js_1.RpcServiceChain([
|
|
249
249
|
rpcServiceConfigurations[0],
|
|
250
250
|
...rpcServiceConfigurations.slice(1),
|
|
251
251
|
]);
|
|
@@ -341,7 +341,7 @@ function createBlockTracker({ networkClientType, endpointUrl, getOptions, provid
|
|
|
341
341
|
pollingInterval:
|
|
342
342
|
// Needed for testing.
|
|
343
343
|
// eslint-disable-next-line no-restricted-globals
|
|
344
|
-
process.env.IN_TEST && networkClientType ===
|
|
344
|
+
process.env.IN_TEST && networkClientType === types_js_1.NetworkClientType.Custom
|
|
345
345
|
? (0, utils_1.inMilliseconds)(1, utils_1.Duration.Second)
|
|
346
346
|
: (0, utils_1.inMilliseconds)(20, utils_1.Duration.Second),
|
|
347
347
|
retryTimeout: (0, utils_1.inMilliseconds)(20, utils_1.Duration.Second),
|
|
@@ -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 { CockatielFailureReason } from '@metamask/controller-utils';\nimport {\n DEFAULT_MAX_CONSECUTIVE_FAILURES,\n DEFAULT_MAX_RETRIES,\n} 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 { inMilliseconds, Duration } from '@metamask/utils';\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 { RpcServiceOptionsWithDefaults } 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 { RpcFailoverMode } from './selectors';\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_http_status'\n | 'timed_out'\n | 'connection_reset'\n | 'unknown';\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.\n */\nexport function classifyRetryReason(error: unknown): RetryReason {\n if (!(error instanceof Error)) {\n return 'unknown';\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_http_status';\n }\n if (isTimeoutError(error)) {\n return 'timed_out';\n }\n if (isConnectionResetError(error)) {\n return 'connection_reset';\n }\n return 'unknown';\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\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 rpcFailoverMode,\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 chainId: configuration.chainId,\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 * Determines the ordered list of endpoints that make up the RPC service chain\n * for a network, honoring the RPC failover flags.\n *\n * @param args - The arguments.\n * @param args.primaryEndpointUrl - The primary endpoint URL for the network.\n * @param args.failoverRpcUrls - The configured failover URLs, if any.\n * @param args.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @returns The endpoints to use, each flagged as primary or failover.\n */\nfunction getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls,\n rpcFailoverMode,\n}: {\n primaryEndpointUrl: string;\n failoverRpcUrls: string[] | undefined;\n rpcFailoverMode: RpcFailoverMode;\n}): { url: string; isFailover: boolean }[] {\n const failoverEndpoints = (failoverRpcUrls ?? []).map((url) => ({\n url,\n isFailover: true,\n }));\n // We explicitly check the URL since some networks have been added with invalid configuration types in the past.\n const isInfura = new URL(primaryEndpointUrl).hostname.endsWith('.infura.io');\n\n if (\n rpcFailoverMode === 'forced' &&\n isInfura &&\n failoverEndpoints.length > 0\n ) {\n // Forced mode for an Infura endpoint with failovers: bypass Infura entirely\n // and route all traffic (including block polling) to failovers. The first\n // failover becomes the positional primary of the chain, so\n // availability/degraded events will report that failover URL as the primary\n // endpoint (there is no Infura primary in this mode).\n return failoverEndpoints;\n }\n if (rpcFailoverMode === 'enabled' && isInfura) {\n return [\n { url: primaryEndpointUrl, isFailover: false },\n ...failoverEndpoints,\n ];\n }\n return [{ url: primaryEndpointUrl, isFailover: false }];\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpoints = getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls: configuration.failoverRpcUrls,\n rpcFailoverMode,\n });\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n // Ensure that if the endpoint continually responds with errors, we\n // break the circuit relatively fast (but not prematurely).\n //\n // Note that the circuit will break much faster if the errors are\n // retriable (e.g. 503) than if not (e.g. 500), so we attempt to strike\n // a balance here.\n const maxConsecutiveFailures = DEFAULT_MAX_CONSECUTIVE_FAILURES;\n\n // The number of rounds of retries that will break the circuit,\n // triggering a \"cooldown\".\n //\n // When we fail over to QuickNode, we expect it to be down at first\n // while it is being automatically activated, and we don't want to\n // activate the \"cooldown\" accidentally.\n const maxConsecutiveFailuresFailover = (DEFAULT_MAX_RETRIES + 1) * 10;\n\n const rpcServiceConfigurations = availableEndpoints.map((endpoint) => {\n const overriddenOptions = getRpcServiceOptions?.(endpoint.url) ?? {};\n return {\n fetch: globalThis.fetch.bind(globalThis),\n btoa: globalThis.btoa.bind(globalThis),\n isOffline,\n policyOptions: {\n maxRetries: DEFAULT_MAX_RETRIES,\n circuitBreakDuration: inMilliseconds(30, Duration.Second),\n maxConsecutiveFailures: endpoint.isFailover\n ? maxConsecutiveFailuresFailover\n : maxConsecutiveFailures,\n ...(overriddenOptions.policyOptions ?? {}),\n },\n ...overriddenOptions,\n endpointUrl: endpoint.url,\n logger,\n };\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, duration, traceId, ...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 duration,\n traceId,\n type,\n retryReason:\n error === undefined ? undefined : classifyRetryReason(error),\n });\n },\n );\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n duration,\n traceId,\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 duration,\n traceId,\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 defaultOptions = {\n pollingInterval:\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? inMilliseconds(1, Duration.Second)\n : inMilliseconds(20, Duration.Second),\n retryTimeout: inMilliseconds(20, Duration.Second),\n };\n\n return new PollingBlockTracker({\n ...defaultOptions,\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.chainId - The chain id 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 chainId,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: string;\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({ chainId }),\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.chainId - The chain id to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n chainId,\n}: {\n chainId: string;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: chainId,\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 { CockatielFailureReason } from '@metamask/controller-utils';\nimport {\n DEFAULT_MAX_CONSECUTIVE_FAILURES,\n DEFAULT_MAX_RETRIES,\n} 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 { inMilliseconds, Duration } from '@metamask/utils';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController.js';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain.js';\nimport type { RpcServiceOptionsWithDefaults } from './rpc-service/rpc-service.js';\nimport {\n isConnectionError,\n isConnectionResetError,\n isJsonParseError,\n isHttpServerError,\n isTimeoutError,\n} from './rpc-service/rpc-service.js';\nimport type { RpcFailoverMode } from './selectors.js';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types.js';\nimport { NetworkClientType } from './types.js';\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_http_status'\n | 'timed_out'\n | 'connection_reset'\n | 'unknown';\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.\n */\nexport function classifyRetryReason(error: unknown): RetryReason {\n if (!(error instanceof Error)) {\n return 'unknown';\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_http_status';\n }\n if (isTimeoutError(error)) {\n return 'timed_out';\n }\n if (isConnectionResetError(error)) {\n return 'connection_reset';\n }\n return 'unknown';\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\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 rpcFailoverMode,\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 chainId: configuration.chainId,\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 * Determines the ordered list of endpoints that make up the RPC service chain\n * for a network, honoring the RPC failover flags.\n *\n * @param args - The arguments.\n * @param args.primaryEndpointUrl - The primary endpoint URL for the network.\n * @param args.failoverRpcUrls - The configured failover URLs, if any.\n * @param args.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @returns The endpoints to use, each flagged as primary or failover.\n */\nfunction getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls,\n rpcFailoverMode,\n}: {\n primaryEndpointUrl: string;\n failoverRpcUrls: string[] | undefined;\n rpcFailoverMode: RpcFailoverMode;\n}): { url: string; isFailover: boolean }[] {\n const failoverEndpoints = (failoverRpcUrls ?? []).map((url) => ({\n url,\n isFailover: true,\n }));\n // We explicitly check the URL since some networks have been added with invalid configuration types in the past.\n const isInfura = new URL(primaryEndpointUrl).hostname.endsWith('.infura.io');\n\n if (\n rpcFailoverMode === 'forced' &&\n isInfura &&\n failoverEndpoints.length > 0\n ) {\n // Forced mode for an Infura endpoint with failovers: bypass Infura entirely\n // and route all traffic (including block polling) to failovers. The first\n // failover becomes the positional primary of the chain, so\n // availability/degraded events will report that failover URL as the primary\n // endpoint (there is no Infura primary in this mode).\n return failoverEndpoints;\n }\n if (rpcFailoverMode === 'enabled' && isInfura) {\n return [\n { url: primaryEndpointUrl, isFailover: false },\n ...failoverEndpoints,\n ];\n }\n return [{ url: primaryEndpointUrl, isFailover: false }];\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpoints = getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls: configuration.failoverRpcUrls,\n rpcFailoverMode,\n });\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n // Ensure that if the endpoint continually responds with errors, we\n // break the circuit relatively fast (but not prematurely).\n //\n // Note that the circuit will break much faster if the errors are\n // retriable (e.g. 503) than if not (e.g. 500), so we attempt to strike\n // a balance here.\n const maxConsecutiveFailures = DEFAULT_MAX_CONSECUTIVE_FAILURES;\n\n // The number of rounds of retries that will break the circuit,\n // triggering a \"cooldown\".\n //\n // When we fail over to QuickNode, we expect it to be down at first\n // while it is being automatically activated, and we don't want to\n // activate the \"cooldown\" accidentally.\n const maxConsecutiveFailuresFailover = (DEFAULT_MAX_RETRIES + 1) * 10;\n\n const rpcServiceConfigurations = availableEndpoints.map((endpoint) => {\n const overriddenOptions = getRpcServiceOptions?.(endpoint.url) ?? {};\n return {\n fetch: globalThis.fetch.bind(globalThis),\n btoa: globalThis.btoa.bind(globalThis),\n isOffline,\n policyOptions: {\n maxRetries: DEFAULT_MAX_RETRIES,\n circuitBreakDuration: inMilliseconds(30, Duration.Second),\n maxConsecutiveFailures: endpoint.isFailover\n ? maxConsecutiveFailuresFailover\n : maxConsecutiveFailures,\n ...(overriddenOptions.policyOptions ?? {}),\n },\n ...overriddenOptions,\n endpointUrl: endpoint.url,\n logger,\n };\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, duration, traceId, ...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 duration,\n traceId,\n type,\n retryReason:\n error === undefined ? undefined : classifyRetryReason(error),\n });\n },\n );\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n duration,\n traceId,\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 duration,\n traceId,\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 defaultOptions = {\n pollingInterval:\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? inMilliseconds(1, Duration.Second)\n : inMilliseconds(20, Duration.Second),\n retryTimeout: inMilliseconds(20, Duration.Second),\n };\n\n return new PollingBlockTracker({\n ...defaultOptions,\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.chainId - The chain id 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 chainId,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: string;\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({ chainId }),\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.chainId - The chain id to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n chainId,\n}: {\n chainId: string;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: chainId,\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":"create-network-client.d.cts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAyB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,
|
|
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;AAyB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA+B;AAEhC,OAAO,KAAK,EAAE,6BAA6B,EAAE,sCAAqC;AAQlF,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAuB;AACtD,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAmB;AAKpB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,4BAA4B,GAC5B,WAAW,GACX,kBAAkB,GAClB,SAAS,CAAC;AAEd;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAoB/D;AAED;;;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;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,CAAC,EAAE,CACrB,cAAc,EAAE,MAAM,KACnB,6BAA6B,CAAC;IACnC,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
|
|
@@ -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;AAyB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,
|
|
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;AAyB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA+B;AAEhC,OAAO,KAAK,EAAE,6BAA6B,EAAE,sCAAqC;AAQlF,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAuB;AACtD,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAmB;AAKpB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,4BAA4B,GAC5B,WAAW,GACX,kBAAkB,GAClB,SAAS,CAAC;AAEd;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAoB/D;AAED;;;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;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,CAAC,EAAE,CACrB,cAAc,EAAE,MAAM,KACnB,6BAA6B,CAAC;IACnC,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
|
|
@@ -8,8 +8,8 @@ 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
10
|
import { inMilliseconds, Duration } from "@metamask/utils";
|
|
11
|
-
import { isConnectionError, isConnectionResetError, isJsonParseError, isHttpServerError, isTimeoutError } from "./rpc-service/rpc-service.mjs";
|
|
12
11
|
import { RpcServiceChain } from "./rpc-service/rpc-service-chain.mjs";
|
|
12
|
+
import { isConnectionError, isConnectionResetError, isJsonParseError, isHttpServerError, isTimeoutError } from "./rpc-service/rpc-service.mjs";
|
|
13
13
|
import { NetworkClientType } from "./types.mjs";
|
|
14
14
|
const SECOND = 1000;
|
|
15
15
|
/**
|
|
@@ -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 { CockatielFailureReason } from '@metamask/controller-utils';\nimport {\n DEFAULT_MAX_CONSECUTIVE_FAILURES,\n DEFAULT_MAX_RETRIES,\n} 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 { inMilliseconds, Duration } from '@metamask/utils';\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 { RpcServiceOptionsWithDefaults } 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 { RpcFailoverMode } from './selectors';\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_http_status'\n | 'timed_out'\n | 'connection_reset'\n | 'unknown';\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.\n */\nexport function classifyRetryReason(error: unknown): RetryReason {\n if (!(error instanceof Error)) {\n return 'unknown';\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_http_status';\n }\n if (isTimeoutError(error)) {\n return 'timed_out';\n }\n if (isConnectionResetError(error)) {\n return 'connection_reset';\n }\n return 'unknown';\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\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 rpcFailoverMode,\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 chainId: configuration.chainId,\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 * Determines the ordered list of endpoints that make up the RPC service chain\n * for a network, honoring the RPC failover flags.\n *\n * @param args - The arguments.\n * @param args.primaryEndpointUrl - The primary endpoint URL for the network.\n * @param args.failoverRpcUrls - The configured failover URLs, if any.\n * @param args.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @returns The endpoints to use, each flagged as primary or failover.\n */\nfunction getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls,\n rpcFailoverMode,\n}: {\n primaryEndpointUrl: string;\n failoverRpcUrls: string[] | undefined;\n rpcFailoverMode: RpcFailoverMode;\n}): { url: string; isFailover: boolean }[] {\n const failoverEndpoints = (failoverRpcUrls ?? []).map((url) => ({\n url,\n isFailover: true,\n }));\n // We explicitly check the URL since some networks have been added with invalid configuration types in the past.\n const isInfura = new URL(primaryEndpointUrl).hostname.endsWith('.infura.io');\n\n if (\n rpcFailoverMode === 'forced' &&\n isInfura &&\n failoverEndpoints.length > 0\n ) {\n // Forced mode for an Infura endpoint with failovers: bypass Infura entirely\n // and route all traffic (including block polling) to failovers. The first\n // failover becomes the positional primary of the chain, so\n // availability/degraded events will report that failover URL as the primary\n // endpoint (there is no Infura primary in this mode).\n return failoverEndpoints;\n }\n if (rpcFailoverMode === 'enabled' && isInfura) {\n return [\n { url: primaryEndpointUrl, isFailover: false },\n ...failoverEndpoints,\n ];\n }\n return [{ url: primaryEndpointUrl, isFailover: false }];\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpoints = getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls: configuration.failoverRpcUrls,\n rpcFailoverMode,\n });\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n // Ensure that if the endpoint continually responds with errors, we\n // break the circuit relatively fast (but not prematurely).\n //\n // Note that the circuit will break much faster if the errors are\n // retriable (e.g. 503) than if not (e.g. 500), so we attempt to strike\n // a balance here.\n const maxConsecutiveFailures = DEFAULT_MAX_CONSECUTIVE_FAILURES;\n\n // The number of rounds of retries that will break the circuit,\n // triggering a \"cooldown\".\n //\n // When we fail over to QuickNode, we expect it to be down at first\n // while it is being automatically activated, and we don't want to\n // activate the \"cooldown\" accidentally.\n const maxConsecutiveFailuresFailover = (DEFAULT_MAX_RETRIES + 1) * 10;\n\n const rpcServiceConfigurations = availableEndpoints.map((endpoint) => {\n const overriddenOptions = getRpcServiceOptions?.(endpoint.url) ?? {};\n return {\n fetch: globalThis.fetch.bind(globalThis),\n btoa: globalThis.btoa.bind(globalThis),\n isOffline,\n policyOptions: {\n maxRetries: DEFAULT_MAX_RETRIES,\n circuitBreakDuration: inMilliseconds(30, Duration.Second),\n maxConsecutiveFailures: endpoint.isFailover\n ? maxConsecutiveFailuresFailover\n : maxConsecutiveFailures,\n ...(overriddenOptions.policyOptions ?? {}),\n },\n ...overriddenOptions,\n endpointUrl: endpoint.url,\n logger,\n };\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, duration, traceId, ...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 duration,\n traceId,\n type,\n retryReason:\n error === undefined ? undefined : classifyRetryReason(error),\n });\n },\n );\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n duration,\n traceId,\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 duration,\n traceId,\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 defaultOptions = {\n pollingInterval:\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? inMilliseconds(1, Duration.Second)\n : inMilliseconds(20, Duration.Second),\n retryTimeout: inMilliseconds(20, Duration.Second),\n };\n\n return new PollingBlockTracker({\n ...defaultOptions,\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.chainId - The chain id 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 chainId,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: string;\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({ chainId }),\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.chainId - The chain id to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n chainId,\n}: {\n chainId: string;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: chainId,\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 { CockatielFailureReason } from '@metamask/controller-utils';\nimport {\n DEFAULT_MAX_CONSECUTIVE_FAILURES,\n DEFAULT_MAX_RETRIES,\n} 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 { inMilliseconds, Duration } from '@metamask/utils';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController.js';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain.js';\nimport type { RpcServiceOptionsWithDefaults } from './rpc-service/rpc-service.js';\nimport {\n isConnectionError,\n isConnectionResetError,\n isJsonParseError,\n isHttpServerError,\n isTimeoutError,\n} from './rpc-service/rpc-service.js';\nimport type { RpcFailoverMode } from './selectors.js';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types.js';\nimport { NetworkClientType } from './types.js';\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_http_status'\n | 'timed_out'\n | 'connection_reset'\n | 'unknown';\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.\n */\nexport function classifyRetryReason(error: unknown): RetryReason {\n if (!(error instanceof Error)) {\n return 'unknown';\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_http_status';\n }\n if (isTimeoutError(error)) {\n return 'timed_out';\n }\n if (isConnectionResetError(error)) {\n return 'connection_reset';\n }\n return 'unknown';\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\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 rpcFailoverMode,\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 chainId: configuration.chainId,\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 * Determines the ordered list of endpoints that make up the RPC service chain\n * for a network, honoring the RPC failover flags.\n *\n * @param args - The arguments.\n * @param args.primaryEndpointUrl - The primary endpoint URL for the network.\n * @param args.failoverRpcUrls - The configured failover URLs, if any.\n * @param args.rpcFailoverMode - The RPC failover mode to apply: `disabled`,\n * `enabled` (divert to the failover URLs when the primary is unavailable), or\n * `forced` (route all traffic for Infura endpoints with failover URLs to those\n * URLs, bypassing Infura).\n * @returns The endpoints to use, each flagged as primary or failover.\n */\nfunction getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls,\n rpcFailoverMode,\n}: {\n primaryEndpointUrl: string;\n failoverRpcUrls: string[] | undefined;\n rpcFailoverMode: RpcFailoverMode;\n}): { url: string; isFailover: boolean }[] {\n const failoverEndpoints = (failoverRpcUrls ?? []).map((url) => ({\n url,\n isFailover: true,\n }));\n // We explicitly check the URL since some networks have been added with invalid configuration types in the past.\n const isInfura = new URL(primaryEndpointUrl).hostname.endsWith('.infura.io');\n\n if (\n rpcFailoverMode === 'forced' &&\n isInfura &&\n failoverEndpoints.length > 0\n ) {\n // Forced mode for an Infura endpoint with failovers: bypass Infura entirely\n // and route all traffic (including block polling) to failovers. The first\n // failover becomes the positional primary of the chain, so\n // availability/degraded events will report that failover URL as the primary\n // endpoint (there is no Infura primary in this mode).\n return failoverEndpoints;\n }\n if (rpcFailoverMode === 'enabled' && isInfura) {\n return [\n { url: primaryEndpointUrl, isFailover: false },\n ...failoverEndpoints,\n ];\n }\n return [{ url: primaryEndpointUrl, isFailover: false }];\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.rpcFailoverMode - The RPC failover mode to apply: `disabled`\n * (failover off), `enabled` (divert to the configured failover URLs when the\n * primary endpoint is unavailable), or `forced` (Infura endpoints that have\n * failover URLs route all traffic to those URLs, bypassing Infura entirely).\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 rpcFailoverMode,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions?: (\n rpcEndpointUrl: string,\n ) => RpcServiceOptionsWithDefaults;\n messenger: NetworkControllerMessenger;\n rpcFailoverMode: RpcFailoverMode;\n logger?: Logger;\n}): RpcServiceChain {\n const availableEndpoints = getAvailableEndpoints({\n primaryEndpointUrl,\n failoverRpcUrls: configuration.failoverRpcUrls,\n rpcFailoverMode,\n });\n\n const isOffline = (): boolean => {\n const connectivityState = messenger.call('ConnectivityController:getState');\n return (\n connectivityState.connectivityStatus === CONNECTIVITY_STATUSES.Offline\n );\n };\n\n // Ensure that if the endpoint continually responds with errors, we\n // break the circuit relatively fast (but not prematurely).\n //\n // Note that the circuit will break much faster if the errors are\n // retriable (e.g. 503) than if not (e.g. 500), so we attempt to strike\n // a balance here.\n const maxConsecutiveFailures = DEFAULT_MAX_CONSECUTIVE_FAILURES;\n\n // The number of rounds of retries that will break the circuit,\n // triggering a \"cooldown\".\n //\n // When we fail over to QuickNode, we expect it to be down at first\n // while it is being automatically activated, and we don't want to\n // activate the \"cooldown\" accidentally.\n const maxConsecutiveFailuresFailover = (DEFAULT_MAX_RETRIES + 1) * 10;\n\n const rpcServiceConfigurations = availableEndpoints.map((endpoint) => {\n const overriddenOptions = getRpcServiceOptions?.(endpoint.url) ?? {};\n return {\n fetch: globalThis.fetch.bind(globalThis),\n btoa: globalThis.btoa.bind(globalThis),\n isOffline,\n policyOptions: {\n maxRetries: DEFAULT_MAX_RETRIES,\n circuitBreakDuration: inMilliseconds(30, Duration.Second),\n maxConsecutiveFailures: endpoint.isFailover\n ? maxConsecutiveFailuresFailover\n : maxConsecutiveFailures,\n ...(overriddenOptions.policyOptions ?? {}),\n },\n ...overriddenOptions,\n endpointUrl: endpoint.url,\n logger,\n };\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, duration, traceId, ...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 duration,\n traceId,\n type,\n retryReason:\n error === undefined ? undefined : classifyRetryReason(error),\n });\n },\n );\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n rpcMethodName,\n duration,\n traceId,\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 duration,\n traceId,\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 defaultOptions = {\n pollingInterval:\n // Needed for testing.\n // eslint-disable-next-line no-restricted-globals\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? inMilliseconds(1, Duration.Second)\n : inMilliseconds(20, Duration.Second),\n retryTimeout: inMilliseconds(20, Duration.Second),\n };\n\n return new PollingBlockTracker({\n ...defaultOptions,\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.chainId - The chain id 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 chainId,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: string;\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({ chainId }),\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.chainId - The chain id to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n chainId,\n}: {\n chainId: string;\n}): JsonRpcMiddleware<JsonRpcRequest> {\n return createScaffoldMiddleware({\n eth_chainId: chainId,\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"]}
|