@metamask/selected-network-controller 17.0.0 → 18.0.1
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.cjs +231 -0
- package/dist/SelectedNetworkController.cjs.map +1 -0
- package/dist/{types/SelectedNetworkController.d.ts → SelectedNetworkController.d.cts} +6 -6
- package/dist/SelectedNetworkController.d.cts.map +1 -0
- package/dist/SelectedNetworkController.d.mts +80 -0
- package/dist/SelectedNetworkController.d.mts.map +1 -0
- package/dist/SelectedNetworkController.mjs +226 -13
- package/dist/SelectedNetworkController.mjs.map +1 -1
- package/dist/SelectedNetworkMiddleware.cjs +16 -0
- package/dist/SelectedNetworkMiddleware.cjs.map +1 -0
- package/dist/SelectedNetworkMiddleware.d.cts +10 -0
- package/dist/SelectedNetworkMiddleware.d.cts.map +1 -0
- package/dist/SelectedNetworkMiddleware.d.mts +10 -0
- package/dist/SelectedNetworkMiddleware.d.mts.map +1 -0
- package/dist/SelectedNetworkMiddleware.mjs +10 -6
- package/dist/SelectedNetworkMiddleware.mjs.map +1 -1
- package/dist/index.cjs +11 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{types/index.d.ts → index.d.cts} +5 -5
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +19 -13
- package/dist/SelectedNetworkController.js +0 -15
- package/dist/SelectedNetworkController.js.map +0 -1
- package/dist/SelectedNetworkMiddleware.js +0 -8
- package/dist/SelectedNetworkMiddleware.js.map +0 -1
- package/dist/chunk-4FNZCOPF.js +0 -23
- package/dist/chunk-4FNZCOPF.js.map +0 -1
- package/dist/chunk-L5BCB47G.mjs +0 -284
- package/dist/chunk-L5BCB47G.mjs.map +0 -1
- package/dist/chunk-ME37HLWC.mjs +0 -23
- package/dist/chunk-ME37HLWC.mjs.map +0 -1
- package/dist/chunk-MQYWK4KP.js +0 -284
- package/dist/chunk-MQYWK4KP.js.map +0 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/types/SelectedNetworkController.d.ts.map +0 -1
- package/dist/types/SelectedNetworkMiddleware.d.ts +0 -10
- package/dist/types/SelectedNetworkMiddleware.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
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
|
+
## [18.0.1]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Redirect domains to default endpoint ([#4679](https://github.com/MetaMask/core/pull/4679))
|
|
15
|
+
- When the default RPC endpoint changes for a network, domains that were
|
|
16
|
+
referencing a network client id on that network are redirected to the new
|
|
17
|
+
default RPC endpoint.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Produce and export ESM-compatible TypeScript type declaration files in addition to CommonJS-compatible declaration files ([#4648](https://github.com/MetaMask/core/pull/4648))
|
|
22
|
+
- Previously, this package shipped with only one variant of type declaration
|
|
23
|
+
files, and these files were only CommonJS-compatible, and the `exports`
|
|
24
|
+
field in `package.json` linked to these files. This is an anti-pattern and
|
|
25
|
+
was rightfully flagged by the
|
|
26
|
+
["Are the Types Wrong?"](https://arethetypeswrong.github.io/) tool as
|
|
27
|
+
["masquerading as CJS"](https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/FalseCJS.md).
|
|
28
|
+
All of the ATTW checks now pass.
|
|
29
|
+
- Remove chunk files ([#4648](https://github.com/MetaMask/core/pull/4648)).
|
|
30
|
+
- Previously, the build tool we used to generate JavaScript files extracted
|
|
31
|
+
common code to "chunk" files. While this was intended to make this package
|
|
32
|
+
more tree-shakeable, it also made debugging more difficult for our
|
|
33
|
+
development teams. These chunk files are no longer present.
|
|
34
|
+
|
|
35
|
+
## [18.0.0]
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- **BREAKING:** Bump devDependency and peerDependency `@metamask/network-controller` from `^20.0.0` to `^21.0.0` ([#4618](https://github.com/MetaMask/core/pull/4618), [#4651](https://github.com/MetaMask/core/pull/4651))
|
|
40
|
+
- Bump `@metamask/base-controller` from `^6.0.2` to `^7.0.0` ([#4625](https://github.com/MetaMask/core/pull/4625), [#4643](https://github.com/MetaMask/core/pull/4643))
|
|
41
|
+
- Bump `typescript` from `~5.0.4` to `~5.2.2` ([#4576](https://github.com/MetaMask/core/pull/4576), [#4584](https://github.com/MetaMask/core/pull/4584))
|
|
42
|
+
|
|
10
43
|
## [17.0.0]
|
|
11
44
|
|
|
12
45
|
### Changed
|
|
@@ -253,7 +286,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
253
286
|
|
|
254
287
|
- Initial Release ([#1643](https://github.com/MetaMask/core/pull/1643))
|
|
255
288
|
|
|
256
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@
|
|
289
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@18.0.1...HEAD
|
|
290
|
+
[18.0.1]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@18.0.0...@metamask/selected-network-controller@18.0.1
|
|
291
|
+
[18.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@17.0.0...@metamask/selected-network-controller@18.0.0
|
|
257
292
|
[17.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@16.0.0...@metamask/selected-network-controller@17.0.0
|
|
258
293
|
[16.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@15.0.2...@metamask/selected-network-controller@16.0.0
|
|
259
294
|
[15.0.2]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@15.0.1...@metamask/selected-network-controller@15.0.2
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _SelectedNetworkController_instances, _SelectedNetworkController_domainProxyMap, _SelectedNetworkController_useRequestQueuePreference, _SelectedNetworkController_registerMessageHandlers, _SelectedNetworkController_setNetworkClientIdForDomain, _SelectedNetworkController_unsetNetworkClientIdForDomain, _SelectedNetworkController_domainHasPermissions, _SelectedNetworkController_resetAllPermissionedDomains;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SelectedNetworkController = exports.SelectedNetworkControllerEventTypes = exports.SelectedNetworkControllerActionTypes = exports.METAMASK_DOMAIN = exports.controllerName = void 0;
|
|
16
|
+
const base_controller_1 = require("@metamask/base-controller");
|
|
17
|
+
const swappable_obj_proxy_1 = require("@metamask/swappable-obj-proxy");
|
|
18
|
+
exports.controllerName = 'SelectedNetworkController';
|
|
19
|
+
const stateMetadata = {
|
|
20
|
+
domains: { persist: true, anonymous: false },
|
|
21
|
+
};
|
|
22
|
+
const getDefaultState = () => ({ domains: {} });
|
|
23
|
+
// npm and local are currently the only valid prefixes for snap domains
|
|
24
|
+
// TODO: eventually we maybe want to pull this in from snaps-utils to ensure it stays in sync
|
|
25
|
+
// For now it seems like overkill to add a dependency for this one constant
|
|
26
|
+
// https://github.com/MetaMask/snaps/blob/2beee7803bfe9e540788a3558b546b9f55dc3cb4/packages/snaps-utils/src/types.ts#L120
|
|
27
|
+
const snapsPrefixes = ['npm:', 'local:'];
|
|
28
|
+
exports.METAMASK_DOMAIN = 'metamask';
|
|
29
|
+
exports.SelectedNetworkControllerActionTypes = {
|
|
30
|
+
getState: `${exports.controllerName}:getState`,
|
|
31
|
+
getNetworkClientIdForDomain: `${exports.controllerName}:getNetworkClientIdForDomain`,
|
|
32
|
+
setNetworkClientIdForDomain: `${exports.controllerName}:setNetworkClientIdForDomain`,
|
|
33
|
+
};
|
|
34
|
+
exports.SelectedNetworkControllerEventTypes = {
|
|
35
|
+
stateChange: `${exports.controllerName}:stateChange`,
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Controller for getting and setting the network for a particular domain.
|
|
39
|
+
*/
|
|
40
|
+
class SelectedNetworkController extends base_controller_1.BaseController {
|
|
41
|
+
/**
|
|
42
|
+
* Construct a SelectedNetworkController controller.
|
|
43
|
+
*
|
|
44
|
+
* @param options - The controller options.
|
|
45
|
+
* @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
|
|
46
|
+
* @param options.state - The controllers initial state.
|
|
47
|
+
* @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
|
|
48
|
+
* @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
|
|
49
|
+
* @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
|
|
50
|
+
*/
|
|
51
|
+
constructor({ messenger, state = getDefaultState(), useRequestQueuePreference, onPreferencesStateChange, domainProxyMap, }) {
|
|
52
|
+
super({
|
|
53
|
+
name: exports.controllerName,
|
|
54
|
+
metadata: stateMetadata,
|
|
55
|
+
messenger,
|
|
56
|
+
state,
|
|
57
|
+
});
|
|
58
|
+
_SelectedNetworkController_instances.add(this);
|
|
59
|
+
_SelectedNetworkController_domainProxyMap.set(this, void 0);
|
|
60
|
+
_SelectedNetworkController_useRequestQueuePreference.set(this, void 0);
|
|
61
|
+
__classPrivateFieldSet(this, _SelectedNetworkController_useRequestQueuePreference, useRequestQueuePreference, "f");
|
|
62
|
+
__classPrivateFieldSet(this, _SelectedNetworkController_domainProxyMap, domainProxyMap, "f");
|
|
63
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_registerMessageHandlers).call(this);
|
|
64
|
+
// 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)
|
|
65
|
+
this.messagingSystem
|
|
66
|
+
.call('PermissionController:getSubjectNames')
|
|
67
|
+
.filter((domain) => this.state.domains[domain] === undefined)
|
|
68
|
+
.forEach((domain) => this.setNetworkClientIdForDomain(domain, this.messagingSystem.call('NetworkController:getState')
|
|
69
|
+
.selectedNetworkClientId));
|
|
70
|
+
this.messagingSystem.subscribe('PermissionController:stateChange', (_, patches) => {
|
|
71
|
+
patches.forEach(({ op, path }) => {
|
|
72
|
+
const isChangingSubject = path[0] === 'subjects' && path[1] !== undefined;
|
|
73
|
+
if (isChangingSubject && typeof path[1] === 'string') {
|
|
74
|
+
const domain = path[1];
|
|
75
|
+
if (op === 'add' && this.state.domains[domain] === undefined) {
|
|
76
|
+
this.setNetworkClientIdForDomain(domain, this.messagingSystem.call('NetworkController:getState')
|
|
77
|
+
.selectedNetworkClientId);
|
|
78
|
+
}
|
|
79
|
+
else if (op === 'remove' &&
|
|
80
|
+
this.state.domains[domain] !== undefined) {
|
|
81
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_unsetNetworkClientIdForDomain).call(this, domain);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
this.messagingSystem.subscribe('NetworkController:stateChange', ({ selectedNetworkClientId, networkConfigurationsByChainId }, patches) => {
|
|
87
|
+
const patch = patches.find(({ op, path }) => (op === 'replace' || op === 'remove') &&
|
|
88
|
+
path[0] === 'networkConfigurationsByChainId');
|
|
89
|
+
if (patch) {
|
|
90
|
+
const networkClientIdToChainId = Object.values(networkConfigurationsByChainId).reduce((acc, network) => {
|
|
91
|
+
network.rpcEndpoints.forEach(({ networkClientId }) => (acc[networkClientId] = network.chainId));
|
|
92
|
+
return acc;
|
|
93
|
+
}, {});
|
|
94
|
+
Object.entries(this.state.domains).forEach(([domain, networkClientIdForDomain]) => {
|
|
95
|
+
const chainIdForDomain = networkClientIdToChainId[networkClientIdForDomain];
|
|
96
|
+
if (patch.op === 'remove' && !chainIdForDomain) {
|
|
97
|
+
// If the network was removed, fall back to the globally selected network
|
|
98
|
+
this.setNetworkClientIdForDomain(domain, selectedNetworkClientId);
|
|
99
|
+
}
|
|
100
|
+
else if (patch.op === 'replace') {
|
|
101
|
+
// If the network was updated, redirect to the network's default endpoint
|
|
102
|
+
const updatedChainId = patch.path[1];
|
|
103
|
+
if (!chainIdForDomain || chainIdForDomain === updatedChainId) {
|
|
104
|
+
const network = networkConfigurationsByChainId[updatedChainId];
|
|
105
|
+
const { networkClientId: defaultNetworkClientId } = network.rpcEndpoints[network.defaultRpcEndpointIndex];
|
|
106
|
+
if (networkClientIdForDomain !== defaultNetworkClientId) {
|
|
107
|
+
this.setNetworkClientIdForDomain(domain, defaultNetworkClientId);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
onPreferencesStateChange(({ useRequestQueue }) => {
|
|
115
|
+
if (__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f") !== useRequestQueue) {
|
|
116
|
+
if (!useRequestQueue) {
|
|
117
|
+
// Loop through all domains and points each domain's proxy
|
|
118
|
+
// to the NetworkController's own proxy of the globally selected networkClient
|
|
119
|
+
Object.keys(this.state.domains).forEach((domain) => {
|
|
120
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_unsetNetworkClientIdForDomain).call(this, domain);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_resetAllPermissionedDomains).call(this);
|
|
125
|
+
}
|
|
126
|
+
__classPrivateFieldSet(this, _SelectedNetworkController_useRequestQueuePreference, useRequestQueue, "f");
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
setNetworkClientIdForDomain(domain, networkClientId) {
|
|
131
|
+
if (!__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f")) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (domain === exports.METAMASK_DOMAIN) {
|
|
135
|
+
throw new Error(`NetworkClientId for domain "${exports.METAMASK_DOMAIN}" cannot be set on the SelectedNetworkController`);
|
|
136
|
+
}
|
|
137
|
+
if (snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
|
|
141
|
+
throw new Error('NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions');
|
|
142
|
+
}
|
|
143
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_setNetworkClientIdForDomain).call(this, domain, networkClientId);
|
|
144
|
+
}
|
|
145
|
+
getNetworkClientIdForDomain(domain) {
|
|
146
|
+
const { selectedNetworkClientId: metamaskSelectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
|
|
147
|
+
if (!__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f")) {
|
|
148
|
+
return metamaskSelectedNetworkClientId;
|
|
149
|
+
}
|
|
150
|
+
return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Accesses the provider and block tracker for the currently selected network.
|
|
154
|
+
*
|
|
155
|
+
* @param domain - the domain for the provider
|
|
156
|
+
* @returns The proxy and block tracker proxies.
|
|
157
|
+
*/
|
|
158
|
+
getProviderAndBlockTracker(domain) {
|
|
159
|
+
// If the domain is 'metamask' or a snap, return the NetworkController's globally selected network client proxy
|
|
160
|
+
if (domain === exports.METAMASK_DOMAIN ||
|
|
161
|
+
snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {
|
|
162
|
+
const networkClient = this.messagingSystem.call('NetworkController:getSelectedNetworkClient');
|
|
163
|
+
if (networkClient === undefined) {
|
|
164
|
+
throw new Error('Selected network not initialized');
|
|
165
|
+
}
|
|
166
|
+
return networkClient;
|
|
167
|
+
}
|
|
168
|
+
let networkProxy = __classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").get(domain);
|
|
169
|
+
if (networkProxy === undefined) {
|
|
170
|
+
let networkClient;
|
|
171
|
+
if (__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f") &&
|
|
172
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
|
|
173
|
+
const networkClientId = this.getNetworkClientIdForDomain(domain);
|
|
174
|
+
networkClient = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
networkClient = this.messagingSystem.call('NetworkController:getSelectedNetworkClient');
|
|
178
|
+
if (networkClient === undefined) {
|
|
179
|
+
throw new Error('Selected network not initialized');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
networkProxy = {
|
|
183
|
+
provider: (0, swappable_obj_proxy_1.createEventEmitterProxy)(networkClient.provider),
|
|
184
|
+
blockTracker: (0, swappable_obj_proxy_1.createEventEmitterProxy)(networkClient.blockTracker, {
|
|
185
|
+
eventFilter: 'skipInternal',
|
|
186
|
+
}),
|
|
187
|
+
};
|
|
188
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").set(domain, networkProxy);
|
|
189
|
+
}
|
|
190
|
+
return networkProxy;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
exports.SelectedNetworkController = SelectedNetworkController;
|
|
194
|
+
_SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkController_useRequestQueuePreference = new WeakMap(), _SelectedNetworkController_instances = new WeakSet(), _SelectedNetworkController_registerMessageHandlers = function _SelectedNetworkController_registerMessageHandlers() {
|
|
195
|
+
this.messagingSystem.registerActionHandler(exports.SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain, this.getNetworkClientIdForDomain.bind(this));
|
|
196
|
+
this.messagingSystem.registerActionHandler(exports.SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain, this.setNetworkClientIdForDomain.bind(this));
|
|
197
|
+
}, _SelectedNetworkController_setNetworkClientIdForDomain = function _SelectedNetworkController_setNetworkClientIdForDomain(domain, networkClientId) {
|
|
198
|
+
const networkClient = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
|
|
199
|
+
const networkProxy = this.getProviderAndBlockTracker(domain);
|
|
200
|
+
networkProxy.provider.setTarget(networkClient.provider);
|
|
201
|
+
networkProxy.blockTracker.setTarget(networkClient.blockTracker);
|
|
202
|
+
this.update((state) => {
|
|
203
|
+
state.domains[domain] = networkClientId;
|
|
204
|
+
});
|
|
205
|
+
}, _SelectedNetworkController_unsetNetworkClientIdForDomain = function _SelectedNetworkController_unsetNetworkClientIdForDomain(domain) {
|
|
206
|
+
const globallySelectedNetworkClient = this.messagingSystem.call('NetworkController:getSelectedNetworkClient');
|
|
207
|
+
const networkProxy = __classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").get(domain);
|
|
208
|
+
if (networkProxy && globallySelectedNetworkClient) {
|
|
209
|
+
networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);
|
|
210
|
+
networkProxy.blockTracker.setTarget(globallySelectedNetworkClient.blockTracker);
|
|
211
|
+
}
|
|
212
|
+
else if (networkProxy) {
|
|
213
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").delete(domain);
|
|
214
|
+
}
|
|
215
|
+
this.update((state) => {
|
|
216
|
+
delete state.domains[domain];
|
|
217
|
+
});
|
|
218
|
+
}, _SelectedNetworkController_domainHasPermissions = function _SelectedNetworkController_domainHasPermissions(domain) {
|
|
219
|
+
return this.messagingSystem.call('PermissionController:hasPermissions', domain);
|
|
220
|
+
}, _SelectedNetworkController_resetAllPermissionedDomains = function _SelectedNetworkController_resetAllPermissionedDomains() {
|
|
221
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").forEach((_, domain) => {
|
|
222
|
+
const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
|
|
223
|
+
// can't use public setNetworkClientIdForDomain because it will throw an error
|
|
224
|
+
// rather than simply skip if the domain doesn't have permissions which can happen
|
|
225
|
+
// in this case since proxies are added for each site the user visits
|
|
226
|
+
if (__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
|
|
227
|
+
__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_setNetworkClientIdForDomain).call(this, domain, selectedNetworkClientId);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=SelectedNetworkController.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectedNetworkController.cjs","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,+DAA2D;AAe3D,uEAAwE;AAI3D,QAAA,cAAc,GAAG,2BAA2B,CAAC;AAE1D,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;CAC7C,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAEhD,uEAAuE;AACvE,6FAA6F;AAC7F,2EAA2E;AAC3E,yHAAyH;AACzH,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC;AAIrC,QAAA,eAAe,GAAG,UAAmB,CAAC;AAEtC,QAAA,oCAAoC,GAAG;IAClD,QAAQ,EAAE,GAAG,sBAAc,WAAoB;IAC/C,2BAA2B,EACzB,GAAG,sBAAc,8BAAuC;IAC1D,2BAA2B,EACzB,GAAG,sBAAc,8BAAuC;CAC3D,CAAC;AAEW,QAAA,mCAAmC,GAAG;IACjD,WAAW,EAAE,GAAG,sBAAc,cAAuB;CACtD,CAAC;AAoEF;;GAEG;AACH,MAAa,yBAA0B,SAAQ,gCAI9C;IAKC;;;;;;;;;OASG;IACH,YAAY,EACV,SAAS,EACT,KAAK,GAAG,eAAe,EAAE,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACmB;QACjC,KAAK,CAAC;YACJ,IAAI,EAAE,sBAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK;SACN,CAAC,CAAC;;QA1BL,4DAA2C;QAE3C,uEAAoC;QAyBlC,uBAAA,IAAI,wDAA8B,yBAAyB,MAAA,CAAC;QAC5D,uBAAA,IAAI,6CAAmB,cAAc,MAAA,CAAC;QACtC,uBAAA,IAAI,gGAAyB,MAA7B,IAAI,CAA2B,CAAC;QAEhC,iTAAiT;QACjT,IAAI,CAAC,eAAe;aACjB,IAAI,CAAC,sCAAsC,CAAC;aAC5C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;aAC5D,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAClB,IAAI,CAAC,2BAA2B,CAC9B,MAAM,EACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,4BAA4B,CAAC;aACpD,uBAAuB,CAC3B,CACF,CAAC;QAEJ,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,kCAAkC,EAClC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;YACb,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC/B,MAAM,iBAAiB,GACrB,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;gBAClD,IAAI,iBAAiB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;oBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBACvB,IAAI,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;wBAC5D,IAAI,CAAC,2BAA2B,CAC9B,MAAM,EACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,4BAA4B,CAAC;6BACpD,uBAAuB,CAC3B,CAAC;qBACH;yBAAM,IACL,EAAE,KAAK,QAAQ;wBACf,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EACxC;wBACA,uBAAA,IAAI,sGAA+B,MAAnC,IAAI,EAAgC,MAAM,CAAC,CAAC;qBAC7C;iBACF;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,+BAA+B,EAC/B,CACE,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,EAC3D,OAAO,EACP,EAAE;YACF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CACf,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,QAAQ,CAAC;gBACrC,IAAI,CAAC,CAAC,CAAC,KAAK,gCAAgC,CAC/C,CAAC;YAEF,IAAI,KAAK,EAAE;gBACT,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAC5C,8BAA8B,CAC/B,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;oBACxB,OAAO,CAAC,YAAY,CAAC,OAAO,CAC1B,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAClE,CAAC;oBACF,OAAO,GAAG,CAAC;gBACb,CAAC,EAAE,EAAyB,CAAC,CAAC;gBAE9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CACxC,CAAC,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAAE,EAAE;oBACrC,MAAM,gBAAgB,GACpB,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;oBAErD,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,gBAAgB,EAAE;wBAC9C,yEAAyE;wBACzE,IAAI,CAAC,2BAA2B,CAC9B,MAAM,EACN,uBAAuB,CACxB,CAAC;qBACH;yBAAM,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE;wBACjC,yEAAyE;wBAEzE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAQ,CAAC;wBAC5C,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,KAAK,cAAc,EAAE;4BAC5D,MAAM,OAAO,GACX,8BAA8B,CAAC,cAAc,CAAC,CAAC;4BAEjD,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE,GAC/C,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;4BAExD,IAAI,wBAAwB,KAAK,sBAAsB,EAAE;gCACvD,IAAI,CAAC,2BAA2B,CAC9B,MAAM,EACN,sBAAsB,CACvB,CAAC;6BACH;yBACF;qBACF;gBACH,CAAC,CACF,CAAC;aACH;QACH,CAAC,CACF,CAAC;QAEF,wBAAwB,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;YAC/C,IAAI,uBAAA,IAAI,4DAA2B,KAAK,eAAe,EAAE;gBACvD,IAAI,CAAC,eAAe,EAAE;oBACpB,0DAA0D;oBAC1D,8EAA8E;oBAC9E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;wBACjD,uBAAA,IAAI,sGAA+B,MAAnC,IAAI,EAAgC,MAAM,CAAC,CAAC;oBAC9C,CAAC,CAAC,CAAC;iBACJ;qBAAM;oBACL,uBAAA,IAAI,oGAA6B,MAAjC,IAAI,CAA+B,CAAC;iBACrC;gBACD,uBAAA,IAAI,wDAA8B,eAAe,MAAA,CAAC;aACnD;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IA8ED,2BAA2B,CACzB,MAAc,EACd,eAAgC;QAEhC,IAAI,CAAC,uBAAA,IAAI,4DAA2B,EAAE;YACpC,OAAO;SACR;QAED,IAAI,MAAM,KAAK,uBAAe,EAAE;YAC9B,MAAM,IAAI,KAAK,CACb,+BAA+B,uBAAe,kDAAkD,CACjG,CAAC;SACH;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE;YAC7D,OAAO;SACR;QAED,IAAI,CAAC,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,MAAM,CAAC,EAAE;YACvC,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;SACH;QAED,uBAAA,IAAI,oGAA6B,MAAjC,IAAI,EAA8B,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7D,CAAC;IAED,2BAA2B,CAAC,MAAc;QACxC,MAAM,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,GAChE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1D,IAAI,CAAC,uBAAA,IAAI,4DAA2B,EAAE;YACpC,OAAO,+BAA+B,CAAC;SACxC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,+BAA+B,CAAC;IACvE,CAAC;IAED;;;;;OAKG;IACH,0BAA0B,CAAC,MAAc;QACvC,+GAA+G;QAC/G,IACE,MAAM,KAAK,uBAAe;YAC1B,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EACzD;YACA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC7C,4CAA4C,CAC7C,CAAC;YACF,IAAI,aAAa,KAAK,SAAS,EAAE;gBAC/B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACrD;YACD,OAAO,aAAa,CAAC;SACtB;QAED,IAAI,YAAY,GAAG,uBAAA,IAAI,iDAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,IAAI,aAAa,CAAC;YAClB,IACE,uBAAA,IAAI,4DAA2B;gBAC/B,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,MAAM,CAAC,EAClC;gBACA,MAAM,eAAe,GAAG,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;gBACjE,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACvC,wCAAwC,EACxC,eAAe,CAChB,CAAC;aACH;iBAAM;gBACL,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACvC,4CAA4C,CAC7C,CAAC;gBACF,IAAI,aAAa,KAAK,SAAS,EAAE;oBAC/B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;iBACrD;aACF;YACD,YAAY,GAAG;gBACb,QAAQ,EAAE,IAAA,6CAAuB,EAAC,aAAa,CAAC,QAAQ,CAAC;gBACzD,YAAY,EAAE,IAAA,6CAAuB,EAAC,aAAa,CAAC,YAAY,EAAE;oBAChE,WAAW,EAAE,cAAc;iBAC5B,CAAC;aACH,CAAC;YACF,uBAAA,IAAI,iDAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;SAChD;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAtTD,8DAsTC;;IAlKG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,4CAAoC,CAAC,2BAA2B,EAChE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;IACF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,4CAAoC,CAAC,2BAA2B,EAChE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;AACJ,CAAC,2HAGC,MAAc,EACd,eAAgC;IAEhC,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC7C,wCAAwC,EACxC,eAAe,CAChB,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAC7D,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxD,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAEhE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,+HAQ8B,MAAc;IAC3C,MAAM,6BAA6B,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC7D,4CAA4C,CAC7C,CAAC;IACF,MAAM,YAAY,GAAG,uBAAA,IAAI,iDAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,YAAY,IAAI,6BAA6B,EAAE;QACjD,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QACxE,YAAY,CAAC,YAAY,CAAC,SAAS,CACjC,6BAA6B,CAAC,YAAY,CAC3C,CAAC;KACH;SAAM,IAAI,YAAY,EAAE;QACvB,uBAAA,IAAI,iDAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACrC;IACD,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,6GAEqB,MAAc;IAClC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAC9B,qCAAqC,EACrC,MAAM,CACP,CAAC;AACJ,CAAC;IAMC,uBAAA,IAAI,iDAAgB,CAAC,OAAO,CAAC,CAAC,CAAe,EAAE,MAAc,EAAE,EAAE;QAC/D,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC3D,4BAA4B,CAC7B,CAAC;QACF,8EAA8E;QAC9E,kFAAkF;QAClF,qEAAqE;QACrE,IAAI,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,MAAM,CAAC,EAAE;YACtC,uBAAA,IAAI,oGAA6B,MAAjC,IAAI,EAA8B,MAAM,EAAE,uBAAuB,CAAC,CAAC;SACpE;IACH,CAAC,CAAC,CAAC;AACL,CAAC","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 { Hex } from '@metamask/utils';\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\n// npm and local are currently the only valid prefixes for snap domains\n// TODO: eventually we maybe want to pull this in from snaps-utils to ensure it stays in sync\n// For now it seems like overkill to add a dependency for this one constant\n// https://github.com/MetaMask/snaps/blob/2beee7803bfe9e540788a3558b546b9f55dc3cb4/packages/snaps-utils/src/types.ts#L120\nconst snapsPrefixes = ['npm:', 'local:'] as const;\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 (\n { selectedNetworkClientId, networkConfigurationsByChainId },\n patches,\n ) => {\n const patch = patches.find(\n ({ op, path }) =>\n (op === 'replace' || op === 'remove') &&\n path[0] === 'networkConfigurationsByChainId',\n );\n\n if (patch) {\n const networkClientIdToChainId = Object.values(\n networkConfigurationsByChainId,\n ).reduce((acc, network) => {\n network.rpcEndpoints.forEach(\n ({ networkClientId }) => (acc[networkClientId] = network.chainId),\n );\n return acc;\n }, {} as Record<string, Hex>);\n\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n const chainIdForDomain =\n networkClientIdToChainId[networkClientIdForDomain];\n\n if (patch.op === 'remove' && !chainIdForDomain) {\n // If the network was removed, fall back to the globally selected network\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n } else if (patch.op === 'replace') {\n // If the network was updated, redirect to the network's default endpoint\n\n const updatedChainId = patch.path[1] as Hex;\n if (!chainIdForDomain || chainIdForDomain === updatedChainId) {\n const network =\n networkConfigurationsByChainId[updatedChainId];\n\n const { networkClientId: defaultNetworkClientId } =\n network.rpcEndpoints[network.defaultRpcEndpointIndex];\n\n if (networkClientIdForDomain !== defaultNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n defaultNetworkClientId,\n );\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 (!this.#useRequestQueuePreference) {\n return;\n }\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 (snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {\n return;\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 // If the domain is 'metamask' or a snap, return the NetworkController's globally selected network client proxy\n if (\n domain === METAMASK_DOMAIN ||\n snapsPrefixes.some((prefix) => domain.startsWith(prefix))\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n return networkClient;\n }\n\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (\n this.#useRequestQueuePreference &&\n this.#domainHasPermissions(domain)\n ) {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\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,8 +1,8 @@
|
|
|
1
|
-
import type { RestrictedControllerMessenger } from
|
|
2
|
-
import { BaseController } from
|
|
3
|
-
import type { BlockTrackerProxy, NetworkClientId, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetSelectedNetworkClientAction, NetworkControllerGetStateAction, NetworkControllerStateChangeEvent, ProviderProxy } from
|
|
4
|
-
import type { PermissionControllerStateChange, GetSubjects as PermissionControllerGetSubjectsAction, HasPermissions as PermissionControllerHasPermissions } from
|
|
5
|
-
import type { Patch } from
|
|
1
|
+
import type { RestrictedControllerMessenger } from "@metamask/base-controller";
|
|
2
|
+
import { BaseController } from "@metamask/base-controller";
|
|
3
|
+
import type { BlockTrackerProxy, NetworkClientId, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetSelectedNetworkClientAction, NetworkControllerGetStateAction, NetworkControllerStateChangeEvent, ProviderProxy } from "@metamask/network-controller";
|
|
4
|
+
import type { PermissionControllerStateChange, GetSubjects as PermissionControllerGetSubjectsAction, HasPermissions as PermissionControllerHasPermissions } from "@metamask/permission-controller";
|
|
5
|
+
import type { Patch } from "immer";
|
|
6
6
|
export declare const controllerName = "SelectedNetworkController";
|
|
7
7
|
export type Domain = string;
|
|
8
8
|
export declare const METAMASK_DOMAIN: "metamask";
|
|
@@ -77,4 +77,4 @@ export declare class SelectedNetworkController extends BaseController<typeof con
|
|
|
77
77
|
*/
|
|
78
78
|
getProviderAndBlockTracker(domain: Domain): NetworkProxy;
|
|
79
79
|
}
|
|
80
|
-
//# sourceMappingURL=SelectedNetworkController.d.
|
|
80
|
+
//# sourceMappingURL=SelectedNetworkController.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectedNetworkController.d.cts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,kCAAkC;AAC/E,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,2CAA2C,EAC3C,+CAA+C,EAC/C,+BAA+B,EAC/B,iCAAiC,EACjC,aAAa,EACd,qCAAqC;AACtC,OAAO,KAAK,EACV,+BAA+B,EAC/B,WAAW,IAAI,qCAAqC,EACpD,cAAc,IAAI,kCAAkC,EACrD,wCAAwC;AAGzC,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc;AAEnC,eAAO,MAAM,cAAc,8BAA8B,CAAC;AAc1D,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,eAAO,MAAM,eAAe,YAAsB,CAAC;AAEnD,eAAO,MAAM,oCAAoC;;;;CAMhD,CAAC;AAEF,eAAO,MAAM,mCAAmC;;CAE/C,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,yCAAyC,GAAG;IACtD,IAAI,EAAE,OAAO,mCAAmC,CAAC,WAAW,CAAC;IAC7D,OAAO,EAAE,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,sDAAsD,GAAG;IACnE,IAAI,EAAE,OAAO,oCAAoC,CAAC,QAAQ,CAAC;IAC3D,OAAO,EAAE,MAAM,8BAA8B,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,OAAO,oCAAoC,CAAC,2BAA2B,CAAC;IAC9E,OAAO,EAAE,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,0DAA0D,GAAG;IACvE,IAAI,EAAE,OAAO,oCAAoC,CAAC,2BAA2B,CAAC;IAC9E,OAAO,EAAE,yBAAyB,CAAC,6BAA6B,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,gCAAgC,GACxC,sDAAsD,GACtD,0DAA0D,GAC1D,0DAA0D,CAAC;AAE/D,MAAM,MAAM,cAAc,GACtB,2CAA2C,GAC3C,+CAA+C,GAC/C,+BAA+B,GAC/B,kCAAkC,GAClC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,+BAA+B,GACzC,yCAAyC,CAAC;AAE5C,MAAM,MAAM,aAAa,GACrB,iCAAiC,GACjC,+BAA+B,CAAC;AAEpC,MAAM,MAAM,kCAAkC,GAAG,6BAA6B,CAC5E,OAAO,cAAc,EACrB,gCAAgC,GAAG,cAAc,EACjD,+BAA+B,GAAG,aAAa,EAC/C,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,CAAC,EAAE,8BAA8B,CAAC;IACvC,SAAS,EAAE,kCAAkC,CAAC;IAC9C,yBAAyB,EAAE,OAAO,CAAC;IACnC,wBAAwB,EAAE,CACxB,QAAQ,EAAE,CAAC,gBAAgB,EAAE;QAAE,eAAe,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,KAC/D,IAAI,CAAC;IACV,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,cAAc,CAC3D,OAAO,cAAc,EACrB,8BAA8B,EAC9B,kCAAkC,CACnC;;IAKC;;;;;;;;;OASG;gBACS,EACV,SAAS,EACT,KAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACf,EAAE,gCAAgC;IAsMnC,2BAA2B,CACzB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe;IAyBlC,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAS5D;;;;;OAKG;IACH,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;CA6CzD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { RestrictedControllerMessenger } from "@metamask/base-controller";
|
|
2
|
+
import { BaseController } from "@metamask/base-controller";
|
|
3
|
+
import type { BlockTrackerProxy, NetworkClientId, NetworkControllerGetNetworkClientByIdAction, NetworkControllerGetSelectedNetworkClientAction, NetworkControllerGetStateAction, NetworkControllerStateChangeEvent, ProviderProxy } from "@metamask/network-controller";
|
|
4
|
+
import type { PermissionControllerStateChange, GetSubjects as PermissionControllerGetSubjectsAction, HasPermissions as PermissionControllerHasPermissions } from "@metamask/permission-controller";
|
|
5
|
+
import type { Patch } from "immer";
|
|
6
|
+
export declare const controllerName = "SelectedNetworkController";
|
|
7
|
+
export type Domain = string;
|
|
8
|
+
export declare const METAMASK_DOMAIN: "metamask";
|
|
9
|
+
export declare const SelectedNetworkControllerActionTypes: {
|
|
10
|
+
getState: "SelectedNetworkController:getState";
|
|
11
|
+
getNetworkClientIdForDomain: "SelectedNetworkController:getNetworkClientIdForDomain";
|
|
12
|
+
setNetworkClientIdForDomain: "SelectedNetworkController:setNetworkClientIdForDomain";
|
|
13
|
+
};
|
|
14
|
+
export declare const SelectedNetworkControllerEventTypes: {
|
|
15
|
+
stateChange: "SelectedNetworkController:stateChange";
|
|
16
|
+
};
|
|
17
|
+
export type SelectedNetworkControllerState = {
|
|
18
|
+
domains: Record<Domain, NetworkClientId>;
|
|
19
|
+
};
|
|
20
|
+
export type SelectedNetworkControllerStateChangeEvent = {
|
|
21
|
+
type: typeof SelectedNetworkControllerEventTypes.stateChange;
|
|
22
|
+
payload: [SelectedNetworkControllerState, Patch[]];
|
|
23
|
+
};
|
|
24
|
+
export type SelectedNetworkControllerGetSelectedNetworkStateAction = {
|
|
25
|
+
type: typeof SelectedNetworkControllerActionTypes.getState;
|
|
26
|
+
handler: () => SelectedNetworkControllerState;
|
|
27
|
+
};
|
|
28
|
+
export type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {
|
|
29
|
+
type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;
|
|
30
|
+
handler: SelectedNetworkController['getNetworkClientIdForDomain'];
|
|
31
|
+
};
|
|
32
|
+
export type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {
|
|
33
|
+
type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;
|
|
34
|
+
handler: SelectedNetworkController['setNetworkClientIdForDomain'];
|
|
35
|
+
};
|
|
36
|
+
export type SelectedNetworkControllerActions = SelectedNetworkControllerGetSelectedNetworkStateAction | SelectedNetworkControllerGetNetworkClientIdForDomainAction | SelectedNetworkControllerSetNetworkClientIdForDomainAction;
|
|
37
|
+
export type AllowedActions = NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetSelectedNetworkClientAction | NetworkControllerGetStateAction | PermissionControllerHasPermissions | PermissionControllerGetSubjectsAction;
|
|
38
|
+
export type SelectedNetworkControllerEvents = SelectedNetworkControllerStateChangeEvent;
|
|
39
|
+
export type AllowedEvents = NetworkControllerStateChangeEvent | PermissionControllerStateChange;
|
|
40
|
+
export type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<typeof controllerName, SelectedNetworkControllerActions | AllowedActions, SelectedNetworkControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
|
|
41
|
+
export type SelectedNetworkControllerOptions = {
|
|
42
|
+
state?: SelectedNetworkControllerState;
|
|
43
|
+
messenger: SelectedNetworkControllerMessenger;
|
|
44
|
+
useRequestQueuePreference: boolean;
|
|
45
|
+
onPreferencesStateChange: (listener: (preferencesState: {
|
|
46
|
+
useRequestQueue: boolean;
|
|
47
|
+
}) => void) => void;
|
|
48
|
+
domainProxyMap: Map<Domain, NetworkProxy>;
|
|
49
|
+
};
|
|
50
|
+
export type NetworkProxy = {
|
|
51
|
+
provider: ProviderProxy;
|
|
52
|
+
blockTracker: BlockTrackerProxy;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Controller for getting and setting the network for a particular domain.
|
|
56
|
+
*/
|
|
57
|
+
export declare class SelectedNetworkController extends BaseController<typeof controllerName, SelectedNetworkControllerState, SelectedNetworkControllerMessenger> {
|
|
58
|
+
#private;
|
|
59
|
+
/**
|
|
60
|
+
* Construct a SelectedNetworkController controller.
|
|
61
|
+
*
|
|
62
|
+
* @param options - The controller options.
|
|
63
|
+
* @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
|
|
64
|
+
* @param options.state - The controllers initial state.
|
|
65
|
+
* @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
|
|
66
|
+
* @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
|
|
67
|
+
* @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
|
|
68
|
+
*/
|
|
69
|
+
constructor({ messenger, state, useRequestQueuePreference, onPreferencesStateChange, domainProxyMap, }: SelectedNetworkControllerOptions);
|
|
70
|
+
setNetworkClientIdForDomain(domain: Domain, networkClientId: NetworkClientId): void;
|
|
71
|
+
getNetworkClientIdForDomain(domain: Domain): NetworkClientId;
|
|
72
|
+
/**
|
|
73
|
+
* Accesses the provider and block tracker for the currently selected network.
|
|
74
|
+
*
|
|
75
|
+
* @param domain - the domain for the provider
|
|
76
|
+
* @returns The proxy and block tracker proxies.
|
|
77
|
+
*/
|
|
78
|
+
getProviderAndBlockTracker(domain: Domain): NetworkProxy;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=SelectedNetworkController.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectedNetworkController.d.mts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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"}
|