@metamask-previews/network-controller 36.0.0-preview-3e34650c2 → 36.0.0-preview-4f4c98e

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 (158) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/{NetworkController-method-action-types.d.mts → NetworkController-method-action-types.d.ts} +2 -2
  3. package/dist/NetworkController-method-action-types.d.ts.map +1 -0
  4. package/dist/{NetworkController-method-action-types.mjs → NetworkController-method-action-types.js} +1 -1
  5. package/dist/NetworkController-method-action-types.js.map +1 -0
  6. package/dist/{NetworkController.d.cts → NetworkController.d.ts} +37 -29
  7. package/dist/NetworkController.d.ts.map +1 -0
  8. package/dist/{NetworkController.mjs → NetworkController.js} +20 -29
  9. package/dist/NetworkController.js.map +1 -0
  10. package/dist/{constants.d.cts → constants.d.ts} +1 -1
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/{constants.mjs → constants.js} +1 -1
  13. package/dist/constants.js.map +1 -0
  14. package/dist/{create-auto-managed-network-client.d.cts → create-auto-managed-network-client.d.ts} +7 -7
  15. package/dist/create-auto-managed-network-client.d.ts.map +1 -0
  16. package/dist/{create-auto-managed-network-client.mjs → create-auto-managed-network-client.js} +2 -2
  17. package/dist/create-auto-managed-network-client.js.map +1 -0
  18. package/dist/{create-network-client.d.cts → create-network-client.d.ts} +7 -7
  19. package/dist/create-network-client.d.ts.map +1 -0
  20. package/dist/{create-network-client.mjs → create-network-client.js} +15 -14
  21. package/dist/create-network-client.js.map +1 -0
  22. package/dist/{index.d.cts → index.d.ts} +16 -16
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +6 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +4 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +4 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/rpc-service/{abstract-rpc-service.d.cts → abstract-rpc-service.d.ts} +2 -2
  31. package/dist/rpc-service/abstract-rpc-service.d.ts.map +1 -0
  32. package/dist/rpc-service/abstract-rpc-service.js +2 -0
  33. package/dist/rpc-service/abstract-rpc-service.js.map +1 -0
  34. package/dist/rpc-service/{rpc-service-chain.d.cts → rpc-service-chain.d.ts} +6 -6
  35. package/dist/rpc-service/rpc-service-chain.d.ts.map +1 -0
  36. package/dist/rpc-service/{rpc-service-chain.mjs → rpc-service-chain.js} +4 -4
  37. package/dist/rpc-service/rpc-service-chain.js.map +1 -0
  38. package/dist/rpc-service/{rpc-service-requestable.d.cts → rpc-service-requestable.d.ts} +4 -4
  39. package/dist/rpc-service/rpc-service-requestable.d.ts.map +1 -0
  40. package/dist/rpc-service/rpc-service-requestable.js +2 -0
  41. package/dist/rpc-service/rpc-service-requestable.js.map +1 -0
  42. package/dist/rpc-service/{rpc-service.d.mts → rpc-service.d.ts} +6 -6
  43. package/dist/rpc-service/rpc-service.d.ts.map +1 -0
  44. package/dist/rpc-service/{rpc-service.mjs → rpc-service.js} +6 -14
  45. package/dist/rpc-service/rpc-service.js.map +1 -0
  46. package/dist/rpc-service/{shared.d.cts → shared.d.ts} +2 -2
  47. package/dist/rpc-service/shared.d.ts.map +1 -0
  48. package/dist/rpc-service/shared.js +2 -0
  49. package/dist/rpc-service/shared.js.map +1 -0
  50. package/dist/{rpc-service-analytics.d.mts → rpc-service-analytics.d.ts} +3 -3
  51. package/dist/rpc-service-analytics.d.ts.map +1 -0
  52. package/dist/{rpc-service-analytics.mjs → rpc-service-analytics.js} +4 -4
  53. package/dist/rpc-service-analytics.js.map +1 -0
  54. package/dist/{selectors.d.mts → selectors.d.ts} +2 -2
  55. package/dist/selectors.d.ts.map +1 -0
  56. package/dist/{selectors.mjs → selectors.js} +1 -1
  57. package/dist/selectors.js.map +1 -0
  58. package/dist/{types.d.cts → types.d.ts} +5 -5
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/{types.mjs → types.js} +1 -1
  61. package/dist/types.js.map +1 -0
  62. package/package.json +15 -19
  63. package/dist/NetworkController-method-action-types.cjs +0 -7
  64. package/dist/NetworkController-method-action-types.cjs.map +0 -1
  65. package/dist/NetworkController-method-action-types.d.cts +0 -268
  66. package/dist/NetworkController-method-action-types.d.cts.map +0 -1
  67. package/dist/NetworkController-method-action-types.d.mts.map +0 -1
  68. package/dist/NetworkController-method-action-types.mjs.map +0 -1
  69. package/dist/NetworkController.cjs +0 -1599
  70. package/dist/NetworkController.cjs.map +0 -1
  71. package/dist/NetworkController.d.cts.map +0 -1
  72. package/dist/NetworkController.d.mts +0 -956
  73. package/dist/NetworkController.d.mts.map +0 -1
  74. package/dist/NetworkController.mjs.map +0 -1
  75. package/dist/constants.cjs +0 -46
  76. package/dist/constants.cjs.map +0 -1
  77. package/dist/constants.d.cts.map +0 -1
  78. package/dist/constants.d.mts +0 -42
  79. package/dist/constants.d.mts.map +0 -1
  80. package/dist/constants.mjs.map +0 -1
  81. package/dist/create-auto-managed-network-client.cjs +0 -149
  82. package/dist/create-auto-managed-network-client.cjs.map +0 -1
  83. package/dist/create-auto-managed-network-client.d.cts.map +0 -1
  84. package/dist/create-auto-managed-network-client.d.mts +0 -74
  85. package/dist/create-auto-managed-network-client.d.mts.map +0 -1
  86. package/dist/create-auto-managed-network-client.mjs.map +0 -1
  87. package/dist/create-network-client.cjs +0 -439
  88. package/dist/create-network-client.cjs.map +0 -1
  89. package/dist/create-network-client.d.cts.map +0 -1
  90. package/dist/create-network-client.d.mts +0 -60
  91. package/dist/create-network-client.d.mts.map +0 -1
  92. package/dist/create-network-client.mjs.map +0 -1
  93. package/dist/index.cjs +0 -31
  94. package/dist/index.cjs.map +0 -1
  95. package/dist/index.d.cts.map +0 -1
  96. package/dist/index.d.mts +0 -16
  97. package/dist/index.d.mts.map +0 -1
  98. package/dist/index.mjs +0 -6
  99. package/dist/index.mjs.map +0 -1
  100. package/dist/logger.cjs +0 -7
  101. package/dist/logger.cjs.map +0 -1
  102. package/dist/logger.d.cts +0 -5
  103. package/dist/logger.d.cts.map +0 -1
  104. package/dist/logger.d.mts +0 -5
  105. package/dist/logger.d.mts.map +0 -1
  106. package/dist/logger.mjs +0 -4
  107. package/dist/logger.mjs.map +0 -1
  108. package/dist/rpc-service/abstract-rpc-service.cjs +0 -3
  109. package/dist/rpc-service/abstract-rpc-service.cjs.map +0 -1
  110. package/dist/rpc-service/abstract-rpc-service.d.cts.map +0 -1
  111. package/dist/rpc-service/abstract-rpc-service.d.mts +0 -17
  112. package/dist/rpc-service/abstract-rpc-service.d.mts.map +0 -1
  113. package/dist/rpc-service/abstract-rpc-service.mjs +0 -2
  114. package/dist/rpc-service/abstract-rpc-service.mjs.map +0 -1
  115. package/dist/rpc-service/rpc-service-chain.cjs +0 -304
  116. package/dist/rpc-service/rpc-service-chain.cjs.map +0 -1
  117. package/dist/rpc-service/rpc-service-chain.d.cts.map +0 -1
  118. package/dist/rpc-service/rpc-service-chain.d.mts +0 -169
  119. package/dist/rpc-service/rpc-service-chain.d.mts.map +0 -1
  120. package/dist/rpc-service/rpc-service-chain.mjs.map +0 -1
  121. package/dist/rpc-service/rpc-service-requestable.cjs +0 -3
  122. package/dist/rpc-service/rpc-service-requestable.cjs.map +0 -1
  123. package/dist/rpc-service/rpc-service-requestable.d.cts.map +0 -1
  124. package/dist/rpc-service/rpc-service-requestable.d.mts +0 -63
  125. package/dist/rpc-service/rpc-service-requestable.d.mts.map +0 -1
  126. package/dist/rpc-service/rpc-service-requestable.mjs +0 -2
  127. package/dist/rpc-service/rpc-service-requestable.mjs.map +0 -1
  128. package/dist/rpc-service/rpc-service.cjs +0 -540
  129. package/dist/rpc-service/rpc-service.cjs.map +0 -1
  130. package/dist/rpc-service/rpc-service.d.cts +0 -247
  131. package/dist/rpc-service/rpc-service.d.cts.map +0 -1
  132. package/dist/rpc-service/rpc-service.d.mts.map +0 -1
  133. package/dist/rpc-service/rpc-service.mjs.map +0 -1
  134. package/dist/rpc-service/shared.cjs +0 -3
  135. package/dist/rpc-service/shared.cjs.map +0 -1
  136. package/dist/rpc-service/shared.d.cts.map +0 -1
  137. package/dist/rpc-service/shared.d.mts +0 -32
  138. package/dist/rpc-service/shared.d.mts.map +0 -1
  139. package/dist/rpc-service/shared.mjs +0 -2
  140. package/dist/rpc-service/shared.mjs.map +0 -1
  141. package/dist/rpc-service-analytics.cjs +0 -180
  142. package/dist/rpc-service-analytics.cjs.map +0 -1
  143. package/dist/rpc-service-analytics.d.cts +0 -85
  144. package/dist/rpc-service-analytics.d.cts.map +0 -1
  145. package/dist/rpc-service-analytics.d.mts.map +0 -1
  146. package/dist/rpc-service-analytics.mjs.map +0 -1
  147. package/dist/selectors.cjs +0 -16
  148. package/dist/selectors.cjs.map +0 -1
  149. package/dist/selectors.d.cts +0 -22
  150. package/dist/selectors.d.cts.map +0 -1
  151. package/dist/selectors.d.mts.map +0 -1
  152. package/dist/selectors.mjs.map +0 -1
  153. package/dist/types.cjs +0 -12
  154. package/dist/types.cjs.map +0 -1
  155. package/dist/types.d.cts.map +0 -1
  156. package/dist/types.d.mts +0 -49
  157. package/dist/types.d.mts.map +0 -1
  158. package/dist/types.mjs.map +0 -1
