@metamask-previews/config-registry-controller 4.0.0-preview-85a915769 → 4.0.0-preview-e45297452

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 CHANGED
@@ -7,10 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Added
11
-
12
- - **BREAKING:** Add events-config support: `ConfigRegistryApiService` now fetches from `/v1/config/events-config` and `ConfigRegistryController` caches the result in `configs.eventsConfig`; requires `ConfigRegistryApiService:fetchEventsConfig` in `ConfigRegistryControllerMessenger`'s `AllowedActions` ([#10448](https://github.com/MetaMask/core/pull/10448))
13
-
14
10
  ### Changed
15
11
 
16
12
  - Bump `@metamask/utils` from `^11.12.0` to `^12.0.0` ([#10192](https://github.com/MetaMask/core/pull/10192))
@@ -4,8 +4,8 @@ import type { Messenger } from '@metamask/messenger';
4
4
  import type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';
5
5
  import type { RemoteFeatureFlagControllerStateChangeEvent } from '@metamask/remote-feature-flag-controller';
6
6
  import { CaipChainId } from '@metamask/utils';
7
- import type { ConfigRegistryApiServiceFetchConfigAction, ConfigRegistryApiServiceFetchEventsConfigAction } from './config-registry-api-service/config-registry-api-service-method-action-types.js';
8
- import type { RegistryEventsConfig, RegistryNetworkConfig } from './config-registry-api-service/types.js';
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
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;
@@ -17,12 +17,12 @@ export declare const DEFAULT_POLLING_INTERVAL: number;
17
17
  */
18
18
  export type ConfigRegistryControllerState = {
19
19
  /**
20
- * Configurations fetched from the config registry API.
21
- * Stores network configs and events config.
20
+ * Network configurations organized by chain ID.
21
+ * Stores the full API response including isFeatured, isTestnet, etc.
22
+ * Use selectors (e.g. selectFeaturedNetworks) to filter when needed.
22
23
  */
23
24
  configs: {
24
25
  networks: Record<CaipChainId, RegistryNetworkConfig>;
25
- eventsConfig?: RegistryEventsConfig | null;
26
26
  };
27
27
  /**
28
28
  * Semantic version string of the configuration data from the API.
@@ -45,10 +45,6 @@ export type ConfigRegistryControllerState = {
45
45
  * indicating the schema/version of the configuration data itself.
46
46
  */
47
47
  etag: string | null;
48
- /**
49
- * HTTP entity tag (ETag) for the events-config endpoint cache validation.
50
- */
51
- eventsConfigEtag?: string | null;
52
48
  };
53
49
  /**
54
50
  * Published when the state of {@link ConfigRegistryController} changes.
@@ -66,7 +62,7 @@ export type ConfigRegistryControllerActions = ConfigRegistryControllerGetStateAc
66
62
  * Actions from other messengers that {@link ConfigRegistryControllerMessenger}
67
63
  * calls.
68
64
  */
69
- type AllowedActions = KeyringControllerGetStateAction | RemoteFeatureFlagControllerGetStateAction | ConfigRegistryApiServiceFetchConfigAction | ConfigRegistryApiServiceFetchEventsConfigAction;
65
+ type AllowedActions = KeyringControllerGetStateAction | RemoteFeatureFlagControllerGetStateAction | ConfigRegistryApiServiceFetchConfigAction;
70
66
  /**
71
67
  * Events that {@link ConfigRegistryControllerMessenger} exposes to other consumers.
72
68
  */
@@ -107,8 +103,7 @@ export declare class ConfigRegistryController extends ConfigRegistryController_b
107
103
  /**
108
104
  * @param options - The controller options.
109
105
  * @param options.messenger - The controller messenger. Must have
110
- * `ConfigRegistryApiService:fetchConfig` and
111
- * `ConfigRegistryApiService:fetchEventsConfig` action handlers registered
106
+ * `ConfigRegistryApiService:fetchConfig` action handler registered
112
107
  * (e.g. by instantiating {@link ConfigRegistryApiService} with the same
113
108
  * messenger).
114
109
  * @param options.state - Initial state.
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigRegistryController.d.ts","sourceRoot":"","sources":["../src/ConfigRegistryController.ts"],"names":[],"mappings":"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"}
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"}
@@ -28,12 +28,6 @@ const stateMetadata = {
28
28
  includeInDebugSnapshot: false,
29
29
  usedInUi: false,
30
30
  },
31
- eventsConfigEtag: {
32
- persist: true,
33
- includeInStateLogs: false,
34
- includeInDebugSnapshot: false,
35
- usedInUi: false,
36
- },
37
31
  };
38
32
  /**
39
33
  * Default fallback configuration when no configs are available.
@@ -48,8 +42,7 @@ export class ConfigRegistryController extends StaticIntervalPollingController()
48
42
  /**
49
43
  * @param options - The controller options.
50
44
  * @param options.messenger - The controller messenger. Must have
51
- * `ConfigRegistryApiService:fetchConfig` and
52
- * `ConfigRegistryApiService:fetchEventsConfig` action handlers registered
45
+ * `ConfigRegistryApiService:fetchConfig` action handler registered
53
46
  * (e.g. by instantiating {@link ConfigRegistryApiService} with the same
54
47
  * messenger).
55
48
  * @param options.state - Initial state.
@@ -64,12 +57,10 @@ export class ConfigRegistryController extends StaticIntervalPollingController()
64
57
  state: {
65
58
  configs: {
66
59
  networks: state.configs?.networks ?? { ...fallbackConfig },
67
- eventsConfig: state.configs?.eventsConfig ?? null,
68
60
  },
69
61
  version: state.version ?? null,
70
62
  lastFetched: state.lastFetched ?? null,
71
63
  etag: state.etag ?? null,
72
- eventsConfigEtag: state.eventsConfigEtag ?? null,
73
64
  },
74
65
  });
75
66
  this.setIntervalLength(pollingInterval);
@@ -86,9 +77,6 @@ export class ConfigRegistryController extends StaticIntervalPollingController()
86
77
  return this.state.configs.networks[caip2ChainId];
87
78
  }
88
79
  async _executePoll(_input) {
89
- await Promise.all([this.#fetchNetworksConfig(), this.#fetchEventsConfig()]);
90
- }
91
- async #fetchNetworksConfig() {
92
80
  try {
93
81
  const result = await this.messenger.call('ConfigRegistryApiService:fetchConfig', {
94
82
  etag: this.state.etag ?? undefined,
@@ -121,29 +109,6 @@ export class ConfigRegistryController extends StaticIntervalPollingController()
121
109
  this.messenger.captureException?.(errorInstance);
122
110
  }
123
111
  }
124
- async #fetchEventsConfig() {
125
- try {
126
- const result = await this.messenger.call('ConfigRegistryApiService:fetchEventsConfig', {
127
- etag: this.state.eventsConfigEtag ?? undefined,
128
- });
129
- if (!result.modified) {
130
- if (result.etag !== undefined) {
131
- this.update((state) => {
132
- state.eventsConfigEtag = result.etag;
133
- });
134
- }
135
- return;
136
- }
137
- this.update((state) => {
138
- state.configs.eventsConfig = result.data.data;
139
- state.eventsConfigEtag = result.etag ?? null;
140
- });
141
- }
142
- catch (error) {
143
- const errorInstance = error instanceof Error ? error : new Error(String(error));
144
- this.messenger.captureException?.(errorInstance);
145
- }
146
- }
147
112
  /**
148
113
  * Stop all polling.
149
114
  */
@@ -1 +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 {\n ConfigRegistryApiServiceFetchConfigAction,\n ConfigRegistryApiServiceFetchEventsConfigAction,\n} from './config-registry-api-service/config-registry-api-service-method-action-types.js';\nimport type {\n RegistryEventsConfig,\n RegistryNetworkConfig,\n} 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 * Configurations fetched from the config registry API.\n * Stores network configs and events config.\n */\n configs: {\n networks: Record<CaipChainId, RegistryNetworkConfig>;\n eventsConfig?: RegistryEventsConfig | null;\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 * HTTP entity tag (ETag) for the events-config endpoint cache validation.\n */\n eventsConfigEtag?: 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 eventsConfigEtag: {\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 | ConfigRegistryApiServiceFetchEventsConfigAction;\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` and\n * `ConfigRegistryApiService:fetchEventsConfig` action handlers 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 eventsConfig: state.configs?.eventsConfig ?? null,\n },\n version: state.version ?? null,\n lastFetched: state.lastFetched ?? null,\n etag: state.etag ?? null,\n eventsConfigEtag: state.eventsConfigEtag ?? 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 await Promise.all([this.#fetchNetworksConfig(), this.#fetchEventsConfig()]);\n }\n\n async #fetchNetworksConfig(): 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 async #fetchEventsConfig(): Promise<void> {\n try {\n const result = await this.messenger.call(\n 'ConfigRegistryApiService:fetchEventsConfig',\n {\n etag: this.state.eventsConfigEtag ?? undefined,\n },\n );\n\n if (!result.modified) {\n if (result.etag !== undefined) {\n this.update((state) => {\n state.eventsConfigEtag = result.etag as string;\n });\n }\n return;\n }\n\n this.update((state) => {\n state.configs.eventsConfig = result.data.data;\n state.eventsConfigEtag = 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"]}
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"]}
@@ -7,12 +7,8 @@ export type ConfigRegistryApiServiceFetchConfigAction = {
7
7
  type: `ConfigRegistryApiService:fetchConfig`;
8
8
  handler: ConfigRegistryApiService['fetchConfig'];
9
9
  };
10
- export type ConfigRegistryApiServiceFetchEventsConfigAction = {
11
- type: `ConfigRegistryApiService:fetchEventsConfig`;
12
- handler: ConfigRegistryApiService['fetchEventsConfig'];
13
- };
14
10
  /**
15
11
  * Union of all ConfigRegistryApiService action types.
16
12
  */
17
- export type ConfigRegistryApiServiceMethodActions = ConfigRegistryApiServiceFetchConfigAction | ConfigRegistryApiServiceFetchEventsConfigAction;
13
+ export type ConfigRegistryApiServiceMethodActions = ConfigRegistryApiServiceFetchConfigAction;
18
14
  //# sourceMappingURL=config-registry-api-service-method-action-types.d.ts.map
@@ -1 +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,MAAM,MAAM,+CAA+C,GAAG;IAC5D,IAAI,EAAE,4CAA4C,CAAC;IACnD,OAAO,EAAE,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;CACxD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qCAAqC,GAC7C,yCAAyC,GACzC,+CAA+C,CAAC"}
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"}
@@ -1 +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\nexport type ConfigRegistryApiServiceFetchEventsConfigAction = {\n type: `ConfigRegistryApiService:fetchEventsConfig`;\n handler: ConfigRegistryApiService['fetchEventsConfig'];\n};\n\n/**\n * Union of all ConfigRegistryApiService action types.\n */\nexport type ConfigRegistryApiServiceMethodActions =\n | ConfigRegistryApiServiceFetchConfigAction\n | ConfigRegistryApiServiceFetchEventsConfigAction;\n"]}
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"]}
@@ -2,7 +2,7 @@ import type { CreateServicePolicyOptions, ServicePolicy } from '@metamask/contro
2
2
  import type { Messenger } from '@metamask/messenger';
3
3
  import type { IDisposable } from 'cockatiel';
4
4
  import type { ConfigRegistryApiServiceMethodActions } from './config-registry-api-service-method-action-types.js';
5
- import type { FetchConfigOptions, FetchConfigResult, FetchEventsConfigResult } from './types.js';
5
+ import type { FetchConfigOptions, FetchConfigResult } from './types.js';
6
6
  export declare enum ConfigRegistryApiEnv {
7
7
  DEV = "dev",
8
8
  UAT = "uat",
@@ -102,41 +102,7 @@ export declare class ConfigRegistryApiService {
102
102
  * {@link CockatielEvent}.
103
103
  */
104
104
  onDegraded(...args: Parameters<ServicePolicy['onDegraded']>): ReturnType<ServicePolicy['onDegraded']>;
105
- /**
106
- * Registers a handler that will be called after an events-config request
107
- * returns a non-500 response, causing a retry. Primarily useful in tests
108
- * where timers are being mocked.
109
- *
110
- * @param listener - The handler to be called.
111
- * @returns An object that can be used to unregister the handler. See
112
- * {@link CockatielEvent}.
113
- * @see {@link createServicePolicy}
114
- */
115
- onEventsConfigRetry(listener: Parameters<ServicePolicy['onRetry']>[0]): IDisposable;
116
- /**
117
- * Registers a handler that will be called after a set number of retry rounds
118
- * prove that requests to the events-config endpoint consistently return a 5xx
119
- * response.
120
- *
121
- * @param args - The arguments passed to the underlying policy's onBreak
122
- * method (e.g. the listener to be called).
123
- * @returns An object that can be used to unregister the handler. See
124
- * {@link CockatielEvent}.
125
- * @see {@link createServicePolicy}
126
- */
127
- onEventsConfigBreak(...args: Parameters<ServicePolicy['onBreak']>): ReturnType<ServicePolicy['onBreak']>;
128
- /**
129
- * Registers a handler that will be called when the events-config endpoint is
130
- * degraded (repeated failures or slow responses).
131
- *
132
- * @param args - The arguments passed to the underlying policy's onDegraded
133
- * method (e.g. the listener to be called).
134
- * @returns An object that can be used to unregister the handler. See
135
- * {@link CockatielEvent}.
136
- */
137
- onEventsConfigDegraded(...args: Parameters<ServicePolicy['onDegraded']>): ReturnType<ServicePolicy['onDegraded']>;
138
105
  fetchConfig(options?: FetchConfigOptions): Promise<FetchConfigResult>;
139
- fetchEventsConfig(options?: FetchConfigOptions): Promise<FetchEventsConfigResult>;
140
106
  }
141
107
  export {};
142
108
  //# sourceMappingURL=config-registry-api-service.d.ts.map
@@ -1 +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,EACjB,uBAAuB,EAGxB,MAAM,YAAY,CAAC;AASpB,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;AAmBF,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;IAoBlC;;;;;;;;OAQG;IACH,YAAY,EACV,SAAS,EACT,GAA8B,EAC9B,KAAK,EAAE,WAA8B,EACrC,aAAkB,GACnB,EAAE,+BAA+B,EAiBjC;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;IAED;;;;;;;;;OASG;IACH,mBAAmB,CACjB,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAChD,WAAW,CAEb;IAED;;;;;;;;;;OAUG;IACH,mBAAmB,CACjB,GAAG,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAC5C,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAEtC;IAED;;;;;;;;OAQG;IACH,sBAAsB,CACpB,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;IAEK,iBAAiB,CACrB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAmDlC;CACF"}
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,7 +1,6 @@
1
1
  import { createServicePolicy, HttpError } from '@metamask/controller-utils';
2
- import { validateRegistryConfigApiResponse, validateRegistryEventsConfigApiResponse, } from './types.js';
3
- const NETWORKS_ENDPOINT_PATH = '/config/networks';
4
- const EVENTS_CONFIG_ENDPOINT_PATH = '/config/events-config';
2
+ import { validateRegistryConfigApiResponse } from './types.js';
3
+ const ENDPOINT_PATH = '/config/networks';
5
4
  export var ConfigRegistryApiEnv;
6
5
  (function (ConfigRegistryApiEnv) {
7
6
  ConfigRegistryApiEnv["DEV"] = "dev";
@@ -14,31 +13,26 @@ export var ConfigRegistryApiEnv;
14
13
  */
15
14
  export const serviceName = 'ConfigRegistryApiService';
16
15
  // === MESSENGER ===
17
- const MESSENGER_EXPOSED_METHODS = ['fetchConfig', 'fetchEventsConfig'];
16
+ const MESSENGER_EXPOSED_METHODS = ['fetchConfig'];
18
17
  // === SERVICE DEFINITION ===
19
18
  /**
20
19
  * Returns the base URL for the config registry API for the given environment.
21
20
  *
22
21
  * @param env - The environment to get the URL for.
23
- * @param endpointPath - The endpoint path to append.
24
- * @returns The full URL for the endpoint.
22
+ * @returns The base URL for the environment.
25
23
  */
26
- function getConfigRegistryUrl(env, endpointPath) {
24
+ function getConfigRegistryUrl(env) {
27
25
  const envPrefix = env === ConfigRegistryApiEnv.PRD ? '' : `${env}-`;
28
- return `https://client-config.${envPrefix}api.cx.metamask.io/v1${endpointPath}`;
26
+ return `https://client-config.${envPrefix}api.cx.metamask.io/v1${ENDPOINT_PATH}`;
29
27
  }
30
28
  export class ConfigRegistryApiService {
31
29
  name;
32
30
  #messenger;
33
31
  #policy;
34
- #eventsConfigPolicy;
35
- #networksUrl;
36
- #eventsConfigUrl;
32
+ #url;
37
33
  #fetch;
38
- /** Cached response from the last successful networks fetch. Used when server returns 304. */
34
+ /** Cached response from the last successful fetch. Used when server returns 304. */
39
35
  #cachedResponse = null;
40
- /** Cached response from the last successful events-config fetch. Used when server returns 304. */
41
- #cachedEventsConfigResponse = null;
42
36
  /**
43
37
  * Construct a Config Registry API Service.
44
38
  *
@@ -51,11 +45,9 @@ export class ConfigRegistryApiService {
51
45
  constructor({ messenger, env = ConfigRegistryApiEnv.UAT, fetch: customFetch = globalThis.fetch, policyOptions = {}, }) {
52
46
  this.name = serviceName;
53
47
  this.#messenger = messenger;
54
- this.#networksUrl = getConfigRegistryUrl(env, NETWORKS_ENDPOINT_PATH);
55
- this.#eventsConfigUrl = getConfigRegistryUrl(env, EVENTS_CONFIG_ENDPOINT_PATH);
48
+ this.#url = getConfigRegistryUrl(env);
56
49
  this.#fetch = customFetch;
57
50
  this.#policy = createServicePolicy(policyOptions);
58
- this.#eventsConfigPolicy = createServicePolicy(policyOptions);
59
51
  this.#messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
60
52
  }
61
53
  /**
@@ -105,45 +97,6 @@ export class ConfigRegistryApiService {
105
97
  onDegraded(...args) {
106
98
  return this.#policy.onDegraded(...args);
107
99
  }
108
- /**
109
- * Registers a handler that will be called after an events-config request
110
- * returns a non-500 response, causing a retry. Primarily useful in tests
111
- * where timers are being mocked.
112
- *
113
- * @param listener - The handler to be called.
114
- * @returns An object that can be used to unregister the handler. See
115
- * {@link CockatielEvent}.
116
- * @see {@link createServicePolicy}
117
- */
118
- onEventsConfigRetry(listener) {
119
- return this.#eventsConfigPolicy.onRetry(listener);
120
- }
121
- /**
122
- * Registers a handler that will be called after a set number of retry rounds
123
- * prove that requests to the events-config endpoint consistently return a 5xx
124
- * response.
125
- *
126
- * @param args - The arguments passed to the underlying policy's onBreak
127
- * method (e.g. the listener to be called).
128
- * @returns An object that can be used to unregister the handler. See
129
- * {@link CockatielEvent}.
130
- * @see {@link createServicePolicy}
131
- */
132
- onEventsConfigBreak(...args) {
133
- return this.#eventsConfigPolicy.onBreak(...args);
134
- }
135
- /**
136
- * Registers a handler that will be called when the events-config endpoint is
137
- * degraded (repeated failures or slow responses).
138
- *
139
- * @param args - The arguments passed to the underlying policy's onDegraded
140
- * method (e.g. the listener to be called).
141
- * @returns An object that can be used to unregister the handler. See
142
- * {@link CockatielEvent}.
143
- */
144
- onEventsConfigDegraded(...args) {
145
- return this.#eventsConfigPolicy.onDegraded(...args);
146
- }
147
100
  async fetchConfig(options = {}) {
148
101
  const headers = {
149
102
  'Cache-Control': 'no-cache',
@@ -152,7 +105,7 @@ export class ConfigRegistryApiService {
152
105
  headers['If-None-Match'] = options.etag;
153
106
  }
154
107
  const response = await this.#policy.execute(async () => {
155
- const res = await this.#fetch(this.#networksUrl, {
108
+ const res = await this.#fetch(this.#url, {
156
109
  headers,
157
110
  });
158
111
  if (res.status === 304) {
@@ -181,44 +134,5 @@ export class ConfigRegistryApiService {
181
134
  modified: true,
182
135
  };
183
136
  }
184
- async fetchEventsConfig(options = {}) {
185
- const headers = {
186
- 'Cache-Control': 'no-cache',
187
- };
188
- if (options.etag) {
189
- headers['If-None-Match'] = options.etag;
190
- }
191
- const response = await this.#eventsConfigPolicy.execute(async () => {
192
- const res = await this.#fetch(this.#eventsConfigUrl, {
193
- headers,
194
- });
195
- if (res.status === 304) {
196
- return res;
197
- }
198
- if (!res.ok) {
199
- throw new HttpError(res.status, `Failed to fetch events config: ${res.status} ${res.statusText}`);
200
- }
201
- return res;
202
- });
203
- if (response.status === 304) {
204
- const etag = response.headers.get('ETag') ?? undefined;
205
- return {
206
- modified: false,
207
- etag,
208
- ...(this.#cachedEventsConfigResponse !== null && {
209
- data: this.#cachedEventsConfigResponse,
210
- }),
211
- };
212
- }
213
- const etag = response.headers.get('ETag') ?? undefined;
214
- const jsonData = await response.json();
215
- validateRegistryEventsConfigApiResponse(jsonData);
216
- this.#cachedEventsConfigResponse = jsonData;
217
- return {
218
- data: jsonData,
219
- etag,
220
- modified: true,
221
- };
222
- }
223
137
  }
