@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
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _ConfigRegistryApiService_policy, _ConfigRegistryApiService_apiBaseUrl, _ConfigRegistryApiService_endpointPath, _ConfigRegistryApiService_timeout, _ConfigRegistryApiService_fetch;
|
|
13
|
+
import { createServicePolicy, DEFAULT_CIRCUIT_BREAK_DURATION, DEFAULT_DEGRADED_THRESHOLD, DEFAULT_MAX_CONSECUTIVE_FAILURES, DEFAULT_MAX_RETRIES } from "@metamask/controller-utils";
|
|
14
|
+
export const DEFAULT_API_BASE_URL = 'https://client-config.uat-api.cx.metamask.io/v1';
|
|
15
|
+
export const DEFAULT_ENDPOINT_PATH = '/config/networks';
|
|
16
|
+
export const DEFAULT_TIMEOUT = 10 * 1000;
|
|
17
|
+
export class ConfigRegistryApiService {
|
|
18
|
+
/**
|
|
19
|
+
* Construct a Config Registry API Service.
|
|
20
|
+
*
|
|
21
|
+
* @param options - The options for constructing the service.
|
|
22
|
+
* @param options.apiBaseUrl - The base URL for the API. Defaults to the UAT API URL.
|
|
23
|
+
* @param options.endpointPath - The endpoint path. Defaults to '/config/networks'.
|
|
24
|
+
* @param options.timeout - Timeout for HTTP requests in milliseconds. Defaults to 10 seconds.
|
|
25
|
+
* @param options.fetch - Custom fetch function for testing or custom implementations. Defaults to the global fetch.
|
|
26
|
+
* @param options.degradedThreshold - The length of time (in milliseconds) that governs when the service is regarded as degraded. Defaults to 5 seconds.
|
|
27
|
+
* @param options.retries - Number of retry attempts for each fetch request. Defaults to 3.
|
|
28
|
+
* @param options.maximumConsecutiveFailures - The maximum number of consecutive failures allowed before breaking the circuit. Defaults to 3.
|
|
29
|
+
* @param options.circuitBreakDuration - The amount of time to wait when the circuit breaks from too many consecutive failures. Defaults to 2 minutes.
|
|
30
|
+
*/
|
|
31
|
+
constructor({ apiBaseUrl = DEFAULT_API_BASE_URL, endpointPath = DEFAULT_ENDPOINT_PATH, timeout = DEFAULT_TIMEOUT, fetch: customFetch = globalThis.fetch, degradedThreshold = DEFAULT_DEGRADED_THRESHOLD, retries = DEFAULT_MAX_RETRIES, maximumConsecutiveFailures = DEFAULT_MAX_CONSECUTIVE_FAILURES, circuitBreakDuration = DEFAULT_CIRCUIT_BREAK_DURATION, } = {}) {
|
|
32
|
+
_ConfigRegistryApiService_policy.set(this, void 0);
|
|
33
|
+
_ConfigRegistryApiService_apiBaseUrl.set(this, void 0);
|
|
34
|
+
_ConfigRegistryApiService_endpointPath.set(this, void 0);
|
|
35
|
+
_ConfigRegistryApiService_timeout.set(this, void 0);
|
|
36
|
+
_ConfigRegistryApiService_fetch.set(this, void 0);
|
|
37
|
+
__classPrivateFieldSet(this, _ConfigRegistryApiService_apiBaseUrl, apiBaseUrl, "f");
|
|
38
|
+
__classPrivateFieldSet(this, _ConfigRegistryApiService_endpointPath, endpointPath, "f");
|
|
39
|
+
__classPrivateFieldSet(this, _ConfigRegistryApiService_timeout, timeout, "f");
|
|
40
|
+
__classPrivateFieldSet(this, _ConfigRegistryApiService_fetch, customFetch, "f");
|
|
41
|
+
__classPrivateFieldSet(this, _ConfigRegistryApiService_policy, createServicePolicy({
|
|
42
|
+
maxRetries: retries,
|
|
43
|
+
maxConsecutiveFailures: maximumConsecutiveFailures,
|
|
44
|
+
circuitBreakDuration,
|
|
45
|
+
degradedThreshold,
|
|
46
|
+
}), "f");
|
|
47
|
+
}
|
|
48
|
+
onBreak(...args) {
|
|
49
|
+
return __classPrivateFieldGet(this, _ConfigRegistryApiService_policy, "f").onBreak(...args);
|
|
50
|
+
}
|
|
51
|
+
onDegraded(...args) {
|
|
52
|
+
return __classPrivateFieldGet(this, _ConfigRegistryApiService_policy, "f").onDegraded(...args);
|
|
53
|
+
}
|
|
54
|
+
async fetchConfig(options = {}) {
|
|
55
|
+
const baseUrl = __classPrivateFieldGet(this, _ConfigRegistryApiService_apiBaseUrl, "f").endsWith('/')
|
|
56
|
+
? __classPrivateFieldGet(this, _ConfigRegistryApiService_apiBaseUrl, "f").slice(0, -1)
|
|
57
|
+
: __classPrivateFieldGet(this, _ConfigRegistryApiService_apiBaseUrl, "f");
|
|
58
|
+
const endpointPath = __classPrivateFieldGet(this, _ConfigRegistryApiService_endpointPath, "f").startsWith('/')
|
|
59
|
+
? __classPrivateFieldGet(this, _ConfigRegistryApiService_endpointPath, "f")
|
|
60
|
+
: `/${__classPrivateFieldGet(this, _ConfigRegistryApiService_endpointPath, "f")}`;
|
|
61
|
+
const url = new URL(`${baseUrl}${endpointPath}`);
|
|
62
|
+
const headers = {
|
|
63
|
+
'Cache-Control': 'no-cache',
|
|
64
|
+
};
|
|
65
|
+
if (options.etag) {
|
|
66
|
+
headers['If-None-Match'] = options.etag;
|
|
67
|
+
}
|
|
68
|
+
const fetchWithTimeout = async () => {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timeoutId = setTimeout(() => controller.abort(), __classPrivateFieldGet(this, _ConfigRegistryApiService_timeout, "f"));
|
|
71
|
+
try {
|
|
72
|
+
const response = await __classPrivateFieldGet(this, _ConfigRegistryApiService_fetch, "f").call(this, url.toString(), {
|
|
73
|
+
headers,
|
|
74
|
+
signal: controller.signal,
|
|
75
|
+
});
|
|
76
|
+
clearTimeout(timeoutId);
|
|
77
|
+
return response;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
clearTimeout(timeoutId);
|
|
81
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
82
|
+
throw new Error(`Request timeout after ${__classPrivateFieldGet(this, _ConfigRegistryApiService_timeout, "f")}ms`);
|
|
83
|
+
}
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const response = await __classPrivateFieldGet(this, _ConfigRegistryApiService_policy, "f").execute(async () => {
|
|
88
|
+
const res = await fetchWithTimeout();
|
|
89
|
+
if (res.status === 304) {
|
|
90
|
+
return {
|
|
91
|
+
status: 304,
|
|
92
|
+
headers: res.headers,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (!res.ok) {
|
|
96
|
+
throw new Error(`Failed to fetch config: ${res.status} ${res.statusText}`);
|
|
97
|
+
}
|
|
98
|
+
return res;
|
|
99
|
+
});
|
|
100
|
+
if (response.status === 304) {
|
|
101
|
+
const etag = response.headers.get('ETag') ?? undefined;
|
|
102
|
+
return {
|
|
103
|
+
notModified: true,
|
|
104
|
+
etag,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const etag = response.headers.get('ETag') ?? undefined;
|
|
108
|
+
const data = (await response.json());
|
|
109
|
+
if (!data?.data || !Array.isArray(data.data.networks)) {
|
|
110
|
+
throw new Error('Invalid response structure from config registry API');
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
data,
|
|
114
|
+
etag,
|
|
115
|
+
notModified: false,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
_ConfigRegistryApiService_policy = new WeakMap(), _ConfigRegistryApiService_apiBaseUrl = new WeakMap(), _ConfigRegistryApiService_endpointPath = new WeakMap(), _ConfigRegistryApiService_timeout = new WeakMap(), _ConfigRegistryApiService_fetch = new WeakMap();
|
|
120
|
+
//# sourceMappingURL=config-registry-api-service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-registry-api-service.mjs","sourceRoot":"","sources":["../../src/config-registry-api-service/config-registry-api-service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createServicePolicy,\n DEFAULT_CIRCUIT_BREAK_DURATION,\n DEFAULT_DEGRADED_THRESHOLD,\n DEFAULT_MAX_CONSECUTIVE_FAILURES,\n DEFAULT_MAX_RETRIES,\n} from '@metamask/controller-utils';\nimport type { ServicePolicy } from '@metamask/controller-utils';\n\nimport type {\n AbstractConfigRegistryApiService,\n FetchConfigOptions,\n FetchConfigResult,\n RegistryConfigApiResponse,\n} from './abstract-config-registry-api-service';\n\nexport const DEFAULT_API_BASE_URL =\n 'https://client-config.uat-api.cx.metamask.io/v1';\n\nexport const DEFAULT_ENDPOINT_PATH = '/config/networks';\n\nexport const DEFAULT_TIMEOUT = 10 * 1000;\n\nexport type ConfigRegistryApiServiceOptions = {\n apiBaseUrl?: string;\n endpointPath?: string;\n timeout?: number;\n fetch?: typeof fetch;\n degradedThreshold?: number;\n retries?: number;\n maximumConsecutiveFailures?: number;\n circuitBreakDuration?: number;\n};\n\nexport class ConfigRegistryApiService\n implements AbstractConfigRegistryApiService\n{\n readonly #policy: ServicePolicy;\n\n readonly #apiBaseUrl: string;\n\n readonly #endpointPath: string;\n\n readonly #timeout: number;\n\n readonly #fetch: typeof fetch;\n\n /**\n * Construct a Config Registry API Service.\n *\n * @param options - The options for constructing the service.\n * @param options.apiBaseUrl - The base URL for the API. Defaults to the UAT API URL.\n * @param options.endpointPath - The endpoint path. Defaults to '/config/networks'.\n * @param options.timeout - Timeout for HTTP requests in milliseconds. Defaults to 10 seconds.\n * @param options.fetch - Custom fetch function for testing or custom implementations. Defaults to the global fetch.\n * @param options.degradedThreshold - The length of time (in milliseconds) that governs when the service is regarded as degraded. Defaults to 5 seconds.\n * @param options.retries - Number of retry attempts for each fetch request. Defaults to 3.\n * @param options.maximumConsecutiveFailures - The maximum number of consecutive failures allowed before breaking the circuit. Defaults to 3.\n * @param options.circuitBreakDuration - The amount of time to wait when the circuit breaks from too many consecutive failures. Defaults to 2 minutes.\n */\n constructor({\n apiBaseUrl = DEFAULT_API_BASE_URL,\n endpointPath = DEFAULT_ENDPOINT_PATH,\n timeout = DEFAULT_TIMEOUT,\n fetch: customFetch = globalThis.fetch,\n degradedThreshold = DEFAULT_DEGRADED_THRESHOLD,\n retries = DEFAULT_MAX_RETRIES,\n maximumConsecutiveFailures = DEFAULT_MAX_CONSECUTIVE_FAILURES,\n circuitBreakDuration = DEFAULT_CIRCUIT_BREAK_DURATION,\n }: ConfigRegistryApiServiceOptions = {}) {\n this.#apiBaseUrl = apiBaseUrl;\n this.#endpointPath = endpointPath;\n this.#timeout = timeout;\n this.#fetch = customFetch;\n\n this.#policy = createServicePolicy({\n maxRetries: retries,\n maxConsecutiveFailures: maximumConsecutiveFailures,\n circuitBreakDuration,\n degradedThreshold,\n });\n }\n\n onBreak(\n ...args: Parameters<ServicePolicy['onBreak']>\n ): ReturnType<ServicePolicy['onBreak']> {\n return this.#policy.onBreak(...args);\n }\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 baseUrl = this.#apiBaseUrl.endsWith('/')\n ? this.#apiBaseUrl.slice(0, -1)\n : this.#apiBaseUrl;\n const endpointPath = this.#endpointPath.startsWith('/')\n ? this.#endpointPath\n : `/${this.#endpointPath}`;\n const url = new URL(`${baseUrl}${endpointPath}`);\n\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 fetchWithTimeout = async (): Promise<Response> => {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.#timeout);\n\n try {\n const response = await this.#fetch(url.toString(), {\n headers,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.#timeout}ms`);\n }\n throw error;\n }\n };\n\n const response = await this.#policy.execute(async () => {\n const res = await fetchWithTimeout();\n\n if (res.status === 304) {\n return {\n status: 304,\n headers: res.headers,\n } as unknown as Response;\n }\n\n if (!res.ok) {\n throw new Error(\n `Failed to fetch config: ${res.status} ${res.statusText}`,\n );\n }\n\n return res;\n });\n\n if ((response as unknown as { status?: number }).status === 304) {\n const etag = response.headers.get('ETag') ?? undefined;\n return {\n notModified: true,\n etag,\n };\n }\n\n const etag = response.headers.get('ETag') ?? undefined;\n const data = (await response.json()) as RegistryConfigApiResponse;\n\n if (!data?.data || !Array.isArray(data.data.networks)) {\n throw new Error('Invalid response structure from config registry API');\n }\n\n return {\n data,\n etag,\n notModified: false,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processNetworkConfigs = exports.compareWithExistingNetworks = exports.filterNetworks = exports.transformNetworkConfig = exports.DEFAULT_TIMEOUT = exports.DEFAULT_ENDPOINT_PATH = exports.DEFAULT_API_BASE_URL = exports.ConfigRegistryApiService = void 0;
|
|
4
|
+
var config_registry_api_service_1 = require("./config-registry-api-service.cjs");
|
|
5
|
+
Object.defineProperty(exports, "ConfigRegistryApiService", { enumerable: true, get: function () { return config_registry_api_service_1.ConfigRegistryApiService; } });
|
|
6
|
+
Object.defineProperty(exports, "DEFAULT_API_BASE_URL", { enumerable: true, get: function () { return config_registry_api_service_1.DEFAULT_API_BASE_URL; } });
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_ENDPOINT_PATH", { enumerable: true, get: function () { return config_registry_api_service_1.DEFAULT_ENDPOINT_PATH; } });
|
|
8
|
+
Object.defineProperty(exports, "DEFAULT_TIMEOUT", { enumerable: true, get: function () { return config_registry_api_service_1.DEFAULT_TIMEOUT; } });
|
|
9
|
+
var transformers_1 = require("./transformers.cjs");
|
|
10
|
+
Object.defineProperty(exports, "transformNetworkConfig", { enumerable: true, get: function () { return transformers_1.transformNetworkConfig; } });
|
|
11
|
+
Object.defineProperty(exports, "filterNetworks", { enumerable: true, get: function () { return transformers_1.filterNetworks; } });
|
|
12
|
+
Object.defineProperty(exports, "compareWithExistingNetworks", { enumerable: true, get: function () { return transformers_1.compareWithExistingNetworks; } });
|
|
13
|
+
Object.defineProperty(exports, "processNetworkConfigs", { enumerable: true, get: function () { return transformers_1.processNetworkConfigs; } });
|
|
14
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/config-registry-api-service/index.ts"],"names":[],"mappings":";;;AAQA,iFAKuC;AAJrC,uIAAA,wBAAwB,OAAA;AACxB,mIAAA,oBAAoB,OAAA;AACpB,oIAAA,qBAAqB,OAAA;AACrB,8HAAA,eAAe,OAAA;AAUjB,mDAKwB;AAJtB,sHAAA,sBAAsB,OAAA;AACtB,8GAAA,cAAc,OAAA;AACd,2HAAA,2BAA2B,OAAA;AAC3B,qHAAA,qBAAqB,OAAA","sourcesContent":["export type {\n AbstractConfigRegistryApiService,\n FetchConfigOptions,\n FetchConfigResult,\n NetworkConfig,\n RegistryConfigApiResponse,\n} from './abstract-config-registry-api-service';\n\nexport {\n ConfigRegistryApiService,\n DEFAULT_API_BASE_URL,\n DEFAULT_ENDPOINT_PATH,\n DEFAULT_TIMEOUT,\n} from './config-registry-api-service';\n\nexport type { ConfigRegistryApiServiceOptions } from './config-registry-api-service';\n\nexport type {\n NetworkFilterOptions,\n NetworkComparisonOptions,\n TransformedNetworkResult,\n} from './transformers';\nexport {\n transformNetworkConfig,\n filterNetworks,\n compareWithExistingNetworks,\n processNetworkConfigs,\n} from './transformers';\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { AbstractConfigRegistryApiService, FetchConfigOptions, FetchConfigResult, NetworkConfig, RegistryConfigApiResponse, } from "./abstract-config-registry-api-service.cjs";
|
|
2
|
+
export { ConfigRegistryApiService, DEFAULT_API_BASE_URL, DEFAULT_ENDPOINT_PATH, DEFAULT_TIMEOUT, } from "./config-registry-api-service.cjs";
|
|
3
|
+
export type { ConfigRegistryApiServiceOptions } from "./config-registry-api-service.cjs";
|
|
4
|
+
export type { NetworkFilterOptions, NetworkComparisonOptions, TransformedNetworkResult, } from "./transformers.cjs";
|
|
5
|
+
export { transformNetworkConfig, filterNetworks, compareWithExistingNetworks, processNetworkConfigs, } from "./transformers.cjs";
|
|
6
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/config-registry-api-service/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,yBAAyB,GAC1B,mDAA+C;AAEhD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,0CAAsC;AAEvC,YAAY,EAAE,+BAA+B,EAAE,0CAAsC;AAErF,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,2BAAuB;AACxB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,GACtB,2BAAuB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { AbstractConfigRegistryApiService, FetchConfigOptions, FetchConfigResult, NetworkConfig, RegistryConfigApiResponse, } from "./abstract-config-registry-api-service.mjs";
|
|
2
|
+
export { ConfigRegistryApiService, DEFAULT_API_BASE_URL, DEFAULT_ENDPOINT_PATH, DEFAULT_TIMEOUT, } from "./config-registry-api-service.mjs";
|
|
3
|
+
export type { ConfigRegistryApiServiceOptions } from "./config-registry-api-service.mjs";
|
|
4
|
+
export type { NetworkFilterOptions, NetworkComparisonOptions, TransformedNetworkResult, } from "./transformers.mjs";
|
|
5
|
+
export { transformNetworkConfig, filterNetworks, compareWithExistingNetworks, processNetworkConfigs, } from "./transformers.mjs";
|
|
6
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/config-registry-api-service/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,yBAAyB,GAC1B,mDAA+C;AAEhD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,0CAAsC;AAEvC,YAAY,EAAE,+BAA+B,EAAE,0CAAsC;AAErF,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,2BAAuB;AACxB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,GACtB,2BAAuB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { ConfigRegistryApiService, DEFAULT_API_BASE_URL, DEFAULT_ENDPOINT_PATH, DEFAULT_TIMEOUT } from "./config-registry-api-service.mjs";
|
|
2
|
+
export { transformNetworkConfig, filterNetworks, compareWithExistingNetworks, processNetworkConfigs } from "./transformers.mjs";
|
|
3
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/config-registry-api-service/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EAChB,0CAAsC;AASvC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,EACtB,2BAAuB","sourcesContent":["export type {\n AbstractConfigRegistryApiService,\n FetchConfigOptions,\n FetchConfigResult,\n NetworkConfig,\n RegistryConfigApiResponse,\n} from './abstract-config-registry-api-service';\n\nexport {\n ConfigRegistryApiService,\n DEFAULT_API_BASE_URL,\n DEFAULT_ENDPOINT_PATH,\n DEFAULT_TIMEOUT,\n} from './config-registry-api-service';\n\nexport type { ConfigRegistryApiServiceOptions } from './config-registry-api-service';\n\nexport type {\n NetworkFilterOptions,\n NetworkComparisonOptions,\n TransformedNetworkResult,\n} from './transformers';\nexport {\n transformNetworkConfig,\n filterNetworks,\n compareWithExistingNetworks,\n processNetworkConfigs,\n} from './transformers';\n"]}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processNetworkConfigs = exports.compareWithExistingNetworks = exports.filterNetworks = exports.transformNetworkConfig = void 0;
|
|
4
|
+
const network_controller_1 = require("@metamask/network-controller");
|
|
5
|
+
/**
|
|
6
|
+
* @param chainId - The chain ID as a string.
|
|
7
|
+
* @returns The chain ID as Hex, or null if invalid.
|
|
8
|
+
*/
|
|
9
|
+
function toHexChainId(chainId) {
|
|
10
|
+
if (!chainId || typeof chainId !== 'string') {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const trimmed = chainId.trim();
|
|
14
|
+
if (trimmed.startsWith('0x') || trimmed.startsWith('0X')) {
|
|
15
|
+
const hexValue = trimmed.toLowerCase();
|
|
16
|
+
if (!/^0x[0-9a-f]+$/iu.test(hexValue)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return hexValue;
|
|
20
|
+
}
|
|
21
|
+
const decimal = Number.parseInt(trimmed, 10);
|
|
22
|
+
if (Number.isNaN(decimal) || decimal < 0) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return `0x${decimal.toString(16)}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @param endpoint - The RPC endpoint from the API.
|
|
29
|
+
* @returns The transformed RPC endpoint, or null if invalid.
|
|
30
|
+
*/
|
|
31
|
+
function transformRpcEndpoint(endpoint) {
|
|
32
|
+
if (!endpoint || typeof endpoint !== 'object') {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const { url, type, networkClientId, failoverUrls } = endpoint;
|
|
36
|
+
if (!url || typeof url !== 'string') {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (!type || typeof type !== 'string') {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (!networkClientId || typeof networkClientId !== 'string') {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const baseEndpoint = {
|
|
46
|
+
networkClientId,
|
|
47
|
+
failoverUrls: Array.isArray(failoverUrls)
|
|
48
|
+
? failoverUrls.filter((failoverUrl) => typeof failoverUrl === 'string')
|
|
49
|
+
: undefined,
|
|
50
|
+
};
|
|
51
|
+
if (type === 'infura') {
|
|
52
|
+
return {
|
|
53
|
+
...baseEndpoint,
|
|
54
|
+
type: network_controller_1.RpcEndpointType.Infura,
|
|
55
|
+
url: url,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (type === 'custom') {
|
|
59
|
+
return {
|
|
60
|
+
...baseEndpoint,
|
|
61
|
+
type: network_controller_1.RpcEndpointType.Custom,
|
|
62
|
+
url,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @param networkConfig - The network configuration from the API.
|
|
69
|
+
* @returns The transformed network configuration, or null if invalid.
|
|
70
|
+
*/
|
|
71
|
+
function transformNetworkConfig(networkConfig) {
|
|
72
|
+
if (!networkConfig || typeof networkConfig !== 'object') {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const chainId = toHexChainId(networkConfig.chainId);
|
|
76
|
+
if (!chainId) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const { name, nativeCurrency, rpcEndpoints, blockExplorerUrls } = networkConfig;
|
|
80
|
+
if (!name || typeof name !== 'string') {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (!nativeCurrency || typeof nativeCurrency !== 'string') {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
if (!Array.isArray(rpcEndpoints) || rpcEndpoints.length === 0) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
// Transform endpoints and track original indices to filtered indices mapping
|
|
90
|
+
const transformedEndpoints = [];
|
|
91
|
+
const originalToFilteredIndexMap = new Map();
|
|
92
|
+
rpcEndpoints.forEach((endpoint, originalIndex) => {
|
|
93
|
+
const transformed = transformRpcEndpoint(endpoint);
|
|
94
|
+
if (transformed !== null) {
|
|
95
|
+
originalToFilteredIndexMap.set(originalIndex, transformedEndpoints.length);
|
|
96
|
+
transformedEndpoints.push(transformed);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
if (transformedEndpoints.length === 0) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// Adjust defaultRpcEndpointIndex to account for filtered endpoints
|
|
103
|
+
const originalDefaultRpcEndpointIndex = networkConfig.defaultRpcEndpointIndex ?? 0;
|
|
104
|
+
const adjustedDefaultRpcEndpointIndex = originalToFilteredIndexMap.get(originalDefaultRpcEndpointIndex);
|
|
105
|
+
if (adjustedDefaultRpcEndpointIndex === undefined) {
|
|
106
|
+
// The original default index pointed to an invalid endpoint
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
if (!Array.isArray(blockExplorerUrls)) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
// Filter block explorer URLs and track original indices to filtered indices mapping
|
|
113
|
+
const validBlockExplorerUrls = [];
|
|
114
|
+
const blockExplorerOriginalToFilteredIndexMap = new Map();
|
|
115
|
+
blockExplorerUrls.forEach((blockExplorerUrl, originalIndex) => {
|
|
116
|
+
if (typeof blockExplorerUrl === 'string' && blockExplorerUrl.length > 0) {
|
|
117
|
+
blockExplorerOriginalToFilteredIndexMap.set(originalIndex, validBlockExplorerUrls.length);
|
|
118
|
+
validBlockExplorerUrls.push(blockExplorerUrl);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// Adjust defaultBlockExplorerUrlIndex to account for filtered URLs
|
|
122
|
+
const { defaultBlockExplorerUrlIndex } = networkConfig;
|
|
123
|
+
let adjustedDefaultBlockExplorerUrlIndex;
|
|
124
|
+
if (defaultBlockExplorerUrlIndex !== undefined) {
|
|
125
|
+
const adjusted = blockExplorerOriginalToFilteredIndexMap.get(defaultBlockExplorerUrlIndex);
|
|
126
|
+
if (adjusted === undefined) {
|
|
127
|
+
// The original default index pointed to an invalid URL
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
adjustedDefaultBlockExplorerUrlIndex = adjusted;
|
|
131
|
+
}
|
|
132
|
+
else if (validBlockExplorerUrls.length > 0) {
|
|
133
|
+
adjustedDefaultBlockExplorerUrlIndex = 0;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
chainId,
|
|
137
|
+
name,
|
|
138
|
+
nativeCurrency,
|
|
139
|
+
rpcEndpoints: transformedEndpoints,
|
|
140
|
+
blockExplorerUrls: validBlockExplorerUrls,
|
|
141
|
+
defaultRpcEndpointIndex: adjustedDefaultRpcEndpointIndex,
|
|
142
|
+
defaultBlockExplorerUrlIndex: adjustedDefaultBlockExplorerUrlIndex,
|
|
143
|
+
lastUpdatedAt: networkConfig.lastUpdatedAt,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
exports.transformNetworkConfig = transformNetworkConfig;
|
|
147
|
+
/**
|
|
148
|
+
* @param networks - Array of network configurations to filter.
|
|
149
|
+
* @param options - Filter options.
|
|
150
|
+
* @returns Filtered array of network configurations.
|
|
151
|
+
*/
|
|
152
|
+
function filterNetworks(networks, options = {}) {
|
|
153
|
+
if (!Array.isArray(networks)) {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
return networks.filter((network) => {
|
|
157
|
+
if (!network || typeof network !== 'object') {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
if (options.isFeatured !== undefined) {
|
|
161
|
+
if (network.isFeatured !== options.isFeatured) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (options.isTestnet !== undefined) {
|
|
166
|
+
if (network.isTestnet !== options.isTestnet) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (options.isActive !== undefined) {
|
|
171
|
+
if (network.isActive !== options.isActive) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (options.isDeprecated !== undefined) {
|
|
176
|
+
if (network.isDeprecated !== options.isDeprecated) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (options.isDefault !== undefined) {
|
|
181
|
+
if (network.isDefault !== options.isDefault) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
exports.filterNetworks = filterNetworks;
|
|
189
|
+
/**
|
|
190
|
+
* @param transformedNetworks - Array of transformed network configurations.
|
|
191
|
+
* @param options - Comparison options.
|
|
192
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
193
|
+
*/
|
|
194
|
+
function compareWithExistingNetworks(transformedNetworks, options) {
|
|
195
|
+
if (!Array.isArray(transformedNetworks)) {
|
|
196
|
+
return {
|
|
197
|
+
networksToAdd: [],
|
|
198
|
+
existingChainIds: [],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const { existingNetworks } = options;
|
|
202
|
+
if (!existingNetworks || typeof existingNetworks !== 'object') {
|
|
203
|
+
return {
|
|
204
|
+
networksToAdd: transformedNetworks,
|
|
205
|
+
existingChainIds: [],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const existingChainIds = new Set(Object.keys(existingNetworks));
|
|
209
|
+
const networksToAdd = [];
|
|
210
|
+
const foundExistingChainIds = [];
|
|
211
|
+
for (const network of transformedNetworks) {
|
|
212
|
+
if (!network?.chainId) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (existingChainIds.has(network.chainId)) {
|
|
216
|
+
foundExistingChainIds.push(network.chainId);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
networksToAdd.push(network);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
networksToAdd,
|
|
224
|
+
existingChainIds: foundExistingChainIds,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
exports.compareWithExistingNetworks = compareWithExistingNetworks;
|
|
228
|
+
/**
|
|
229
|
+
* @param networks - Array of network configurations from the API.
|
|
230
|
+
* @param filterOptions - Options for filtering networks.
|
|
231
|
+
* @param comparisonOptions - Options for comparing with existing networks.
|
|
232
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
233
|
+
*/
|
|
234
|
+
function processNetworkConfigs(networks, filterOptions = {}, comparisonOptions) {
|
|
235
|
+
if (!Array.isArray(networks) || networks.length === 0) {
|
|
236
|
+
return {
|
|
237
|
+
networksToAdd: [],
|
|
238
|
+
existingChainIds: [],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const filteredNetworks = filterNetworks(networks, filterOptions);
|
|
242
|
+
const transformedNetworks = filteredNetworks
|
|
243
|
+
.map(transformNetworkConfig)
|
|
244
|
+
.filter((network) => network !== null);
|
|
245
|
+
if (comparisonOptions) {
|
|
246
|
+
return compareWithExistingNetworks(transformedNetworks, comparisonOptions);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
networksToAdd: transformedNetworks,
|
|
250
|
+
existingChainIds: [],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
exports.processNetworkConfigs = processNetworkConfigs;
|
|
254
|
+
//# sourceMappingURL=transformers.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.cjs","sourceRoot":"","sources":["../../src/config-registry-api-service/transformers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkConfiguration } from '@metamask/network-controller';\nimport { RpcEndpointType } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport type { NetworkConfig } from './abstract-config-registry-api-service';\n\ntype RpcEndpoint = NetworkConfiguration['rpcEndpoints'][number];\n\nexport type NetworkFilterOptions = {\n isFeatured?: boolean;\n isTestnet?: boolean;\n isActive?: boolean;\n isDeprecated?: boolean;\n isDefault?: boolean;\n};\n\nexport type NetworkComparisonOptions = {\n existingNetworks: Record<Hex, NetworkConfiguration>;\n};\n\nexport type TransformedNetworkResult = {\n networksToAdd: NetworkConfiguration[];\n existingChainIds: Hex[];\n};\n\n/**\n * @param chainId - The chain ID as a string.\n * @returns The chain ID as Hex, or null if invalid.\n */\nfunction toHexChainId(chainId: string): Hex | null {\n if (!chainId || typeof chainId !== 'string') {\n return null;\n }\n\n const trimmed = chainId.trim();\n\n if (trimmed.startsWith('0x') || trimmed.startsWith('0X')) {\n const hexValue = trimmed.toLowerCase();\n if (!/^0x[0-9a-f]+$/iu.test(hexValue)) {\n return null;\n }\n return hexValue as Hex;\n }\n\n const decimal = Number.parseInt(trimmed, 10);\n if (Number.isNaN(decimal) || decimal < 0) {\n return null;\n }\n\n return `0x${decimal.toString(16)}`;\n}\n\n/**\n * @param endpoint - The RPC endpoint from the API.\n * @returns The transformed RPC endpoint, or null if invalid.\n */\nfunction transformRpcEndpoint(\n endpoint: NetworkConfig['rpcEndpoints'][0],\n): RpcEndpoint | null {\n if (!endpoint || typeof endpoint !== 'object') {\n return null;\n }\n\n const { url, type, networkClientId, failoverUrls } = endpoint;\n\n if (!url || typeof url !== 'string') {\n return null;\n }\n\n if (!type || typeof type !== 'string') {\n return null;\n }\n\n if (!networkClientId || typeof networkClientId !== 'string') {\n return null;\n }\n\n const baseEndpoint = {\n networkClientId,\n failoverUrls: Array.isArray(failoverUrls)\n ? failoverUrls.filter(\n (failoverUrl): failoverUrl is string =>\n typeof failoverUrl === 'string',\n )\n : undefined,\n };\n\n if (type === 'infura') {\n return {\n ...baseEndpoint,\n type: RpcEndpointType.Infura,\n url: url as `https://${string}.infura.io/v3/{infuraProjectId}`,\n } as RpcEndpoint;\n }\n\n if (type === 'custom') {\n return {\n ...baseEndpoint,\n type: RpcEndpointType.Custom,\n url,\n } as RpcEndpoint;\n }\n\n return null;\n}\n\n/**\n * @param networkConfig - The network configuration from the API.\n * @returns The transformed network configuration, or null if invalid.\n */\nexport function transformNetworkConfig(\n networkConfig: NetworkConfig,\n): NetworkConfiguration | null {\n if (!networkConfig || typeof networkConfig !== 'object') {\n return null;\n }\n\n const chainId = toHexChainId(networkConfig.chainId);\n if (!chainId) {\n return null;\n }\n\n const { name, nativeCurrency, rpcEndpoints, blockExplorerUrls } =\n networkConfig;\n\n if (!name || typeof name !== 'string') {\n return null;\n }\n\n if (!nativeCurrency || typeof nativeCurrency !== 'string') {\n return null;\n }\n\n if (!Array.isArray(rpcEndpoints) || rpcEndpoints.length === 0) {\n return null;\n }\n\n // Transform endpoints and track original indices to filtered indices mapping\n const transformedEndpoints: RpcEndpoint[] = [];\n const originalToFilteredIndexMap = new Map<number, number>();\n\n rpcEndpoints.forEach((endpoint, originalIndex) => {\n const transformed = transformRpcEndpoint(endpoint);\n if (transformed !== null) {\n originalToFilteredIndexMap.set(\n originalIndex,\n transformedEndpoints.length,\n );\n transformedEndpoints.push(transformed);\n }\n });\n\n if (transformedEndpoints.length === 0) {\n return null;\n }\n\n // Adjust defaultRpcEndpointIndex to account for filtered endpoints\n const originalDefaultRpcEndpointIndex =\n networkConfig.defaultRpcEndpointIndex ?? 0;\n const adjustedDefaultRpcEndpointIndex = originalToFilteredIndexMap.get(\n originalDefaultRpcEndpointIndex,\n );\n\n if (adjustedDefaultRpcEndpointIndex === undefined) {\n // The original default index pointed to an invalid endpoint\n return null;\n }\n\n if (!Array.isArray(blockExplorerUrls)) {\n return null;\n }\n\n // Filter block explorer URLs and track original indices to filtered indices mapping\n const validBlockExplorerUrls: string[] = [];\n const blockExplorerOriginalToFilteredIndexMap = new Map<number, number>();\n\n blockExplorerUrls.forEach((blockExplorerUrl, originalIndex) => {\n if (typeof blockExplorerUrl === 'string' && blockExplorerUrl.length > 0) {\n blockExplorerOriginalToFilteredIndexMap.set(\n originalIndex,\n validBlockExplorerUrls.length,\n );\n validBlockExplorerUrls.push(blockExplorerUrl);\n }\n });\n\n // Adjust defaultBlockExplorerUrlIndex to account for filtered URLs\n const { defaultBlockExplorerUrlIndex } = networkConfig;\n let adjustedDefaultBlockExplorerUrlIndex: number | undefined;\n\n if (defaultBlockExplorerUrlIndex !== undefined) {\n const adjusted = blockExplorerOriginalToFilteredIndexMap.get(\n defaultBlockExplorerUrlIndex,\n );\n\n if (adjusted === undefined) {\n // The original default index pointed to an invalid URL\n return null;\n }\n\n adjustedDefaultBlockExplorerUrlIndex = adjusted;\n } else if (validBlockExplorerUrls.length > 0) {\n adjustedDefaultBlockExplorerUrlIndex = 0;\n }\n\n return {\n chainId,\n name,\n nativeCurrency,\n rpcEndpoints: transformedEndpoints,\n blockExplorerUrls: validBlockExplorerUrls,\n defaultRpcEndpointIndex: adjustedDefaultRpcEndpointIndex,\n defaultBlockExplorerUrlIndex: adjustedDefaultBlockExplorerUrlIndex,\n lastUpdatedAt: networkConfig.lastUpdatedAt,\n };\n}\n\n/**\n * @param networks - Array of network configurations to filter.\n * @param options - Filter options.\n * @returns Filtered array of network configurations.\n */\nexport function filterNetworks(\n networks: NetworkConfig[],\n options: NetworkFilterOptions = {},\n): NetworkConfig[] {\n if (!Array.isArray(networks)) {\n return [];\n }\n\n return networks.filter((network) => {\n if (!network || typeof network !== 'object') {\n return false;\n }\n\n if (options.isFeatured !== undefined) {\n if (network.isFeatured !== options.isFeatured) {\n return false;\n }\n }\n\n if (options.isTestnet !== undefined) {\n if (network.isTestnet !== options.isTestnet) {\n return false;\n }\n }\n\n if (options.isActive !== undefined) {\n if (network.isActive !== options.isActive) {\n return false;\n }\n }\n\n if (options.isDeprecated !== undefined) {\n if (network.isDeprecated !== options.isDeprecated) {\n return false;\n }\n }\n\n if (options.isDefault !== undefined) {\n if (network.isDefault !== options.isDefault) {\n return false;\n }\n }\n\n return true;\n });\n}\n\n/**\n * @param transformedNetworks - Array of transformed network configurations.\n * @param options - Comparison options.\n * @returns Result containing networks to add and existing chain IDs.\n */\nexport function compareWithExistingNetworks(\n transformedNetworks: NetworkConfiguration[],\n options: NetworkComparisonOptions,\n): TransformedNetworkResult {\n if (!Array.isArray(transformedNetworks)) {\n return {\n networksToAdd: [],\n existingChainIds: [],\n };\n }\n\n const { existingNetworks } = options;\n\n if (!existingNetworks || typeof existingNetworks !== 'object') {\n return {\n networksToAdd: transformedNetworks,\n existingChainIds: [],\n };\n }\n\n const existingChainIds = new Set<Hex>(Object.keys(existingNetworks) as Hex[]);\n const networksToAdd: NetworkConfiguration[] = [];\n const foundExistingChainIds: Hex[] = [];\n\n for (const network of transformedNetworks) {\n if (!network?.chainId) {\n continue;\n }\n\n if (existingChainIds.has(network.chainId)) {\n foundExistingChainIds.push(network.chainId);\n } else {\n networksToAdd.push(network);\n }\n }\n\n return {\n networksToAdd,\n existingChainIds: foundExistingChainIds,\n };\n}\n\n/**\n * @param networks - Array of network configurations from the API.\n * @param filterOptions - Options for filtering networks.\n * @param comparisonOptions - Options for comparing with existing networks.\n * @returns Result containing networks to add and existing chain IDs.\n */\nexport function processNetworkConfigs(\n networks: NetworkConfig[],\n filterOptions: NetworkFilterOptions = {},\n comparisonOptions?: NetworkComparisonOptions,\n): TransformedNetworkResult {\n if (!Array.isArray(networks) || networks.length === 0) {\n return {\n networksToAdd: [],\n existingChainIds: [],\n };\n }\n\n const filteredNetworks = filterNetworks(networks, filterOptions);\n\n const transformedNetworks = filteredNetworks\n .map(transformNetworkConfig)\n .filter((network): network is NetworkConfiguration => network !== null);\n\n if (comparisonOptions) {\n return compareWithExistingNetworks(transformedNetworks, comparisonOptions);\n }\n\n return {\n networksToAdd: transformedNetworks,\n existingChainIds: [],\n };\n}\n"]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { NetworkConfiguration } from "@metamask/network-controller";
|
|
2
|
+
import type { Hex } from "@metamask/utils";
|
|
3
|
+
import type { NetworkConfig } from "./abstract-config-registry-api-service.cjs";
|
|
4
|
+
export type NetworkFilterOptions = {
|
|
5
|
+
isFeatured?: boolean;
|
|
6
|
+
isTestnet?: boolean;
|
|
7
|
+
isActive?: boolean;
|
|
8
|
+
isDeprecated?: boolean;
|
|
9
|
+
isDefault?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type NetworkComparisonOptions = {
|
|
12
|
+
existingNetworks: Record<Hex, NetworkConfiguration>;
|
|
13
|
+
};
|
|
14
|
+
export type TransformedNetworkResult = {
|
|
15
|
+
networksToAdd: NetworkConfiguration[];
|
|
16
|
+
existingChainIds: Hex[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @param networkConfig - The network configuration from the API.
|
|
20
|
+
* @returns The transformed network configuration, or null if invalid.
|
|
21
|
+
*/
|
|
22
|
+
export declare function transformNetworkConfig(networkConfig: NetworkConfig): NetworkConfiguration | null;
|
|
23
|
+
/**
|
|
24
|
+
* @param networks - Array of network configurations to filter.
|
|
25
|
+
* @param options - Filter options.
|
|
26
|
+
* @returns Filtered array of network configurations.
|
|
27
|
+
*/
|
|
28
|
+
export declare function filterNetworks(networks: NetworkConfig[], options?: NetworkFilterOptions): NetworkConfig[];
|
|
29
|
+
/**
|
|
30
|
+
* @param transformedNetworks - Array of transformed network configurations.
|
|
31
|
+
* @param options - Comparison options.
|
|
32
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
33
|
+
*/
|
|
34
|
+
export declare function compareWithExistingNetworks(transformedNetworks: NetworkConfiguration[], options: NetworkComparisonOptions): TransformedNetworkResult;
|
|
35
|
+
/**
|
|
36
|
+
* @param networks - Array of network configurations from the API.
|
|
37
|
+
* @param filterOptions - Options for filtering networks.
|
|
38
|
+
* @param comparisonOptions - Options for comparing with existing networks.
|
|
39
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
40
|
+
*/
|
|
41
|
+
export declare function processNetworkConfigs(networks: NetworkConfig[], filterOptions?: NetworkFilterOptions, comparisonOptions?: NetworkComparisonOptions): TransformedNetworkResult;
|
|
42
|
+
//# sourceMappingURL=transformers.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.d.cts","sourceRoot":"","sources":["../../src/config-registry-api-service/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AAEzE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,mDAA+C;AAI5E,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,gBAAgB,EAAE,MAAM,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,gBAAgB,EAAE,GAAG,EAAE,CAAC;CACzB,CAAC;AAmFF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,aAAa,GAC3B,oBAAoB,GAAG,IAAI,CAuG7B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,oBAAyB,GACjC,aAAa,EAAE,CA0CjB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,oBAAoB,EAAE,EAC3C,OAAO,EAAE,wBAAwB,GAChC,wBAAwB,CAqC1B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EAAE,EACzB,aAAa,GAAE,oBAAyB,EACxC,iBAAiB,CAAC,EAAE,wBAAwB,GAC3C,wBAAwB,CAsB1B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { NetworkConfiguration } from "@metamask/network-controller";
|
|
2
|
+
import type { Hex } from "@metamask/utils";
|
|
3
|
+
import type { NetworkConfig } from "./abstract-config-registry-api-service.mjs";
|
|
4
|
+
export type NetworkFilterOptions = {
|
|
5
|
+
isFeatured?: boolean;
|
|
6
|
+
isTestnet?: boolean;
|
|
7
|
+
isActive?: boolean;
|
|
8
|
+
isDeprecated?: boolean;
|
|
9
|
+
isDefault?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type NetworkComparisonOptions = {
|
|
12
|
+
existingNetworks: Record<Hex, NetworkConfiguration>;
|
|
13
|
+
};
|
|
14
|
+
export type TransformedNetworkResult = {
|
|
15
|
+
networksToAdd: NetworkConfiguration[];
|
|
16
|
+
existingChainIds: Hex[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @param networkConfig - The network configuration from the API.
|
|
20
|
+
* @returns The transformed network configuration, or null if invalid.
|
|
21
|
+
*/
|
|
22
|
+
export declare function transformNetworkConfig(networkConfig: NetworkConfig): NetworkConfiguration | null;
|
|
23
|
+
/**
|
|
24
|
+
* @param networks - Array of network configurations to filter.
|
|
25
|
+
* @param options - Filter options.
|
|
26
|
+
* @returns Filtered array of network configurations.
|
|
27
|
+
*/
|
|
28
|
+
export declare function filterNetworks(networks: NetworkConfig[], options?: NetworkFilterOptions): NetworkConfig[];
|
|
29
|
+
/**
|
|
30
|
+
* @param transformedNetworks - Array of transformed network configurations.
|
|
31
|
+
* @param options - Comparison options.
|
|
32
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
33
|
+
*/
|
|
34
|
+
export declare function compareWithExistingNetworks(transformedNetworks: NetworkConfiguration[], options: NetworkComparisonOptions): TransformedNetworkResult;
|
|
35
|
+
/**
|
|
36
|
+
* @param networks - Array of network configurations from the API.
|
|
37
|
+
* @param filterOptions - Options for filtering networks.
|
|
38
|
+
* @param comparisonOptions - Options for comparing with existing networks.
|
|
39
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
40
|
+
*/
|
|
41
|
+
export declare function processNetworkConfigs(networks: NetworkConfig[], filterOptions?: NetworkFilterOptions, comparisonOptions?: NetworkComparisonOptions): TransformedNetworkResult;
|
|
42
|
+
//# sourceMappingURL=transformers.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.d.mts","sourceRoot":"","sources":["../../src/config-registry-api-service/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qCAAqC;AAEzE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,mDAA+C;AAI5E,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,gBAAgB,EAAE,MAAM,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,gBAAgB,EAAE,GAAG,EAAE,CAAC;CACzB,CAAC;AAmFF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,aAAa,GAC3B,oBAAoB,GAAG,IAAI,CAuG7B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,oBAAyB,GACjC,aAAa,EAAE,CA0CjB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,oBAAoB,EAAE,EAC3C,OAAO,EAAE,wBAAwB,GAChC,wBAAwB,CAqC1B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EAAE,EACzB,aAAa,GAAE,oBAAyB,EACxC,iBAAiB,CAAC,EAAE,wBAAwB,GAC3C,wBAAwB,CAsB1B"}
|