@metamask/selected-network-controller 10.0.1 → 12.0.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.
- package/CHANGELOG.md +36 -1
- package/dist/SelectedNetworkController.js +2 -2
- package/dist/SelectedNetworkController.mjs +1 -1
- package/dist/SelectedNetworkMiddleware.js +3 -3
- package/dist/SelectedNetworkMiddleware.mjs +2 -2
- package/dist/{chunk-WK7GHGRD.js → chunk-GH5B6PLJ.js} +88 -42
- package/dist/chunk-GH5B6PLJ.js.map +1 -0
- package/dist/{chunk-PPX4FXXU.mjs → chunk-HLY6NUFO.mjs} +2 -2
- package/dist/{chunk-DZKNOQNE.mjs → chunk-IVAOSEAZ.mjs} +88 -42
- package/dist/chunk-IVAOSEAZ.mjs.map +1 -0
- package/dist/{chunk-MRZPOKCN.js → chunk-LYHGM2FW.js} +3 -3
- package/dist/index.js +3 -3
- package/dist/index.mjs +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/SelectedNetworkController.d.ts +23 -19
- package/dist/types/SelectedNetworkController.d.ts.map +1 -1
- package/dist/types/SelectedNetworkMiddleware.d.ts +1 -1
- package/dist/types/SelectedNetworkMiddleware.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/chunk-DZKNOQNE.mjs.map +0 -1
- package/dist/chunk-WK7GHGRD.js.map +0 -1
- /package/dist/{chunk-PPX4FXXU.mjs.map → chunk-HLY6NUFO.mjs.map} +0 -0
- /package/dist/{chunk-MRZPOKCN.js.map → chunk-LYHGM2FW.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [12.0.0]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- These changes keep the per domain proxies (stored in domainProxyMap) pointing to the correct network client instance when the "Select networks for each site" toggle is turned on and off.
|
|
15
|
+
- **BREAKING:** A parameter `useRequestQueuePreference` which should point to the current preferences state for `useRequestQueue` is now required by the constructor ([#4130](https://github.com/MetaMask/core/pull/4130))
|
|
16
|
+
- - **BREAKING:** An `onPreferencesStateChange` argument that should subscribe to `PreferencesController` state changes and call a callback with the updated state is now a required parameter in the constructor options object. ([#4130](https://github.com/MetaMask/core/pull/4130))
|
|
17
|
+
|
|
18
|
+
### Removed
|
|
19
|
+
|
|
20
|
+
- The `getUseRequestQueue` parameter is no longer expected by the constructor. ([#4130](https://github.com/MetaMask/core/pull/4130))
|
|
21
|
+
|
|
22
|
+
## [11.0.0]
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Now exports the `Domain` type ([#4104](https://github.com/MetaMask/core/pull/4104))
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Previously the `SelectedNetworkController` only constructed proxies for domains that had permissions. Other domains have no associated proxy and the `getProviderAndBlockTracker` method would throw an error. This was problematic because we grab the network client for an origin a single time when constructing an RPC pipeline for that origin in the MetaMask extension. We don't re-create the RPC pipeline when permissions change. That means that the pipeline is setup with the wrong network client and cannot be updated. The following changes ensure seamlessly proxying calls during sessions where a dapp connects/disconnects and provides a path for clients to prune inactive proxies:
|
|
31
|
+
- **BREAKING:** `SelectedNetworkController` now expects a `domainProxyMap` param - which is a Map of Domain to NetworkProxy - in its constructor ([#4104](https://github.com/MetaMask/core/pull/4104))
|
|
32
|
+
- This `domainProxyMap` is expected to automatically delete entries for domains that are no longer connected to the wallet. The `SelectedNetworkController` handles _adding_ entries, but it can't handle removal, as it doesn't know which connections are active.
|
|
33
|
+
- You can pass in a plain `Map` here and it will work, but during longer sessions this might grow unbounded, resulting in a memory leak.
|
|
34
|
+
- **BREAKING:** `SelectedNetworkController` now requires `NetworkController:getSelectedNetworkClient` as an allowed action ([#4063](https://github.com/MetaMask/core/pull/4063))
|
|
35
|
+
- `getProviderAndBlockTracker` method no longer throws an error if the `useRequestQueue` flag is false ([#4063](https://github.com/MetaMask/core/pull/4063))
|
|
36
|
+
- `getProviderAndBlockTracker` method no longer throws an error if there is no `networkClientId` set for the passed domain. Now it returns a proxy pointed at the globally selected network instead. ([#4063](https://github.com/MetaMask/core/pull/4063))
|
|
37
|
+
- Bump dependency `@metamask/network-controller` to `^18.1.0` ([#4121](https://github.com/MetaMask/core/pull/4121))
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- Previously when a domain's permission was removed from `PermissionsController`, it's network client proxy would continue to point at the `networkClientId` it was last set to. Now it is set to follow the globally selected network ([#4063](https://github.com/MetaMask/core/pull/4063))
|
|
42
|
+
|
|
10
43
|
## [10.0.1]
|
|
11
44
|
|
|
12
45
|
### Fixed
|
|
@@ -157,7 +190,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
157
190
|
|
|
158
191
|
- Initial Release ([#1643](https://github.com/MetaMask/core/pull/1643))
|
|
159
192
|
|
|
160
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@
|
|
193
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@12.0.0...HEAD
|
|
194
|
+
[12.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@11.0.0...@metamask/selected-network-controller@12.0.0
|
|
195
|
+
[11.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@10.0.1...@metamask/selected-network-controller@11.0.0
|
|
161
196
|
[10.0.1]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@10.0.0...@metamask/selected-network-controller@10.0.1
|
|
162
197
|
[10.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@9.0.0...@metamask/selected-network-controller@10.0.0
|
|
163
198
|
[9.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@8.0.0...@metamask/selected-network-controller@9.0.0
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkGH5B6PLJjs = require('./chunk-GH5B6PLJ.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
exports.METAMASK_DOMAIN =
|
|
14
|
+
exports.METAMASK_DOMAIN = _chunkGH5B6PLJjs.METAMASK_DOMAIN; exports.SelectedNetworkController = _chunkGH5B6PLJjs.SelectedNetworkController; exports.SelectedNetworkControllerActionTypes = _chunkGH5B6PLJjs.SelectedNetworkControllerActionTypes; exports.SelectedNetworkControllerEventTypes = _chunkGH5B6PLJjs.SelectedNetworkControllerEventTypes; exports.controllerName = _chunkGH5B6PLJjs.controllerName;
|
|
15
15
|
//# sourceMappingURL=SelectedNetworkController.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var _chunkLYHGM2FWjs = require('./chunk-LYHGM2FW.js');
|
|
4
|
+
require('./chunk-GH5B6PLJ.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
exports.createSelectedNetworkMiddleware =
|
|
7
|
+
exports.createSelectedNetworkMiddleware = _chunkLYHGM2FWjs.createSelectedNetworkMiddleware;
|
|
8
8
|
//# sourceMappingURL=SelectedNetworkMiddleware.js.map
|
|
@@ -38,7 +38,7 @@ var SelectedNetworkControllerActionTypes = {
|
|
|
38
38
|
var SelectedNetworkControllerEventTypes = {
|
|
39
39
|
stateChange: `${controllerName}:stateChange`
|
|
40
40
|
};
|
|
41
|
-
var
|
|
41
|
+
var _domainProxyMap, _useRequestQueuePreference, _registerMessageHandlers, registerMessageHandlers_fn, _setNetworkClientIdForDomain, setNetworkClientIdForDomain_fn, _unsetNetworkClientIdForDomain, unsetNetworkClientIdForDomain_fn, _domainHasPermissions, domainHasPermissions_fn, _resetAllPermissionedDomains, resetAllPermissionedDomains_fn;
|
|
42
42
|
var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
43
43
|
/**
|
|
44
44
|
* Construct a SelectedNetworkController controller.
|
|
@@ -46,12 +46,16 @@ var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
|
46
46
|
* @param options - The controller options.
|
|
47
47
|
* @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
|
|
48
48
|
* @param options.state - The controllers initial state.
|
|
49
|
-
* @param options.
|
|
49
|
+
* @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
|
|
50
|
+
* @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
|
|
51
|
+
* @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
|
|
50
52
|
*/
|
|
51
53
|
constructor({
|
|
52
54
|
messenger,
|
|
53
55
|
state = getDefaultState(),
|
|
54
|
-
|
|
56
|
+
useRequestQueuePreference,
|
|
57
|
+
onPreferencesStateChange,
|
|
58
|
+
domainProxyMap
|
|
55
59
|
}) {
|
|
56
60
|
super({
|
|
57
61
|
name: controllerName,
|
|
@@ -61,10 +65,22 @@ var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
|
61
65
|
});
|
|
62
66
|
__privateAdd(this, _registerMessageHandlers);
|
|
63
67
|
__privateAdd(this, _setNetworkClientIdForDomain);
|
|
68
|
+
/**
|
|
69
|
+
* This method is used when a domain is removed from the PermissionsController.
|
|
70
|
+
* It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.
|
|
71
|
+
*
|
|
72
|
+
* @param domain - The domain for which to unset the network client ID.
|
|
73
|
+
*/
|
|
74
|
+
__privateAdd(this, _unsetNetworkClientIdForDomain);
|
|
64
75
|
__privateAdd(this, _domainHasPermissions);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
76
|
+
// Loop through all domains and for those with permissions it points that domain's proxy
|
|
77
|
+
// to an unproxied instance of the globally selected network client.
|
|
78
|
+
// NOT the NetworkController's proxy of the globally selected networkClient
|
|
79
|
+
__privateAdd(this, _resetAllPermissionedDomains);
|
|
80
|
+
__privateAdd(this, _domainProxyMap, void 0);
|
|
81
|
+
__privateAdd(this, _useRequestQueuePreference, void 0);
|
|
82
|
+
__privateSet(this, _useRequestQueuePreference, useRequestQueuePreference);
|
|
83
|
+
__privateSet(this, _domainProxyMap, domainProxyMap);
|
|
68
84
|
__privateMethod(this, _registerMessageHandlers, registerMessageHandlers_fn).call(this);
|
|
69
85
|
this.messagingSystem.call("PermissionController:getSubjectNames").filter((domain) => this.state.domains[domain] === void 0).forEach(
|
|
70
86
|
(domain) => this.setNetworkClientIdForDomain(
|
|
@@ -85,9 +101,7 @@ var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
|
85
101
|
this.messagingSystem.call("NetworkController:getState").selectedNetworkClientId
|
|
86
102
|
);
|
|
87
103
|
} else if (op === "remove" && this.state.domains[domain] !== void 0) {
|
|
88
|
-
this.
|
|
89
|
-
delete domains[domain];
|
|
90
|
-
});
|
|
104
|
+
__privateMethod(this, _unsetNetworkClientIdForDomain, unsetNetworkClientIdForDomain_fn).call(this, domain);
|
|
91
105
|
}
|
|
92
106
|
}
|
|
93
107
|
});
|
|
@@ -113,6 +127,18 @@ var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
|
113
127
|
});
|
|
114
128
|
}
|
|
115
129
|
);
|
|
130
|
+
onPreferencesStateChange(({ useRequestQueue }) => {
|
|
131
|
+
if (__privateGet(this, _useRequestQueuePreference) !== useRequestQueue) {
|
|
132
|
+
if (!useRequestQueue) {
|
|
133
|
+
Object.keys(this.state.domains).forEach((domain) => {
|
|
134
|
+
__privateMethod(this, _unsetNetworkClientIdForDomain, unsetNetworkClientIdForDomain_fn).call(this, domain);
|
|
135
|
+
});
|
|
136
|
+
} else {
|
|
137
|
+
__privateMethod(this, _resetAllPermissionedDomains, resetAllPermissionedDomains_fn).call(this);
|
|
138
|
+
}
|
|
139
|
+
__privateSet(this, _useRequestQueuePreference, useRequestQueue);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
116
142
|
}
|
|
117
143
|
setNetworkClientIdForDomain(domain, networkClientId) {
|
|
118
144
|
if (domain === METAMASK_DOMAIN) {
|
|
@@ -129,7 +155,7 @@ var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
|
129
155
|
}
|
|
130
156
|
getNetworkClientIdForDomain(domain) {
|
|
131
157
|
const { selectedNetworkClientId: metamaskSelectedNetworkClientId } = this.messagingSystem.call("NetworkController:getState");
|
|
132
|
-
if (!__privateGet(this,
|
|
158
|
+
if (!__privateGet(this, _useRequestQueuePreference)) {
|
|
133
159
|
return metamaskSelectedNetworkClientId;
|
|
134
160
|
}
|
|
135
161
|
return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;
|
|
@@ -141,36 +167,36 @@ var SelectedNetworkController = class extends _basecontroller.BaseController {
|
|
|
141
167
|
* @returns The proxy and block tracker proxies.
|
|
142
168
|
*/
|
|
143
169
|
getProviderAndBlockTracker(domain) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
"Provider and BlockTracker should be fetched from NetworkController when useRequestQueue is false"
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
const networkClientId = this.state.domains[domain];
|
|
150
|
-
if (!networkClientId) {
|
|
151
|
-
throw new Error(
|
|
152
|
-
"NetworkClientId has not been set for the requested domain"
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
let networkProxy = __privateGet(this, _proxies).get(domain);
|
|
170
|
+
const networkClientId = this.getNetworkClientIdForDomain(domain);
|
|
171
|
+
let networkProxy = __privateGet(this, _domainProxyMap).get(domain);
|
|
156
172
|
if (networkProxy === void 0) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
173
|
+
let networkClient;
|
|
174
|
+
if (networkClientId === void 0 || !__privateGet(this, _useRequestQueuePreference)) {
|
|
175
|
+
networkClient = this.messagingSystem.call(
|
|
176
|
+
"NetworkController:getSelectedNetworkClient"
|
|
177
|
+
);
|
|
178
|
+
if (networkClient === void 0) {
|
|
179
|
+
throw new Error("Selected network not initialized");
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
networkClient = this.messagingSystem.call(
|
|
183
|
+
"NetworkController:getNetworkClientById",
|
|
184
|
+
networkClientId
|
|
185
|
+
);
|
|
186
|
+
}
|
|
161
187
|
networkProxy = {
|
|
162
188
|
provider: _swappableobjproxy.createEventEmitterProxy.call(void 0, networkClient.provider),
|
|
163
189
|
blockTracker: _swappableobjproxy.createEventEmitterProxy.call(void 0, networkClient.blockTracker, {
|
|
164
190
|
eventFilter: "skipInternal"
|
|
165
191
|
})
|
|
166
192
|
};
|
|
167
|
-
__privateGet(this,
|
|
193
|
+
__privateGet(this, _domainProxyMap).set(domain, networkProxy);
|
|
168
194
|
}
|
|
169
195
|
return networkProxy;
|
|
170
196
|
}
|
|
171
197
|
};
|
|
172
|
-
|
|
173
|
-
|
|
198
|
+
_domainProxyMap = new WeakMap();
|
|
199
|
+
_useRequestQueuePreference = new WeakMap();
|
|
174
200
|
_registerMessageHandlers = new WeakSet();
|
|
175
201
|
registerMessageHandlers_fn = function() {
|
|
176
202
|
this.messagingSystem.registerActionHandler(
|
|
@@ -188,22 +214,31 @@ setNetworkClientIdForDomain_fn = function(domain, networkClientId) {
|
|
|
188
214
|
"NetworkController:getNetworkClientById",
|
|
189
215
|
networkClientId
|
|
190
216
|
);
|
|
191
|
-
const networkProxy =
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
provider: _swappableobjproxy.createEventEmitterProxy.call(void 0, networkClient.provider),
|
|
195
|
-
blockTracker: _swappableobjproxy.createEventEmitterProxy.call(void 0, networkClient.blockTracker, {
|
|
196
|
-
eventFilter: "skipInternal"
|
|
197
|
-
})
|
|
198
|
-
});
|
|
199
|
-
} else {
|
|
200
|
-
networkProxy.provider.setTarget(networkClient.provider);
|
|
201
|
-
networkProxy.blockTracker.setTarget(networkClient.blockTracker);
|
|
202
|
-
}
|
|
217
|
+
const networkProxy = this.getProviderAndBlockTracker(domain);
|
|
218
|
+
networkProxy.provider.setTarget(networkClient.provider);
|
|
219
|
+
networkProxy.blockTracker.setTarget(networkClient.blockTracker);
|
|
203
220
|
this.update((state) => {
|
|
204
221
|
state.domains[domain] = networkClientId;
|
|
205
222
|
});
|
|
206
223
|
};
|
|
224
|
+
_unsetNetworkClientIdForDomain = new WeakSet();
|
|
225
|
+
unsetNetworkClientIdForDomain_fn = function(domain) {
|
|
226
|
+
const globallySelectedNetworkClient = this.messagingSystem.call(
|
|
227
|
+
"NetworkController:getSelectedNetworkClient"
|
|
228
|
+
);
|
|
229
|
+
const networkProxy = __privateGet(this, _domainProxyMap).get(domain);
|
|
230
|
+
if (networkProxy && globallySelectedNetworkClient) {
|
|
231
|
+
networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);
|
|
232
|
+
networkProxy.blockTracker.setTarget(
|
|
233
|
+
globallySelectedNetworkClient.blockTracker
|
|
234
|
+
);
|
|
235
|
+
} else if (networkProxy) {
|
|
236
|
+
__privateGet(this, _domainProxyMap).delete(domain);
|
|
237
|
+
}
|
|
238
|
+
this.update((state) => {
|
|
239
|
+
delete state.domains[domain];
|
|
240
|
+
});
|
|
241
|
+
};
|
|
207
242
|
_domainHasPermissions = new WeakSet();
|
|
208
243
|
domainHasPermissions_fn = function(domain) {
|
|
209
244
|
return this.messagingSystem.call(
|
|
@@ -211,6 +246,17 @@ domainHasPermissions_fn = function(domain) {
|
|
|
211
246
|
domain
|
|
212
247
|
);
|
|
213
248
|
};
|
|
249
|
+
_resetAllPermissionedDomains = new WeakSet();
|
|
250
|
+
resetAllPermissionedDomains_fn = function() {
|
|
251
|
+
__privateGet(this, _domainProxyMap).forEach((_, domain) => {
|
|
252
|
+
const { selectedNetworkClientId } = this.messagingSystem.call(
|
|
253
|
+
"NetworkController:getState"
|
|
254
|
+
);
|
|
255
|
+
if (__privateMethod(this, _domainHasPermissions, domainHasPermissions_fn).call(this, domain)) {
|
|
256
|
+
__privateMethod(this, _setNetworkClientIdForDomain, setNetworkClientIdForDomain_fn).call(this, domain, selectedNetworkClientId);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
};
|
|
214
260
|
|
|
215
261
|
|
|
216
262
|
|
|
@@ -219,4 +265,4 @@ domainHasPermissions_fn = function(domain) {
|
|
|
219
265
|
|
|
220
266
|
|
|
221
267
|
exports.controllerName = controllerName; exports.METAMASK_DOMAIN = METAMASK_DOMAIN; exports.SelectedNetworkControllerActionTypes = SelectedNetworkControllerActionTypes; exports.SelectedNetworkControllerEventTypes = SelectedNetworkControllerEventTypes; exports.SelectedNetworkController = SelectedNetworkController;
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
268
|
+
//# sourceMappingURL=chunk-GH5B6PLJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n BlockTrackerProxy,\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n ProviderProxy,\n} from '@metamask/network-controller';\nimport type {\n PermissionControllerStateChange,\n GetSubjects as PermissionControllerGetSubjectsAction,\n HasPermissions as PermissionControllerHasPermissions,\n} from '@metamask/permission-controller';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { Patch } from 'immer';\n\nexport const controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({ domains: {} });\n\nexport type Domain = string;\n\nexport const METAMASK_DOMAIN = 'metamask' as const;\n\nexport const SelectedNetworkControllerActionTypes = {\n getState: `${controllerName}:getState` as const,\n getNetworkClientIdForDomain:\n `${controllerName}:getNetworkClientIdForDomain` as const,\n setNetworkClientIdForDomain:\n `${controllerName}:setNetworkClientIdForDomain` as const,\n};\n\nexport const SelectedNetworkControllerEventTypes = {\n stateChange: `${controllerName}:stateChange` as const,\n};\n\nexport type SelectedNetworkControllerState = {\n domains: Record<Domain, NetworkClientId>;\n};\n\nexport type SelectedNetworkControllerStateChangeEvent = {\n type: typeof SelectedNetworkControllerEventTypes.stateChange;\n payload: [SelectedNetworkControllerState, Patch[]];\n};\n\nexport type SelectedNetworkControllerGetSelectedNetworkStateAction = {\n type: typeof SelectedNetworkControllerActionTypes.getState;\n handler: () => SelectedNetworkControllerState;\n};\n\nexport type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;\n handler: SelectedNetworkController['getNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: SelectedNetworkController['setNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerActions =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetSelectedNetworkClientAction\n | NetworkControllerGetStateAction\n | PermissionControllerHasPermissions\n | PermissionControllerGetSubjectsAction;\n\nexport type SelectedNetworkControllerEvents =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | NetworkControllerStateChangeEvent\n | PermissionControllerStateChange;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerActions | AllowedActions,\n SelectedNetworkControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport type SelectedNetworkControllerOptions = {\n state?: SelectedNetworkControllerState;\n messenger: SelectedNetworkControllerMessenger;\n useRequestQueuePreference: boolean;\n onPreferencesStateChange: (\n listener: (preferencesState: { useRequestQueue: boolean }) => void,\n ) => void;\n domainProxyMap: Map<Domain, NetworkProxy>;\n};\n\nexport type NetworkProxy = {\n provider: ProviderProxy;\n blockTracker: BlockTrackerProxy;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseController<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\n> {\n #domainProxyMap: Map<Domain, NetworkProxy>;\n\n #useRequestQueuePreference: boolean;\n\n /**\n * Construct a SelectedNetworkController controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.\n * @param options.state - The controllers initial state.\n * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.\n * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.\n * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.\n */\n constructor({\n messenger,\n state = getDefaultState(),\n useRequestQueuePreference,\n onPreferencesStateChange,\n domainProxyMap,\n }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state,\n });\n this.#useRequestQueuePreference = useRequestQueuePreference;\n this.#domainProxyMap = domainProxyMap;\n this.#registerMessageHandlers();\n\n // this is fetching all the dapp permissions from the PermissionsController and looking for any domains that are not in domains state in this controller. Then we take any missing domains and add them to state here, setting it with the globally selected networkClientId (fetched from the NetworkController)\n this.messagingSystem\n .call('PermissionController:getSubjectNames')\n .filter((domain) => this.state.domains[domain] === undefined)\n .forEach((domain) =>\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'PermissionController:stateChange',\n (_, patches) => {\n patches.forEach(({ op, path }) => {\n const isChangingSubject =\n path[0] === 'subjects' && path[1] !== undefined;\n if (isChangingSubject && typeof path[1] === 'string') {\n const domain = path[1];\n if (op === 'add' && this.state.domains[domain] === undefined) {\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n );\n } else if (\n op === 'remove' &&\n this.state.domains[domain] !== undefined\n ) {\n this.#unsetNetworkClientIdForDomain(domain);\n }\n }\n });\n },\n );\n\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n ({ selectedNetworkClientId }, patches) => {\n patches.forEach(({ op, path }) => {\n // if a network is removed, update the networkClientId for all domains that were using it to the selected network\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const removedNetworkClientId = path[1] as NetworkClientId;\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n if (networkClientIdForDomain === removedNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n }\n },\n );\n }\n });\n },\n );\n\n onPreferencesStateChange(({ useRequestQueue }) => {\n if (this.#useRequestQueuePreference !== useRequestQueue) {\n if (!useRequestQueue) {\n // Loop through all domains and points each domain's proxy\n // to the NetworkController's own proxy of the globally selected networkClient\n Object.keys(this.state.domains).forEach((domain) => {\n this.#unsetNetworkClientIdForDomain(domain);\n });\n } else {\n this.#resetAllPermissionedDomains();\n }\n this.#useRequestQueuePreference = useRequestQueue;\n }\n });\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n }\n\n #setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n const networkProxy = this.getProviderAndBlockTracker(domain);\n networkProxy.provider.setTarget(networkClient.provider);\n networkProxy.blockTracker.setTarget(networkClient.blockTracker);\n\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n }\n\n /**\n * This method is used when a domain is removed from the PermissionsController.\n * It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.\n *\n * @param domain - The domain for which to unset the network client ID.\n */\n #unsetNetworkClientIdForDomain(domain: Domain) {\n const globallySelectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n const networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy && globallySelectedNetworkClient) {\n networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);\n networkProxy.blockTracker.setTarget(\n globallySelectedNetworkClient.blockTracker,\n );\n } else if (networkProxy) {\n this.#domainProxyMap.delete(domain);\n }\n this.update((state) => {\n delete state.domains[domain];\n });\n }\n\n #domainHasPermissions(domain: Domain): boolean {\n return this.messagingSystem.call(\n 'PermissionController:hasPermissions',\n domain,\n );\n }\n\n // Loop through all domains and for those with permissions it points that domain's proxy\n // to an unproxied instance of the globally selected network client.\n // NOT the NetworkController's proxy of the globally selected networkClient\n #resetAllPermissionedDomains() {\n this.#domainProxyMap.forEach((_: NetworkProxy, domain: string) => {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n // can't use public setNetworkClientIdForDomain because it will throw an error\n // rather than simply skip if the domain doesn't have permissions which can happen\n // in this case since proxies are added for each site the user visits\n if (this.#domainHasPermissions(domain)) {\n this.#setNetworkClientIdForDomain(domain, selectedNetworkClientId);\n }\n });\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n if (domain === METAMASK_DOMAIN) {\n throw new Error(\n `NetworkClientId for domain \"${METAMASK_DOMAIN}\" cannot be set on the SelectedNetworkController`,\n );\n }\n\n if (!this.#domainHasPermissions(domain)) {\n throw new Error(\n 'NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions',\n );\n }\n\n this.#setNetworkClientIdForDomain(domain, networkClientId);\n }\n\n getNetworkClientIdForDomain(domain: Domain): NetworkClientId {\n const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n if (!this.#useRequestQueuePreference) {\n return metamaskSelectedNetworkClientId;\n }\n return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @param domain - the domain for the provider\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(domain: Domain): NetworkProxy {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (networkClientId === undefined || !this.#useRequestQueuePreference) {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n }\n networkProxy = {\n provider: createEventEmitterProxy(networkClient.provider),\n blockTracker: createEventEmitterProxy(networkClient.blockTracker, {\n eventFilter: 'skipInternal',\n }),\n };\n this.#domainProxyMap.set(domain, networkProxy);\n }\n return networkProxy;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SelectedNetworkControllerActionTypes
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IVAOSEAZ.mjs";
|
|
4
4
|
|
|
5
5
|
// src/SelectedNetworkMiddleware.ts
|
|
6
6
|
var createSelectedNetworkMiddleware = (messenger) => {
|
|
@@ -20,4 +20,4 @@ var createSelectedNetworkMiddleware = (messenger) => {
|
|
|
20
20
|
export {
|
|
21
21
|
createSelectedNetworkMiddleware
|
|
22
22
|
};
|
|
23
|
-
//# sourceMappingURL=chunk-
|
|
23
|
+
//# sourceMappingURL=chunk-HLY6NUFO.mjs.map
|
|
@@ -38,7 +38,7 @@ var SelectedNetworkControllerActionTypes = {
|
|
|
38
38
|
var SelectedNetworkControllerEventTypes = {
|
|
39
39
|
stateChange: `${controllerName}:stateChange`
|
|
40
40
|
};
|
|
41
|
-
var
|
|
41
|
+
var _domainProxyMap, _useRequestQueuePreference, _registerMessageHandlers, registerMessageHandlers_fn, _setNetworkClientIdForDomain, setNetworkClientIdForDomain_fn, _unsetNetworkClientIdForDomain, unsetNetworkClientIdForDomain_fn, _domainHasPermissions, domainHasPermissions_fn, _resetAllPermissionedDomains, resetAllPermissionedDomains_fn;
|
|
42
42
|
var SelectedNetworkController = class extends BaseController {
|
|
43
43
|
/**
|
|
44
44
|
* Construct a SelectedNetworkController controller.
|
|
@@ -46,12 +46,16 @@ var SelectedNetworkController = class extends BaseController {
|
|
|
46
46
|
* @param options - The controller options.
|
|
47
47
|
* @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
|
|
48
48
|
* @param options.state - The controllers initial state.
|
|
49
|
-
* @param options.
|
|
49
|
+
* @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
|
|
50
|
+
* @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
|
|
51
|
+
* @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
|
|
50
52
|
*/
|
|
51
53
|
constructor({
|
|
52
54
|
messenger,
|
|
53
55
|
state = getDefaultState(),
|
|
54
|
-
|
|
56
|
+
useRequestQueuePreference,
|
|
57
|
+
onPreferencesStateChange,
|
|
58
|
+
domainProxyMap
|
|
55
59
|
}) {
|
|
56
60
|
super({
|
|
57
61
|
name: controllerName,
|
|
@@ -61,10 +65,22 @@ var SelectedNetworkController = class extends BaseController {
|
|
|
61
65
|
});
|
|
62
66
|
__privateAdd(this, _registerMessageHandlers);
|
|
63
67
|
__privateAdd(this, _setNetworkClientIdForDomain);
|
|
68
|
+
/**
|
|
69
|
+
* This method is used when a domain is removed from the PermissionsController.
|
|
70
|
+
* It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.
|
|
71
|
+
*
|
|
72
|
+
* @param domain - The domain for which to unset the network client ID.
|
|
73
|
+
*/
|
|
74
|
+
__privateAdd(this, _unsetNetworkClientIdForDomain);
|
|
64
75
|
__privateAdd(this, _domainHasPermissions);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
76
|
+
// Loop through all domains and for those with permissions it points that domain's proxy
|
|
77
|
+
// to an unproxied instance of the globally selected network client.
|
|
78
|
+
// NOT the NetworkController's proxy of the globally selected networkClient
|
|
79
|
+
__privateAdd(this, _resetAllPermissionedDomains);
|
|
80
|
+
__privateAdd(this, _domainProxyMap, void 0);
|
|
81
|
+
__privateAdd(this, _useRequestQueuePreference, void 0);
|
|
82
|
+
__privateSet(this, _useRequestQueuePreference, useRequestQueuePreference);
|
|
83
|
+
__privateSet(this, _domainProxyMap, domainProxyMap);
|
|
68
84
|
__privateMethod(this, _registerMessageHandlers, registerMessageHandlers_fn).call(this);
|
|
69
85
|
this.messagingSystem.call("PermissionController:getSubjectNames").filter((domain) => this.state.domains[domain] === void 0).forEach(
|
|
70
86
|
(domain) => this.setNetworkClientIdForDomain(
|
|
@@ -85,9 +101,7 @@ var SelectedNetworkController = class extends BaseController {
|
|
|
85
101
|
this.messagingSystem.call("NetworkController:getState").selectedNetworkClientId
|
|
86
102
|
);
|
|
87
103
|
} else if (op === "remove" && this.state.domains[domain] !== void 0) {
|
|
88
|
-
this.
|
|
89
|
-
delete domains[domain];
|
|
90
|
-
});
|
|
104
|
+
__privateMethod(this, _unsetNetworkClientIdForDomain, unsetNetworkClientIdForDomain_fn).call(this, domain);
|
|
91
105
|
}
|
|
92
106
|
}
|
|
93
107
|
});
|
|
@@ -113,6 +127,18 @@ var SelectedNetworkController = class extends BaseController {
|
|
|
113
127
|
});
|
|
114
128
|
}
|
|
115
129
|
);
|
|
130
|
+
onPreferencesStateChange(({ useRequestQueue }) => {
|
|
131
|
+
if (__privateGet(this, _useRequestQueuePreference) !== useRequestQueue) {
|
|
132
|
+
if (!useRequestQueue) {
|
|
133
|
+
Object.keys(this.state.domains).forEach((domain) => {
|
|
134
|
+
__privateMethod(this, _unsetNetworkClientIdForDomain, unsetNetworkClientIdForDomain_fn).call(this, domain);
|
|
135
|
+
});
|
|
136
|
+
} else {
|
|
137
|
+
__privateMethod(this, _resetAllPermissionedDomains, resetAllPermissionedDomains_fn).call(this);
|
|
138
|
+
}
|
|
139
|
+
__privateSet(this, _useRequestQueuePreference, useRequestQueue);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
116
142
|
}
|
|
117
143
|
setNetworkClientIdForDomain(domain, networkClientId) {
|
|
118
144
|
if (domain === METAMASK_DOMAIN) {
|
|
@@ -129,7 +155,7 @@ var SelectedNetworkController = class extends BaseController {
|
|
|
129
155
|
}
|
|
130
156
|
getNetworkClientIdForDomain(domain) {
|
|
131
157
|
const { selectedNetworkClientId: metamaskSelectedNetworkClientId } = this.messagingSystem.call("NetworkController:getState");
|
|
132
|
-
if (!__privateGet(this,
|
|
158
|
+
if (!__privateGet(this, _useRequestQueuePreference)) {
|
|
133
159
|
return metamaskSelectedNetworkClientId;
|
|
134
160
|
}
|
|
135
161
|
return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;
|
|
@@ -141,36 +167,36 @@ var SelectedNetworkController = class extends BaseController {
|
|
|
141
167
|
* @returns The proxy and block tracker proxies.
|
|
142
168
|
*/
|
|
143
169
|
getProviderAndBlockTracker(domain) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
"Provider and BlockTracker should be fetched from NetworkController when useRequestQueue is false"
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
const networkClientId = this.state.domains[domain];
|
|
150
|
-
if (!networkClientId) {
|
|
151
|
-
throw new Error(
|
|
152
|
-
"NetworkClientId has not been set for the requested domain"
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
let networkProxy = __privateGet(this, _proxies).get(domain);
|
|
170
|
+
const networkClientId = this.getNetworkClientIdForDomain(domain);
|
|
171
|
+
let networkProxy = __privateGet(this, _domainProxyMap).get(domain);
|
|
156
172
|
if (networkProxy === void 0) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
173
|
+
let networkClient;
|
|
174
|
+
if (networkClientId === void 0 || !__privateGet(this, _useRequestQueuePreference)) {
|
|
175
|
+
networkClient = this.messagingSystem.call(
|
|
176
|
+
"NetworkController:getSelectedNetworkClient"
|
|
177
|
+
);
|
|
178
|
+
if (networkClient === void 0) {
|
|
179
|
+
throw new Error("Selected network not initialized");
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
networkClient = this.messagingSystem.call(
|
|
183
|
+
"NetworkController:getNetworkClientById",
|
|
184
|
+
networkClientId
|
|
185
|
+
);
|
|
186
|
+
}
|
|
161
187
|
networkProxy = {
|
|
162
188
|
provider: createEventEmitterProxy(networkClient.provider),
|
|
163
189
|
blockTracker: createEventEmitterProxy(networkClient.blockTracker, {
|
|
164
190
|
eventFilter: "skipInternal"
|
|
165
191
|
})
|
|
166
192
|
};
|
|
167
|
-
__privateGet(this,
|
|
193
|
+
__privateGet(this, _domainProxyMap).set(domain, networkProxy);
|
|
168
194
|
}
|
|
169
195
|
return networkProxy;
|
|
170
196
|
}
|
|
171
197
|
};
|
|
172
|
-
|
|
173
|
-
|
|
198
|
+
_domainProxyMap = new WeakMap();
|
|
199
|
+
_useRequestQueuePreference = new WeakMap();
|
|
174
200
|
_registerMessageHandlers = new WeakSet();
|
|
175
201
|
registerMessageHandlers_fn = function() {
|
|
176
202
|
this.messagingSystem.registerActionHandler(
|
|
@@ -188,22 +214,31 @@ setNetworkClientIdForDomain_fn = function(domain, networkClientId) {
|
|
|
188
214
|
"NetworkController:getNetworkClientById",
|
|
189
215
|
networkClientId
|
|
190
216
|
);
|
|
191
|
-
const networkProxy =
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
provider: createEventEmitterProxy(networkClient.provider),
|
|
195
|
-
blockTracker: createEventEmitterProxy(networkClient.blockTracker, {
|
|
196
|
-
eventFilter: "skipInternal"
|
|
197
|
-
})
|
|
198
|
-
});
|
|
199
|
-
} else {
|
|
200
|
-
networkProxy.provider.setTarget(networkClient.provider);
|
|
201
|
-
networkProxy.blockTracker.setTarget(networkClient.blockTracker);
|
|
202
|
-
}
|
|
217
|
+
const networkProxy = this.getProviderAndBlockTracker(domain);
|
|
218
|
+
networkProxy.provider.setTarget(networkClient.provider);
|
|
219
|
+
networkProxy.blockTracker.setTarget(networkClient.blockTracker);
|
|
203
220
|
this.update((state) => {
|
|
204
221
|
state.domains[domain] = networkClientId;
|
|
205
222
|
});
|
|
206
223
|
};
|
|
224
|
+
_unsetNetworkClientIdForDomain = new WeakSet();
|
|
225
|
+
unsetNetworkClientIdForDomain_fn = function(domain) {
|
|
226
|
+
const globallySelectedNetworkClient = this.messagingSystem.call(
|
|
227
|
+
"NetworkController:getSelectedNetworkClient"
|
|
228
|
+
);
|
|
229
|
+
const networkProxy = __privateGet(this, _domainProxyMap).get(domain);
|
|
230
|
+
if (networkProxy && globallySelectedNetworkClient) {
|
|
231
|
+
networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);
|
|
232
|
+
networkProxy.blockTracker.setTarget(
|
|
233
|
+
globallySelectedNetworkClient.blockTracker
|
|
234
|
+
);
|
|
235
|
+
} else if (networkProxy) {
|
|
236
|
+
__privateGet(this, _domainProxyMap).delete(domain);
|
|
237
|
+
}
|
|
238
|
+
this.update((state) => {
|
|
239
|
+
delete state.domains[domain];
|
|
240
|
+
});
|
|
241
|
+
};
|
|
207
242
|
_domainHasPermissions = new WeakSet();
|
|
208
243
|
domainHasPermissions_fn = function(domain) {
|
|
209
244
|
return this.messagingSystem.call(
|
|
@@ -211,6 +246,17 @@ domainHasPermissions_fn = function(domain) {
|
|
|
211
246
|
domain
|
|
212
247
|
);
|
|
213
248
|
};
|
|
249
|
+
_resetAllPermissionedDomains = new WeakSet();
|
|
250
|
+
resetAllPermissionedDomains_fn = function() {
|
|
251
|
+
__privateGet(this, _domainProxyMap).forEach((_, domain) => {
|
|
252
|
+
const { selectedNetworkClientId } = this.messagingSystem.call(
|
|
253
|
+
"NetworkController:getState"
|
|
254
|
+
);
|
|
255
|
+
if (__privateMethod(this, _domainHasPermissions, domainHasPermissions_fn).call(this, domain)) {
|
|
256
|
+
__privateMethod(this, _setNetworkClientIdForDomain, setNetworkClientIdForDomain_fn).call(this, domain, selectedNetworkClientId);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
};
|
|
214
260
|
|
|
215
261
|
export {
|
|
216
262
|
controllerName,
|
|
@@ -219,4 +265,4 @@ export {
|
|
|
219
265
|
SelectedNetworkControllerEventTypes,
|
|
220
266
|
SelectedNetworkController
|
|
221
267
|
};
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
268
|
+
//# sourceMappingURL=chunk-IVAOSEAZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/SelectedNetworkController.ts"],"sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n BlockTrackerProxy,\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n ProviderProxy,\n} from '@metamask/network-controller';\nimport type {\n PermissionControllerStateChange,\n GetSubjects as PermissionControllerGetSubjectsAction,\n HasPermissions as PermissionControllerHasPermissions,\n} from '@metamask/permission-controller';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { Patch } from 'immer';\n\nexport const controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({ domains: {} });\n\nexport type Domain = string;\n\nexport const METAMASK_DOMAIN = 'metamask' as const;\n\nexport const SelectedNetworkControllerActionTypes = {\n getState: `${controllerName}:getState` as const,\n getNetworkClientIdForDomain:\n `${controllerName}:getNetworkClientIdForDomain` as const,\n setNetworkClientIdForDomain:\n `${controllerName}:setNetworkClientIdForDomain` as const,\n};\n\nexport const SelectedNetworkControllerEventTypes = {\n stateChange: `${controllerName}:stateChange` as const,\n};\n\nexport type SelectedNetworkControllerState = {\n domains: Record<Domain, NetworkClientId>;\n};\n\nexport type SelectedNetworkControllerStateChangeEvent = {\n type: typeof SelectedNetworkControllerEventTypes.stateChange;\n payload: [SelectedNetworkControllerState, Patch[]];\n};\n\nexport type SelectedNetworkControllerGetSelectedNetworkStateAction = {\n type: typeof SelectedNetworkControllerActionTypes.getState;\n handler: () => SelectedNetworkControllerState;\n};\n\nexport type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;\n handler: SelectedNetworkController['getNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: SelectedNetworkController['setNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerActions =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetSelectedNetworkClientAction\n | NetworkControllerGetStateAction\n | PermissionControllerHasPermissions\n | PermissionControllerGetSubjectsAction;\n\nexport type SelectedNetworkControllerEvents =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | NetworkControllerStateChangeEvent\n | PermissionControllerStateChange;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerActions | AllowedActions,\n SelectedNetworkControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport type SelectedNetworkControllerOptions = {\n state?: SelectedNetworkControllerState;\n messenger: SelectedNetworkControllerMessenger;\n useRequestQueuePreference: boolean;\n onPreferencesStateChange: (\n listener: (preferencesState: { useRequestQueue: boolean }) => void,\n ) => void;\n domainProxyMap: Map<Domain, NetworkProxy>;\n};\n\nexport type NetworkProxy = {\n provider: ProviderProxy;\n blockTracker: BlockTrackerProxy;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseController<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\n> {\n #domainProxyMap: Map<Domain, NetworkProxy>;\n\n #useRequestQueuePreference: boolean;\n\n /**\n * Construct a SelectedNetworkController controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.\n * @param options.state - The controllers initial state.\n * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.\n * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.\n * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.\n */\n constructor({\n messenger,\n state = getDefaultState(),\n useRequestQueuePreference,\n onPreferencesStateChange,\n domainProxyMap,\n }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state,\n });\n this.#useRequestQueuePreference = useRequestQueuePreference;\n this.#domainProxyMap = domainProxyMap;\n this.#registerMessageHandlers();\n\n // this is fetching all the dapp permissions from the PermissionsController and looking for any domains that are not in domains state in this controller. Then we take any missing domains and add them to state here, setting it with the globally selected networkClientId (fetched from the NetworkController)\n this.messagingSystem\n .call('PermissionController:getSubjectNames')\n .filter((domain) => this.state.domains[domain] === undefined)\n .forEach((domain) =>\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'PermissionController:stateChange',\n (_, patches) => {\n patches.forEach(({ op, path }) => {\n const isChangingSubject =\n path[0] === 'subjects' && path[1] !== undefined;\n if (isChangingSubject && typeof path[1] === 'string') {\n const domain = path[1];\n if (op === 'add' && this.state.domains[domain] === undefined) {\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n );\n } else if (\n op === 'remove' &&\n this.state.domains[domain] !== undefined\n ) {\n this.#unsetNetworkClientIdForDomain(domain);\n }\n }\n });\n },\n );\n\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n ({ selectedNetworkClientId }, patches) => {\n patches.forEach(({ op, path }) => {\n // if a network is removed, update the networkClientId for all domains that were using it to the selected network\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const removedNetworkClientId = path[1] as NetworkClientId;\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n if (networkClientIdForDomain === removedNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n }\n },\n );\n }\n });\n },\n );\n\n onPreferencesStateChange(({ useRequestQueue }) => {\n if (this.#useRequestQueuePreference !== useRequestQueue) {\n if (!useRequestQueue) {\n // Loop through all domains and points each domain's proxy\n // to the NetworkController's own proxy of the globally selected networkClient\n Object.keys(this.state.domains).forEach((domain) => {\n this.#unsetNetworkClientIdForDomain(domain);\n });\n } else {\n this.#resetAllPermissionedDomains();\n }\n this.#useRequestQueuePreference = useRequestQueue;\n }\n });\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n }\n\n #setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n const networkProxy = this.getProviderAndBlockTracker(domain);\n networkProxy.provider.setTarget(networkClient.provider);\n networkProxy.blockTracker.setTarget(networkClient.blockTracker);\n\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n }\n\n /**\n * This method is used when a domain is removed from the PermissionsController.\n * It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.\n *\n * @param domain - The domain for which to unset the network client ID.\n */\n #unsetNetworkClientIdForDomain(domain: Domain) {\n const globallySelectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n const networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy && globallySelectedNetworkClient) {\n networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);\n networkProxy.blockTracker.setTarget(\n globallySelectedNetworkClient.blockTracker,\n );\n } else if (networkProxy) {\n this.#domainProxyMap.delete(domain);\n }\n this.update((state) => {\n delete state.domains[domain];\n });\n }\n\n #domainHasPermissions(domain: Domain): boolean {\n return this.messagingSystem.call(\n 'PermissionController:hasPermissions',\n domain,\n );\n }\n\n // Loop through all domains and for those with permissions it points that domain's proxy\n // to an unproxied instance of the globally selected network client.\n // NOT the NetworkController's proxy of the globally selected networkClient\n #resetAllPermissionedDomains() {\n this.#domainProxyMap.forEach((_: NetworkProxy, domain: string) => {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n // can't use public setNetworkClientIdForDomain because it will throw an error\n // rather than simply skip if the domain doesn't have permissions which can happen\n // in this case since proxies are added for each site the user visits\n if (this.#domainHasPermissions(domain)) {\n this.#setNetworkClientIdForDomain(domain, selectedNetworkClientId);\n }\n });\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n if (domain === METAMASK_DOMAIN) {\n throw new Error(\n `NetworkClientId for domain \"${METAMASK_DOMAIN}\" cannot be set on the SelectedNetworkController`,\n );\n }\n\n if (!this.#domainHasPermissions(domain)) {\n throw new Error(\n 'NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions',\n );\n }\n\n this.#setNetworkClientIdForDomain(domain, networkClientId);\n }\n\n getNetworkClientIdForDomain(domain: Domain): NetworkClientId {\n const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n if (!this.#useRequestQueuePreference) {\n return metamaskSelectedNetworkClientId;\n }\n return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @param domain - the domain for the provider\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(domain: Domain): NetworkProxy {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (networkClientId === undefined || !this.#useRequestQueuePreference) {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n }\n networkProxy = {\n provider: createEventEmitterProxy(networkClient.provider),\n blockTracker: createEventEmitterProxy(networkClient.blockTracker, {\n eventFilter: 'skipInternal',\n }),\n };\n this.#domainProxyMap.set(domain, networkProxy);\n }\n return networkProxy;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,sBAAsB;AAe/B,SAAS,+BAA+B;AAGjC,IAAM,iBAAiB;AAE9B,IAAM,gBAAgB;AAAA,EACpB,SAAS,EAAE,SAAS,MAAM,WAAW,MAAM;AAC7C;AAEA,IAAM,kBAAkB,OAAO,EAAE,SAAS,CAAC,EAAE;AAItC,IAAM,kBAAkB;AAExB,IAAM,uCAAuC;AAAA,EAClD,UAAU,GAAG,cAAc;AAAA,EAC3B,6BACE,GAAG,cAAc;AAAA,EACnB,6BACE,GAAG,cAAc;AACrB;AAEO,IAAM,sCAAsC;AAAA,EACjD,aAAa,GAAG,cAAc;AAChC;AAzCA;AAgHO,IAAM,4BAAN,cAAwC,eAI7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,YAAY;AAAA,IACV;AAAA,IACA,QAAQ,gBAAgB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAqC;AACnC,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF,CAAC;AAgFH;AAWA;AAuBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA;AAUA;AAAA;AAAA;AAAA;AAxKA;AAEA;AAyBE,uBAAK,4BAA6B;AAClC,uBAAK,iBAAkB;AACvB,0BAAK,sDAAL;AAGA,SAAK,gBACF,KAAK,sCAAsC,EAC3C,OAAO,CAAC,WAAW,KAAK,MAAM,QAAQ,MAAM,MAAM,MAAS,EAC3D;AAAA,MAAQ,CAAC,WACR,KAAK;AAAA,QACH;AAAA,QACA,KAAK,gBAAgB,KAAK,4BAA4B,EACnD;AAAA,MACL;AAAA,IACF;AAEF,SAAK,gBAAgB;AAAA,MACnB;AAAA,MACA,CAAC,GAAG,YAAY;AACd,gBAAQ,QAAQ,CAAC,EAAE,IAAI,KAAK,MAAM;AAChC,gBAAM,oBACJ,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM;AACxC,cAAI,qBAAqB,OAAO,KAAK,CAAC,MAAM,UAAU;AACpD,kBAAM,SAAS,KAAK,CAAC;AACrB,gBAAI,OAAO,SAAS,KAAK,MAAM,QAAQ,MAAM,MAAM,QAAW;AAC5D,mBAAK;AAAA,gBACH;AAAA,gBACA,KAAK,gBAAgB,KAAK,4BAA4B,EACnD;AAAA,cACL;AAAA,YACF,WACE,OAAO,YACP,KAAK,MAAM,QAAQ,MAAM,MAAM,QAC/B;AACA,oCAAK,kEAAL,WAAoC;AAAA,YACtC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,gBAAgB;AAAA,MACnB;AAAA,MACA,CAAC,EAAE,wBAAwB,GAAG,YAAY;AACxC,gBAAQ,QAAQ,CAAC,EAAE,IAAI,KAAK,MAAM;AAEhC,cAAI,OAAO,YAAY,KAAK,CAAC,MAAM,yBAAyB;AAC1D,kBAAM,yBAAyB,KAAK,CAAC;AACrC,mBAAO,QAAQ,KAAK,MAAM,OAAO,EAAE;AAAA,cACjC,CAAC,CAAC,QAAQ,wBAAwB,MAAM;AACtC,oBAAI,6BAA6B,wBAAwB;AACvD,uBAAK;AAAA,oBACH;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,6BAAyB,CAAC,EAAE,gBAAgB,MAAM;AAChD,UAAI,mBAAK,gCAA+B,iBAAiB;AACvD,YAAI,CAAC,iBAAiB;AAGpB,iBAAO,KAAK,KAAK,MAAM,OAAO,EAAE,QAAQ,CAAC,WAAW;AAClD,kCAAK,kEAAL,WAAoC;AAAA,UACtC,CAAC;AAAA,QACH,OAAO;AACL,gCAAK,8DAAL;AAAA,QACF;AACA,2BAAK,4BAA6B;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EA8EA,4BACE,QACA,iBACA;AACA,QAAI,WAAW,iBAAiB;AAC9B,YAAM,IAAI;AAAA,QACR,+BAA+B,eAAe;AAAA,MAChD;AAAA,IACF;AAEA,QAAI,CAAC,sBAAK,gDAAL,WAA2B,SAAS;AACvC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,0BAAK,8DAAL,WAAkC,QAAQ;AAAA,EAC5C;AAAA,EAEA,4BAA4B,QAAiC;AAC3D,UAAM,EAAE,yBAAyB,gCAAgC,IAC/D,KAAK,gBAAgB,KAAK,4BAA4B;AACxD,QAAI,CAAC,mBAAK,6BAA4B;AACpC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,QAAQ,MAAM,KAAK;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,2BAA2B,QAA8B;AACvD,UAAM,kBAAkB,KAAK,4BAA4B,MAAM;AAC/D,QAAI,eAAe,mBAAK,iBAAgB,IAAI,MAAM;AAClD,QAAI,iBAAiB,QAAW;AAC9B,UAAI;AACJ,UAAI,oBAAoB,UAAa,CAAC,mBAAK,6BAA4B;AACrE,wBAAgB,KAAK,gBAAgB;AAAA,UACnC;AAAA,QACF;AACA,YAAI,kBAAkB,QAAW;AAC/B,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QACpD;AAAA,MACF,OAAO;AACL,wBAAgB,KAAK,gBAAgB;AAAA,UACnC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,qBAAe;AAAA,QACb,UAAU,wBAAwB,cAAc,QAAQ;AAAA,QACxD,cAAc,wBAAwB,cAAc,cAAc;AAAA,UAChE,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AACA,yBAAK,iBAAgB,IAAI,QAAQ,YAAY;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AACF;AApPE;AAEA;AAwGA;AAAA,6BAAwB,WAAS;AAC/B,OAAK,gBAAgB;AAAA,IACnB,qCAAqC;AAAA,IACrC,KAAK,4BAA4B,KAAK,IAAI;AAAA,EAC5C;AACA,OAAK,gBAAgB;AAAA,IACnB,qCAAqC;AAAA,IACrC,KAAK,4BAA4B,KAAK,IAAI;AAAA,EAC5C;AACF;AAEA;AAAA,iCAA4B,SAC1B,QACA,iBACA;AACA,QAAM,gBAAgB,KAAK,gBAAgB;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe,KAAK,2BAA2B,MAAM;AAC3D,eAAa,SAAS,UAAU,cAAc,QAAQ;AACtD,eAAa,aAAa,UAAU,cAAc,YAAY;AAE9D,OAAK,OAAO,CAAC,UAAU;AACrB,UAAM,QAAQ,MAAM,IAAI;AAAA,EAC1B,CAAC;AACH;AAQA;AAAA,mCAA8B,SAAC,QAAgB;AAC7C,QAAM,gCAAgC,KAAK,gBAAgB;AAAA,IACzD;AAAA,EACF;AACA,QAAM,eAAe,mBAAK,iBAAgB,IAAI,MAAM;AACpD,MAAI,gBAAgB,+BAA+B;AACjD,iBAAa,SAAS,UAAU,8BAA8B,QAAQ;AACtE,iBAAa,aAAa;AAAA,MACxB,8BAA8B;AAAA,IAChC;AAAA,EACF,WAAW,cAAc;AACvB,uBAAK,iBAAgB,OAAO,MAAM;AAAA,EACpC;AACA,OAAK,OAAO,CAAC,UAAU;AACrB,WAAO,MAAM,QAAQ,MAAM;AAAA,EAC7B,CAAC;AACH;AAEA;AAAA,0BAAqB,SAAC,QAAyB;AAC7C,SAAO,KAAK,gBAAgB;AAAA,IAC1B;AAAA,IACA;AAAA,EACF;AACF;AAKA;AAAA,iCAA4B,WAAG;AAC7B,qBAAK,iBAAgB,QAAQ,CAAC,GAAiB,WAAmB;AAChE,UAAM,EAAE,wBAAwB,IAAI,KAAK,gBAAgB;AAAA,MACvD;AAAA,IACF;AAIA,QAAI,sBAAK,gDAAL,WAA2B,SAAS;AACtC,4BAAK,8DAAL,WAAkC,QAAQ;AAAA,IAC5C;AAAA,EACF,CAAC;AACH;","names":[]}
|