224
138
  //# sourceMappingURL=config-registry-api-service.js.map
@@ -1 +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 FetchEventsConfigResult,\n RegistryConfigApiResponse,\n RegistryEventsConfigApiResponse,\n} from './types.js';\nimport {\n validateRegistryConfigApiResponse,\n validateRegistryEventsConfigApiResponse,\n} from './types.js';\n\nconst NETWORKS_ENDPOINT_PATH = '/config/networks';\nconst EVENTS_CONFIG_ENDPOINT_PATH = '/config/events-config';\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', 'fetchEventsConfig'] 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 * @param endpointPath - The endpoint path to append.\n * @returns The full URL for the endpoint.\n */\nfunction getConfigRegistryUrl(\n env: ConfigRegistryApiEnv,\n endpointPath: string,\n): string {\n const envPrefix = env === ConfigRegistryApiEnv.PRD ? '' : `${env}-`;\n return `https://client-config.${envPrefix}api.cx.metamask.io/v1${endpointPath}`;\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 #eventsConfigPolicy: ServicePolicy;\n\n readonly #networksUrl: string;\n\n readonly #eventsConfigUrl: string;\n\n readonly #fetch: typeof fetch;\n\n /** Cached response from the last successful networks fetch. Used when server returns 304. */\n #cachedResponse: RegistryConfigApiResponse | null = null;\n\n /** Cached response from the last successful events-config fetch. Used when server returns 304. */\n #cachedEventsConfigResponse: RegistryEventsConfigApiResponse | 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.#networksUrl = getConfigRegistryUrl(env, NETWORKS_ENDPOINT_PATH);\n this.#eventsConfigUrl = getConfigRegistryUrl(\n env,\n EVENTS_CONFIG_ENDPOINT_PATH,\n );\n this.#fetch = customFetch;\n\n this.#policy = createServicePolicy(policyOptions);\n this.#eventsConfigPolicy = 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 /**\n * Registers a handler that will be called after an events-config request\n * returns a non-500 response, causing a retry. Primarily useful in tests\n * where timers are being 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 onEventsConfigRetry(\n listener: Parameters<ServicePolicy['onRetry']>[0],\n ): IDisposable {\n return this.#eventsConfigPolicy.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 events-config endpoint consistently return a 5xx\n * response.\n *\n * @param args - The arguments passed to the underlying policy's onBreak\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 * @see {@link createServicePolicy}\n */\n onEventsConfigBreak(\n ...args: Parameters<ServicePolicy['onBreak']>\n ): ReturnType<ServicePolicy['onBreak']> {\n return this.#eventsConfigPolicy.onBreak(...args);\n }\n\n /**\n * Registers a handler that will be called when the events-config endpoint is\n * degraded (repeated failures or slow responses).\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 onEventsConfigDegraded(\n ...args: Parameters<ServicePolicy['onDegraded']>\n ): ReturnType<ServicePolicy['onDegraded']> {\n return this.#eventsConfigPolicy.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.#networksUrl, {\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: unknown = 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 async fetchEventsConfig(\n options: FetchConfigOptions = {},\n ): Promise<FetchEventsConfigResult> {\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.#eventsConfigPolicy.execute(async () => {\n const res = await this.#fetch(this.#eventsConfigUrl, {\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 events 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.#cachedEventsConfigResponse !== null && {\n data: this.#cachedEventsConfigResponse,\n }),\n };\n }\n\n const etag = response.headers.get('ETag') ?? undefined;\n const jsonData: unknown = await response.json();\n\n validateRegistryEventsConfigApiResponse(jsonData);\n\n this.#cachedEventsConfigResponse = jsonData;\n\n return {\n data: jsonData,\n etag,\n modified: true,\n };\n }\n}\n"]}
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"]}
@@ -491,33 +491,6 @@ export declare const RegistryConfigApiResponseSchema: import("@metamask/superstr
491
491
  export type RegistryNetworkConfig = Infer<typeof RegistryNetworkConfigSchema>;
492
492
  export type RegistryConfigApiResponse = Infer<typeof RegistryConfigApiResponseSchema>;
493
493
  export declare function validateRegistryConfigApiResponse(data: unknown): asserts data is RegistryConfigApiResponse;
494
- /**
495
- * Schema for the events-config API response.
496
- * Maps event names to their allowed analytics purposes.
497
- */
498
- export declare const RegistryEventsConfigApiResponseSchema: import("@metamask/superstruct").Struct<{
499
- data: {
500
- schemaVersion: string;
501
- version: string;
502
- timestamp: number;
503
- events: Record<string, string[]>;
504
- };
505
- }, {
506
- data: import("@metamask/superstruct").Struct<{
507
- schemaVersion: string;
508
- version: string;
509
- timestamp: number;
510
- events: Record<string, string[]>;
511
- }, {
512
- schemaVersion: import("@metamask/superstruct").Struct<string, null>;
513
- version: import("@metamask/superstruct").Struct<string, null>;
514
- timestamp: import("@metamask/superstruct").Struct<number, null>;
515
- events: import("@metamask/superstruct").Struct<Record<string, string[]>, null>;
516
- }>;
517
- }>;
518
- export type RegistryEventsConfigApiResponse = Infer<typeof RegistryEventsConfigApiResponseSchema>;
519
- export type RegistryEventsConfig = RegistryEventsConfigApiResponse['data'];
520
- export declare function validateRegistryEventsConfigApiResponse(data: unknown): asserts data is RegistryEventsConfigApiResponse;
521
494
  export type FetchConfigOptions = {
522
495
  etag?: string;
523
496
  };
@@ -534,13 +507,4 @@ export type FetchConfigResult = {
534
507
  data: RegistryConfigApiResponse;
535
508
  etag?: string;
536
509
  };
537
- export type FetchEventsConfigResult = {
538
- modified: false;
539
- etag?: string;
540
- data?: RegistryEventsConfigApiResponse;
541
- } | {
542
- modified: true;
543
- data: RegistryEventsConfigApiResponse;
544
- etag?: string;
545
- };
546
510
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config-registry-api-service/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AA2DnD;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWtC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM1C,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE9E,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAC3C,OAAO,+BAA+B,CACvC,CAAC;AAEF,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,IAAI,yBAAyB,CAE3C;AAED;;;GAGG;AACH,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;EAOhD,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG,KAAK,CACjD,OAAO,qCAAqC,CAC7C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,+BAA+B,CAAC,MAAM,CAAC,CAAC;AAE3E,wBAAgB,uCAAuC,CACrD,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,IAAI,+BAA+B,CAEjD;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IACE,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,yBAAyB,CAAC;CAClC,GACD;IACE,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,yBAAyB,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,uBAAuB,GAC/B;IACE,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,+BAA+B,CAAC;CACxC,GACD;IACE,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,+BAA+B,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config-registry-api-service/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AA0DnD;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWtC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM1C,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE9E,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAC3C,OAAO,+BAA+B,CACvC,CAAC;AAEF,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,IAAI,yBAAyB,CAE3C;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IACE,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,yBAAyB,CAAC;CAClC,GACD;IACE,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,yBAAyB,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
@@ -1,4 +1,4 @@
1
- import { array, assert, boolean, number, optional, record, string, type, } from '@metamask/superstruct';
1
+ import { array, assert, boolean, number, optional, string, type, } from '@metamask/superstruct';
2
2
  import { CaipChainIdStruct, StrictHexStruct } from '@metamask/utils';
3
3
  const AssetSchema = type({
4
4
  assetId: string(),
@@ -68,19 +68,4 @@ export const RegistryConfigApiResponseSchema = type({
68
68
  export function validateRegistryConfigApiResponse(data) {
69
69
  assert(data, RegistryConfigApiResponseSchema);
70
70
  }
71
- /**
72
- * Schema for the events-config API response.
73
- * Maps event names to their allowed analytics purposes.
74
- */
75
- export const RegistryEventsConfigApiResponseSchema = type({
76
- data: type({
77
- schemaVersion: string(),
78
- version: string(),
79
- timestamp: number(),
80
- events: record(string(), array(string())),
81
- }),
82
- });
83
- export function validateRegistryEventsConfigApiResponse(data) {
84
- assert(data, RegistryEventsConfigApiResponseSchema);
85
- }
86
71
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config-registry-api-service/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Infer } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n number,\n optional,\n record,\n string,\n type,\n} from '@metamask/superstruct';\nimport { CaipChainIdStruct, StrictHexStruct } from '@metamask/utils';\n\nconst AssetSchema = type({\n assetId: string(),\n imageUrl: string(),\n name: string(),\n symbol: string(),\n decimals: number(),\n coingeckoCoinId: optional(string()),\n});\n\nconst AssetsSchema = type({\n listUrl: optional(string()),\n native: AssetSchema,\n governance: optional(AssetSchema),\n});\n\nconst RpcProviderSchema = type({\n url: string(),\n type: string(),\n networkClientId: string(),\n});\n\nconst RpcProvidersSchema = type({\n default: RpcProviderSchema,\n fallbacks: array(string()),\n});\n\nconst BlockExplorerUrlsSchema = type({\n default: string(),\n fallbacks: array(string()),\n});\n\nconst ChainConfigSchema = type({\n isActive: boolean(),\n isTestnet: boolean(),\n isDefault: boolean(),\n isFeatured: boolean(),\n isDeprecated: boolean(),\n isDeletable: boolean(),\n isAutoEnabled: optional(boolean()),\n priority: number(),\n});\n\nconst NetworkContractsSchema = type({\n multicall3: optional(StrictHexStruct),\n});\n\n/**\n * Schema for a single chain in the CAIP-2 config registry API response.\n * chainId is in CAIP-2 format (e.g. \"eip155:1\", \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\").\n */\nexport const RegistryNetworkConfigSchema = type({\n chainId: CaipChainIdStruct,\n name: string(),\n imageUrl: string(),\n coingeckoPlatformId: string(),\n geckoTerminalPlatformId: optional(string()),\n assets: AssetsSchema,\n rpcProviders: RpcProvidersSchema,\n blockExplorerUrls: BlockExplorerUrlsSchema,\n config: ChainConfigSchema,\n contracts: optional(NetworkContractsSchema),\n});\n\n/**\n * Top-level API response shape. Uses `data.chains` (CAIP-2) and `data.version`.\n */\nexport const RegistryConfigApiResponseSchema = type({\n data: type({\n version: string(),\n timestamp: number(),\n chains: array(RegistryNetworkConfigSchema),\n }),\n});\n\nexport type RegistryNetworkConfig = Infer<typeof RegistryNetworkConfigSchema>;\n\nexport type RegistryConfigApiResponse = Infer<\n typeof RegistryConfigApiResponseSchema\n>;\n\nexport function validateRegistryConfigApiResponse(\n data: unknown,\n): asserts data is RegistryConfigApiResponse {\n assert(data, RegistryConfigApiResponseSchema);\n}\n\n/**\n * Schema for the events-config API response.\n * Maps event names to their allowed analytics purposes.\n */\nexport const RegistryEventsConfigApiResponseSchema = type({\n data: type({\n schemaVersion: string(),\n version: string(),\n timestamp: number(),\n events: record(string(), array(string())),\n }),\n});\n\nexport type RegistryEventsConfigApiResponse = Infer<\n typeof RegistryEventsConfigApiResponseSchema\n>;\n\nexport type RegistryEventsConfig = RegistryEventsConfigApiResponse['data'];\n\nexport function validateRegistryEventsConfigApiResponse(\n data: unknown,\n): asserts data is RegistryEventsConfigApiResponse {\n assert(data, RegistryEventsConfigApiResponseSchema);\n}\n\nexport type FetchConfigOptions = {\n etag?: string;\n};\n\nexport type FetchConfigResult =\n | {\n modified: false;\n etag?: string;\n /**\n * Cached data from the service when available (e.g. after a previous\n * successful fetch). Omitted when the service has no cache yet.\n */\n data?: RegistryConfigApiResponse;\n }\n | {\n modified: true;\n data: RegistryConfigApiResponse;\n etag?: string;\n };\n\nexport type FetchEventsConfigResult =\n | {\n modified: false;\n etag?: string;\n data?: RegistryEventsConfigApiResponse;\n }\n | {\n modified: true;\n data: RegistryEventsConfigApiResponse;\n etag?: string;\n };\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config-registry-api-service/types.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,IAAI,GACL,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAErE,MAAM,WAAW,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE;IACjB,QAAQ,EAAE,MAAM,EAAE;IAClB,IAAI,EAAE,MAAM,EAAE;IACd,MAAM,EAAE,MAAM,EAAE;IAChB,QAAQ,EAAE,MAAM,EAAE;IAClB,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,MAAM,EAAE;IACb,IAAI,EAAE,MAAM,EAAE;IACd,eAAe,EAAE,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,iBAAiB;IAC1B,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,EAAE;IACjB,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,EAAE;IACnB,SAAS,EAAE,OAAO,EAAE;IACpB,SAAS,EAAE,OAAO,EAAE;IACpB,UAAU,EAAE,OAAO,EAAE;IACrB,YAAY,EAAE,OAAO,EAAE;IACvB,WAAW,EAAE,OAAO,EAAE;IACtB,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAClC,QAAQ,EAAE,MAAM,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC;CACtC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;IAC9C,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,MAAM,EAAE;IACd,QAAQ,EAAE,MAAM,EAAE;IAClB,mBAAmB,EAAE,MAAM,EAAE;IAC7B,uBAAuB,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,EAAE,YAAY;IACpB,YAAY,EAAE,kBAAkB;IAChC,iBAAiB,EAAE,uBAAuB;IAC1C,MAAM,EAAE,iBAAiB;IACzB,SAAS,EAAE,QAAQ,CAAC,sBAAsB,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC;IAClD,IAAI,EAAE,IAAI,CAAC;QACT,OAAO,EAAE,MAAM,EAAE;QACjB,SAAS,EAAE,MAAM,EAAE;QACnB,MAAM,EAAE,KAAK,CAAC,2BAA2B,CAAC;KAC3C,CAAC;CACH,CAAC,CAAC;AAQH,MAAM,UAAU,iCAAiC,CAC/C,IAAa;IAEb,MAAM,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import type { Infer } from '@metamask/superstruct';\nimport {\n array,\n assert,\n boolean,\n number,\n optional,\n string,\n type,\n} from '@metamask/superstruct';\nimport { CaipChainIdStruct, StrictHexStruct } from '@metamask/utils';\n\nconst AssetSchema = type({\n assetId: string(),\n imageUrl: string(),\n name: string(),\n symbol: string(),\n decimals: number(),\n coingeckoCoinId: optional(string()),\n});\n\nconst AssetsSchema = type({\n listUrl: optional(string()),\n native: AssetSchema,\n governance: optional(AssetSchema),\n});\n\nconst RpcProviderSchema = type({\n url: string(),\n type: string(),\n networkClientId: string(),\n});\n\nconst RpcProvidersSchema = type({\n default: RpcProviderSchema,\n fallbacks: array(string()),\n});\n\nconst BlockExplorerUrlsSchema = type({\n default: string(),\n fallbacks: array(string()),\n});\n\nconst ChainConfigSchema = type({\n isActive: boolean(),\n isTestnet: boolean(),\n isDefault: boolean(),\n isFeatured: boolean(),\n isDeprecated: boolean(),\n isDeletable: boolean(),\n isAutoEnabled: optional(boolean()),\n priority: number(),\n});\n\nconst NetworkContractsSchema = type({\n multicall3: optional(StrictHexStruct),\n});\n\n/**\n * Schema for a single chain in the CAIP-2 config registry API response.\n * chainId is in CAIP-2 format (e.g. \"eip155:1\", \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\").\n */\nexport const RegistryNetworkConfigSchema = type({\n chainId: CaipChainIdStruct,\n name: string(),\n imageUrl: string(),\n coingeckoPlatformId: string(),\n geckoTerminalPlatformId: optional(string()),\n assets: AssetsSchema,\n rpcProviders: RpcProvidersSchema,\n blockExplorerUrls: BlockExplorerUrlsSchema,\n config: ChainConfigSchema,\n contracts: optional(NetworkContractsSchema),\n});\n\n/**\n * Top-level API response shape. Uses `data.chains` (CAIP-2) and `data.version`.\n */\nexport const RegistryConfigApiResponseSchema = type({\n data: type({\n version: string(),\n timestamp: number(),\n chains: array(RegistryNetworkConfigSchema),\n }),\n});\n\nexport type RegistryNetworkConfig = Infer<typeof RegistryNetworkConfigSchema>;\n\nexport type RegistryConfigApiResponse = Infer<\n typeof RegistryConfigApiResponseSchema\n>;\n\nexport function validateRegistryConfigApiResponse(\n data: unknown,\n): asserts data is RegistryConfigApiResponse {\n assert(data, RegistryConfigApiResponseSchema);\n}\n\nexport type FetchConfigOptions = {\n etag?: string;\n};\n\nexport type FetchConfigResult =\n | {\n modified: false;\n etag?: string;\n /**\n * Cached data from the service when available (e.g. after a previous\n * successful fetch). Omitted when the service has no cache yet.\n */\n data?: RegistryConfigApiResponse;\n }\n | {\n modified: true;\n data: RegistryConfigApiResponse;\n etag?: string;\n };\n"]}
package/dist/index.d.ts CHANGED
@@ -2,9 +2,9 @@ export type { ConfigRegistryControllerState, ConfigRegistryControllerOptions, Co
2
2
  export type { ConfigRegistryControllerStartPollingAction, ConfigRegistryControllerStopPollingAction, ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction, } from './ConfigRegistryController-method-action-types.js';
3
3
  export { ConfigRegistryController, DEFAULT_POLLING_INTERVAL, } from './ConfigRegistryController.js';
4
4
  export { selectFeaturedNetworks, selectNetworks, selectEvmAutoEnabledNetworksChainIds, } from './selectors.js';
5
- export type { FetchConfigOptions, FetchConfigResult, FetchEventsConfigResult, RegistryNetworkConfig, RegistryConfigApiResponse, RegistryEventsConfig, RegistryEventsConfigApiResponse, } from './config-registry-api-service/types.js';
5
+ export type { FetchConfigOptions, FetchConfigResult, RegistryNetworkConfig, RegistryConfigApiResponse, } from './config-registry-api-service/types.js';
6
6
  export type { ConfigRegistryApiServiceOptions, ConfigRegistryApiServiceActions, ConfigRegistryApiServiceEvents, ConfigRegistryApiServiceMessenger, } from './config-registry-api-service/config-registry-api-service.js';
7
- export type { ConfigRegistryApiServiceFetchConfigAction, ConfigRegistryApiServiceFetchEventsConfigAction, ConfigRegistryApiServiceMethodActions, } from './config-registry-api-service/config-registry-api-service-method-action-types.js';
7
+ export type { ConfigRegistryApiServiceFetchConfigAction, ConfigRegistryApiServiceMethodActions, } from './config-registry-api-service/config-registry-api-service-method-action-types.js';
8
8
  export type { NetworkFilterOptions } from './config-registry-api-service/filters.js';
9
9
  export { ConfigRegistryApiService, ConfigRegistryApiEnv, } from './config-registry-api-service/config-registry-api-service.js';
10
10
  export { filterNetworks } from './config-registry-api-service/filters.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAC/B,sCAAsC,EACtC,yCAAyC,EACzC,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,0CAA0C,EAC1C,yCAAyC,EACzC,4DAA4D,GAC7D,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,oCAAoC,GACrC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,+BAA+B,EAC/B,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,8DAA8D,CAAC;AACtE,YAAY,EACV,yCAAyC,EACzC,+CAA+C,EAC/C,qCAAqC,GACtC,MAAM,kFAAkF,CAAC;AAC1F,YAAY,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAC/B,sCAAsC,EACtC,yCAAyC,EACzC,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,0CAA0C,EAC1C,yCAAyC,EACzC,4DAA4D,GAC7D,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,oCAAoC,GACrC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,+BAA+B,EAC/B,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,8DAA8D,CAAC;AACtE,YAAY,EACV,yCAAyC,EACzC,qCAAqC,GACtC,MAAM,kFAAkF,CAAC;AAC1F,YAAY,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,oCAAoC,GACrC,MAAM,gBAAgB,CAAC;AAsBxB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC","sourcesContent":["export type {\n ConfigRegistryControllerState,\n ConfigRegistryControllerOptions,\n ConfigRegistryControllerActions,\n ConfigRegistryControllerGetStateAction,\n ConfigRegistryControllerStateChangedEvent,\n ConfigRegistryControllerEvents,\n ConfigRegistryControllerMessenger,\n} from './ConfigRegistryController.js';\nexport type {\n ConfigRegistryControllerStartPollingAction,\n ConfigRegistryControllerStopPollingAction,\n ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction,\n} from './ConfigRegistryController-method-action-types.js';\nexport {\n ConfigRegistryController,\n DEFAULT_POLLING_INTERVAL,\n} from './ConfigRegistryController.js';\nexport {\n selectFeaturedNetworks,\n selectNetworks,\n selectEvmAutoEnabledNetworksChainIds,\n} from './selectors.js';\nexport type {\n FetchConfigOptions,\n FetchConfigResult,\n FetchEventsConfigResult,\n RegistryNetworkConfig,\n RegistryConfigApiResponse,\n RegistryEventsConfig,\n RegistryEventsConfigApiResponse,\n} from './config-registry-api-service/types.js';\nexport type {\n ConfigRegistryApiServiceOptions,\n ConfigRegistryApiServiceActions,\n ConfigRegistryApiServiceEvents,\n ConfigRegistryApiServiceMessenger,\n} from './config-registry-api-service/config-registry-api-service.js';\nexport type {\n ConfigRegistryApiServiceFetchConfigAction,\n ConfigRegistryApiServiceFetchEventsConfigAction,\n ConfigRegistryApiServiceMethodActions,\n} from './config-registry-api-service/config-registry-api-service-method-action-types.js';\nexport type { NetworkFilterOptions } from './config-registry-api-service/filters.js';\nexport {\n ConfigRegistryApiService,\n ConfigRegistryApiEnv,\n} from './config-registry-api-service/config-registry-api-service.js';\nexport { filterNetworks } from './config-registry-api-service/filters.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,oCAAoC,GACrC,MAAM,gBAAgB,CAAC;AAkBxB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC","sourcesContent":["export type {\n ConfigRegistryControllerState,\n ConfigRegistryControllerOptions,\n ConfigRegistryControllerActions,\n ConfigRegistryControllerGetStateAction,\n ConfigRegistryControllerStateChangedEvent,\n ConfigRegistryControllerEvents,\n ConfigRegistryControllerMessenger,\n} from './ConfigRegistryController.js';\nexport type {\n ConfigRegistryControllerStartPollingAction,\n ConfigRegistryControllerStopPollingAction,\n ConfigRegistryControllerGetNetworkConfigByCaip2ChainIdAction,\n} from './ConfigRegistryController-method-action-types.js';\nexport {\n ConfigRegistryController,\n DEFAULT_POLLING_INTERVAL,\n} from './ConfigRegistryController.js';\nexport {\n selectFeaturedNetworks,\n selectNetworks,\n selectEvmAutoEnabledNetworksChainIds,\n} from './selectors.js';\nexport type {\n FetchConfigOptions,\n FetchConfigResult,\n RegistryNetworkConfig,\n RegistryConfigApiResponse,\n} from './config-registry-api-service/types.js';\nexport type {\n ConfigRegistryApiServiceOptions,\n ConfigRegistryApiServiceActions,\n ConfigRegistryApiServiceEvents,\n ConfigRegistryApiServiceMessenger,\n} from './config-registry-api-service/config-registry-api-service.js';\nexport type {\n ConfigRegistryApiServiceFetchConfigAction,\n ConfigRegistryApiServiceMethodActions,\n} from './config-registry-api-service/config-registry-api-service-method-action-types.js';\nexport type { NetworkFilterOptions } from './config-registry-api-service/filters.js';\nexport {\n ConfigRegistryApiService,\n ConfigRegistryApiEnv,\n} from './config-registry-api-service/config-registry-api-service.js';\nexport { filterNetworks } from './config-registry-api-service/filters.js';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/config-registry-controller",
3
- "version": "4.0.0-preview-85a915769",
3
+ "version": "4.0.0-preview-e45297452",
4
4
  "description": "Manages configuration registry for MetaMask",
5
5
  "keywords": [
6
6
  "Ethereum",