@metamask/selected-network-controller 1.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 ADDED
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [1.0.0]
10
+ ### Added
11
+ - Initial Release ([#1643](https://github.com/MetaMask/core/pull/1643))
12
+
13
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@1.0.0...HEAD
14
+ [1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/selected-network-controller@1.0.0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 MetaMask
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # `@metamask/selected-network-controller`
2
+
3
+ Provides an interface to the currently selected networkClientId for a given domain.
4
+
5
+ Domain here means one of two things:
6
+
7
+ - the jsonrpc request originated from a dapp (domain is the origin/url of the dapp)
8
+ - the jsonrpc request originated interally to metamask (the domain is here is 'metamask')
9
+
10
+ ## Installation
11
+
12
+ `yarn add @metamask/selected-network-controller`
13
+
14
+ or
15
+
16
+ `npm install @metamask/selected-network-controller`
17
+
18
+ ## Contributing
19
+
20
+ This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/core#readme).
@@ -0,0 +1,63 @@
1
+ import type { RestrictedControllerMessenger } from '@metamask/base-controller';
2
+ import { BaseControllerV2 } from '@metamask/base-controller';
3
+ import type { NetworkClientId, NetworkControllerStateChangeEvent } from '@metamask/network-controller';
4
+ import type { Patch } from 'immer';
5
+ declare const controllerName = "SelectedNetworkController";
6
+ declare type Domain = string;
7
+ export declare const SelectedNetworkControllerActionTypes: {
8
+ getState: "SelectedNetworkController:getState";
9
+ getNetworkClientIdForDomain: "SelectedNetworkController:getNetworkClientIdForDomain";
10
+ setNetworkClientIdForDomain: "SelectedNetworkController:setNetworkClientIdForDomain";
11
+ };
12
+ export declare const SelectedNetworkControllerEventTypes: {
13
+ stateChange: "SelectedNetworkController:stateChange";
14
+ };
15
+ export declare type SelectedNetworkControllerState = {
16
+ domains: Record<Domain, NetworkClientId>;
17
+ /**
18
+ * Feature flag to start returning networkClientId based on the domain.
19
+ * when the flag is false, the 'metamask' domain will always be used.
20
+ * defaults to false
21
+ */
22
+ perDomainNetwork: boolean;
23
+ };
24
+ export declare type SelectedNetworkControllerStateChangeEvent = {
25
+ type: typeof SelectedNetworkControllerEventTypes.stateChange;
26
+ payload: [SelectedNetworkControllerState, Patch[]];
27
+ };
28
+ export declare type SelectedNetworkControllerGetSelectedNetworkStateAction = {
29
+ type: typeof SelectedNetworkControllerActionTypes.getState;
30
+ handler: () => SelectedNetworkControllerState;
31
+ };
32
+ export declare type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {
33
+ type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;
34
+ handler: (domain: string) => NetworkClientId;
35
+ };
36
+ export declare type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {
37
+ type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;
38
+ handler: (domain: string, NetworkClientId: NetworkClientId) => void;
39
+ };
40
+ export declare type SelectedNetworkControllerAction = SelectedNetworkControllerGetSelectedNetworkStateAction | SelectedNetworkControllerGetNetworkClientIdForDomainAction | SelectedNetworkControllerSetNetworkClientIdForDomainAction;
41
+ export declare type SelectedNetworkControllerEvent = SelectedNetworkControllerStateChangeEvent;
42
+ export declare type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<typeof controllerName, SelectedNetworkControllerAction, NetworkControllerStateChangeEvent | SelectedNetworkControllerEvent, string, string>;
43
+ export declare type SelectedNetworkControllerOptions = {
44
+ messenger: SelectedNetworkControllerMessenger;
45
+ };
46
+ /**
47
+ * Controller for getting and setting the network for a particular domain.
48
+ */
49
+ export declare class SelectedNetworkController extends BaseControllerV2<typeof controllerName, SelectedNetworkControllerState, SelectedNetworkControllerMessenger> {
50
+ #private;
51
+ /**
52
+ * Construct a SelectedNetworkController controller.
53
+ *
54
+ * @param options - The controller options.
55
+ * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
56
+ */
57
+ constructor({ messenger }: SelectedNetworkControllerOptions);
58
+ setNetworkClientIdForMetamask(networkClientId: NetworkClientId): void;
59
+ setNetworkClientIdForDomain(domain: Domain, networkClientId: NetworkClientId): void;
60
+ getNetworkClientIdForDomain(domain: Domain): string;
61
+ }
62
+ export {};
63
+ //# sourceMappingURL=SelectedNetworkController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectedNetworkController.d.ts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EACf,iCAAiC,EAElC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,QAAA,MAAM,cAAc,8BAA8B,CAAC;AAYnD,aAAK,MAAM,GAAG,MAAM,CAAC;AAIrB,eAAO,MAAM,oCAAoC;;;;CAMhD,CAAC;AAEF,eAAO,MAAM,mCAAmC;;CAE/C,CAAC;AAEF,oBAAY,8BAA8B,GAAG;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,oBAAY,yCAAyC,GAAG;IACtD,IAAI,EAAE,OAAO,mCAAmC,CAAC,WAAW,CAAC;IAC7D,OAAO,EAAE,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC,CAAC;CACpD,CAAC;AAEF,oBAAY,sDAAsD,GAAG;IACnE,IAAI,EAAE,OAAO,oCAAoC,CAAC,QAAQ,CAAC;IAC3D,OAAO,EAAE,MAAM,8BAA8B,CAAC;CAC/C,CAAC;AAEF,oBAAY,0DAA0D,GAAG;IACvE,IAAI,EAAE,OAAO,oCAAoC,CAAC,2BAA2B,CAAC;IAC9E,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,eAAe,CAAC;CAC9C,CAAC;AAEF,oBAAY,0DAA0D,GAAG;IACvE,IAAI,EAAE,OAAO,oCAAoC,CAAC,2BAA2B,CAAC;IAC9E,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,KAAK,IAAI,CAAC;CACrE,CAAC;AAEF,oBAAY,+BAA+B,GACvC,sDAAsD,GACtD,0DAA0D,GAC1D,0DAA0D,CAAC;AAE/D,oBAAY,8BAA8B,GACxC,yCAAyC,CAAC;AAE5C,oBAAY,kCAAkC,GAAG,6BAA6B,CAC5E,OAAO,cAAc,EACrB,+BAA+B,EAC/B,iCAAiC,GAAG,8BAA8B,EAClE,MAAM,EACN,MAAM,CACP,CAAC;AAEF,oBAAY,gCAAgC,GAAG;IAC7C,SAAS,EAAE,kCAAkC,CAAC;CAC/C,CAAC;AAEF;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB,CAC7D,OAAO,cAAc,EACrB,8BAA8B,EAC9B,kCAAkC,CACnC;;IACC;;;;;OAKG;gBACS,EAAE,SAAS,EAAE,EAAE,gCAAgC;IAwC3D,6BAA6B,CAAC,eAAe,EAAE,eAAe;IAI9D,2BAA2B,CACzB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe;IAOlC,2BAA2B,CAAC,MAAM,EAAE,MAAM;CAM3C"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ 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");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var _SelectedNetworkController_instances, _SelectedNetworkController_registerMessageHandlers;
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SelectedNetworkController = exports.SelectedNetworkControllerEventTypes = exports.SelectedNetworkControllerActionTypes = void 0;
10
+ const base_controller_1 = require("@metamask/base-controller");
11
+ const controllerName = 'SelectedNetworkController';
12
+ const stateMetadata = {
13
+ domains: { persist: true, anonymous: false },
14
+ perDomainNetwork: { persist: true, anonymous: false },
15
+ };
16
+ const getDefaultState = () => ({
17
+ domains: {},
18
+ perDomainNetwork: false,
19
+ });
20
+ const METAMASK_DOMAIN = 'metamask';
21
+ exports.SelectedNetworkControllerActionTypes = {
22
+ getState: `${controllerName}:getState`,
23
+ getNetworkClientIdForDomain: `${controllerName}:getNetworkClientIdForDomain`,
24
+ setNetworkClientIdForDomain: `${controllerName}:setNetworkClientIdForDomain`,
25
+ };
26
+ exports.SelectedNetworkControllerEventTypes = {
27
+ stateChange: `${controllerName}:stateChange`,
28
+ };
29
+ /**
30
+ * Controller for getting and setting the network for a particular domain.
31
+ */
32
+ class SelectedNetworkController extends base_controller_1.BaseControllerV2 {
33
+ /**
34
+ * Construct a SelectedNetworkController controller.
35
+ *
36
+ * @param options - The controller options.
37
+ * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
38
+ */
39
+ constructor({ messenger }) {
40
+ super({
41
+ name: controllerName,
42
+ metadata: stateMetadata,
43
+ messenger,
44
+ state: getDefaultState(),
45
+ });
46
+ _SelectedNetworkController_instances.add(this);
47
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_registerMessageHandlers).call(this);
48
+ }
49
+ setNetworkClientIdForMetamask(networkClientId) {
50
+ this.setNetworkClientIdForDomain(METAMASK_DOMAIN, networkClientId);
51
+ }
52
+ setNetworkClientIdForDomain(domain, networkClientId) {
53
+ this.update((state) => {
54
+ state.domains[domain] = networkClientId;
55
+ });
56
+ }
57
+ getNetworkClientIdForDomain(domain) {
58
+ if (this.state.perDomainNetwork) {
59
+ return this.state.domains[domain];
60
+ }
61
+ return this.state.domains[METAMASK_DOMAIN];
62
+ }
63
+ }
64
+ exports.SelectedNetworkController = SelectedNetworkController;
65
+ _SelectedNetworkController_instances = new WeakSet(), _SelectedNetworkController_registerMessageHandlers = function _SelectedNetworkController_registerMessageHandlers() {
66
+ this.messagingSystem.registerActionHandler(exports.SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain, this.getNetworkClientIdForDomain.bind(this));
67
+ this.messagingSystem.registerActionHandler(exports.SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain, this.setNetworkClientIdForDomain.bind(this));
68
+ // subscribe to networkController statechange:: selectedNetworkClientId changed
69
+ // update the value for the domain 'metamask'
70
+ this.messagingSystem.subscribe('NetworkController:stateChange', (state, patch) => {
71
+ const isChangingNetwork = patch.some((p) => p.path[0] === 'selectedNetworkClientId');
72
+ if (!isChangingNetwork) {
73
+ return;
74
+ }
75
+ // set it for the 'global' network to preserve functionality for the
76
+ // selectedNetworkController.perDomainNetwork feature flag being off
77
+ this.setNetworkClientIdForMetamask(state.selectedNetworkClientId);
78
+ });
79
+ };
80
+ //# sourceMappingURL=SelectedNetworkController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectedNetworkController.js","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":";;;;;;;;;AACA,+DAA6D;AAQ7D,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5C,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;CACtD,CAAC;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,EAAE;IACX,gBAAgB,EAAE,KAAK;CACxB,CAAC,CAAC;AAIH,MAAM,eAAe,GAAG,UAAmB,CAAC;AAE/B,QAAA,oCAAoC,GAAG;IAClD,QAAQ,EAAE,GAAG,cAAc,WAAoB;IAC/C,2BAA2B,EACzB,GAAG,cAAc,8BAAuC;IAC1D,2BAA2B,EACzB,GAAG,cAAc,8BAAuC;CAC3D,CAAC;AAEW,QAAA,mCAAmC,GAAG;IACjD,WAAW,EAAE,GAAG,cAAc,cAAuB;CACtD,CAAC;AAoDF;;GAEG;AACH,MAAa,yBAA0B,SAAQ,kCAI9C;IACC;;;;;OAKG;IACH,YAAY,EAAE,SAAS,EAAoC;QACzD,KAAK,CAAC;YACJ,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,aAAa;YACvB,SAAS;YACT,KAAK,EAAE,eAAe,EAAE;SACzB,CAAC,CAAC;;QACH,uBAAA,IAAI,gGAAyB,MAA7B,IAAI,CAA2B,CAAC;IAClC,CAAC;IAgCD,6BAA6B,CAAC,eAAgC;QAC5D,IAAI,CAAC,2BAA2B,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IACrE,CAAC;IAED,2BAA2B,CACzB,MAAc,EACd,eAAgC;QAEhC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACpB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B,CAAC,MAAc;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SACnC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,CAAC;CACF;AAtED,8DAsEC;;IAhDG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,4CAAoC,CAAC,2BAA2B,EAChE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,4CAAoC,CAAC,2BAA2B,EAChE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;IAEF,+EAA+E;IAC/E,6CAA6C;IAC7C,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,+BAA+B,EAC/B,CAAC,KAAmB,EAAE,KAAc,EAAE,EAAE;QACtC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,yBAAyB,CAC/C,CAAC;QACF,IAAI,CAAC,iBAAiB,EAAE;YACtB,OAAO;SACR;QAED,oEAAoE;QACpE,oEAAoE;QACpE,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACpE,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport type {\n NetworkClientId,\n NetworkControllerStateChangeEvent,\n NetworkState,\n} from '@metamask/network-controller';\nimport type { Patch } from 'immer';\n\nconst controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n perDomainNetwork: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({\n domains: {},\n perDomainNetwork: false,\n});\n\ntype Domain = string;\n\nconst 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 * Feature flag to start returning networkClientId based on the domain.\n * when the flag is false, the 'metamask' domain will always be used.\n * defaults to false\n */\n perDomainNetwork: boolean;\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: (domain: string) => NetworkClientId;\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: (domain: string, NetworkClientId: NetworkClientId) => void;\n};\n\nexport type SelectedNetworkControllerAction =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type SelectedNetworkControllerEvent =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerAction,\n NetworkControllerStateChangeEvent | SelectedNetworkControllerEvent,\n string,\n string\n>;\n\nexport type SelectedNetworkControllerOptions = {\n messenger: SelectedNetworkControllerMessenger;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseControllerV2<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\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 */\n constructor({ messenger }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: getDefaultState(),\n });\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n\n // subscribe to networkController statechange:: selectedNetworkClientId changed\n // update the value for the domain 'metamask'\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (state: NetworkState, patch: Patch[]) => {\n const isChangingNetwork = patch.some(\n (p) => p.path[0] === 'selectedNetworkClientId',\n );\n if (!isChangingNetwork) {\n return;\n }\n\n // set it for the 'global' network to preserve functionality for the\n // selectedNetworkController.perDomainNetwork feature flag being off\n this.setNetworkClientIdForMetamask(state.selectedNetworkClientId);\n },\n );\n }\n\n setNetworkClientIdForMetamask(networkClientId: NetworkClientId) {\n this.setNetworkClientIdForDomain(METAMASK_DOMAIN, networkClientId);\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n }\n\n getNetworkClientIdForDomain(domain: Domain) {\n if (this.state.perDomainNetwork) {\n return this.state.domains[domain];\n }\n return this.state.domains[METAMASK_DOMAIN];\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ControllerMessenger } from '@metamask/base-controller';
2
+ import type { NetworkControllerGetStateAction } from '@metamask/network-controller';
3
+ import type { JsonRpcMiddleware } from 'json-rpc-engine';
4
+ import type { SelectedNetworkControllerGetNetworkClientIdForDomainAction, SelectedNetworkControllerSetNetworkClientIdForDomainAction } from './SelectedNetworkController';
5
+ export declare const createSelectedNetworkMiddleware: (messenger: ControllerMessenger<SelectedNetworkControllerGetNetworkClientIdForDomainAction | SelectedNetworkControllerSetNetworkClientIdForDomainAction | NetworkControllerGetStateAction, never>) => JsonRpcMiddleware<any, any>;
6
+ //# sourceMappingURL=SelectedNetworkMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectedNetworkMiddleware.d.ts","sourceRoot":"","sources":["../src/SelectedNetworkMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAEV,+BAA+B,EAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EACV,0DAA0D,EAC1D,0DAA0D,EAC3D,MAAM,6BAA6B,CAAC;AAGrC,eAAO,MAAM,+BAA+B,cAC/B,oBACP,0DAA0D,GAC1D,0DAA0D,GAC1D,+BAA+B,EACjC,KAAK,CACN,KACA,kBAAkB,GAAG,EAAE,GAAG,CA4B5B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSelectedNetworkMiddleware = void 0;
4
+ const SelectedNetworkController_1 = require("./SelectedNetworkController");
5
+ const createSelectedNetworkMiddleware = (messenger) => {
6
+ const getNetworkClientIdForDomain = (origin) => messenger.call(SelectedNetworkController_1.SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain, origin);
7
+ const setNetworkClientIdForDomain = (origin, networkClientId) => messenger.call(SelectedNetworkController_1.SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain, origin, networkClientId);
8
+ const getDefaultNetworkClientId = () => messenger.call('NetworkController:getState').selectedNetworkClientId;
9
+ return (req, _, next) => {
10
+ if (getNetworkClientIdForDomain(req.origin) === undefined) {
11
+ setNetworkClientIdForDomain(req.origin, getDefaultNetworkClientId());
12
+ }
13
+ req.networkClientId = getNetworkClientIdForDomain(req.origin);
14
+ return next();
15
+ };
16
+ };
17
+ exports.createSelectedNetworkMiddleware = createSelectedNetworkMiddleware;
18
+ //# sourceMappingURL=SelectedNetworkMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectedNetworkMiddleware.js","sourceRoot":"","sources":["../src/SelectedNetworkMiddleware.ts"],"names":[],"mappings":";;;AAWA,2EAAmF;AAE5E,MAAM,+BAA+B,GAAG,CAC7C,SAKC,EAC4B,EAAE;IAC/B,MAAM,2BAA2B,GAAG,CAAC,MAAc,EAAE,EAAE,CACrD,SAAS,CAAC,IAAI,CACZ,gEAAoC,CAAC,2BAA2B,EAChE,MAAM,CACP,CAAC;IAEJ,MAAM,2BAA2B,GAAG,CAClC,MAAc,EACd,eAAgC,EAChC,EAAE,CACF,SAAS,CAAC,IAAI,CACZ,gEAAoC,CAAC,2BAA2B,EAChE,MAAM,EACN,eAAe,CAChB,CAAC;IAEJ,MAAM,yBAAyB,GAAG,GAAG,EAAE,CACrC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,uBAAuB,CAAC;IAEvE,OAAO,CAAC,GAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE;YACzD,2BAA2B,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC;SACtE;QAED,GAAG,CAAC,eAAe,GAAG,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC,CAAC;AAnCW,QAAA,+BAA+B,mCAmC1C","sourcesContent":["import type { ControllerMessenger } from '@metamask/base-controller';\nimport type {\n NetworkClientId,\n NetworkControllerGetStateAction,\n} from '@metamask/network-controller';\nimport type { JsonRpcMiddleware } from 'json-rpc-engine';\n\nimport type {\n SelectedNetworkControllerGetNetworkClientIdForDomainAction,\n SelectedNetworkControllerSetNetworkClientIdForDomainAction,\n} from './SelectedNetworkController';\nimport { SelectedNetworkControllerActionTypes } from './SelectedNetworkController';\n\nexport const createSelectedNetworkMiddleware = (\n messenger: ControllerMessenger<\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction\n | NetworkControllerGetStateAction,\n never\n >,\n): JsonRpcMiddleware<any, any> => {\n const getNetworkClientIdForDomain = (origin: string) =>\n messenger.call(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n origin,\n );\n\n const setNetworkClientIdForDomain = (\n origin: string,\n networkClientId: NetworkClientId,\n ) =>\n messenger.call(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n origin,\n networkClientId,\n );\n\n const getDefaultNetworkClientId = () =>\n messenger.call('NetworkController:getState').selectedNetworkClientId;\n\n return (req: any, _, next) => {\n if (getNetworkClientIdForDomain(req.origin) === undefined) {\n setNetworkClientIdForDomain(req.origin, getDefaultNetworkClientId());\n }\n\n req.networkClientId = getNetworkClientIdForDomain(req.origin);\n return next();\n };\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export * from './SelectedNetworkController';
2
+ export * from './SelectedNetworkMiddleware';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./SelectedNetworkController"), exports);
18
+ __exportStar(require("./SelectedNetworkMiddleware"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,8DAA4C","sourcesContent":["export * from './SelectedNetworkController';\nexport * from './SelectedNetworkMiddleware';\n"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@metamask/selected-network-controller",
3
+ "version": "1.0.0",
4
+ "description": "Provides an interface to the currently selected networkClientId for a given domain",
5
+ "keywords": [
6
+ "MetaMask",
7
+ "Ethereum"
8
+ ],
9
+ "homepage": "https://github.com/MetaMask/core/tree/main/packages/selected-network-controller#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/MetaMask/core/issues"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/MetaMask/core.git"
16
+ },
17
+ "license": "MIT",
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "files": [
21
+ "dist/"
22
+ ],
23
+ "scripts": {
24
+ "build:docs": "typedoc",
25
+ "changelog:validate": "../../scripts/validate-changelog.sh @metamask/selected-network-controller",
26
+ "publish:preview": "yarn npm publish --tag preview",
27
+ "test": "jest",
28
+ "test:watch": "jest --watch"
29
+ },
30
+ "dependencies": {
31
+ "@metamask/base-controller": "^3.2.1",
32
+ "@metamask/network-controller": "^12.1.2",
33
+ "json-rpc-engine": "^6.1.0"
34
+ },
35
+ "devDependencies": {
36
+ "@metamask/auto-changelog": "^3.1.0",
37
+ "@types/jest": "^27.4.1",
38
+ "deepmerge": "^4.2.2",
39
+ "immer": "^9.0.6",
40
+ "jest": "^27.5.1",
41
+ "lodash": "^4.17.21",
42
+ "nock": "^13.3.1",
43
+ "sinon": "^9.2.4",
44
+ "ts-jest": "^27.1.4",
45
+ "typedoc": "^0.22.15",
46
+ "typedoc-plugin-missing-exports": "^0.22.6",
47
+ "typescript": "~4.6.3"
48
+ },
49
+ "peerDependencies": {
50
+ "@metamask/network-controller": "^12.1.2"
51
+ },
52
+ "engines": {
53
+ "node": ">=16.0.0"
54
+ },
55
+ "publishConfig": {
56
+ "access": "public",
57
+ "registry": "https://registry.npmjs.org/"
58
+ }
59
+ }