@metamask-previews/config-registry-controller 3.1.0-preview-8bfa290fb → 4.0.0-preview-0a30e47
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 +15 -2
- package/dist/{ConfigRegistryController-method-action-types.d.mts → ConfigRegistryController-method-action-types.d.ts} +2 -2
- package/dist/ConfigRegistryController-method-action-types.d.ts.map +1 -0
- package/dist/{ConfigRegistryController-method-action-types.mjs → ConfigRegistryController-method-action-types.js} +1 -1
- package/dist/ConfigRegistryController-method-action-types.js.map +1 -0
- package/dist/{ConfigRegistryController.d.cts → ConfigRegistryController.d.ts} +18 -18
- package/dist/ConfigRegistryController.d.ts.map +1 -0
- package/dist/{ConfigRegistryController.mjs → ConfigRegistryController.js} +51 -34
- package/dist/ConfigRegistryController.js.map +1 -0
- package/dist/config-registry-api-service/{config-registry-api-service-method-action-types.d.cts → config-registry-api-service-method-action-types.d.ts} +2 -2
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.d.ts.map +1 -0
- package/dist/config-registry-api-service/{config-registry-api-service-method-action-types.mjs → config-registry-api-service-method-action-types.js} +1 -1
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.js.map +1 -0
- package/dist/config-registry-api-service/{config-registry-api-service.d.mts → config-registry-api-service.d.ts} +6 -6
- package/dist/config-registry-api-service/config-registry-api-service.d.ts.map +1 -0
- package/dist/config-registry-api-service/{config-registry-api-service.mjs → config-registry-api-service.js} +22 -34
- package/dist/config-registry-api-service/config-registry-api-service.js.map +1 -0
- package/dist/config-registry-api-service/{filters.d.mts → filters.d.ts} +2 -2
- package/dist/config-registry-api-service/filters.d.ts.map +1 -0
- package/dist/config-registry-api-service/{filters.mjs → filters.js} +1 -1
- package/dist/config-registry-api-service/filters.js.map +1 -0
- package/dist/config-registry-api-service/{types.d.cts → types.d.ts} +49 -49
- package/dist/config-registry-api-service/types.d.ts.map +1 -0
- package/dist/config-registry-api-service/{types.mjs → types.js} +3 -3
- package/dist/config-registry-api-service/types.js.map +1 -0
- package/dist/{index.d.cts → index.d.ts} +11 -11
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/{selectors.d.cts → selectors.d.ts} +63 -63
- package/dist/selectors.d.ts.map +1 -0
- package/dist/{selectors.mjs → selectors.js} +4 -4
- package/dist/selectors.js.map +1 -0
- package/package.json +18 -22
- package/dist/ConfigRegistryController-method-action-types.cjs +0 -7
- package/dist/ConfigRegistryController-method-action-types.cjs.map +0 -1
- package/dist/ConfigRegistryController-method-action-types.d.cts +0 -31
- package/dist/ConfigRegistryController-method-action-types.d.cts.map +0 -1
- package/dist/ConfigRegistryController-method-action-types.d.mts.map +0 -1
- package/dist/ConfigRegistryController-method-action-types.mjs.map +0 -1
- package/dist/ConfigRegistryController.cjs +0 -160
- package/dist/ConfigRegistryController.cjs.map +0 -1
- package/dist/ConfigRegistryController.d.cts.map +0 -1
- package/dist/ConfigRegistryController.d.mts +0 -128
- package/dist/ConfigRegistryController.d.mts.map +0 -1
- package/dist/ConfigRegistryController.mjs.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.cjs +0 -7
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.cjs.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.d.cts.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.d.mts +0 -14
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.d.mts.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service-method-action-types.mjs.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service.cjs +0 -154
- package/dist/config-registry-api-service/config-registry-api-service.cjs.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service.d.cts +0 -108
- package/dist/config-registry-api-service/config-registry-api-service.d.cts.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service.d.mts.map +0 -1
- package/dist/config-registry-api-service/config-registry-api-service.mjs.map +0 -1
- package/dist/config-registry-api-service/filters.cjs +0 -30
- package/dist/config-registry-api-service/filters.cjs.map +0 -1
- package/dist/config-registry-api-service/filters.d.cts +0 -15
- package/dist/config-registry-api-service/filters.d.cts.map +0 -1
- package/dist/config-registry-api-service/filters.d.mts.map +0 -1
- package/dist/config-registry-api-service/filters.mjs.map +0 -1
- package/dist/config-registry-api-service/types.cjs +0 -75
- package/dist/config-registry-api-service/types.cjs.map +0 -1
- package/dist/config-registry-api-service/types.d.cts.map +0 -1
- package/dist/config-registry-api-service/types.d.mts +0 -510
- package/dist/config-registry-api-service/types.d.mts.map +0 -1
- package/dist/config-registry-api-service/types.mjs.map +0 -1
- package/dist/index.cjs +0 -16
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -11
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -5
- package/dist/index.mjs.map +0 -1
- package/dist/selectors.cjs +0 -54
- package/dist/selectors.cjs.map +0 -1
- package/dist/selectors.d.cts.map +0 -1
- package/dist/selectors.d.mts +0 -466
- package/dist/selectors.d.mts.map +0 -1
- package/dist/selectors.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,10 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [4.0.0]
|
|
11
|
+
|
|
10
12
|
### Changed
|
|
11
13
|
|
|
12
|
-
-
|
|
14
|
+
- **BREAKING:** Drop CommonJS support ([#9536](https://github.com/MetaMask/core/pull/9536))
|
|
15
|
+
- This package is now ESM-only, but can still be used in CommonJS projects via `require(esm)` in modern Node.js versions (22+), or dynamic imports in older Node.js versions.
|
|
16
|
+
- **BREAKING:** Bump minimum Node.js version to 22 ([#9976](https://github.com/MetaMask/core/pull/9976))
|
|
17
|
+
- **BREAKING:** Bump TypeScript target to ES2022 ([#10019](https://github.com/MetaMask/core/pull/10019))
|
|
18
|
+
- This package now ships ES2022 code, requiring a compatible modern environment or bundler configuration to consume.
|
|
19
|
+
- Bump `@metamask/remote-feature-flag-controller` from `^6.0.0` to `^7.0.0` ([#9980](https://github.com/MetaMask/core/pull/9980), [#10129](https://github.com/MetaMask/core/pull/10129), [#10160](https://github.com/MetaMask/core/pull/10160))
|
|
13
20
|
- Bump `@metamask/utils` from `^11.11.0` to `^11.12.0` ([#10076](https://github.com/MetaMask/core/pull/10076))
|
|
21
|
+
- Bump `@metamask/base-controller` from `^9.1.0` to `^10.0.0` ([#10160](https://github.com/MetaMask/core/pull/10160))
|
|
22
|
+
- Bump `@metamask/controller-utils` from `^12.3.0` to `^13.0.0` ([#10160](https://github.com/MetaMask/core/pull/10160))
|
|
23
|
+
- Bump `@metamask/keyring-controller` from `^27.1.1` to `^28.0.0` ([#10160](https://github.com/MetaMask/core/pull/10160))
|
|
24
|
+
- Bump `@metamask/messenger` from `^2.0.0` to `^3.0.0` ([#10160](https://github.com/MetaMask/core/pull/10160))
|
|
25
|
+
- Bump `@metamask/polling-controller` from `^16.0.9` to `^17.0.0` ([#10160](https://github.com/MetaMask/core/pull/10160))
|
|
14
26
|
|
|
15
27
|
## [3.1.0]
|
|
16
28
|
|
|
@@ -159,7 +171,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
159
171
|
|
|
160
172
|
- Initial release ([#7668](https://github.com/MetaMask/core/pull/7668), [#7809](https://github.com/MetaMask/core/pull/7809))
|
|
161
173
|
|
|
162
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/config-registry-controller@
|
|
174
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/config-registry-controller@4.0.0...HEAD
|
|
175
|
+
[4.0.0]: https://github.com/MetaMask/core/compare/@metamask/config-registry-controller@3.1.0...@metamask/config-registry-controller@4.0.0
|
|
163
176
|
[3.1.0]: https://github.com/MetaMask/core/compare/@metamask/config-registry-controller@3.0.0...@metamask/config-registry-controller@3.1.0
|
|
164
177
|
[3.0.0]: https://github.com/MetaMask/core/compare/@metamask/config-registry-controller@2.0.1...@metamask/config-registry-controller@3.0.0
|
|
165
178
|
[2.0.1]: https://github.com/MetaMask/core/compare/@metamask/config-registry-controller@2.0.0...@metamask/config-registry-controller@2.0.1
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* This file is auto generated.
|
|
3
3
|
* Do not edit manually.
|
|
4
4
|
*/
|
|
5
|
-
import type { ConfigRegistryController } from
|
|
5
|
+
import type { ConfigRegistryController } from './ConfigRegistryController.js';
|
|
6
6
|
/**
|
|
7
7
|
* Get the network configuration for a given CAIP-2 chain ID.
|
|
8
8
|
*
|
|
@@ -28,4 +28,4 @@ export type ConfigRegistryControllerStartPollingAction = {
|
|
|
28
28
|
* Union of all ConfigRegistryController action types.
|
|
29
29
|
*/
|
|
30
30
|
export type ConfigRegistryControllerMethodActions = ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction | ConfigRegistryControllerStopPollingAction | ConfigRegistryControllerStartPollingAction;
|
|
31
|
-
//# sourceMappingURL=ConfigRegistryController-method-action-types.d.
|
|
31
|
+
//# sourceMappingURL=ConfigRegistryController-method-action-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController-method-action-types.d.ts","sourceRoot":"","sources":["../src/ConfigRegistryController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,4DAA4D,GAAG;IACzE,IAAI,EAAE,yDAAyD,CAAC;IAChE,OAAO,EAAE,wBAAwB,CAAC,gCAAgC,CAAC,CAAC;CACrE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yCAAyC,GAAG;IACtD,IAAI,EAAE,sCAAsC,CAAC;IAC7C,OAAO,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,0CAA0C,GAAG;IACvD,IAAI,EAAE,uCAAuC,CAAC;IAC9C,OAAO,EAAE,wBAAwB,CAAC,cAAc,CAAC,CAAC;CACnD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC7C,4DAA4D,GAC5D,yCAAyC,GACzC,0CAA0C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController-method-action-types.js","sourceRoot":"","sources":["../src/ConfigRegistryController-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { ConfigRegistryController } from './ConfigRegistryController.js';\n\n/**\n * Get the network configuration for a given CAIP-2 chain ID.\n *\n * @param caip2ChainId - The CAIP-2 chain ID (e.g., \"eip155:1\").\n * @returns The network configuration if found, otherwise undefined.\n */\nexport type ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction = {\n type: `ConfigRegistryController:getNetworkConfigByCaip2ChainId`;\n handler: ConfigRegistryController['getNetworkConfigByCaip2ChainId'];\n};\n\n/**\n * Stop all polling.\n */\nexport type ConfigRegistryControllerStopPollingAction = {\n type: `ConfigRegistryController:stopPolling`;\n handler: ConfigRegistryController['stopPolling'];\n};\n\nexport type ConfigRegistryControllerStartPollingAction = {\n type: `ConfigRegistryController:startPolling`;\n handler: ConfigRegistryController['startPolling'];\n};\n\n/**\n * Union of all ConfigRegistryController action types.\n */\nexport type ConfigRegistryControllerMethodActions =\n | ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction\n | ConfigRegistryControllerStopPollingAction\n | ConfigRegistryControllerStartPollingAction;\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { ControllerGetStateAction, ControllerStateChangedEvent } from
|
|
2
|
-
import type { KeyringControllerGetStateAction, KeyringControllerLockEvent, KeyringControllerUnlockEvent } from
|
|
3
|
-
import type { Messenger } from
|
|
4
|
-
import type { RemoteFeatureFlagControllerGetStateAction } from
|
|
5
|
-
import type { RemoteFeatureFlagControllerStateChangeEvent } from
|
|
6
|
-
import { CaipChainId } from
|
|
7
|
-
import type { ConfigRegistryApiServiceFetchConfigAction } from
|
|
8
|
-
import type { RegistryNetworkConfig } from
|
|
9
|
-
import type { ConfigRegistryControllerMethodActions } from
|
|
1
|
+
import type { ControllerGetStateAction, ControllerStateChangedEvent } from '@metamask/base-controller';
|
|
2
|
+
import type { KeyringControllerGetStateAction, KeyringControllerLockEvent, KeyringControllerUnlockEvent } from '@metamask/keyring-controller';
|
|
3
|
+
import type { Messenger } from '@metamask/messenger';
|
|
4
|
+
import type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';
|
|
5
|
+
import type { RemoteFeatureFlagControllerStateChangeEvent } from '@metamask/remote-feature-flag-controller';
|
|
6
|
+
import { CaipChainId } from '@metamask/utils';
|
|
7
|
+
import type { ConfigRegistryApiServiceFetchConfigAction } from './config-registry-api-service/config-registry-api-service-method-action-types.js';
|
|
8
|
+
import type { RegistryNetworkConfig } from './config-registry-api-service/types.js';
|
|
9
|
+
import type { ConfigRegistryControllerMethodActions } from './ConfigRegistryController-method-action-types.js';
|
|
10
10
|
declare const controllerName = "ConfigRegistryController";
|
|
11
11
|
export declare const DEFAULT_POLLING_INTERVAL: number;
|
|
12
12
|
/**
|
|
@@ -84,18 +84,18 @@ export type ConfigRegistryControllerOptions = {
|
|
|
84
84
|
fallbackConfig?: Record<string, RegistryNetworkConfig>;
|
|
85
85
|
};
|
|
86
86
|
declare const ConfigRegistryController_base: (abstract new (...args: any[]) => {
|
|
87
|
-
readonly
|
|
88
|
-
"__#6@#intervalLength": number | undefined;
|
|
89
|
-
setIntervalLength(intervalLength: number): void;
|
|
90
|
-
getIntervalLength(): number | undefined;
|
|
91
|
-
_startPolling(input: null): void;
|
|
92
|
-
_stopPollingByPollingTokenSetId(key: string): void;
|
|
93
|
-
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
94
|
-
readonly "__#3@#callbacks": Map<string, Set<(input: null) => void>>;
|
|
87
|
+
readonly _callbacks: Map<string, Set<(input: null) => void>>;
|
|
95
88
|
_executePoll(input: null): Promise<void>;
|
|
96
89
|
startPolling(input: null): string;
|
|
97
90
|
stopAllPolling(): void;
|
|
98
91
|
stopPollingByPollingToken(pollingToken: string): void;
|
|
92
|
+
readonly _intervalIds: Record<import("@metamask/polling-controller").PollingTokenSetId, NodeJS.Timeout>;
|
|
93
|
+
_intervalLength: number | undefined;
|
|
94
|
+
setIntervalLength(intervalLength: number): void;
|
|
95
|
+
getIntervalLength(): number | undefined;
|
|
96
|
+
_startPolling(input: null): void;
|
|
97
|
+
_stopPollingByPollingTokenSetId(key: import("@metamask/polling-controller").PollingTokenSetId): void;
|
|
98
|
+
readonly _pollingTokenSets: Map<import("@metamask/polling-controller").PollingTokenSetId, Set<string>>;
|
|
99
99
|
onPollingComplete(input: null, callback: (input: null) => void): void;
|
|
100
100
|
}) & typeof import("@metamask/base-controller").BaseController;
|
|
101
101
|
export declare class ConfigRegistryController extends ConfigRegistryController_base<typeof controllerName, ConfigRegistryControllerState, ConfigRegistryControllerMessenger> {
|
|
@@ -125,4 +125,4 @@ export declare class ConfigRegistryController extends ConfigRegistryController_b
|
|
|
125
125
|
stopPolling(): void;
|
|
126
126
|
}
|
|
127
127
|
export {};
|
|
128
|
-
//# sourceMappingURL=ConfigRegistryController.d.
|
|
128
|
+
//# sourceMappingURL=ConfigRegistryController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController.d.ts","sourceRoot":"","sources":["../src/ConfigRegistryController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,2BAA2B,EAE5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAC7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,yCAAyC,EAAE,MAAM,0CAA0C,CAAC;AAC1G,OAAO,KAAK,EAAE,2CAA2C,EAAE,MAAM,0CAA0C,CAAC;AAC5G,OAAO,EAAE,WAAW,EAAkC,MAAM,iBAAiB,CAAC;AAE9E,OAAO,KAAK,EAAE,yCAAyC,EAAE,MAAM,kFAAkF,CAAC;AAClJ,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAE/G,QAAA,MAAM,cAAc,6BAA6B,CAAC;AAElD,eAAO,MAAM,wBAAwB,QAAkC,CAAC;AAIxE;;;;;GAKG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C;;;;OAIG;IACH,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;KACtD,CAAC;IACF;;;;;OAKG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAwCF;;GAEG;AACH,MAAM,MAAM,yCAAyC,GACnD,2BAA2B,CACzB,OAAO,cAAc,EACrB,6BAA6B,CAC9B,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG,wBAAwB,CAC3E,OAAO,cAAc,EACrB,6BAA6B,CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,+BAA+B,GACvC,sCAAsC,GACtC,qCAAqC,CAAC;AAE1C;;;GAGG;AACH,KAAK,cAAc,GACf,+BAA+B,GAC/B,yCAAyC,GACzC,yCAAyC,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,8BAA8B,GACxC,yCAAyC,CAAC;AAE5C;;;GAGG;AACH,KAAK,aAAa,GACd,4BAA4B,GAC5B,0BAA0B,GAC1B,2CAA2C,CAAC;AAEhD;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GAAG,SAAS,CACvD,OAAO,cAAc,EACrB,+BAA+B,GAAG,cAAc,EAChD,8BAA8B,GAAG,aAAa,CAC/C,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACxD,CAAC;;;;;;;;;;;;;;;;AAEF,qBAAa,wBAAyB,SAAQ,8BAC5C,OAAO,cAAc,EACrB,6BAA6B,EAC7B,iCAAiC,CAClC;;IACC;;;;;;;;;OASG;IACH,YAAY,EACV,SAAS,EACT,KAAU,EACV,eAA0C,EAC1C,cAAwC,GACzC,EAAE,+BAA+B,EAsBjC;IAED;;;;;OAKG;IACH,8BAA8B,CAC5B,YAAY,EAAE,WAAW,GACxB,qBAAqB,GAAG,SAAS,CAEnC;IAEK,YAAY,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC9C;IAED;;OAEG;IACH,WAAW,IAAI,IAAI,CAKlB;CAwEF"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
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");
|
|
4
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
-
};
|
|
6
|
-
var _ConfigRegistryController_instances, _ConfigRegistryController_setupEventListeners, _ConfigRegistryController_onUnlock, _ConfigRegistryController_onLock, _ConfigRegistryController_onFeatureFlagChange, _ConfigRegistryController_isFeatureFlagEnabled;
|
|
7
|
-
import { StaticIntervalPollingController } from "@metamask/polling-controller";
|
|
8
|
-
import { Duration, inMilliseconds } from "@metamask/utils";
|
|
1
|
+
import { StaticIntervalPollingController } from '@metamask/polling-controller';
|
|
2
|
+
import { Duration, inMilliseconds } from '@metamask/utils';
|
|
9
3
|
const controllerName = 'ConfigRegistryController';
|
|
10
4
|
export const DEFAULT_POLLING_INTERVAL = inMilliseconds(1, Duration.Day);
|
|
11
5
|
const FEATURE_FLAG_KEY = 'configRegistryApiEnabled';
|
|
@@ -69,10 +63,9 @@ export class ConfigRegistryController extends StaticIntervalPollingController()
|
|
|
69
63
|
etag: state.etag ?? null,
|
|
70
64
|
},
|
|
71
65
|
});
|
|
72
|
-
_ConfigRegistryController_instances.add(this);
|
|
73
66
|
this.setIntervalLength(pollingInterval);
|
|
74
67
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
75
|
-
|
|
68
|
+
this.#setupEventListeners();
|
|
76
69
|
}
|
|
77
70
|
/**
|
|
78
71
|
* Get the network configuration for a given CAIP-2 chain ID.
|
|
@@ -125,32 +118,56 @@ export class ConfigRegistryController extends StaticIntervalPollingController()
|
|
|
125
118
|
// using the `MESSENGER_EXPOSED_METHODS` array.
|
|
126
119
|
super.stopAllPolling();
|
|
127
120
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
this.startPolling(null);
|
|
121
|
+
/**
|
|
122
|
+
* Setup messenger event listeners necessary for the controller lifecycle
|
|
123
|
+
*/
|
|
124
|
+
#setupEventListeners() {
|
|
125
|
+
this.messenger.subscribe('KeyringController:unlock', this.#onUnlock.bind(this));
|
|
126
|
+
this.messenger.subscribe('KeyringController:lock', this.#onLock.bind(this));
|
|
127
|
+
this.messenger.subscribe('RemoteFeatureFlagController:stateChange', this.#onFeatureFlagChange.bind(this), (stateSelector) => stateSelector.remoteFeatureFlags[FEATURE_FLAG_KEY]);
|
|
136
128
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
this.startPolling(null);
|
|
129
|
+
/**
|
|
130
|
+
* Handle wallet unlock event by starting polling if the config registry API is enabled.
|
|
131
|
+
*/
|
|
132
|
+
#onUnlock() {
|
|
133
|
+
if (this.#isFeatureFlagEnabled()) {
|
|
134
|
+
this.startPolling(null);
|
|
135
|
+
}
|
|
145
136
|
}
|
|
146
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Handle wallet lock event by stopping all polling to prevent unnecessary API calls.
|
|
139
|
+
*/
|
|
140
|
+
#onLock() {
|
|
147
141
|
this.stopAllPolling();
|
|
148
142
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
143
|
+
/**
|
|
144
|
+
* Handle changes to the config registry API feature flag by
|
|
145
|
+
* starting or stopping polling accordingly.
|
|
146
|
+
*
|
|
147
|
+
* @param featureFlagValue - The new value of the feature flag.
|
|
148
|
+
*/
|
|
149
|
+
#onFeatureFlagChange(featureFlagValue) {
|
|
150
|
+
const { isUnlocked } = this.messenger.call('KeyringController:getState');
|
|
151
|
+
if (typeof featureFlagValue === 'boolean' &&
|
|
152
|
+
featureFlagValue &&
|
|
153
|
+
isUnlocked) {
|
|
154
|
+
this.startPolling(null);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
this.stopAllPolling();
|
|
158
|
+
}
|
|
153
159
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
/**
|
|
161
|
+
* Get the current status of the config registry feature flag.
|
|
162
|
+
*
|
|
163
|
+
* @returns Whether the config registry API is enabled.
|
|
164
|
+
*/
|
|
165
|
+
#isFeatureFlagEnabled() {
|
|
166
|
+
const featureFlagValue = this.messenger.call('RemoteFeatureFlagController:getState').remoteFeatureFlags[FEATURE_FLAG_KEY];
|
|
167
|
+
if (typeof featureFlagValue !== 'boolean') {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
return featureFlagValue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=ConfigRegistryController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController.js","sourceRoot":"","sources":["../src/ConfigRegistryController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangedEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport type {\n KeyringControllerGetStateAction,\n KeyringControllerLockEvent,\n KeyringControllerUnlockEvent,\n} from '@metamask/keyring-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';\nimport type { RemoteFeatureFlagControllerStateChangeEvent } from '@metamask/remote-feature-flag-controller';\nimport { CaipChainId, Duration, inMilliseconds, Json } from '@metamask/utils';\n\nimport type { ConfigRegistryApiServiceFetchConfigAction } from './config-registry-api-service/config-registry-api-service-method-action-types.js';\nimport type { RegistryNetworkConfig } from './config-registry-api-service/types.js';\nimport type { ConfigRegistryControllerMethodActions } from './ConfigRegistryController-method-action-types.js';\n\nconst controllerName = 'ConfigRegistryController';\n\nexport const DEFAULT_POLLING_INTERVAL = inMilliseconds(1, Duration.Day);\n\nconst FEATURE_FLAG_KEY = 'configRegistryApiEnabled';\n\n/**\n * State for the ConfigRegistryController.\n *\n * Tracks network configurations fetched from the config registry API,\n * along with metadata about the fetch status and caching.\n */\nexport type ConfigRegistryControllerState = {\n /**\n * Network configurations organized by chain ID.\n * Stores the full API response including isFeatured, isTestnet, etc.\n * Use selectors (e.g. selectFeaturedNetworks) to filter when needed.\n */\n configs: {\n networks: Record<CaipChainId, RegistryNetworkConfig>;\n };\n /**\n * Semantic version string of the configuration data from the API.\n * Indicates the version/schema of the configuration structure itself\n * (e.g., \"v1.0.0\", \"1.0.0\").\n * This is different from `etag` which is used for HTTP cache validation.\n */\n version: string | null;\n /**\n * Timestamp (milliseconds since epoch) of when the configuration\n * was last successfully fetched from the API.\n */\n lastFetched: number | null;\n /**\n * HTTP entity tag (ETag) used for cache validation.\n * Sent as `If-None-Match` header in subsequent requests to check\n * if the content has changed. If the server returns 304 Not Modified,\n * the full response body is not downloaded, improving efficiency.\n * This is different from `version` which is a semantic version string\n * indicating the schema/version of the configuration data itself.\n */\n etag: string | null;\n};\n\nconst stateMetadata = {\n configs: {\n persist: true,\n includeInStateLogs: false,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n version: {\n persist: true,\n includeInStateLogs: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n lastFetched: {\n persist: true,\n includeInStateLogs: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n etag: {\n persist: true,\n includeInStateLogs: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n} satisfies StateMetadata<ConfigRegistryControllerState>;\n\n/**\n * Default fallback configuration when no configs are available.\n */\nconst DEFAULT_FALLBACK_CONFIG: Record<string, RegistryNetworkConfig> = {};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'startPolling',\n 'stopPolling',\n 'getNetworkConfigByCaip2ChainId',\n] as const;\n\n/**\n * Published when the state of {@link ConfigRegistryController} changes.\n */\nexport type ConfigRegistryControllerStateChangedEvent =\n ControllerStateChangedEvent<\n typeof controllerName,\n ConfigRegistryControllerState\n >;\n\n/**\n * Retrieves the state of the {@link ConfigRegistryController}.\n */\nexport type ConfigRegistryControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n ConfigRegistryControllerState\n>;\n\n/**\n * Actions that {@link ConfigRegistryControllerMessenger} exposes to other consumers.\n */\nexport type ConfigRegistryControllerActions =\n | ConfigRegistryControllerGetStateAction\n | ConfigRegistryControllerMethodActions;\n\n/**\n * Actions from other messengers that {@link ConfigRegistryControllerMessenger}\n * calls.\n */\ntype AllowedActions =\n | KeyringControllerGetStateAction\n | RemoteFeatureFlagControllerGetStateAction\n | ConfigRegistryApiServiceFetchConfigAction;\n\n/**\n * Events that {@link ConfigRegistryControllerMessenger} exposes to other consumers.\n */\nexport type ConfigRegistryControllerEvents =\n ConfigRegistryControllerStateChangedEvent;\n\n/**\n * Events from other messengers that {@link ConfigRegistryControllerMessenger}\n * subscribes to.\n */\ntype AllowedEvents =\n | KeyringControllerUnlockEvent\n | KeyringControllerLockEvent\n | RemoteFeatureFlagControllerStateChangeEvent;\n\n/**\n * The messenger restricted to actions and events accessed by\n * {@link ConfigRegistryController}.\n */\nexport type ConfigRegistryControllerMessenger = Messenger<\n typeof controllerName,\n ConfigRegistryControllerActions | AllowedActions,\n ConfigRegistryControllerEvents | AllowedEvents\n>;\n\nexport type ConfigRegistryControllerOptions = {\n messenger: ConfigRegistryControllerMessenger;\n state?: Partial<ConfigRegistryControllerState>;\n pollingInterval?: number;\n fallbackConfig?: Record<string, RegistryNetworkConfig>;\n};\n\nexport class ConfigRegistryController extends StaticIntervalPollingController<null>()<\n typeof controllerName,\n ConfigRegistryControllerState,\n ConfigRegistryControllerMessenger\n> {\n /**\n * @param options - The controller options.\n * @param options.messenger - The controller messenger. Must have\n * `ConfigRegistryApiService:fetchConfig` action handler registered\n * (e.g. by instantiating {@link ConfigRegistryApiService} with the same\n * messenger).\n * @param options.state - Initial state.\n * @param options.pollingInterval - Polling interval in milliseconds.\n * @param options.fallbackConfig - Fallback configuration.\n */\n constructor({\n messenger,\n state = {},\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n fallbackConfig = DEFAULT_FALLBACK_CONFIG,\n }: ConfigRegistryControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: {\n configs: {\n networks: state.configs?.networks ?? { ...fallbackConfig },\n },\n version: state.version ?? null,\n lastFetched: state.lastFetched ?? null,\n etag: state.etag ?? null,\n },\n });\n\n this.setIntervalLength(pollingInterval);\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n this.#setupEventListeners();\n }\n\n /**\n * Get the network configuration for a given CAIP-2 chain ID.\n *\n * @param caip2ChainId - The CAIP-2 chain ID (e.g., \"eip155:1\").\n * @returns The network configuration if found, otherwise undefined.\n */\n getNetworkConfigByCaip2ChainId(\n caip2ChainId: CaipChainId,\n ): RegistryNetworkConfig | undefined {\n return this.state.configs.networks[caip2ChainId];\n }\n\n async _executePoll(_input: null): Promise<void> {\n try {\n const result = await this.messenger.call(\n 'ConfigRegistryApiService:fetchConfig',\n {\n etag: this.state.etag ?? undefined,\n },\n );\n\n if (!result.modified) {\n this.update((state) => {\n state.lastFetched = Date.now();\n if (result.etag !== undefined) {\n state.etag = result.etag ?? null;\n }\n });\n return;\n }\n\n const apiChains = result.data.data.chains;\n const newConfigs: Record<string, RegistryNetworkConfig> = {};\n // duplicate chainIds from API response are not expected\n apiChains.forEach((chainConfig) => {\n const { chainId } = chainConfig;\n newConfigs[chainId] = chainConfig;\n });\n\n this.update((state) => {\n state.configs.networks = newConfigs;\n state.version = result.data.data.version;\n state.lastFetched = Date.now();\n state.etag = result.etag ?? null;\n });\n } catch (error) {\n const errorInstance =\n error instanceof Error ? error : new Error(String(error));\n\n this.messenger.captureException?.(errorInstance);\n }\n }\n\n /**\n * Stop all polling.\n */\n stopPolling(): void {\n // This is a wrapper around `super.stopAllPolling()` for backwards\n // compatibility, while allowing this method to be exposed via the messenger\n // using the `MESSENGER_EXPOSED_METHODS` array.\n super.stopAllPolling();\n }\n\n /**\n * Setup messenger event listeners necessary for the controller lifecycle\n */\n #setupEventListeners(): void {\n this.messenger.subscribe(\n 'KeyringController:unlock',\n this.#onUnlock.bind(this),\n );\n\n this.messenger.subscribe('KeyringController:lock', this.#onLock.bind(this));\n\n this.messenger.subscribe(\n 'RemoteFeatureFlagController:stateChange',\n this.#onFeatureFlagChange.bind(this),\n (stateSelector) => stateSelector.remoteFeatureFlags[FEATURE_FLAG_KEY],\n );\n }\n\n /**\n * Handle wallet unlock event by starting polling if the config registry API is enabled.\n */\n #onUnlock(): void {\n if (this.#isFeatureFlagEnabled()) {\n this.startPolling(null);\n }\n }\n\n /**\n * Handle wallet lock event by stopping all polling to prevent unnecessary API calls.\n */\n #onLock(): void {\n this.stopAllPolling();\n }\n\n /**\n * Handle changes to the config registry API feature flag by\n * starting or stopping polling accordingly.\n *\n * @param featureFlagValue - The new value of the feature flag.\n */\n #onFeatureFlagChange(featureFlagValue: Json): void {\n const { isUnlocked } = this.messenger.call('KeyringController:getState');\n\n if (\n typeof featureFlagValue === 'boolean' &&\n featureFlagValue &&\n isUnlocked\n ) {\n this.startPolling(null);\n } else {\n this.stopAllPolling();\n }\n }\n\n /**\n * Get the current status of the config registry feature flag.\n *\n * @returns Whether the config registry API is enabled.\n */\n #isFeatureFlagEnabled(): boolean {\n const featureFlagValue = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags[FEATURE_FLAG_KEY];\n\n if (typeof featureFlagValue !== 'boolean') {\n return false;\n }\n\n return featureFlagValue;\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* This file is auto generated.
|
|
3
3
|
* Do not edit manually.
|
|
4
4
|
*/
|
|
5
|
-
import type { ConfigRegistryApiService } from
|
|
5
|
+
import type { ConfigRegistryApiService } from './config-registry-api-service.js';
|
|
6
6
|
export type ConfigRegistryApiServiceFetchConfigAction = {
|
|
7
7
|
type: `ConfigRegistryApiService:fetchConfig`;
|
|
8
8
|
handler: ConfigRegistryApiService['fetchConfig'];
|
|
@@ -11,4 +11,4 @@ export type ConfigRegistryApiServiceFetchConfigAction = {
|
|
|
11
11
|
* Union of all ConfigRegistryApiService action types.
|
|
12
12
|
*/
|
|
13
13
|
export type ConfigRegistryApiServiceMethodActions = ConfigRegistryApiServiceFetchConfigAction;
|
|
14
|
-
//# sourceMappingURL=config-registry-api-service-method-action-types.d.
|
|
14
|
+
//# sourceMappingURL=config-registry-api-service-method-action-types.d.ts.map
|
package/dist/config-registry-api-service/config-registry-api-service-method-action-types.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-api-service-method-action-types.d.ts","sourceRoot":"","sources":["../../src/config-registry-api-service/config-registry-api-service-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAEjF,MAAM,MAAM,yCAAyC,GAAG;IACtD,IAAI,EAAE,sCAAsC,CAAC;IAC7C,OAAO,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAC;CAClD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC/C,yCAAyC,CAAC"}
|
package/dist/config-registry-api-service/config-registry-api-service-method-action-types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-api-service-method-action-types.js","sourceRoot":"","sources":["../../src/config-registry-api-service/config-registry-api-service-method-action-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * This file is auto generated.\n * Do not edit manually.\n */\n\nimport type { ConfigRegistryApiService } from './config-registry-api-service.js';\n\nexport type ConfigRegistryApiServiceFetchConfigAction = {\n type: `ConfigRegistryApiService:fetchConfig`;\n handler: ConfigRegistryApiService['fetchConfig'];\n};\n\n/**\n * Union of all ConfigRegistryApiService action types.\n */\nexport type ConfigRegistryApiServiceMethodActions =\n ConfigRegistryApiServiceFetchConfigAction;\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { CreateServicePolicyOptions, ServicePolicy } from
|
|
2
|
-
import type { Messenger } from
|
|
3
|
-
import type { IDisposable } from
|
|
4
|
-
import type { ConfigRegistryApiServiceMethodActions } from
|
|
5
|
-
import type { FetchConfigOptions, FetchConfigResult } from
|
|
1
|
+
import type { CreateServicePolicyOptions, ServicePolicy } from '@metamask/controller-utils';
|
|
2
|
+
import type { Messenger } from '@metamask/messenger';
|
|
3
|
+
import type { IDisposable } from 'cockatiel';
|
|
4
|
+
import type { ConfigRegistryApiServiceMethodActions } from './config-registry-api-service-method-action-types.js';
|
|
5
|
+
import type { FetchConfigOptions, FetchConfigResult } from './types.js';
|
|
6
6
|
export declare enum ConfigRegistryApiEnv {
|
|
7
7
|
DEV = "dev",
|
|
8
8
|
UAT = "uat",
|
|
@@ -105,4 +105,4 @@ export declare class ConfigRegistryApiService {
|
|
|
105
105
|
fetchConfig(options?: FetchConfigOptions): Promise<FetchConfigResult>;
|
|
106
106
|
}
|
|
107
107
|
export {};
|
|
108
|
-
//# sourceMappingURL=config-registry-api-service.d.
|
|
108
|
+
//# sourceMappingURL=config-registry-api-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-api-service.d.ts","sourceRoot":"","sources":["../../src/config-registry-api-service/config-registry-api-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,sDAAsD,CAAC;AAClH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAKpB,oBAAY,oBAAoB;IAC9B,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,SAAS;CACb;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,6BAA6B,CAAC;AAMtD;;GAEG;AACH,MAAM,MAAM,+BAA+B,GACzC,qCAAqC,CAAC;AAExC;;GAEG;AACH,KAAK,cAAc,GAAG,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAEnD;;GAEG;AACH,KAAK,aAAa,GAAG,KAAK,CAAC;AAE3B;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GAAG,SAAS,CACvD,OAAO,WAAW,EAClB,+BAA+B,GAAG,cAAc,EAChD,8BAA8B,GAAG,aAAa,CAC/C,CAAC;AAeF,MAAM,MAAM,+BAA+B,GAAG;IAC5C;;;OAGG;IACH,SAAS,EAAE,iCAAiC,CAAC;IAC7C,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;CAC5C,CAAC;AAEF,qBAAa,wBAAwB;;IACnC,QAAQ,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC;IAalC;;;;;;;;OAQG;IACH,YAAY,EACV,SAAS,EACT,GAA8B,EAC9B,KAAK,EAAE,WAA8B,EACrC,aAAkB,GACnB,EAAE,+BAA+B,EAYjC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAEtE;IAED;;;;;;;;;OASG;IACH,OAAO,CACL,GAAG,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAC5C,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAEtC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CACR,GAAG,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,GAC/C,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAEzC;IAEK,WAAW,CACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAiD5B;CACF"}
|
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
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");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
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");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _ConfigRegistryApiService_messenger, _ConfigRegistryApiService_policy, _ConfigRegistryApiService_url, _ConfigRegistryApiService_fetch, _ConfigRegistryApiService_cachedResponse;
|
|
13
|
-
import { createServicePolicy, HttpError } from "@metamask/controller-utils";
|
|
14
|
-
import { validateRegistryConfigApiResponse } from "./types.mjs";
|
|
1
|
+
import { createServicePolicy, HttpError } from '@metamask/controller-utils';
|
|
2
|
+
import { validateRegistryConfigApiResponse } from './types.js';
|
|
15
3
|
const ENDPOINT_PATH = '/config/networks';
|
|
16
4
|
export var ConfigRegistryApiEnv;
|
|
17
5
|
(function (ConfigRegistryApiEnv) {
|
|
@@ -38,6 +26,13 @@ function getConfigRegistryUrl(env) {
|
|
|
38
26
|
return `https://client-config.${envPrefix}api.cx.metamask.io/v1${ENDPOINT_PATH}`;
|
|
39
27
|
}
|
|
40
28
|
export class ConfigRegistryApiService {
|
|
29
|
+
name;
|
|
30
|
+
#messenger;
|
|
31
|
+
#policy;
|
|
32
|
+
#url;
|
|
33
|
+
#fetch;
|
|
34
|
+
/** Cached response from the last successful fetch. Used when server returns 304. */
|
|
35
|
+
#cachedResponse = null;
|
|
41
36
|
/**
|
|
42
37
|
* Construct a Config Registry API Service.
|
|
43
38
|
*
|
|
@@ -48,18 +43,12 @@ export class ConfigRegistryApiService {
|
|
|
48
43
|
* @param options.policyOptions - Options to pass to `createServicePolicy`, which wraps each request. See {@link CreateServicePolicyOptions}.
|
|
49
44
|
*/
|
|
50
45
|
constructor({ messenger, env = ConfigRegistryApiEnv.UAT, fetch: customFetch = globalThis.fetch, policyOptions = {}, }) {
|
|
51
|
-
_ConfigRegistryApiService_messenger.set(this, void 0);
|
|
52
|
-
_ConfigRegistryApiService_policy.set(this, void 0);
|
|
53
|
-
_ConfigRegistryApiService_url.set(this, void 0);
|
|
54
|
-
_ConfigRegistryApiService_fetch.set(this, void 0);
|
|
55
|
-
/** Cached response from the last successful fetch. Used when server returns 304. */
|
|
56
|
-
_ConfigRegistryApiService_cachedResponse.set(this, null);
|
|
57
46
|
this.name = serviceName;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
47
|
+
this.#messenger = messenger;
|
|
48
|
+
this.#url = getConfigRegistryUrl(env);
|
|
49
|
+
this.#fetch = customFetch;
|
|
50
|
+
this.#policy = createServicePolicy(policyOptions);
|
|
51
|
+
this.#messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
63
52
|
}
|
|
64
53
|
/**
|
|
65
54
|
* Registers a handler that will be called after a request returns a non-500
|
|
@@ -72,7 +61,7 @@ export class ConfigRegistryApiService {
|
|
|
72
61
|
* @see {@link createServicePolicy}
|
|
73
62
|
*/
|
|
74
63
|
onRetry(listener) {
|
|
75
|
-
return
|
|
64
|
+
return this.#policy.onRetry(listener);
|
|
76
65
|
}
|
|
77
66
|
/**
|
|
78
67
|
* Registers a handler that will be called after a set number of retry rounds
|
|
@@ -85,7 +74,7 @@ export class ConfigRegistryApiService {
|
|
|
85
74
|
* @see {@link createServicePolicy}
|
|
86
75
|
*/
|
|
87
76
|
onBreak(...args) {
|
|
88
|
-
return
|
|
77
|
+
return this.#policy.onBreak(...args);
|
|
89
78
|
}
|
|
90
79
|
/**
|
|
91
80
|
* Registers a handler that will be called under one of two circumstances:
|
|
@@ -106,7 +95,7 @@ export class ConfigRegistryApiService {
|
|
|
106
95
|
* {@link CockatielEvent}.
|
|
107
96
|
*/
|
|
108
97
|
onDegraded(...args) {
|
|
109
|
-
return
|
|
98
|
+
return this.#policy.onDegraded(...args);
|
|
110
99
|
}
|
|
111
100
|
async fetchConfig(options = {}) {
|
|
112
101
|
const headers = {
|
|
@@ -115,8 +104,8 @@ export class ConfigRegistryApiService {
|
|
|
115
104
|
if (options.etag) {
|
|
116
105
|
headers['If-None-Match'] = options.etag;
|
|
117
106
|
}
|
|
118
|
-
const response = await
|
|
119
|
-
const res = await
|
|
107
|
+
const response = await this.#policy.execute(async () => {
|
|
108
|
+
const res = await this.#fetch(this.#url, {
|
|
120
109
|
headers,
|
|
121
110
|
});
|
|
122
111
|
if (res.status === 304) {
|
|
@@ -132,13 +121,13 @@ export class ConfigRegistryApiService {
|
|
|
132
121
|
return {
|
|
133
122
|
modified: false,
|
|
134
123
|
etag,
|
|
135
|
-
...(
|
|
124
|
+
...(this.#cachedResponse !== null && { data: this.#cachedResponse }),
|
|
136
125
|
};
|
|
137
126
|
}
|
|
138
127
|
const etag = response.headers.get('ETag') ?? undefined;
|
|
139
128
|
const jsonData = await response.json();
|
|
140
129
|
validateRegistryConfigApiResponse(jsonData);
|
|
141
|
-
|
|
130
|
+
this.#cachedResponse = jsonData;
|
|
142
131
|
return {
|
|
143
132
|
data: jsonData,
|
|
144
133
|
etag,
|
|
@@ -146,5 +135,4 @@ export class ConfigRegistryApiService {
|
|
|
146
135
|
};
|
|
147
136
|
}
|
|
148
137
|
}
|
|
149
|
-
|
|
150
|
-
//# sourceMappingURL=config-registry-api-service.mjs.map
|
|
138
|
+
//# sourceMappingURL=config-registry-api-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-api-service.js","sourceRoot":"","sources":["../../src/config-registry-api-service/config-registry-api-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServicePolicy, HttpError } from '@metamask/controller-utils';\nimport type {\n CreateServicePolicyOptions,\n ServicePolicy,\n} from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { IDisposable } from 'cockatiel';\n\nimport type { ConfigRegistryApiServiceMethodActions } from './config-registry-api-service-method-action-types.js';\nimport type {\n FetchConfigOptions,\n FetchConfigResult,\n RegistryConfigApiResponse,\n} from './types.js';\nimport { validateRegistryConfigApiResponse } from './types.js';\n\nconst ENDPOINT_PATH = '/config/networks';\n\nexport enum ConfigRegistryApiEnv {\n DEV = 'dev',\n UAT = 'uat',\n PRD = 'prod',\n}\n\n/**\n * The name of the {@link ConfigRegistryApiService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'ConfigRegistryApiService';\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = ['fetchConfig'] as const;\n\n/**\n * Actions that {@link ConfigRegistryApiService} exposes to other consumers.\n */\nexport type ConfigRegistryApiServiceActions =\n ConfigRegistryApiServiceMethodActions;\n\n/**\n * Actions from other messengers that {@link ConfigRegistryApiServiceMessenger} calls.\n */\ntype AllowedActions = never;\n\n/**\n * Events that {@link ConfigRegistryApiService} exposes to other consumers.\n */\nexport type ConfigRegistryApiServiceEvents = never;\n\n/**\n * Events from other messengers that {@link ConfigRegistryApiService} subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link ConfigRegistryApiService}.\n */\nexport type ConfigRegistryApiServiceMessenger = Messenger<\n typeof serviceName,\n ConfigRegistryApiServiceActions | AllowedActions,\n ConfigRegistryApiServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\n/**\n * Returns the base URL for the config registry API for the given environment.\n *\n * @param env - The environment to get the URL for.\n * @returns The base URL for the environment.\n */\nfunction getConfigRegistryUrl(env: ConfigRegistryApiEnv): string {\n const envPrefix = env === ConfigRegistryApiEnv.PRD ? '' : `${env}-`;\n return `https://client-config.${envPrefix}api.cx.metamask.io/v1${ENDPOINT_PATH}`;\n}\n\nexport type ConfigRegistryApiServiceOptions = {\n /**\n * The messenger suited for this service. Required so the service can be used\n * independently and register its actions.\n */\n messenger: ConfigRegistryApiServiceMessenger;\n env?: ConfigRegistryApiEnv;\n fetch?: typeof fetch;\n /**\n * Options to pass to `createServicePolicy`, which wraps each request.\n * See {@link CreateServicePolicyOptions}.\n */\n policyOptions?: CreateServicePolicyOptions;\n};\n\nexport class ConfigRegistryApiService {\n readonly name: typeof serviceName;\n\n readonly #messenger: ConfigRegistryApiServiceMessenger;\n\n readonly #policy: ServicePolicy;\n\n readonly #url: string;\n\n readonly #fetch: typeof fetch;\n\n /** Cached response from the last successful fetch. Used when server returns 304. */\n #cachedResponse: RegistryConfigApiResponse | null = null;\n\n /**\n * Construct a Config Registry API Service.\n *\n * @param options - The options for constructing the service.\n * @param options.messenger - The messenger suited for this service.\n * @param options.env - The environment to determine the correct API endpoints. Defaults to UAT.\n * @param options.fetch - Custom fetch function for testing or custom implementations. Defaults to the global fetch.\n * @param options.policyOptions - Options to pass to `createServicePolicy`, which wraps each request. See {@link CreateServicePolicyOptions}.\n */\n constructor({\n messenger,\n env = ConfigRegistryApiEnv.UAT,\n fetch: customFetch = globalThis.fetch,\n policyOptions = {},\n }: ConfigRegistryApiServiceOptions) {\n this.name = serviceName;\n this.#messenger = messenger;\n this.#url = getConfigRegistryUrl(env);\n this.#fetch = customFetch;\n\n this.#policy = createServicePolicy(policyOptions);\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Registers a handler that will be called after a request returns a non-500\n * response, causing a retry. Primarily useful in tests where timers are being\n * mocked.\n *\n * @param listener - The handler to be called.\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n * @see {@link createServicePolicy}\n */\n onRetry(listener: Parameters<ServicePolicy['onRetry']>[0]): IDisposable {\n return this.#policy.onRetry(listener);\n }\n\n /**\n * Registers a handler that will be called after a set number of retry rounds\n * prove that requests to the API endpoint consistently return a 5xx response.\n *\n * @param args - The arguments passed to the underlying policy's onBreak method\n * (e.g. the listener to be called).\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n * @see {@link createServicePolicy}\n */\n onBreak(\n ...args: Parameters<ServicePolicy['onBreak']>\n ): ReturnType<ServicePolicy['onBreak']> {\n return this.#policy.onBreak(...args);\n }\n\n /**\n * Registers a handler that will be called under one of two circumstances:\n *\n * 1. After a set number of retries prove that requests to the API\n * consistently result in one of the following failures:\n * 1. A connection initiation error\n * 2. A connection reset error\n * 3. A timeout error\n * 4. A non-JSON response\n * 5. A 502, 503, or 504 response\n * 2. After a successful request is made to the API, but the response takes\n * longer than a set duration to return.\n *\n * @param args - The arguments passed to the underlying policy's onDegraded\n * method (e.g. the listener to be called).\n * @returns An object that can be used to unregister the handler. See\n * {@link CockatielEvent}.\n */\n onDegraded(\n ...args: Parameters<ServicePolicy['onDegraded']>\n ): ReturnType<ServicePolicy['onDegraded']> {\n return this.#policy.onDegraded(...args);\n }\n\n async fetchConfig(\n options: FetchConfigOptions = {},\n ): Promise<FetchConfigResult> {\n const headers: HeadersInit = {\n 'Cache-Control': 'no-cache',\n };\n\n if (options.etag) {\n headers['If-None-Match'] = options.etag;\n }\n\n const response = await this.#policy.execute(async () => {\n const res = await this.#fetch(this.#url, {\n headers,\n });\n\n if (res.status === 304) {\n return res;\n }\n\n if (!res.ok) {\n throw new HttpError(\n res.status,\n `Failed to fetch config: ${res.status} ${res.statusText}`,\n );\n }\n\n return res;\n });\n\n if (response.status === 304) {\n const etag = response.headers.get('ETag') ?? undefined;\n return {\n modified: false,\n etag,\n ...(this.#cachedResponse !== null && { data: this.#cachedResponse }),\n };\n }\n\n const etag = response.headers.get('ETag') ?? undefined;\n const jsonData = await response.json();\n\n validateRegistryConfigApiResponse(jsonData);\n\n this.#cachedResponse = jsonData;\n\n return {\n data: jsonData,\n etag,\n modified: true,\n };\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RegistryNetworkConfig } from
|
|
1
|
+
import type { RegistryNetworkConfig } from './types.js';
|
|
2
2
|
export type NetworkFilterOptions = {
|
|
3
3
|
isFeatured?: boolean;
|
|
4
4
|
isTestnet?: boolean;
|
|
@@ -12,4 +12,4 @@ export type NetworkFilterOptions = {
|
|
|
12
12
|
* @returns Filtered array of chain configurations.
|
|
13
13
|
*/
|
|
14
14
|
export declare function filterNetworks(networks: RegistryNetworkConfig[], options?: NetworkFilterOptions): RegistryNetworkConfig[];
|
|
15
|
-
//# sourceMappingURL=filters.d.
|
|
15
|
+
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/config-registry-api-service/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,OAAO,GAAE,oBAAyB,GACjC,qBAAqB,EAAE,CAczB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/config-registry-api-service/filters.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,GAAG;IAClB,YAAY;IACZ,WAAW;IACX,UAAU;IACV,cAAc;IACd,WAAW;CACsC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAiC,EACjC,OAAO,GAAyB,EAAE;IAElC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IACE,WAAW,KAAK,SAAS;gBACzB,MAAM,CAAC,GAA0B,CAAC,KAAK,WAAW,EAClD,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { RegistryNetworkConfig } from './types.js';\n\nexport type NetworkFilterOptions = {\n isFeatured?: boolean;\n isTestnet?: boolean;\n isActive?: boolean;\n isDeprecated?: boolean;\n isDefault?: boolean;\n};\n\nconst FILTER_KEYS = [\n 'isFeatured',\n 'isTestnet',\n 'isActive',\n 'isDeprecated',\n 'isDefault',\n] as const satisfies (keyof NetworkFilterOptions)[];\n\n/**\n * @param networks - Array of chain configurations to filter.\n * @param options - Filter options (matched against config.*).\n * @returns Filtered array of chain configurations.\n */\nexport function filterNetworks(\n networks: RegistryNetworkConfig[],\n options: NetworkFilterOptions = {},\n): RegistryNetworkConfig[] {\n return networks.filter((network) => {\n const { config } = network;\n for (const key of FILTER_KEYS) {\n const optionValue = options[key];\n if (\n optionValue !== undefined &&\n config[key as keyof typeof config] !== optionValue\n ) {\n return false;\n }\n }\n return true;\n });\n}\n"]}
|