@metamask/network-controller 21.0.0 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/dist/NetworkController.cjs +1373 -0
  3. package/dist/NetworkController.cjs.map +1 -0
  4. package/dist/{types/NetworkController.d.ts → NetworkController.d.cts} +14 -14
  5. package/dist/NetworkController.d.cts.map +1 -0
  6. package/dist/NetworkController.d.mts +636 -0
  7. package/dist/NetworkController.d.mts.map +1 -0
  8. package/dist/NetworkController.mjs +1345 -23
  9. package/dist/NetworkController.mjs.map +1 -1
  10. package/dist/constants.cjs +32 -0
  11. package/dist/constants.cjs.map +1 -0
  12. package/dist/{types/constants.d.ts → constants.d.cts} +1 -1
  13. package/dist/constants.d.cts.map +1 -0
  14. package/dist/constants.d.mts +28 -0
  15. package/dist/constants.d.mts.map +1 -0
  16. package/dist/constants.mjs +28 -9
  17. package/dist/constants.mjs.map +1 -1
  18. package/dist/create-auto-managed-network-client.cjs +134 -0
  19. package/dist/create-auto-managed-network-client.cjs.map +1 -0
  20. package/dist/{types/create-auto-managed-network-client.d.ts → create-auto-managed-network-client.d.cts} +2 -2
  21. package/dist/create-auto-managed-network-client.d.cts.map +1 -0
  22. package/dist/create-auto-managed-network-client.d.mts +47 -0
  23. package/dist/create-auto-managed-network-client.d.mts.map +1 -0
  24. package/dist/create-auto-managed-network-client.mjs +129 -9
  25. package/dist/create-auto-managed-network-client.mjs.map +1 -1
  26. package/dist/create-network-client.cjs +146 -0
  27. package/dist/create-network-client.cjs.map +1 -0
  28. package/dist/{types/create-network-client.d.ts → create-network-client.d.cts} +2 -2
  29. package/dist/create-network-client.d.cts.map +1 -0
  30. package/dist/create-network-client.d.mts +19 -0
  31. package/dist/create-network-client.d.mts.map +1 -0
  32. package/dist/create-network-client.mjs +143 -7
  33. package/dist/create-network-client.mjs.map +1 -1
  34. package/dist/index.cjs +27 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/{types/index.d.ts → index.d.cts} +9 -9
  37. package/dist/index.d.cts.map +1 -0
  38. package/dist/index.d.mts +9 -0
  39. package/dist/index.d.mts.map +1 -0
  40. package/dist/index.mjs +3 -28
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/logger.cjs +7 -0
  43. package/dist/logger.cjs.map +1 -0
  44. package/dist/{types/logger.d.ts → logger.d.cts} +2 -2
  45. package/dist/logger.d.cts.map +1 -0
  46. package/dist/logger.d.mts +5 -0
  47. package/dist/logger.d.mts.map +1 -0
  48. package/dist/logger.mjs +3 -9
  49. package/dist/logger.mjs.map +1 -1
  50. package/dist/types.cjs +12 -0
  51. package/dist/types.cjs.map +1 -0
  52. package/dist/{types/types.d.ts → types.d.cts} +5 -5
  53. package/dist/types.d.cts.map +1 -0
  54. package/dist/types.d.mts +41 -0
  55. package/dist/types.d.mts.map +1 -0
  56. package/dist/types.mjs +8 -7
  57. package/dist/types.mjs.map +1 -1
  58. package/package.json +20 -15
  59. package/dist/NetworkController.js +0 -25
  60. package/dist/NetworkController.js.map +0 -1
  61. package/dist/chunk-2QJYHWIP.mjs +0 -15
  62. package/dist/chunk-2QJYHWIP.mjs.map +0 -1
  63. package/dist/chunk-AU4UVIPZ.mjs +0 -11
  64. package/dist/chunk-AU4UVIPZ.mjs.map +0 -1
  65. package/dist/chunk-BV3ZGWII.mjs +0 -1485
  66. package/dist/chunk-BV3ZGWII.mjs.map +0 -1
  67. package/dist/chunk-E4V6XEBR.js +0 -125
  68. package/dist/chunk-E4V6XEBR.js.map +0 -1
  69. package/dist/chunk-KHZTS7TF.js +0 -11
  70. package/dist/chunk-KHZTS7TF.js.map +0 -1
  71. package/dist/chunk-LLMZDA4Q.js +0 -99
  72. package/dist/chunk-LLMZDA4Q.js.map +0 -1
  73. package/dist/chunk-TZA3CBEI.mjs +0 -99
  74. package/dist/chunk-TZA3CBEI.mjs.map +0 -1
  75. package/dist/chunk-U43RY4MY.mjs +0 -125
  76. package/dist/chunk-U43RY4MY.mjs.map +0 -1
  77. package/dist/chunk-VGYLDDJB.js +0 -9
  78. package/dist/chunk-VGYLDDJB.js.map +0 -1
  79. package/dist/chunk-VTLOAS2R.mjs +0 -9
  80. package/dist/chunk-VTLOAS2R.mjs.map +0 -1
  81. package/dist/chunk-XUI43LEZ.mjs +0 -30
  82. package/dist/chunk-XUI43LEZ.mjs.map +0 -1
  83. package/dist/chunk-YOHMQPGM.js +0 -1485
  84. package/dist/chunk-YOHMQPGM.js.map +0 -1
  85. package/dist/chunk-Z4BLTVTB.js +0 -30
  86. package/dist/chunk-Z4BLTVTB.js.map +0 -1
  87. package/dist/chunk-ZKNI7MD3.js +0 -15
  88. package/dist/chunk-ZKNI7MD3.js.map +0 -1
  89. package/dist/constants.js +0 -10
  90. package/dist/constants.js.map +0 -1
  91. package/dist/create-auto-managed-network-client.js +0 -10
  92. package/dist/create-auto-managed-network-client.js.map +0 -1
  93. package/dist/create-network-client.js +0 -9
  94. package/dist/create-network-client.js.map +0 -1
  95. package/dist/index.js +0 -29
  96. package/dist/index.js.map +0 -1
  97. package/dist/logger.js +0 -10
  98. package/dist/logger.js.map +0 -1
  99. package/dist/tsconfig.build.tsbuildinfo +0 -1
  100. package/dist/types/NetworkController.d.ts.map +0 -1
  101. package/dist/types/constants.d.ts.map +0 -1
  102. package/dist/types/create-auto-managed-network-client.d.ts.map +0 -1
  103. package/dist/types/create-network-client.d.ts.map +0 -1
  104. package/dist/types/index.d.ts.map +0 -1
  105. package/dist/types/logger.d.ts.map +0 -1
  106. package/dist/types/types.d.ts.map +0 -1
  107. package/dist/types.js +0 -8
  108. package/dist/types.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.mjs";
