@metamask-previews/config-registry-controller 0.0.1-preview-ab102d86
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 +21 -0
- package/LICENSE +20 -0
- package/README.md +15 -0
- package/dist/ConfigRegistryController.cjs +205 -0
- package/dist/ConfigRegistryController.cjs.map +1 -0
- package/dist/ConfigRegistryController.d.cts +95 -0
- package/dist/ConfigRegistryController.d.cts.map +1 -0
- package/dist/ConfigRegistryController.d.mts +95 -0
- package/dist/ConfigRegistryController.d.mts.map +1 -0
- package/dist/ConfigRegistryController.mjs +201 -0
- package/dist/ConfigRegistryController.mjs.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.cjs +3 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.cjs.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.cts +47 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.cts.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.mts +47 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.mts.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.mjs +2 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.mjs.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.cjs +124 -0
- package/dist/config-registry-api-service/config-registry-api-service.cjs.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.cts +36 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.cts.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.mts +36 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.mts.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.mjs +120 -0
- package/dist/config-registry-api-service/config-registry-api-service.mjs.map +1 -0
- package/dist/config-registry-api-service/index.cjs +14 -0
- package/dist/config-registry-api-service/index.cjs.map +1 -0
- package/dist/config-registry-api-service/index.d.cts +6 -0
- package/dist/config-registry-api-service/index.d.cts.map +1 -0
- package/dist/config-registry-api-service/index.d.mts +6 -0
- package/dist/config-registry-api-service/index.d.mts.map +1 -0
- package/dist/config-registry-api-service/index.mjs +3 -0
- package/dist/config-registry-api-service/index.mjs.map +1 -0
- package/dist/config-registry-api-service/transformers.cjs +254 -0
- package/dist/config-registry-api-service/transformers.cjs.map +1 -0
- package/dist/config-registry-api-service/transformers.d.cts +42 -0
- package/dist/config-registry-api-service/transformers.d.cts.map +1 -0
- package/dist/config-registry-api-service/transformers.d.mts +42 -0
- package/dist/config-registry-api-service/transformers.d.mts.map +1 -0
- package/dist/config-registry-api-service/transformers.mjs +247 -0
- package/dist/config-registry-api-service/transformers.mjs.map +1 -0
- package/dist/index.cjs +18 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +4 -0
- package/dist/index.mjs.map +1 -0
- package/dist/utils/feature-flags.cjs +27 -0
- package/dist/utils/feature-flags.cjs.map +1 -0
- package/dist/utils/feature-flags.d.cts +9 -0
- package/dist/utils/feature-flags.d.cts.map +1 -0
- package/dist/utils/feature-flags.d.mts +9 -0
- package/dist/utils/feature-flags.d.mts.map +1 -0
- package/dist/utils/feature-flags.mjs +23 -0
- package/dist/utils/feature-flags.mjs.map +1 -0
- package/package.json +79 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Initial release of `@metamask/config-registry-controller` ([#7668](https://github.com/MetaMask/core/pull/7668))
|
|
13
|
+
- Controller for fetching and managing network configurations from a remote API
|
|
14
|
+
- ConfigRegistryApiService with ETag support, retries, circuit breaker, and timeout handling
|
|
15
|
+
- Network filtering to only include featured, active, non-testnet networks
|
|
16
|
+
- Feature flag integration using `config_registry_api_enabled` to enable/disable API fetching
|
|
17
|
+
- Fallback configuration support when API is unavailable or feature flag is disabled
|
|
18
|
+
- State persistence for configs, version, lastFetched, and etag
|
|
19
|
+
- Uses StaticIntervalPollingController for periodic updates (default: 24 hours)
|
|
20
|
+
|
|
21
|
+
[Unreleased]: https://github.com/MetaMask/core/
|
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 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,15 @@
|
|
|
1
|
+
# `@metamask/config-registry-controller`
|
|
2
|
+
|
|
3
|
+
Manages configuration registry for MetaMask
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
`yarn add @metamask/config-registry-controller`
|
|
8
|
+
|
|
9
|
+
or
|
|
10
|
+
|
|
11
|
+
`npm install @metamask/config-registry-controller`
|
|
12
|
+
|
|
13
|
+
## Contributing
|
|
14
|
+
|
|
15
|
+
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,205 @@
|
|
|
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 _ConfigRegistryController_instances, _ConfigRegistryController_fallbackConfig, _ConfigRegistryController_apiService, _ConfigRegistryController_useFallbackConfig, _ConfigRegistryController_handleFetchError;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ConfigRegistryController = exports.DEFAULT_POLLING_INTERVAL = void 0;
|
|
16
|
+
const polling_controller_1 = require("@metamask/polling-controller");
|
|
17
|
+
const config_registry_api_service_1 = require("./config-registry-api-service/index.cjs");
|
|
18
|
+
const feature_flags_1 = require("./utils/feature-flags.cjs");
|
|
19
|
+
const controllerName = 'ConfigRegistryController';
|
|
20
|
+
exports.DEFAULT_POLLING_INTERVAL = 24 * 60 * 60 * 1000;
|
|
21
|
+
const stateMetadata = {
|
|
22
|
+
configs: {
|
|
23
|
+
persist: true,
|
|
24
|
+
anonymous: false,
|
|
25
|
+
includeInStateLogs: false,
|
|
26
|
+
includeInDebugSnapshot: true,
|
|
27
|
+
usedInUi: true,
|
|
28
|
+
},
|
|
29
|
+
version: {
|
|
30
|
+
persist: true,
|
|
31
|
+
anonymous: false,
|
|
32
|
+
includeInStateLogs: true,
|
|
33
|
+
includeInDebugSnapshot: true,
|
|
34
|
+
usedInUi: false,
|
|
35
|
+
},
|
|
36
|
+
lastFetched: {
|
|
37
|
+
persist: true,
|
|
38
|
+
anonymous: false,
|
|
39
|
+
includeInStateLogs: true,
|
|
40
|
+
includeInDebugSnapshot: true,
|
|
41
|
+
usedInUi: false,
|
|
42
|
+
},
|
|
43
|
+
fetchError: {
|
|
44
|
+
persist: true,
|
|
45
|
+
anonymous: false,
|
|
46
|
+
includeInStateLogs: true,
|
|
47
|
+
includeInDebugSnapshot: true,
|
|
48
|
+
usedInUi: false,
|
|
49
|
+
},
|
|
50
|
+
etag: {
|
|
51
|
+
persist: true,
|
|
52
|
+
anonymous: false,
|
|
53
|
+
includeInStateLogs: false,
|
|
54
|
+
includeInDebugSnapshot: false,
|
|
55
|
+
usedInUi: false,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const DEFAULT_FALLBACK_CONFIG = {};
|
|
59
|
+
class ConfigRegistryController extends (0, polling_controller_1.StaticIntervalPollingController)() {
|
|
60
|
+
/**
|
|
61
|
+
* @param options - The controller options.
|
|
62
|
+
* @param options.messenger - The controller messenger.
|
|
63
|
+
* @param options.state - Initial state.
|
|
64
|
+
* @param options.pollingInterval - Polling interval in milliseconds.
|
|
65
|
+
* @param options.fallbackConfig - Fallback configuration.
|
|
66
|
+
* @param options.apiService - The API service.
|
|
67
|
+
*/
|
|
68
|
+
constructor({ messenger, state = {}, pollingInterval = exports.DEFAULT_POLLING_INTERVAL, fallbackConfig = DEFAULT_FALLBACK_CONFIG, apiService = new config_registry_api_service_1.ConfigRegistryApiService(), }) {
|
|
69
|
+
super({
|
|
70
|
+
name: controllerName,
|
|
71
|
+
metadata: stateMetadata,
|
|
72
|
+
messenger,
|
|
73
|
+
state: {
|
|
74
|
+
configs: { networks: {} },
|
|
75
|
+
version: null,
|
|
76
|
+
lastFetched: null,
|
|
77
|
+
fetchError: null,
|
|
78
|
+
etag: null,
|
|
79
|
+
...state,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
_ConfigRegistryController_instances.add(this);
|
|
83
|
+
_ConfigRegistryController_fallbackConfig.set(this, void 0);
|
|
84
|
+
_ConfigRegistryController_apiService.set(this, void 0);
|
|
85
|
+
this.setIntervalLength(pollingInterval);
|
|
86
|
+
__classPrivateFieldSet(this, _ConfigRegistryController_fallbackConfig, fallbackConfig, "f");
|
|
87
|
+
__classPrivateFieldSet(this, _ConfigRegistryController_apiService, apiService, "f");
|
|
88
|
+
this.messenger.registerActionHandler(`${controllerName}:getConfig`, (key) => this.getConfig(key));
|
|
89
|
+
this.messenger.registerActionHandler(`${controllerName}:setConfig`, (key, value, metadata) => this.setConfig(key, value, metadata));
|
|
90
|
+
this.messenger.registerActionHandler(`${controllerName}:getAllConfigs`, () => this.getAllConfigs());
|
|
91
|
+
this.messenger.registerActionHandler(`${controllerName}:startPolling`, (input) => this.startPolling(input));
|
|
92
|
+
this.messenger.registerActionHandler(`${controllerName}:stopPolling`, () => this.stopPolling());
|
|
93
|
+
}
|
|
94
|
+
async _executePoll(_input) {
|
|
95
|
+
const isApiEnabled = (0, feature_flags_1.isConfigRegistryApiEnabled)(this.messenger);
|
|
96
|
+
if (!isApiEnabled) {
|
|
97
|
+
__classPrivateFieldGet(this, _ConfigRegistryController_instances, "m", _ConfigRegistryController_useFallbackConfig).call(this, 'Feature flag disabled - using fallback configuration');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const result = await __classPrivateFieldGet(this, _ConfigRegistryController_apiService, "f").fetchConfig({
|
|
102
|
+
etag: this.state.etag ?? undefined,
|
|
103
|
+
});
|
|
104
|
+
if (result.notModified) {
|
|
105
|
+
this.update((state) => {
|
|
106
|
+
state.fetchError = null;
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Filter networks: only featured, active, non-testnet networks
|
|
111
|
+
const filteredNetworks = (0, config_registry_api_service_1.filterNetworks)(result.data.data.networks, {
|
|
112
|
+
isFeatured: true,
|
|
113
|
+
isActive: true,
|
|
114
|
+
isTestnet: false,
|
|
115
|
+
});
|
|
116
|
+
const newConfigs = {};
|
|
117
|
+
for (const network of filteredNetworks) {
|
|
118
|
+
newConfigs[network.chainId] = {
|
|
119
|
+
key: network.chainId,
|
|
120
|
+
value: network,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
this.update((state) => {
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
125
|
+
state.configs = { networks: newConfigs };
|
|
126
|
+
state.version = result.data.data.version;
|
|
127
|
+
state.lastFetched = Date.now();
|
|
128
|
+
state.fetchError = null;
|
|
129
|
+
state.etag = result.etag ?? null;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
__classPrivateFieldGet(this, _ConfigRegistryController_instances, "m", _ConfigRegistryController_handleFetchError).call(this, error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
getConfig(key) {
|
|
137
|
+
return this.state.configs?.networks?.[key];
|
|
138
|
+
}
|
|
139
|
+
getAllConfigs() {
|
|
140
|
+
return { ...(this.state.configs?.networks ?? {}) };
|
|
141
|
+
}
|
|
142
|
+
getConfigValue(key) {
|
|
143
|
+
const entry = this.state.configs?.networks?.[key];
|
|
144
|
+
return entry?.value;
|
|
145
|
+
}
|
|
146
|
+
setConfig(key, value, metadata) {
|
|
147
|
+
this.update((state) => {
|
|
148
|
+
if (!state.configs) {
|
|
149
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
150
|
+
state.configs = { networks: {} };
|
|
151
|
+
}
|
|
152
|
+
if (!state.configs.networks) {
|
|
153
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
|
+
state.configs.networks = {};
|
|
155
|
+
}
|
|
156
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
157
|
+
state.configs.networks[key] = {
|
|
158
|
+
key,
|
|
159
|
+
value,
|
|
160
|
+
metadata,
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
removeConfig(key) {
|
|
165
|
+
this.update((state) => {
|
|
166
|
+
if (state.configs?.networks) {
|
|
167
|
+
delete state.configs.networks[key];
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
clearConfigs() {
|
|
172
|
+
this.update((state) => {
|
|
173
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
174
|
+
state.configs = { networks: {} };
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
startPolling(input = {}) {
|
|
178
|
+
return super.startPolling(input);
|
|
179
|
+
}
|
|
180
|
+
stopPolling() {
|
|
181
|
+
super.stopAllPolling();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.ConfigRegistryController = ConfigRegistryController;
|
|
185
|
+
_ConfigRegistryController_fallbackConfig = new WeakMap(), _ConfigRegistryController_apiService = new WeakMap(), _ConfigRegistryController_instances = new WeakSet(), _ConfigRegistryController_useFallbackConfig = function _ConfigRegistryController_useFallbackConfig(errorMessage) {
|
|
186
|
+
this.update((state) => {
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
+
state.configs = { networks: { ...__classPrivateFieldGet(this, _ConfigRegistryController_fallbackConfig, "f") } };
|
|
189
|
+
state.fetchError =
|
|
190
|
+
errorMessage ?? 'Using fallback configuration - API unavailable';
|
|
191
|
+
state.etag = null;
|
|
192
|
+
});
|
|
193
|
+
}, _ConfigRegistryController_handleFetchError = function _ConfigRegistryController_handleFetchError(error) {
|
|
194
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
195
|
+
const hasNoConfigs = Object.keys(this.state.configs?.networks ?? {}).length === 0;
|
|
196
|
+
if (hasNoConfigs) {
|
|
197
|
+
__classPrivateFieldGet(this, _ConfigRegistryController_instances, "m", _ConfigRegistryController_useFallbackConfig).call(this, errorMessage);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
this.update((state) => {
|
|
201
|
+
state.fetchError = errorMessage;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=ConfigRegistryController.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController.cjs","sourceRoot":"","sources":["../src/ConfigRegistryController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { StaticIntervalPollingController } from '@metamask/polling-controller';\nimport type { RemoteFeatureFlagControllerState } from '@metamask/remote-feature-flag-controller';\nimport type { Json } from '@metamask/utils';\n\nimport type {\n AbstractConfigRegistryApiService,\n FetchConfigResult,\n} from './config-registry-api-service';\nimport {\n ConfigRegistryApiService,\n filterNetworks,\n} from './config-registry-api-service';\nimport { isConfigRegistryApiEnabled } from './utils/feature-flags';\n\nconst controllerName = 'ConfigRegistryController';\n\nexport const DEFAULT_POLLING_INTERVAL = 24 * 60 * 60 * 1000;\n\nexport type RegistryConfigEntry = {\n key: string;\n value: Json;\n metadata?: Json;\n};\n\nexport type ConfigRegistryState = {\n configs: {\n networks?: Record<string, RegistryConfigEntry>;\n };\n version: string | null;\n lastFetched: number | null;\n fetchError: string | null;\n etag: string | null;\n};\n\nconst stateMetadata = {\n configs: {\n persist: true,\n anonymous: false,\n includeInStateLogs: false,\n includeInDebugSnapshot: true,\n usedInUi: true,\n },\n version: {\n persist: true,\n anonymous: false,\n includeInStateLogs: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n lastFetched: {\n persist: true,\n anonymous: false,\n includeInStateLogs: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n fetchError: {\n persist: true,\n anonymous: false,\n includeInStateLogs: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n },\n etag: {\n persist: true,\n anonymous: false,\n includeInStateLogs: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n};\n\nconst DEFAULT_FALLBACK_CONFIG: Record<string, RegistryConfigEntry> = {};\n\ntype ConfigRegistryPollingInput = Record<string, never>;\n\nexport type ConfigRegistryControllerStateChangeEvent =\n ControllerStateChangeEvent<typeof controllerName, ConfigRegistryState>;\n\nexport type ConfigRegistryControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n ConfigRegistryState\n>;\n\nexport type ConfigRegistryControllerGetConfigAction = {\n type: `${typeof controllerName}:getConfig`;\n handler: ConfigRegistryController['getConfig'];\n};\n\nexport type ConfigRegistryControllerSetConfigAction = {\n type: `${typeof controllerName}:setConfig`;\n handler: ConfigRegistryController['setConfig'];\n};\n\nexport type ConfigRegistryControllerGetAllConfigsAction = {\n type: `${typeof controllerName}:getAllConfigs`;\n handler: ConfigRegistryController['getAllConfigs'];\n};\n\nexport type ConfigRegistryControllerStartPollingAction = {\n type: `${typeof controllerName}:startPolling`;\n handler: (input: ConfigRegistryPollingInput) => string;\n};\n\nexport type ConfigRegistryControllerStopPollingAction = {\n type: `${typeof controllerName}:stopPolling`;\n handler: () => void;\n};\n\nexport type ConfigRegistryControllerActions =\n | ConfigRegistryControllerGetStateAction\n | ConfigRegistryControllerGetConfigAction\n | ConfigRegistryControllerSetConfigAction\n | ConfigRegistryControllerGetAllConfigsAction\n | ConfigRegistryControllerStartPollingAction\n | ConfigRegistryControllerStopPollingAction\n | {\n type: 'RemoteFeatureFlagController:getState';\n handler: () => RemoteFeatureFlagControllerState;\n };\n\nexport type ConfigRegistryControllerEvents =\n ConfigRegistryControllerStateChangeEvent;\n\nexport type ConfigRegistryMessenger = Messenger<\n typeof controllerName,\n ConfigRegistryControllerActions,\n ConfigRegistryControllerEvents\n>;\n\nexport type ConfigRegistryControllerOptions = {\n messenger: ConfigRegistryMessenger;\n state?: Partial<ConfigRegistryState>;\n pollingInterval?: number;\n fallbackConfig?: Record<string, RegistryConfigEntry>;\n apiService?: AbstractConfigRegistryApiService;\n};\n\nexport class ConfigRegistryController extends StaticIntervalPollingController<ConfigRegistryPollingInput>()<\n typeof controllerName,\n ConfigRegistryState,\n ConfigRegistryMessenger\n> {\n readonly #fallbackConfig: Record<string, RegistryConfigEntry>;\n\n readonly #apiService: AbstractConfigRegistryApiService;\n\n /**\n * @param options - The controller options.\n * @param options.messenger - The controller messenger.\n * @param options.state - Initial state.\n * @param options.pollingInterval - Polling interval in milliseconds.\n * @param options.fallbackConfig - Fallback configuration.\n * @param options.apiService - The API service.\n */\n constructor({\n messenger,\n state = {},\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n fallbackConfig = DEFAULT_FALLBACK_CONFIG,\n apiService = new ConfigRegistryApiService(),\n }: ConfigRegistryControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state: {\n configs: { networks: {} },\n version: null,\n lastFetched: null,\n fetchError: null,\n etag: null,\n ...state,\n },\n });\n\n this.setIntervalLength(pollingInterval);\n this.#fallbackConfig = fallbackConfig;\n this.#apiService = apiService;\n\n this.messenger.registerActionHandler(\n `${controllerName}:getConfig`,\n (key: string) => this.getConfig(key),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:setConfig`,\n (key: string, value: Json, metadata?: Json) =>\n this.setConfig(key, value, metadata),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:getAllConfigs`,\n () => this.getAllConfigs(),\n );\n\n this.messenger.registerActionHandler(\n `${controllerName}:startPolling`,\n (input: ConfigRegistryPollingInput) => this.startPolling(input),\n );\n\n this.messenger.registerActionHandler(`${controllerName}:stopPolling`, () =>\n this.stopPolling(),\n );\n }\n\n async _executePoll(_input: ConfigRegistryPollingInput): Promise<void> {\n const isApiEnabled = isConfigRegistryApiEnabled(this.messenger);\n\n if (!isApiEnabled) {\n this.#useFallbackConfig(\n 'Feature flag disabled - using fallback configuration',\n );\n return;\n }\n\n try {\n const result: FetchConfigResult = await this.#apiService.fetchConfig({\n etag: this.state.etag ?? undefined,\n });\n\n if (result.notModified) {\n this.update((state) => {\n state.fetchError = null;\n });\n return;\n }\n\n // Filter networks: only featured, active, non-testnet networks\n const filteredNetworks = filterNetworks(result.data.data.networks, {\n isFeatured: true,\n isActive: true,\n isTestnet: false,\n });\n\n const newConfigs: Record<string, RegistryConfigEntry> = {};\n for (const network of filteredNetworks) {\n newConfigs[network.chainId] = {\n key: network.chainId,\n value: network as unknown as Json,\n };\n }\n\n this.update((state) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.configs as any) = { networks: newConfigs };\n state.version = result.data.data.version;\n state.lastFetched = Date.now();\n state.fetchError = null;\n state.etag = result.etag ?? null;\n });\n } catch (error) {\n this.#handleFetchError(error);\n }\n }\n\n #useFallbackConfig(errorMessage?: string): void {\n this.update((state) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.configs as any) = { networks: { ...this.#fallbackConfig } };\n state.fetchError =\n errorMessage ?? 'Using fallback configuration - API unavailable';\n state.etag = null;\n });\n }\n\n #handleFetchError(error: unknown): void {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred';\n\n const hasNoConfigs =\n Object.keys(this.state.configs?.networks ?? {}).length === 0;\n\n if (hasNoConfigs) {\n this.#useFallbackConfig(errorMessage);\n } else {\n this.update((state) => {\n state.fetchError = errorMessage;\n });\n }\n }\n\n getConfig(key: string): RegistryConfigEntry | undefined {\n return this.state.configs?.networks?.[key];\n }\n\n getAllConfigs(): Record<string, RegistryConfigEntry> {\n return { ...(this.state.configs?.networks ?? {}) };\n }\n\n getConfigValue<TValue = Json>(key: string): TValue | undefined {\n const entry = this.state.configs?.networks?.[key];\n return entry?.value as TValue | undefined;\n }\n\n setConfig(key: string, value: Json, metadata?: Json): void {\n this.update((state) => {\n if (!state.configs) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.configs as any) = { networks: {} };\n }\n if (!state.configs.networks) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.configs.networks as any) = {};\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.configs.networks as any)[key] = {\n key,\n value,\n metadata,\n };\n });\n }\n\n removeConfig(key: string): void {\n this.update((state) => {\n if (state.configs?.networks) {\n delete state.configs.networks[key];\n }\n });\n }\n\n clearConfigs(): void {\n this.update((state) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.configs as any) = { networks: {} };\n });\n }\n\n startPolling(input: ConfigRegistryPollingInput = {}): string {\n return super.startPolling(input);\n }\n\n stopPolling(): void {\n super.stopAllPolling();\n }\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
|
|
2
|
+
import type { Messenger } from "@metamask/messenger";
|
|
3
|
+
import type { RemoteFeatureFlagControllerState } from "@metamask/remote-feature-flag-controller";
|
|
4
|
+
import type { Json } from "@metamask/utils";
|
|
5
|
+
import type { AbstractConfigRegistryApiService } from "./config-registry-api-service/index.cjs";
|
|
6
|
+
declare const controllerName = "ConfigRegistryController";
|
|
7
|
+
export declare const DEFAULT_POLLING_INTERVAL: number;
|
|
8
|
+
export type RegistryConfigEntry = {
|
|
9
|
+
key: string;
|
|
10
|
+
value: Json;
|
|
11
|
+
metadata?: Json;
|
|
12
|
+
};
|
|
13
|
+
export type ConfigRegistryState = {
|
|
14
|
+
configs: {
|
|
15
|
+
networks?: Record<string, RegistryConfigEntry>;
|
|
16
|
+
};
|
|
17
|
+
version: string | null;
|
|
18
|
+
lastFetched: number | null;
|
|
19
|
+
fetchError: string | null;
|
|
20
|
+
etag: string | null;
|
|
21
|
+
};
|
|
22
|
+
type ConfigRegistryPollingInput = Record<string, never>;
|
|
23
|
+
export type ConfigRegistryControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, ConfigRegistryState>;
|
|
24
|
+
export type ConfigRegistryControllerGetStateAction = ControllerGetStateAction<typeof controllerName, ConfigRegistryState>;
|
|
25
|
+
export type ConfigRegistryControllerGetConfigAction = {
|
|
26
|
+
type: `${typeof controllerName}:getConfig`;
|
|
27
|
+
handler: ConfigRegistryController['getConfig'];
|
|
28
|
+
};
|
|
29
|
+
export type ConfigRegistryControllerSetConfigAction = {
|
|
30
|
+
type: `${typeof controllerName}:setConfig`;
|
|
31
|
+
handler: ConfigRegistryController['setConfig'];
|
|
32
|
+
};
|
|
33
|
+
export type ConfigRegistryControllerGetAllConfigsAction = {
|
|
34
|
+
type: `${typeof controllerName}:getAllConfigs`;
|
|
35
|
+
handler: ConfigRegistryController['getAllConfigs'];
|
|
36
|
+
};
|
|
37
|
+
export type ConfigRegistryControllerStartPollingAction = {
|
|
38
|
+
type: `${typeof controllerName}:startPolling`;
|
|
39
|
+
handler: (input: ConfigRegistryPollingInput) => string;
|
|
40
|
+
};
|
|
41
|
+
export type ConfigRegistryControllerStopPollingAction = {
|
|
42
|
+
type: `${typeof controllerName}:stopPolling`;
|
|
43
|
+
handler: () => void;
|
|
44
|
+
};
|
|
45
|
+
export type ConfigRegistryControllerActions = ConfigRegistryControllerGetStateAction | ConfigRegistryControllerGetConfigAction | ConfigRegistryControllerSetConfigAction | ConfigRegistryControllerGetAllConfigsAction | ConfigRegistryControllerStartPollingAction | ConfigRegistryControllerStopPollingAction | {
|
|
46
|
+
type: 'RemoteFeatureFlagController:getState';
|
|
47
|
+
handler: () => RemoteFeatureFlagControllerState;
|
|
48
|
+
};
|
|
49
|
+
export type ConfigRegistryControllerEvents = ConfigRegistryControllerStateChangeEvent;
|
|
50
|
+
export type ConfigRegistryMessenger = Messenger<typeof controllerName, ConfigRegistryControllerActions, ConfigRegistryControllerEvents>;
|
|
51
|
+
export type ConfigRegistryControllerOptions = {
|
|
52
|
+
messenger: ConfigRegistryMessenger;
|
|
53
|
+
state?: Partial<ConfigRegistryState>;
|
|
54
|
+
pollingInterval?: number;
|
|
55
|
+
fallbackConfig?: Record<string, RegistryConfigEntry>;
|
|
56
|
+
apiService?: AbstractConfigRegistryApiService;
|
|
57
|
+
};
|
|
58
|
+
declare const ConfigRegistryController_base: (abstract new (...args: any[]) => {
|
|
59
|
+
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
60
|
+
"__#15@#intervalLength": number | undefined;
|
|
61
|
+
setIntervalLength(intervalLength: number): void;
|
|
62
|
+
getIntervalLength(): number | undefined;
|
|
63
|
+
_startPolling(input: ConfigRegistryPollingInput): void;
|
|
64
|
+
_stopPollingByPollingTokenSetId(key: string): void;
|
|
65
|
+
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
66
|
+
readonly "__#3@#callbacks": Map<string, Set<(input: ConfigRegistryPollingInput) => void>>;
|
|
67
|
+
_executePoll(input: ConfigRegistryPollingInput): Promise<void>;
|
|
68
|
+
startPolling(input: ConfigRegistryPollingInput): string;
|
|
69
|
+
stopAllPolling(): void;
|
|
70
|
+
stopPollingByPollingToken(pollingToken: string): void;
|
|
71
|
+
onPollingComplete(input: ConfigRegistryPollingInput, callback: (input: ConfigRegistryPollingInput) => void): void;
|
|
72
|
+
}) & typeof import("@metamask/base-controller").BaseController;
|
|
73
|
+
export declare class ConfigRegistryController extends ConfigRegistryController_base<typeof controllerName, ConfigRegistryState, ConfigRegistryMessenger> {
|
|
74
|
+
#private;
|
|
75
|
+
/**
|
|
76
|
+
* @param options - The controller options.
|
|
77
|
+
* @param options.messenger - The controller messenger.
|
|
78
|
+
* @param options.state - Initial state.
|
|
79
|
+
* @param options.pollingInterval - Polling interval in milliseconds.
|
|
80
|
+
* @param options.fallbackConfig - Fallback configuration.
|
|
81
|
+
* @param options.apiService - The API service.
|
|
82
|
+
*/
|
|
83
|
+
constructor({ messenger, state, pollingInterval, fallbackConfig, apiService, }: ConfigRegistryControllerOptions);
|
|
84
|
+
_executePoll(_input: ConfigRegistryPollingInput): Promise<void>;
|
|
85
|
+
getConfig(key: string): RegistryConfigEntry | undefined;
|
|
86
|
+
getAllConfigs(): Record<string, RegistryConfigEntry>;
|
|
87
|
+
getConfigValue<TValue = Json>(key: string): TValue | undefined;
|
|
88
|
+
setConfig(key: string, value: Json, metadata?: Json): void;
|
|
89
|
+
removeConfig(key: string): void;
|
|
90
|
+
clearConfigs(): void;
|
|
91
|
+
startPolling(input?: ConfigRegistryPollingInput): string;
|
|
92
|
+
stopPolling(): void;
|
|
93
|
+
}
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=ConfigRegistryController.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController.d.cts","sourceRoot":"","sources":["../src/ConfigRegistryController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
|
|
2
|
+
import type { Messenger } from "@metamask/messenger";
|
|
3
|
+
import type { RemoteFeatureFlagControllerState } from "@metamask/remote-feature-flag-controller";
|
|
4
|
+
import type { Json } from "@metamask/utils";
|
|
5
|
+
import type { AbstractConfigRegistryApiService } from "./config-registry-api-service/index.mjs";
|
|
6
|
+
declare const controllerName = "ConfigRegistryController";
|
|
7
|
+
export declare const DEFAULT_POLLING_INTERVAL: number;
|
|
8
|
+
export type RegistryConfigEntry = {
|
|
9
|
+
key: string;
|
|
10
|
+
value: Json;
|
|
11
|
+
metadata?: Json;
|
|
12
|
+
};
|
|
13
|
+
export type ConfigRegistryState = {
|
|
14
|
+
configs: {
|
|
15
|
+
networks?: Record<string, RegistryConfigEntry>;
|
|
16
|
+
};
|
|
17
|
+
version: string | null;
|
|
18
|
+
lastFetched: number | null;
|
|
19
|
+
fetchError: string | null;
|
|
20
|
+
etag: string | null;
|
|
21
|
+
};
|
|
22
|
+
type ConfigRegistryPollingInput = Record<string, never>;
|
|
23
|
+
export type ConfigRegistryControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, ConfigRegistryState>;
|
|
24
|
+
export type ConfigRegistryControllerGetStateAction = ControllerGetStateAction<typeof controllerName, ConfigRegistryState>;
|
|
25
|
+
export type ConfigRegistryControllerGetConfigAction = {
|
|
26
|
+
type: `${typeof controllerName}:getConfig`;
|
|
27
|
+
handler: ConfigRegistryController['getConfig'];
|
|
28
|
+
};
|
|
29
|
+
export type ConfigRegistryControllerSetConfigAction = {
|
|
30
|
+
type: `${typeof controllerName}:setConfig`;
|
|
31
|
+
handler: ConfigRegistryController['setConfig'];
|
|
32
|
+
};
|
|
33
|
+
export type ConfigRegistryControllerGetAllConfigsAction = {
|
|
34
|
+
type: `${typeof controllerName}:getAllConfigs`;
|
|
35
|
+
handler: ConfigRegistryController['getAllConfigs'];
|
|
36
|
+
};
|
|
37
|
+
export type ConfigRegistryControllerStartPollingAction = {
|
|
38
|
+
type: `${typeof controllerName}:startPolling`;
|
|
39
|
+
handler: (input: ConfigRegistryPollingInput) => string;
|
|
40
|
+
};
|
|
41
|
+
export type ConfigRegistryControllerStopPollingAction = {
|
|
42
|
+
type: `${typeof controllerName}:stopPolling`;
|
|
43
|
+
handler: () => void;
|
|
44
|
+
};
|
|
45
|
+
export type ConfigRegistryControllerActions = ConfigRegistryControllerGetStateAction | ConfigRegistryControllerGetConfigAction | ConfigRegistryControllerSetConfigAction | ConfigRegistryControllerGetAllConfigsAction | ConfigRegistryControllerStartPollingAction | ConfigRegistryControllerStopPollingAction | {
|
|
46
|
+
type: 'RemoteFeatureFlagController:getState';
|
|
47
|
+
handler: () => RemoteFeatureFlagControllerState;
|
|
48
|
+
};
|
|
49
|
+
export type ConfigRegistryControllerEvents = ConfigRegistryControllerStateChangeEvent;
|
|
50
|
+
export type ConfigRegistryMessenger = Messenger<typeof controllerName, ConfigRegistryControllerActions, ConfigRegistryControllerEvents>;
|
|
51
|
+
export type ConfigRegistryControllerOptions = {
|
|
52
|
+
messenger: ConfigRegistryMessenger;
|
|
53
|
+
state?: Partial<ConfigRegistryState>;
|
|
54
|
+
pollingInterval?: number;
|
|
55
|
+
fallbackConfig?: Record<string, RegistryConfigEntry>;
|
|
56
|
+
apiService?: AbstractConfigRegistryApiService;
|
|
57
|
+
};
|
|
58
|
+
declare const ConfigRegistryController_base: (abstract new (...args: any[]) => {
|
|
59
|
+
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
60
|
+
"__#15@#intervalLength": number | undefined;
|
|
61
|
+
setIntervalLength(intervalLength: number): void;
|
|
62
|
+
getIntervalLength(): number | undefined;
|
|
63
|
+
_startPolling(input: ConfigRegistryPollingInput): void;
|
|
64
|
+
_stopPollingByPollingTokenSetId(key: string): void;
|
|
65
|
+
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
66
|
+
readonly "__#3@#callbacks": Map<string, Set<(input: ConfigRegistryPollingInput) => void>>;
|
|
67
|
+
_executePoll(input: ConfigRegistryPollingInput): Promise<void>;
|
|
68
|
+
startPolling(input: ConfigRegistryPollingInput): string;
|
|
69
|
+
stopAllPolling(): void;
|
|
70
|
+
stopPollingByPollingToken(pollingToken: string): void;
|
|
71
|
+
onPollingComplete(input: ConfigRegistryPollingInput, callback: (input: ConfigRegistryPollingInput) => void): void;
|
|
72
|
+
}) & typeof import("@metamask/base-controller").BaseController;
|
|
73
|
+
export declare class ConfigRegistryController extends ConfigRegistryController_base<typeof controllerName, ConfigRegistryState, ConfigRegistryMessenger> {
|
|
74
|
+
#private;
|
|
75
|
+
/**
|
|
76
|
+
* @param options - The controller options.
|
|
77
|
+
* @param options.messenger - The controller messenger.
|
|
78
|
+
* @param options.state - Initial state.
|
|
79
|
+
* @param options.pollingInterval - Polling interval in milliseconds.
|
|
80
|
+
* @param options.fallbackConfig - Fallback configuration.
|
|
81
|
+
* @param options.apiService - The API service.
|
|
82
|
+
*/
|
|
83
|
+
constructor({ messenger, state, pollingInterval, fallbackConfig, apiService, }: ConfigRegistryControllerOptions);
|
|
84
|
+
_executePoll(_input: ConfigRegistryPollingInput): Promise<void>;
|
|
85
|
+
getConfig(key: string): RegistryConfigEntry | undefined;
|
|
86
|
+
getAllConfigs(): Record<string, RegistryConfigEntry>;
|
|
87
|
+
getConfigValue<TValue = Json>(key: string): TValue | undefined;
|
|
88
|
+
setConfig(key: string, value: Json, metadata?: Json): void;
|
|
89
|
+
removeConfig(key: string): void;
|
|
90
|
+
clearConfigs(): void;
|
|
91
|
+
startPolling(input?: ConfigRegistryPollingInput): string;
|
|
92
|
+
stopPolling(): void;
|
|
93
|
+
}
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=ConfigRegistryController.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigRegistryController.d.mts","sourceRoot":"","sources":["../src/ConfigRegistryController.ts"],"names":[],"mappings":"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"}
|