@@ -1,149 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAutoManagedNetworkClient = void 0;
4
- const create_network_client_js_1 = require("./create-network-client.cjs");
5
- /**
6
- * The name of the method on both the provider and block tracker proxy which can
7
- * be used to get the underlying provider or block tracker from the network
8
- * client, when it is initialized.
9
- */
10
- const REFLECTIVE_PROPERTY_NAME = '__target__';
11
- /**
12
- * By default, the provider and block provider proxies will point to nothing.
13
- * This is impossible when using the Proxy API, as the target object has to be
14
- * something, so this object represents that "something".
15
- */
16
- const UNINITIALIZED_TARGET = { __UNINITIALIZED__: true };
17
- /**
18
- * This function creates two proxies, one that wraps a provider and another that
19
- * wraps a block tracker. These proxies are unique in that both will be "empty"
20
- * at first; that is, neither will point to a functional provider or block
21
- * tracker. Instead, as soon as a method or event is accessed on either object
22
- * that requires a network request to function, a network client is created on
23
- * the fly and the method or event in question is then forwarded to whichever
24
- * part of the network client is serving as the receiver. The network client is
25
- * then cached for subsequent usages.
26
- *
27
- * @param args - The arguments.
28
- * @param args.networkClientId - The ID that will be assigned to the new network
29
- * client in the registry.
30
- * @param args.networkClientConfiguration - The configuration object that will be
31
- * used to instantiate the network client when it is needed.
32
- * @param args.getRpcServiceOptions - Factory for constructing RPC service
33
- * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.
34
- * @param args.getBlockTrackerOptions - Factory for constructing block tracker
35
- * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.
36
- * @param args.messenger - The network controller messenger.
37
- * @param args.rpcFailoverMode - The RPC failover mode to apply: `disabled`,
38
- * `enabled` (divert to the failover URLs when the primary is unavailable), or
39
- * `forced` (route all traffic for Infura endpoints with failover URLs to those
40
- * URLs, bypassing Infura).
41
- * @param args.logger - A `loglevel` logger.
42
- * @returns The auto-managed network client.
43
- */
44
- function createAutoManagedNetworkClient({ networkClientId, networkClientConfiguration, getRpcServiceOptions, getBlockTrackerOptions = () => ({}), messenger, rpcFailoverMode: givenRpcFailoverMode, logger, }) {
45
- let rpcFailoverMode = givenRpcFailoverMode;
46
- let networkClient;
47
- const ensureNetworkClientCreated = () => {
48
- networkClient ?? (networkClient = (0, create_network_client_js_1.createNetworkClient)({
49
- id: networkClientId,
50
- configuration: networkClientConfiguration,
51
- getRpcServiceOptions,
52
- getBlockTrackerOptions,
53
- messenger,
54
- rpcFailoverMode,
55
- logger,
56
- }));
57
- if (networkClient === undefined) {
58
- throw new Error("It looks like `createNetworkClient` didn't return anything. Perhaps it's being mocked?");
59
- }
60
- return networkClient;
61
- };
62
- const providerProxy = new Proxy(UNINITIALIZED_TARGET, {
63
- get(_target, propertyName, receiver) {
64
- if (propertyName === REFLECTIVE_PROPERTY_NAME) {
65
- return networkClient?.provider;
66
- }
67
- const { provider } = ensureNetworkClientCreated();
68
- if (propertyName in provider) {
69
- // Typecast: We know that `[propertyName]` is a propertyName on
70
- // `provider`.
71
- const value = provider[propertyName];
72
- if (typeof value === 'function') {
73
- // Ensure that the method on the provider is called with `this` as
74
- // the target, *not* the proxy (which happens by default) —
75
- // this allows private properties to be accessed
76
- return function (...args) {
77
- // @ts-expect-error We don't care that `this` may not be compatible
78
- // with the signature of the method being called, as technically
79
- // it can be anything.
80
- return value.apply(this === receiver ? provider : this, args);
81
- };
82
- }
83
- return value;
84
- }
85
- return undefined;
86
- },
87
- // TODO: Replace `any` with type
88
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
- has(_target, propertyName) {
90
- if (propertyName === REFLECTIVE_PROPERTY_NAME) {
91
- return true;
92
- }
93
- const { provider } = ensureNetworkClientCreated();
94
- return propertyName in provider;
95
- },
96
- });
97
- const blockTrackerProxy = new Proxy(UNINITIALIZED_TARGET, {
98
- get(_target, propertyName, receiver) {
99
- if (propertyName === REFLECTIVE_PROPERTY_NAME) {
100
- return networkClient?.blockTracker;
101
- }
102
- const { blockTracker } = ensureNetworkClientCreated();
103
- if (propertyName in blockTracker) {
104
- // Typecast: We know that `[propertyName]` is a propertyName on
105
- // `provider`.
106
- const value = blockTracker[propertyName];
107
- if (typeof value === 'function') {
108
- // Ensure that the method on the provider is called with `this` as
109
- // the target, *not* the proxy (which happens by default) —
110
- // this allows private properties to be accessed
111
- return function (...args) {
112
- // @ts-expect-error We don't care that `this` may not be
113
- // compatible with the signature of the method being called, as
114
- // technically it can be anything.
115
- return value.apply(this === receiver ? blockTracker : this, args);
116
- };
117
- }
118
- return value;
119
- }
120
- return undefined;
121
- },
122
- // TODO: Replace `any` with type
123
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
- has(_target, propertyName) {
125
- if (propertyName === REFLECTIVE_PROPERTY_NAME) {
126
- return true;
127
- }
128
- const { blockTracker } = ensureNetworkClientCreated();
129
- return propertyName in blockTracker;
130
- },
131
- });
132
- const destroy = () => {
133
- networkClient?.destroy();
134
- };
135
- const setRpcFailoverMode = (newRpcFailoverMode) => {
136
- rpcFailoverMode = newRpcFailoverMode;
137
- destroy();
138
- networkClient = undefined;
139
- };
140
- return {
141
- configuration: networkClientConfiguration,
142
- provider: providerProxy,
143
- blockTracker: blockTrackerProxy,
144
- destroy,
145
- setRpcFailoverMode,
146
- };
147
- }
148
- exports.createAutoManagedNetworkClient = createAutoManagedNetworkClient;
149
- //# sourceMappingURL=create-auto-managed-network-client.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-auto-managed-network-client.cjs","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.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 +0,0 @@
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,74 +0,0 @@
1
- import type { PollingBlockTrackerOptions } from "@metamask/eth-block-tracker";
2
- import type { Logger } from "loglevel";
3
- import type { NetworkClientId, NetworkControllerMessenger } from "./NetworkController.mjs";
4
- import type { RpcServiceOptionsWithDefaults } from "./rpc-service/rpc-service.mjs";
5
- import type { RpcFailoverMode } from "./selectors.mjs";
6
- import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.mjs";
7
- /**
8
- * The name of the method on both the provider and block tracker proxy which can
9
- * be used to get the underlying provider or block tracker from the network
10
- * client, when it is initialized.
11
- */
12
- declare const REFLECTIVE_PROPERTY_NAME = "__target__";
13
- /**
14
- * Represents a proxy object which wraps a target object. As a proxy, it allows
15
- * for accessing and setting all of the properties that the target object
16
- * supports, but also supports an extra propertyName (`__target__`) to access
17
- * the target itself.
18
- *
19
- * @template Type - The type of the target object. It is assumed that this type
20
- * will be constant even when the target is swapped.
21
- */
22
- export type ProxyWithAccessibleTarget<TargetType> = TargetType & {
23
- [REFLECTIVE_PROPERTY_NAME]: TargetType;
24
- };
25
- /**
26
- * An object that provides the same interface as a network client but where the
27
- * network client is not initialized until either the provider or block tracker
28
- * is first accessed.
29
- */
30
- export type AutoManagedNetworkClient<Configuration extends NetworkClientConfiguration> = {
31
- configuration: Configuration;
32
- provider: ProxyWithAccessibleTarget<Provider>;
33
- blockTracker: ProxyWithAccessibleTarget<BlockTracker>;
34
- destroy: () => void;
35
- setRpcFailoverMode: (rpcFailoverMode: RpcFailoverMode) => void;
36
- };
37
- /**
38
- * This function creates two proxies, one that wraps a provider and another that
39
- * wraps a block tracker. These proxies are unique in that both will be "empty"
40
- * at first; that is, neither will point to a functional provider or block
41
- * tracker. Instead, as soon as a method or event is accessed on either object
42
- * that requires a network request to function, a network client is created on
43
- * the fly and the method or event in question is then forwarded to whichever
44
- * part of the network client is serving as the receiver. The network client is
45
- * then cached for subsequent usages.
46
- *
47
- * @param args - The arguments.
48
- * @param args.networkClientId - The ID that will be assigned to the new network
49
- * client in the registry.
50
- * @param args.networkClientConfiguration - The configuration object that will be
51
- * used to instantiate the network client when it is needed.
52
- * @param args.getRpcServiceOptions - Factory for constructing RPC service
53
- * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.
54
- * @param args.getBlockTrackerOptions - Factory for constructing block tracker
55
- * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.
56
- * @param args.messenger - The network controller messenger.
57
- * @param args.rpcFailoverMode - The RPC failover mode to apply: `disabled`,
58
- * `enabled` (divert to the failover URLs when the primary is unavailable), or
59
- * `forced` (route all traffic for Infura endpoints with failover URLs to those
60
- * URLs, bypassing Infura).
61
- * @param args.logger - A `loglevel` logger.
62
- * @returns The auto-managed network client.
63
- */
64
- export declare function createAutoManagedNetworkClient<Configuration extends NetworkClientConfiguration>({ networkClientId, networkClientConfiguration, getRpcServiceOptions, getBlockTrackerOptions, messenger, rpcFailoverMode: givenRpcFailoverMode, logger, }: {
65
- networkClientId: NetworkClientId;
66
- networkClientConfiguration: Configuration;
67
- getRpcServiceOptions?: (rpcEndpointUrl: string) => RpcServiceOptionsWithDefaults;
68
- getBlockTrackerOptions?: (rpcEndpointUrl: string) => Omit<PollingBlockTrackerOptions, 'provider'>;
69
- messenger: NetworkControllerMessenger;
70
- rpcFailoverMode: RpcFailoverMode;
71
- logger?: Logger;
72
- }): AutoManagedNetworkClient<Configuration>;
73
- export {};
74
- //# sourceMappingURL=create-auto-managed-network-client.d.mts.map
@@ -1 +0,0 @@
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 +0,0 @@
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.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"]}