2
+ /**
3
+ * The name of the method on both the provider and block tracker proxy which can
4
+ * be used to get the underlying provider or block tracker from the network
5
+ * client, when it is initialized.
6
+ */
7
+ declare const REFLECTIVE_PROPERTY_NAME = "__target__";
8
+ /**
9
+ * Represents a proxy object which wraps a target object. As a proxy, it allows
10
+ * for accessing and setting all of the properties that the target object
11
+ * supports, but also supports an extra propertyName (`__target__`) to access
12
+ * the target itself.
13
+ *
14
+ * @template Type - The type of the target object. It is assumed that this type
15
+ * will be constant even when the target is swapped.
16
+ */
17
+ export type ProxyWithAccessibleTarget<TargetType> = TargetType & {
18
+ [REFLECTIVE_PROPERTY_NAME]: TargetType;
19
+ };
20
+ /**
21
+ * An object that provides the same interface as a network client but where the
22
+ * network client is not initialized until either the provider or block tracker
23
+ * is first accessed.
24
+ */
25
+ export type AutoManagedNetworkClient<Configuration extends NetworkClientConfiguration> = {
26
+ configuration: Configuration;
27
+ provider: ProxyWithAccessibleTarget<Provider>;
28
+ blockTracker: ProxyWithAccessibleTarget<BlockTracker>;
29
+ destroy: () => void;
30
+ };
31
+ /**
32
+ * This function creates two proxies, one that wraps a provider and another that
33
+ * wraps a block tracker. These proxies are unique in that both will be "empty"
34
+ * at first; that is, neither will point to a functional provider or block
35
+ * tracker. Instead, as soon as a method or event is accessed on either object
36
+ * that requires a network request to function, a network client is created on
37
+ * the fly and the method or event in question is then forwarded to whichever
38
+ * part of the network client is serving as the receiver. The network client is
39
+ * then cached for subsequent usages.
40
+ *
41
+ * @param networkClientConfiguration - The configuration object that will be
42
+ * used to instantiate the network client when it is needed.
43
+ * @returns The auto-managed network client.
44
+ */
45
+ export declare function createAutoManagedNetworkClient<Configuration extends NetworkClientConfiguration>(networkClientConfiguration: Configuration): AutoManagedNetworkClient<Configuration>;
46
+ export {};
47
+ //# sourceMappingURL=create-auto-managed-network-client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-auto-managed-network-client.d.mts","sourceRoot":"","sources":["../src/create-auto-managed-network-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAEjB;;;;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;CACrB,CAAC;AAWF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,SAAS,0BAA0B,EAEhD,0BAA0B,EAAE,aAAa,GACxC,wBAAwB,CAAC,aAAa,CAAC,CAsHzC"}
@@ -1,10 +1,130 @@
1
- import {
2
- createAutoManagedNetworkClient
3
- } from "./chunk-TZA3CBEI.mjs";
4
- import "./chunk-U43RY4MY.mjs";
5
- import "./chunk-AU4UVIPZ.mjs";
6
- import "./chunk-XUI43LEZ.mjs";
7
- export {
8
- createAutoManagedNetworkClient
9
- };
1
+ import { createNetworkClient } from "./create-network-client.mjs";
2
+ /**
3
+ * The name of the method on both the provider and block tracker proxy which can
4
+ * be used to get the underlying provider or block tracker from the network
5
+ * client, when it is initialized.
6
+ */
7
+ const REFLECTIVE_PROPERTY_NAME = '__target__';
8
+ /**
9
+ * By default, the provider and block provider proxies will point to nothing.
10
+ * This is impossible when using the Proxy API, as the target object has to be
11
+ * something, so this object represents that "something".
12
+ */
13
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
14
+ // eslint-disable-next-line @typescript-eslint/naming-convention
15
+ const UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };
16
+ /**
17
+ * This function creates two proxies, one that wraps a provider and another that
18
+ * wraps a block tracker. These proxies are unique in that both will be "empty"
19
+ * at first; that is, neither will point to a functional provider or block
20
+ * tracker. Instead, as soon as a method or event is accessed on either object
21
+ * that requires a network request to function, a network client is created on
22
+ * the fly and the method or event in question is then forwarded to whichever
23
+ * part of the network client is serving as the receiver. The network client is
24
+ * then cached for subsequent usages.
25
+ *
26
+ * @param networkClientConfiguration - The configuration object that will be
27
+ * used to instantiate the network client when it is needed.
28
+ * @returns The auto-managed network client.
29
+ */
30
+ export function createAutoManagedNetworkClient(networkClientConfiguration) {
31
+ let networkClient;
32
+ const providerProxy = new Proxy(UNINITIALIZED_TARGET, {
33
+ // TODO: Replace `any` with type
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ get(_target, propertyName, receiver) {
36
+ if (propertyName === REFLECTIVE_PROPERTY_NAME) {
37
+ return networkClient?.provider;
38
+ }
39
+ networkClient ?? (networkClient = createNetworkClient(networkClientConfiguration));
40
+ if (networkClient === undefined) {
41
+ throw new Error("It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?");
42
+ }
43
+ const { provider } = networkClient;
44
+ if (propertyName in provider) {
45
+ // Typecast: We know that `[propertyName]` is a propertyName on
46
+ // `provider`.
47
+ const value = provider[propertyName];
48
+ if (typeof value === 'function') {
49
+ // Ensure that the method on the provider is called with `this` as
50
+ // the target, *not* the proxy (which happens by default) —
51
+ // this allows private properties to be accessed
52
+ // TODO: Replace `any` with type
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ return function (...args) {
55
+ // @ts-expect-error We don't care that `this` may not be compatible
56
+ // with the signature of the method being called, as technically
57
+ // it can be anything.
58
+ return value.apply(this === receiver ? provider : this, args);
59
+ };
60
+ }
61
+ return value;
62
+ }
63
+ return undefined;
64
+ },
65
+ // TODO: Replace `any` with type
66
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
+ has(_target, propertyName) {
68
+ if (propertyName === REFLECTIVE_PROPERTY_NAME) {
69
+ return true;
70
+ }
71
+ networkClient ?? (networkClient = createNetworkClient(networkClientConfiguration));
72
+ const { provider } = networkClient;
73
+ return propertyName in provider;
74
+ },
75
+ });
76
+ const blockTrackerProxy = new Proxy(UNINITIALIZED_TARGET, {
77
+ // TODO: Replace `any` with type
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ get(_target, propertyName, receiver) {
80
+ if (propertyName === REFLECTIVE_PROPERTY_NAME) {
81
+ return networkClient?.blockTracker;
82
+ }
83
+ networkClient ?? (networkClient = createNetworkClient(networkClientConfiguration));
84
+ if (networkClient === undefined) {
85
+ throw new Error("It looks like createNetworkClient returned undefined. Perhaps it's mocked?");
86
+ }
87
+ const { blockTracker } = networkClient;
88
+ if (propertyName in blockTracker) {
89
+ // Typecast: We know that `[propertyName]` is a propertyName on
90
+ // `provider`.
91
+ const value = blockTracker[propertyName];
92
+ if (typeof value === 'function') {
93
+ // Ensure that the method on the provider is called with `this` as
94
+ // the target, *not* the proxy (which happens by default) —
95
+ // this allows private properties to be accessed
96
+ // TODO: Replace `any` with type
97
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
+ return function (...args) {
99
+ // @ts-expect-error We don't care that `this` may not be
100
+ // compatible with the signature of the method being called, as
101
+ // technically it can be anything.
102
+ return value.apply(this === receiver ? blockTracker : this, args);
103
+ };
104
+ }
105
+ return value;
106
+ }
107
+ return undefined;
108
+ },
109
+ // TODO: Replace `any` with type
110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+ has(_target, propertyName) {
112
+ if (propertyName === REFLECTIVE_PROPERTY_NAME) {
113
+ return true;
114
+ }
115
+ networkClient ?? (networkClient = createNetworkClient(networkClientConfiguration));
116
+ const { blockTracker } = networkClient;
117
+ return propertyName in blockTracker;
118
+ },
119
+ });
120
+ const destroy = () => {
121
+ networkClient?.destroy();
122
+ };
123
+ return {
124
+ configuration: networkClientConfiguration,
125
+ provider: providerProxy,
126
+ blockTracker: blockTrackerProxy,
127
+ destroy,
128
+ };
129
+ }
10
130
  //# sourceMappingURL=create-auto-managed-network-client.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
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 { NetworkClient } from './create-network-client';\nimport { createNetworkClient } from './create-network-client';\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};\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 */\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\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 networkClientConfiguration - The configuration object that will be\n * used to instantiate the network client when it is needed.\n * @returns The auto-managed network client.\n */\nexport function createAutoManagedNetworkClient<\n Configuration extends NetworkClientConfiguration,\n>(\n networkClientConfiguration: Configuration,\n): AutoManagedNetworkClient<Configuration> {\n let networkClient: NetworkClient | undefined;\n\n const providerProxy = new Proxy(UNINITIALIZED_TARGET, {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(_target: any, propertyName: PropertyKey, receiver: unknown) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.provider;\n }\n\n networkClient ??= createNetworkClient(networkClientConfiguration);\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 const { provider } = networkClient;\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 // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: unknown, ...args: any[]) {\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) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n networkClient ??= createNetworkClient(networkClientConfiguration);\n const { provider } = networkClient;\n return propertyName in provider;\n },\n });\n\n const blockTrackerProxy: ProxyWithAccessibleTarget<BlockTracker> = new Proxy(\n UNINITIALIZED_TARGET,\n {\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(_target: any, propertyName: PropertyKey, receiver: unknown) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return networkClient?.blockTracker;\n }\n\n networkClient ??= createNetworkClient(networkClientConfiguration);\n if (networkClient === undefined) {\n throw new Error(\n \"It looks like createNetworkClient returned undefined. Perhaps it's mocked?\",\n );\n }\n const { blockTracker } = networkClient;\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 // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: unknown, ...args: any[]) {\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) {\n if (propertyName === REFLECTIVE_PROPERTY_NAME) {\n return true;\n }\n networkClient ??= createNetworkClient(networkClientConfiguration);\n const { blockTracker } = networkClient;\n return propertyName in blockTracker;\n },\n },\n );\n\n const destroy = () => {\n networkClient?.destroy();\n };\n\n return {\n configuration: networkClientConfiguration,\n provider: providerProxy,\n blockTracker: blockTrackerProxy,\n destroy,\n };\n}\n"]}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNetworkClient = void 0;
4
+ const controller_utils_1 = require("@metamask/controller-utils");
5
+ const eth_block_tracker_1 = require("@metamask/eth-block-tracker");
6
+ const eth_json_rpc_infura_1 = require("@metamask/eth-json-rpc-infura");
7
+ const eth_json_rpc_middleware_1 = require("@metamask/eth-json-rpc-middleware");
8
+ const eth_json_rpc_provider_1 = require("@metamask/eth-json-rpc-provider");
9
+ const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
10
+ const types_1 = require("./types.cjs");
11
+ const SECOND = 1000;
12
+ /**
13
+ * Create a JSON RPC network client for a specific network.
14
+ *
15
+ * @param networkConfig - The network configuration.
16
+ * @returns The network client.
17
+ */
18
+ function createNetworkClient(networkConfig) {
19
+ const rpcApiMiddleware = networkConfig.type === types_1.NetworkClientType.Infura
20
+ ? (0, eth_json_rpc_infura_1.createInfuraMiddleware)({
21
+ network: networkConfig.network,
22
+ projectId: networkConfig.infuraProjectId,
23
+ maxAttempts: 5,
24
+ source: 'metamask',
25
+ })
26
+ : (0, eth_json_rpc_middleware_1.createFetchMiddleware)({
27
+ btoa: global.btoa,
28
+ fetch: global.fetch,
29
+ rpcUrl: networkConfig.rpcUrl,
30
+ });
31
+ const rpcProvider = (0, eth_json_rpc_provider_1.providerFromMiddleware)(rpcApiMiddleware);
32
+ const blockTrackerOpts =
33
+ // eslint-disable-next-line n/no-process-env
34
+ process.env.IN_TEST && networkConfig.type === 'custom'
35
+ ? { pollingInterval: SECOND }
36
+ : {};
37
+ const blockTracker = new eth_block_tracker_1.PollingBlockTracker({
38
+ ...blockTrackerOpts,
39
+ provider: rpcProvider,
40
+ });
41
+ const networkMiddleware = networkConfig.type === types_1.NetworkClientType.Infura
42
+ ? createInfuraNetworkMiddleware({
43
+ blockTracker,
44
+ network: networkConfig.network,
45
+ rpcProvider,
46
+ rpcApiMiddleware,
47
+ })
48
+ : createCustomNetworkMiddleware({
49
+ blockTracker,
50
+ chainId: networkConfig.chainId,
51
+ rpcApiMiddleware,
52
+ });
53
+ const engine = new json_rpc_engine_1.JsonRpcEngine();
54
+ engine.push(networkMiddleware);
55
+ const provider = (0, eth_json_rpc_provider_1.providerFromEngine)(engine);
56
+ const destroy = () => {
57
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
58
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
59
+ blockTracker.destroy();
60
+ };
61
+ return { configuration: networkConfig, provider, blockTracker, destroy };
62
+ }
63
+ exports.createNetworkClient = createNetworkClient;
64
+ /**
65
+ * Create middleware for infura.
66
+ *
67
+ * @param args - The arguments.
68
+ * @param args.blockTracker - The block tracker to use.
69
+ * @param args.network - The Infura network to use.
70
+ * @param args.rpcProvider - The RPC provider to use.
71
+ * @param args.rpcApiMiddleware - Additional middleware.
72
+ * @returns The collection of middleware that makes up the Infura client.
73
+ */
74
+ function createInfuraNetworkMiddleware({ blockTracker, network, rpcProvider, rpcApiMiddleware, }) {
75
+ return (0, json_rpc_engine_1.mergeMiddleware)([
76
+ createNetworkAndChainIdMiddleware({ network }),
77
+ (0, eth_json_rpc_middleware_1.createBlockCacheMiddleware)({ blockTracker }),
78
+ (0, eth_json_rpc_middleware_1.createInflightCacheMiddleware)(),
79
+ (0, eth_json_rpc_middleware_1.createBlockRefMiddleware)({ blockTracker, provider: rpcProvider }),
80
+ (0, eth_json_rpc_middleware_1.createRetryOnEmptyMiddleware)({ blockTracker, provider: rpcProvider }),
81
+ (0, eth_json_rpc_middleware_1.createBlockTrackerInspectorMiddleware)({ blockTracker }),
82
+ rpcApiMiddleware,
83
+ ]);
84
+ }
85
+ /**
86
+ * Creates static method middleware.
87
+ *
88
+ * @param args - The Arguments.
89
+ * @param args.network - The Infura network to use.
90
+ * @returns The middleware that implements the eth_chainId method.
91
+ */
92
+ function createNetworkAndChainIdMiddleware({ network, }) {
93
+ return (0, json_rpc_engine_1.createScaffoldMiddleware)({
94
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
95
+ // eslint-disable-next-line @typescript-eslint/naming-convention
96
+ eth_chainId: controller_utils_1.ChainId[network],
97
+ });
98
+ }
99
+ const createChainIdMiddleware = (chainId) => {
100
+ return (req, res, next, end) => {
101
+ if (req.method === 'eth_chainId') {
102
+ res.result = chainId;
103
+ return end();
104
+ }
105
+ return next();
106
+ };
107
+ };
108
+ /**
109
+ * Creates custom middleware.
110
+ *
111
+ * @param args - The arguments.
112
+ * @param args.blockTracker - The block tracker to use.
113
+ * @param args.chainId - The chain id to use.
114
+ * @param args.rpcApiMiddleware - Additional middleware.
115
+ * @returns The collection of middleware that makes up the Infura client.
116
+ */
117
+ function createCustomNetworkMiddleware({ blockTracker, chainId, rpcApiMiddleware, }) {
118
+ // eslint-disable-next-line n/no-process-env
119
+ const testMiddlewares = process.env.IN_TEST
120
+ ? [createEstimateGasDelayTestMiddleware()]
121
+ : [];
122
+ return (0, json_rpc_engine_1.mergeMiddleware)([
123
+ ...testMiddlewares,
124
+ createChainIdMiddleware(chainId),
125
+ (0, eth_json_rpc_middleware_1.createBlockRefRewriteMiddleware)({ blockTracker }),
126
+ (0, eth_json_rpc_middleware_1.createBlockCacheMiddleware)({ blockTracker }),
127
+ (0, eth_json_rpc_middleware_1.createInflightCacheMiddleware)(),
128
+ (0, eth_json_rpc_middleware_1.createBlockTrackerInspectorMiddleware)({ blockTracker }),
129
+ rpcApiMiddleware,
130
+ ]);
131
+ }
132
+ /**
133
+ * For use in tests only.
134
+ * Adds a delay to `eth_estimateGas` calls.
135
+ *
136
+ * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
137
+ */
138
+ function createEstimateGasDelayTestMiddleware() {
139
+ return (0, json_rpc_engine_1.createAsyncMiddleware)(async (req, _, next) => {
140
+ if (req.method === 'eth_estimateGas') {
141
+ await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
142
+ }
143
+ return next();
144
+ });
145
+ }
146
+ //# sourceMappingURL=create-network-client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-network-client.cjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InfuraNetworkType } from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\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 type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';\nimport {\n providerFromEngine,\n providerFromMiddleware,\n} from '@metamask/eth-json-rpc-provider';\nimport {\n createAsyncMiddleware,\n createScaffoldMiddleware,\n JsonRpcEngine,\n mergeMiddleware,\n} from '@metamask/json-rpc-engine';\nimport type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport type { Hex, Json, JsonRpcParams } from '@metamask/utils';\n\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param networkConfig - The network configuration.\n * @returns The network client.\n */\nexport function createNetworkClient(\n networkConfig: NetworkClientConfiguration,\n): NetworkClient {\n const rpcApiMiddleware =\n networkConfig.type === NetworkClientType.Infura\n ? createInfuraMiddleware({\n network: networkConfig.network,\n projectId: networkConfig.infuraProjectId,\n maxAttempts: 5,\n source: 'metamask',\n })\n : createFetchMiddleware({\n btoa: global.btoa,\n fetch: global.fetch,\n rpcUrl: networkConfig.rpcUrl,\n });\n\n const rpcProvider = providerFromMiddleware(rpcApiMiddleware);\n\n const blockTrackerOpts =\n // eslint-disable-next-line n/no-process-env\n process.env.IN_TEST && networkConfig.type === 'custom'\n ? { pollingInterval: SECOND }\n : {};\n const blockTracker = new PollingBlockTracker({\n ...blockTrackerOpts,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n networkConfig.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: networkConfig.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: networkConfig.chainId,\n rpcApiMiddleware,\n });\n\n const engine = new JsonRpcEngine();\n\n engine.push(networkMiddleware);\n\n const provider = providerFromEngine(engine);\n\n const destroy = () => {\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: networkConfig, provider, blockTracker, destroy };\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: SafeEventEmitterProvider;\n rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;\n}) {\n return mergeMiddleware([\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}) {\n return createScaffoldMiddleware({\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcParams, Json> => {\n return (req, res, next, end) => {\n if (req.method === 'eth_chainId') {\n res.result = chainId;\n return end();\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: JsonRpcMiddleware<JsonRpcParams, Json>;\n}): JsonRpcMiddleware<JsonRpcParams, Json> {\n // eslint-disable-next-line n/no-process-env\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return mergeMiddleware([\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\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() {\n return createAsyncMiddleware(async (req, _, next) => {\n if (req.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { BlockTracker, NetworkClientConfiguration, Provider } from './types';
1
+ import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.cjs";
2
2
  /**
3
3
  * The pair of provider / block tracker that can be used to interface with the
4
4
  * network and respond to new activity.
@@ -16,4 +16,4 @@ export type NetworkClient = {
16
16
  * @returns The network client.
17
17
  */
18
18
  export declare function createNetworkClient(networkConfig: NetworkClientConfiguration): NetworkClient;
19
- //# sourceMappingURL=create-network-client.d.ts.map
19
+ //# sourceMappingURL=create-network-client.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-network-client.d.cts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,0BAA0B,GACxC,aAAa,CAsDf"}
@@ -0,0 +1,19 @@
1
+ import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.mjs";
2
+ /**
3
+ * The pair of provider / block tracker that can be used to interface with the
4
+ * network and respond to new activity.
5
+ */
6
+ export type NetworkClient = {
7
+ configuration: NetworkClientConfiguration;
8
+ provider: Provider;
9
+ blockTracker: BlockTracker;
10
+ destroy: () => void;
11
+ };
12
+ /**
13
+ * Create a JSON RPC network client for a specific network.
14
+ *
15
+ * @param networkConfig - The network configuration.
16
+ * @returns The network client.
17
+ */
18
+ export declare function createNetworkClient(networkConfig: NetworkClientConfiguration): NetworkClient;
19
+ //# sourceMappingURL=create-network-client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-network-client.d.mts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,0BAA0B,GACxC,aAAa,CAsDf"}
@@ -1,9 +1,145 @@
1
- import {
2
- createNetworkClient
3
- } from "./chunk-U43RY4MY.mjs";
4
- import "./chunk-AU4UVIPZ.mjs";
5
- import "./chunk-XUI43LEZ.mjs";
6
- export {
7
- createNetworkClient
1
+ import { ChainId } from "@metamask/controller-utils";
2
+ import $metamaskethblocktracker from "@metamask/eth-block-tracker";
3
+ const { PollingBlockTracker } = $metamaskethblocktracker;
4
+ import $metamaskethjsonrpcinfura from "@metamask/eth-json-rpc-infura";
5
+ const { createInfuraMiddleware } = $metamaskethjsonrpcinfura;
6
+ import $metamaskethjsonrpcmiddleware from "@metamask/eth-json-rpc-middleware";
7
+ const { createBlockCacheMiddleware, createBlockRefMiddleware, createBlockRefRewriteMiddleware, createBlockTrackerInspectorMiddleware, createInflightCacheMiddleware, createFetchMiddleware, createRetryOnEmptyMiddleware } = $metamaskethjsonrpcmiddleware;
8
+ import { providerFromEngine, providerFromMiddleware } from "@metamask/eth-json-rpc-provider";
9
+ import { createAsyncMiddleware, createScaffoldMiddleware, JsonRpcEngine, mergeMiddleware } from "@metamask/json-rpc-engine";
10
+ import { NetworkClientType } from "./types.mjs";
11
+ const SECOND = 1000;
12
+ /**
13
+ * Create a JSON RPC network client for a specific network.
14
+ *
15
+ * @param networkConfig - The network configuration.
16
+ * @returns The network client.
17
+ */
18
+ export function createNetworkClient(networkConfig) {
19
+ const rpcApiMiddleware = networkConfig.type === NetworkClientType.Infura
20
+ ? createInfuraMiddleware({
21
+ network: networkConfig.network,
22
+ projectId: networkConfig.infuraProjectId,
23
+ maxAttempts: 5,
24
+ source: 'metamask',
25
+ })
26
+ : createFetchMiddleware({
27
+ btoa: global.btoa,
28
+ fetch: global.fetch,
29
+ rpcUrl: networkConfig.rpcUrl,
30
+ });
31
+ const rpcProvider = providerFromMiddleware(rpcApiMiddleware);
32
+ const blockTrackerOpts =
33
+ // eslint-disable-next-line n/no-process-env
34
+ process.env.IN_TEST && networkConfig.type === 'custom'
35
+ ? { pollingInterval: SECOND }
36
+ : {};
37
+ const blockTracker = new PollingBlockTracker({
38
+ ...blockTrackerOpts,
39
+ provider: rpcProvider,
40
+ });
41
+ const networkMiddleware = networkConfig.type === NetworkClientType.Infura
42
+ ? createInfuraNetworkMiddleware({
43
+ blockTracker,
44
+ network: networkConfig.network,
45
+ rpcProvider,
46
+ rpcApiMiddleware,
47
+ })
48
+ : createCustomNetworkMiddleware({
49
+ blockTracker,
50
+ chainId: networkConfig.chainId,
51
+ rpcApiMiddleware,
52
+ });
53
+ const engine = new JsonRpcEngine();
54
+ engine.push(networkMiddleware);
55
+ const provider = providerFromEngine(engine);
56
+ const destroy = () => {
57
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
58
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
59
+ blockTracker.destroy();
60
+ };
61
+ return { configuration: networkConfig, provider, blockTracker, destroy };
62
+ }
63
+ /**
64
+ * Create middleware for infura.
65
+ *
66
+ * @param args - The arguments.
67
+ * @param args.blockTracker - The block tracker to use.
68
+ * @param args.network - The Infura network to use.
69
+ * @param args.rpcProvider - The RPC provider to use.
70
+ * @param args.rpcApiMiddleware - Additional middleware.
71
+ * @returns The collection of middleware that makes up the Infura client.
72
+ */
73
+ function createInfuraNetworkMiddleware({ blockTracker, network, rpcProvider, rpcApiMiddleware, }) {
74
+ return mergeMiddleware([
75
+ createNetworkAndChainIdMiddleware({ network }),
76
+ createBlockCacheMiddleware({ blockTracker }),
77
+ createInflightCacheMiddleware(),
78
+ createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
79
+ createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
80
+ createBlockTrackerInspectorMiddleware({ blockTracker }),
81
+ rpcApiMiddleware,
82
+ ]);
83
+ }
84
+ /**
85
+ * Creates static method middleware.
86
+ *
87
+ * @param args - The Arguments.
88
+ * @param args.network - The Infura network to use.
89
+ * @returns The middleware that implements the eth_chainId method.
90
+ */
91
+ function createNetworkAndChainIdMiddleware({ network, }) {
92
+ return createScaffoldMiddleware({
93
+ // TODO: Either fix this lint violation or explain why it's necessary to ignore.
94
+ // eslint-disable-next-line @typescript-eslint/naming-convention
95
+ eth_chainId: ChainId[network],
96
+ });
97
+ }
98
+ const createChainIdMiddleware = (chainId) => {
99
+ return (req, res, next, end) => {
100
+ if (req.method === 'eth_chainId') {
101
+ res.result = chainId;
102
+ return end();
103
+ }
104
+ return next();
105
+ };
8
106
  };
107
+ /**
108
+ * Creates custom middleware.
109
+ *
110
+ * @param args - The arguments.
111
+ * @param args.blockTracker - The block tracker to use.
112
+ * @param args.chainId - The chain id to use.
113
+ * @param args.rpcApiMiddleware - Additional middleware.
114
+ * @returns The collection of middleware that makes up the Infura client.
115
+ */
116
+ function createCustomNetworkMiddleware({ blockTracker, chainId, rpcApiMiddleware, }) {
117
+ // eslint-disable-next-line n/no-process-env
118
+ const testMiddlewares = process.env.IN_TEST
119
+ ? [createEstimateGasDelayTestMiddleware()]
120
+ : [];
121
+ return mergeMiddleware([
122
+ ...testMiddlewares,
123
+ createChainIdMiddleware(chainId),
124
+ createBlockRefRewriteMiddleware({ blockTracker }),
125
+ createBlockCacheMiddleware({ blockTracker }),
126
+ createInflightCacheMiddleware(),
127
+ createBlockTrackerInspectorMiddleware({ blockTracker }),
128
+ rpcApiMiddleware,
129
+ ]);
130
+ }
131
+ /**
132
+ * For use in tests only.
133
+ * Adds a delay to `eth_estimateGas` calls.
134
+ *
135
+ * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
136
+ */
137
+ function createEstimateGasDelayTestMiddleware() {
138
+ return createAsyncMiddleware(async (req, _, next) => {
139
+ if (req.method === 'eth_estimateGas') {
140
+ await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
141
+ }
142
+ return next();
143
+ });
144
+ }
9
145
  //# sourceMappingURL=create-network-client.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"file":"create-network-client.mjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InfuraNetworkType } from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\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 type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';\nimport {\n providerFromEngine,\n providerFromMiddleware,\n} from '@metamask/eth-json-rpc-provider';\nimport {\n createAsyncMiddleware,\n createScaffoldMiddleware,\n JsonRpcEngine,\n mergeMiddleware,\n} from '@metamask/json-rpc-engine';\nimport type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport type { Hex, Json, JsonRpcParams } from '@metamask/utils';\n\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param networkConfig - The network configuration.\n * @returns The network client.\n */\nexport function createNetworkClient(\n networkConfig: NetworkClientConfiguration,\n): NetworkClient {\n const rpcApiMiddleware =\n networkConfig.type === NetworkClientType.Infura\n ? createInfuraMiddleware({\n network: networkConfig.network,\n projectId: networkConfig.infuraProjectId,\n maxAttempts: 5,\n source: 'metamask',\n })\n : createFetchMiddleware({\n btoa: global.btoa,\n fetch: global.fetch,\n rpcUrl: networkConfig.rpcUrl,\n });\n\n const rpcProvider = providerFromMiddleware(rpcApiMiddleware);\n\n const blockTrackerOpts =\n // eslint-disable-next-line n/no-process-env\n process.env.IN_TEST && networkConfig.type === 'custom'\n ? { pollingInterval: SECOND }\n : {};\n const blockTracker = new PollingBlockTracker({\n ...blockTrackerOpts,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n networkConfig.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: networkConfig.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: networkConfig.chainId,\n rpcApiMiddleware,\n });\n\n const engine = new JsonRpcEngine();\n\n engine.push(networkMiddleware);\n\n const provider = providerFromEngine(engine);\n\n const destroy = () => {\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: networkConfig, provider, blockTracker, destroy };\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: SafeEventEmitterProvider;\n rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;\n}) {\n return mergeMiddleware([\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}) {\n return createScaffoldMiddleware({\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcParams, Json> => {\n return (req, res, next, end) => {\n if (req.method === 'eth_chainId') {\n res.result = chainId;\n return end();\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: JsonRpcMiddleware<JsonRpcParams, Json>;\n}): JsonRpcMiddleware<JsonRpcParams, Json> {\n // eslint-disable-next-line n/no-process-env\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return mergeMiddleware([\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\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() {\n return createAsyncMiddleware(async (req, _, next) => {\n if (req.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n });\n}\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.NetworkClientType = exports.RpcEndpointType = exports.NetworkController = exports.knownKeysOf = exports.selectAvailableNetworkClientIds = exports.getDefaultNetworkControllerState = void 0;
18
+ var NetworkController_1 = require("./NetworkController.cjs");
19
+ Object.defineProperty(exports, "getDefaultNetworkControllerState", { enumerable: true, get: function () { return NetworkController_1.getDefaultNetworkControllerState; } });
20
+ Object.defineProperty(exports, "selectAvailableNetworkClientIds", { enumerable: true, get: function () { return NetworkController_1.selectAvailableNetworkClientIds; } });
21
+ Object.defineProperty(exports, "knownKeysOf", { enumerable: true, get: function () { return NetworkController_1.knownKeysOf; } });
22
+ Object.defineProperty(exports, "NetworkController", { enumerable: true, get: function () { return NetworkController_1.NetworkController; } });
23
+ Object.defineProperty(exports, "RpcEndpointType", { enumerable: true, get: function () { return NetworkController_1.RpcEndpointType; } });
24
+ __exportStar(require("./constants.cjs"), exports);
25
+ var types_1 = require("./types.cjs");
26
+ Object.defineProperty(exports, "NetworkClientType", { enumerable: true, get: function () { return types_1.NetworkClientType; } });
27
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAiCA,6DAM6B;AAL3B,qIAAA,gCAAgC,OAAA;AAChC,oIAAA,+BAA+B,OAAA;AAC/B,gHAAA,WAAW,OAAA;AACX,sHAAA,iBAAiB,OAAA;AACjB,oHAAA,eAAe,OAAA;AAEjB,kDAA4B;AAO5B,qCAA4C;AAAnC,0GAAA,iBAAiB,OAAA","sourcesContent":["export type { AutoManagedNetworkClient } from './create-auto-managed-network-client';\nexport type {\n Block,\n NetworkMetadata,\n NetworkConfiguration,\n BuiltInNetworkClientId,\n CustomNetworkClientId,\n NetworkClientId,\n NetworksMetadata,\n NetworkState,\n BlockTrackerProxy,\n ProviderProxy,\n AddNetworkFields,\n UpdateNetworkFields,\n NetworkControllerStateChangeEvent,\n NetworkControllerNetworkWillChangeEvent,\n NetworkControllerNetworkDidChangeEvent,\n NetworkControllerInfuraIsBlockedEvent,\n NetworkControllerInfuraIsUnblockedEvent,\n NetworkControllerEvents,\n NetworkControllerGetStateAction,\n NetworkControllerGetEthQueryAction,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetEIP1559CompatibilityAction,\n NetworkControllerFindNetworkClientIdByChainIdAction,\n NetworkControllerSetProviderTypeAction,\n NetworkControllerSetActiveNetworkAction,\n NetworkControllerGetNetworkConfigurationByNetworkClientId,\n NetworkControllerActions,\n NetworkControllerMessenger,\n NetworkControllerOptions,\n} from './NetworkController';\nexport {\n getDefaultNetworkControllerState,\n selectAvailableNetworkClientIds,\n knownKeysOf,\n NetworkController,\n RpcEndpointType,\n} from './NetworkController';\nexport * from './constants';\nexport type { BlockTracker, Provider } from './types';\nexport type {\n NetworkClientConfiguration,\n InfuraNetworkClientConfiguration,\n CustomNetworkClientConfiguration,\n} from './types';\nexport { NetworkClientType } from './types';\nexport type { NetworkClient } from './create-network-client';\n"]}