@metamask-previews/assets-controller 1.0.0-preview-27e39dd44 → 1.0.0-preview-1346d4756
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 +8 -0
- package/dist/AssetsController.cjs +109 -41
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +56 -2
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +56 -2
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +109 -41
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +61 -4
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts +22 -3
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +22 -3
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +59 -3
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +4 -1
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts +8 -4
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts +8 -4
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +4 -1
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +19 -9
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +8 -3
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +8 -3
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +19 -9
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/TokenDataSource.cjs +3 -0
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts +1 -0
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts +1 -0
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +3 -0
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +16 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +5 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +5 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +16 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.cts +4 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.mts +4 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -1
- package/dist/data-sources/index.cjs.map +1 -1
- package/dist/data-sources/index.d.cts +2 -2
- package/dist/data-sources/index.d.cts.map +1 -1
- package/dist/data-sources/index.d.mts +2 -2
- package/dist/data-sources/index.d.mts.map +1 -1
- package/dist/data-sources/index.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs +3 -0
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.cts +1 -0
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.mts +1 -0
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs +3 -0
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,8 +7,16 @@ 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
|
+
- Add optional `trackMetaMetricsEvent` callback to measure and report first init/fetch historical time (duration in ms) to MetaMetrics when the initial asset fetch completes after unlock or app open ([#7871](https://github.com/MetaMask/core/pull/7871))
|
|
13
|
+
- Add `AccountsApiDataSourceConfig` and `PriceDataSourceConfig` types; add `accountsApiDataSourceConfig` and `priceDataSourceConfig` options to `AssetsControllerOptions` for per-data-source configuration (pollInterval, tokenDetectionEnabled, etc.). When `tokenDetectionEnabled` is false, `AccountsApiDataSource` only returns balances for tokens already in state and does not add new tokens ([#7926](https://github.com/MetaMask/core/pull/7926))
|
|
14
|
+
- Add `useExternalService` option to `TokenDetector`, `TokenDetectionOptions`, `RpcDataSourceConfig`, and `RpcDataSourceOptions`. Token detection runs only when both `tokenDetectionEnabled` and `useExternalService` are true and stops when either is false ([#7924](https://github.com/MetaMask/core/pull/7924))
|
|
15
|
+
- Add basic functionality toggle: `isBasicFunctionality` (getter `() => boolean`); no value is stored in the controller. When the getter returns true (matches UI "Basic functionality" ON), token and price APIs are used; when false, only RPC is used. Optional `subscribeToBasicFunctionalityChange(onChange)` lets the consumer register for toggle changes (e.g. extension subscribes to PreferencesController:stateChange, mobile uses its own mechanism); may return an unsubscribe function for controller destroy ([#7904](https://github.com/MetaMask/core/pull/7904))
|
|
16
|
+
|
|
10
17
|
### Changed
|
|
11
18
|
|
|
19
|
+
- **BREAKING:** `AccountsApiDataSourceConfig.tokenDetectionEnabled` is now a getter `() => boolean` (was `boolean`) so the Accounts API data source reacts when the user toggles token detection at runtime, consistent with `RpcDataSourceConfig.tokenDetectionEnabled`. Pass a function, e.g. `tokenDetectionEnabled: () => preferenceController.state.useTokenDetection`.
|
|
12
20
|
- **BREAKING:** Rename state and `DataResponse` property from `assetsMetadata` to `assetsInfo`. Update consumers that read `state.assetsMetadata` or set `response.assetsMetadata` to use `assetsInfo` instead ([#7902](https://github.com/MetaMask/core/pull/7902))
|
|
13
21
|
- Bump `@metamask/keyring-api` from `^21.0.0` to `^21.5.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
14
22
|
- Bump `@metamask/keyring-internal-api` from `^9.0.0` to `^10.0.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
13
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
|
-
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource,
|
|
16
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.AssetsController = exports.getDefaultAssetsControllerState = void 0;
|
|
19
19
|
const base_controller_1 = require("@metamask/base-controller");
|
|
@@ -182,7 +182,7 @@ function normalizeResponse(response) {
|
|
|
182
182
|
* - The controller does NOT manage polling - it simply receives pushed updates
|
|
183
183
|
*/
|
|
184
184
|
class AssetsController extends base_controller_1.BaseController {
|
|
185
|
-
constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, queryApiClient, rpcDataSourceConfig, }) {
|
|
185
|
+
constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trackMetaMetricsEvent, accountsApiDataSourceConfig, priceDataSourceConfig, }) {
|
|
186
186
|
super({
|
|
187
187
|
name: CONTROLLER_NAME,
|
|
188
188
|
messenger,
|
|
@@ -195,8 +195,14 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
195
195
|
_AssetsController_instances.add(this);
|
|
196
196
|
/** Whether the controller is enabled */
|
|
197
197
|
_AssetsController_isEnabled.set(this, void 0);
|
|
198
|
+
/** Getter for basic functionality (only balance fetch/subscribe use RPC; token/price API not used). No attribute stored. */
|
|
199
|
+
_AssetsController_isBasicFunctionality.set(this, void 0);
|
|
198
200
|
/** Default update interval hint passed to data sources */
|
|
199
201
|
_AssetsController_defaultUpdateInterval.set(this, void 0);
|
|
202
|
+
/** Optional callback for first init/fetch MetaMetrics (duration). */
|
|
203
|
+
_AssetsController_trackMetaMetricsEvent.set(this, void 0);
|
|
204
|
+
/** Whether we have already reported first init fetch for this session (reset on #stop). */
|
|
205
|
+
_AssetsController_firstInitFetchReported.set(this, false);
|
|
200
206
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
201
207
|
/**
|
|
202
208
|
* Active balance subscriptions keyed by account ID.
|
|
@@ -214,8 +220,11 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
214
220
|
_AssetsController_priceDataSource.set(this, void 0);
|
|
215
221
|
_AssetsController_detectionMiddleware.set(this, void 0);
|
|
216
222
|
_AssetsController_tokenDataSource.set(this, void 0);
|
|
223
|
+
_AssetsController_unsubscribeBasicFunctionality.set(this, null);
|
|
217
224
|
__classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
|
|
225
|
+
__classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
|
|
218
226
|
__classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
|
|
227
|
+
__classPrivateFieldSet(this, _AssetsController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
|
|
219
228
|
const rpcConfig = rpcDataSourceConfig ?? {};
|
|
220
229
|
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
|
|
221
230
|
__classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource_1.BackendWebsocketDataSource({
|
|
@@ -226,6 +235,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
226
235
|
__classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource_1.AccountsApiDataSource({
|
|
227
236
|
queryApiClient,
|
|
228
237
|
onActiveChainsUpdated,
|
|
238
|
+
...accountsApiDataSourceConfig,
|
|
229
239
|
}), "f");
|
|
230
240
|
__classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_1.SnapDataSource({
|
|
231
241
|
messenger: this.messenger,
|
|
@@ -241,6 +251,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
241
251
|
}), "f");
|
|
242
252
|
__classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource_1.PriceDataSource({
|
|
243
253
|
queryApiClient,
|
|
254
|
+
...priceDataSourceConfig,
|
|
244
255
|
}), "f");
|
|
245
256
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
|
|
246
257
|
if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
|
|
@@ -253,6 +264,14 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
253
264
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
|
|
254
265
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
|
|
255
266
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
267
|
+
// Subscribe to basic-functionality changes after construction so a synchronous
|
|
268
|
+
// onChange during subscribe cannot run before data sources are initialized.
|
|
269
|
+
if (subscribeToBasicFunctionalityChange) {
|
|
270
|
+
const unsubscribe = subscribeToBasicFunctionalityChange((isBasic) => this.handleBasicFunctionalityChange(isBasic));
|
|
271
|
+
if (typeof unsubscribe === 'function') {
|
|
272
|
+
__classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, unsubscribe, "f");
|
|
273
|
+
}
|
|
274
|
+
}
|
|
256
275
|
}
|
|
257
276
|
// ============================================================================
|
|
258
277
|
// DATA SOURCE CHAIN MANAGEMENT
|
|
@@ -312,21 +331,34 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
312
331
|
customAssets.push(...accountCustomAssets);
|
|
313
332
|
}
|
|
314
333
|
if (options?.forceUpdate) {
|
|
334
|
+
const startTime = Date.now();
|
|
315
335
|
const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
316
336
|
assetTypes,
|
|
317
337
|
dataTypes,
|
|
318
338
|
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
319
339
|
forceUpdate: true,
|
|
320
340
|
});
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
341
|
+
const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
342
|
+
? [
|
|
343
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
344
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
345
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
346
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
347
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
348
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
349
|
+
]
|
|
350
|
+
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
351
|
+
const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
|
|
329
352
|
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
|
|
353
|
+
if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
|
|
354
|
+
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
355
|
+
const durationMs = Date.now() - startTime;
|
|
356
|
+
__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f").call(this, {
|
|
357
|
+
durationMs,
|
|
358
|
+
chainIds,
|
|
359
|
+
durationByDataSource,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
330
362
|
}
|
|
331
363
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
332
364
|
}
|
|
@@ -492,6 +524,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
492
524
|
* @param options.updateInterval - Polling interval in ms.
|
|
493
525
|
*/
|
|
494
526
|
subscribeAssetsPrice(accounts, chainIds, options = {}) {
|
|
527
|
+
if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
495
530
|
const { updateInterval = __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f") } = options;
|
|
496
531
|
const subscriptionKey = 'ds:PriceDataSource';
|
|
497
532
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
@@ -531,6 +566,18 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
531
566
|
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").unsubscribe(subscriptionKey).catch(console.error);
|
|
532
567
|
existingSubscription.unsubscribe();
|
|
533
568
|
}
|
|
569
|
+
/**
|
|
570
|
+
* Handle basic functionality toggle change. Call this from the consumer (extension or mobile)
|
|
571
|
+
* when the user changes the "Basic functionality" setting. Refreshes subscriptions so the
|
|
572
|
+
* current {@link AssetsControllerOptions.isBasicFunctionality} getter is used (true = APIs on,
|
|
573
|
+
* false = RPC only).
|
|
574
|
+
*
|
|
575
|
+
* @param _isBasic - The new value (for call-site clarity; the getter is the source of truth).
|
|
576
|
+
*/
|
|
577
|
+
handleBasicFunctionalityChange(_isBasic) {
|
|
578
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
579
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
580
|
+
}
|
|
534
581
|
/**
|
|
535
582
|
* Handle assets updated from a data source.
|
|
536
583
|
* Called via the onAssetsUpdate callback passed in SubscriptionRequest when the controller subscribes to a data source.
|
|
@@ -548,11 +595,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
548
595
|
});
|
|
549
596
|
// Run through enrichment middlewares (Event Stack: Detection → Token → Price)
|
|
550
597
|
// Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
|
|
551
|
-
const enrichedResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
552
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
|
|
553
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").assetsMiddleware,
|
|
554
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").assetsMiddleware,
|
|
555
|
-
], request ?? {
|
|
598
|
+
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"), __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f")], request ?? {
|
|
556
599
|
accountsWithSupportedChains: [],
|
|
557
600
|
chainIds: [],
|
|
558
601
|
dataTypes: ['balance', 'metadata', 'price'],
|
|
@@ -564,21 +607,20 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
564
607
|
// ============================================================================
|
|
565
608
|
destroy() {
|
|
566
609
|
log('Destroying AssetsController', {
|
|
567
|
-
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a",
|
|
610
|
+
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get).length,
|
|
568
611
|
subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
569
612
|
});
|
|
570
613
|
// Destroy instantiated data sources
|
|
571
614
|
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f")?.destroy?.();
|
|
572
615
|
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")?.destroy?.();
|
|
573
616
|
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f")?.destroy?.();
|
|
574
|
-
|
|
575
|
-
'destroy' in __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f") &&
|
|
576
|
-
typeof __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy ===
|
|
577
|
-
'function') {
|
|
578
|
-
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
|
|
579
|
-
}
|
|
617
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")?.destroy?.();
|
|
580
618
|
// Stop all active subscriptions
|
|
581
619
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
620
|
+
if (__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f")) {
|
|
621
|
+
__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f").call(this);
|
|
622
|
+
__classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, null, "f");
|
|
623
|
+
}
|
|
582
624
|
// Unregister action handlers
|
|
583
625
|
this.messenger.unregisterActionHandler('AssetsController:getAssets');
|
|
584
626
|
this.messenger.unregisterActionHandler('AssetsController:getAssetsBalance');
|
|
@@ -592,9 +634,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
592
634
|
}
|
|
593
635
|
}
|
|
594
636
|
exports.AssetsController = AssetsController;
|
|
595
|
-
_AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
637
|
+
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
596
638
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
597
|
-
},
|
|
639
|
+
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
598
640
|
return [
|
|
599
641
|
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
|
|
600
642
|
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
@@ -653,14 +695,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInte
|
|
|
653
695
|
// ============================================================================
|
|
654
696
|
/**
|
|
655
697
|
* Execute middlewares with request/response context.
|
|
698
|
+
* Returns response and exclusive duration per source (sum ≈ wall time).
|
|
656
699
|
*
|
|
657
|
-
* @param
|
|
700
|
+
* @param sources - Data sources or middlewares with getName() and assetsMiddleware (executed in order).
|
|
658
701
|
* @param request - The data request.
|
|
659
702
|
* @param initialResponse - Optional initial response (for enriching existing data).
|
|
660
|
-
* @returns
|
|
703
|
+
* @returns Response and durationByDataSource (exclusive ms per source name).
|
|
661
704
|
*/
|
|
662
|
-
async function _AssetsController_executeMiddlewares(
|
|
663
|
-
const
|
|
705
|
+
async function _AssetsController_executeMiddlewares(sources, request, initialResponse = {}) {
|
|
706
|
+
const names = sources.map((source) => source.getName());
|
|
707
|
+
const middlewares = sources.map((source) => source.assetsMiddleware);
|
|
708
|
+
const inclusive = [];
|
|
709
|
+
const wrapped = middlewares.map((middleware, i) => (async (ctx, next) => {
|
|
710
|
+
const start = Date.now();
|
|
711
|
+
try {
|
|
712
|
+
return await middleware(ctx, next);
|
|
713
|
+
}
|
|
714
|
+
finally {
|
|
715
|
+
inclusive[i] = Date.now() - start;
|
|
716
|
+
}
|
|
717
|
+
}));
|
|
718
|
+
const chain = wrapped.reduceRight((next, middleware) => async (ctx) => {
|
|
664
719
|
try {
|
|
665
720
|
return await middleware(ctx, next);
|
|
666
721
|
}
|
|
@@ -674,7 +729,16 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
|
|
|
674
729
|
response: initialResponse,
|
|
675
730
|
getAssetsState: () => this.state,
|
|
676
731
|
});
|
|
677
|
-
|
|
732
|
+
const durationByDataSource = {};
|
|
733
|
+
for (let i = 0; i < inclusive.length; i++) {
|
|
734
|
+
const nextInc = i + 1 < inclusive.length ? (inclusive[i + 1] ?? 0) : 0;
|
|
735
|
+
const exclusive = Math.max(0, (inclusive[i] ?? 0) - nextInc);
|
|
736
|
+
const name = names[i];
|
|
737
|
+
if (name !== undefined) {
|
|
738
|
+
durationByDataSource[name] = exclusive;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return { response: result.response, durationByDataSource };
|
|
678
742
|
}, _AssetsController_updateState =
|
|
679
743
|
// ============================================================================
|
|
680
744
|
// STATE MANAGEMENT
|
|
@@ -869,29 +933,29 @@ async function _AssetsController_updateState(response) {
|
|
|
869
933
|
enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
|
|
870
934
|
});
|
|
871
935
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
});
|
|
879
|
-
}
|
|
936
|
+
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
937
|
+
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
938
|
+
forceUpdate: true,
|
|
939
|
+
}).catch((error) => {
|
|
940
|
+
log('Failed to fetch assets', error);
|
|
941
|
+
});
|
|
880
942
|
}, _AssetsController_stop = function _AssetsController_stop() {
|
|
881
943
|
log('Stopping asset tracking', {
|
|
882
944
|
activeSubscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
883
945
|
hasPriceSubscription: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").has('ds:PriceDataSource'),
|
|
884
946
|
});
|
|
947
|
+
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
|
|
885
948
|
// Stop price subscription first (uses direct messenger call)
|
|
886
949
|
this.unsubscribeAssetsPrice();
|
|
887
950
|
// Stop balance subscriptions by properly notifying data sources via messenger
|
|
888
|
-
// This ensures data sources stop their polling timers
|
|
889
|
-
//
|
|
951
|
+
// This ensures data sources stop their polling timers.
|
|
952
|
+
// Use #allBalanceDataSources so we unsubscribe from every source that may have
|
|
953
|
+
// been subscribed (e.g. when switching from full to basic functionality).
|
|
890
954
|
const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
|
|
891
955
|
for (const subscriptionKey of subscriptionKeys) {
|
|
892
956
|
if (subscriptionKey.startsWith('ds:')) {
|
|
893
957
|
const sourceId = subscriptionKey.slice(3);
|
|
894
|
-
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a",
|
|
958
|
+
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
|
|
895
959
|
if (source) {
|
|
896
960
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
897
961
|
}
|
|
@@ -911,7 +975,11 @@ async function _AssetsController_updateState(response) {
|
|
|
911
975
|
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
|
|
912
976
|
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
913
977
|
const remainingChains = new Set(chainToAccounts.keys());
|
|
914
|
-
|
|
978
|
+
// When basic functionality is on (getter true), use all balance data sources; when off (getter false), RPC only.
|
|
979
|
+
const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
980
|
+
? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
|
|
981
|
+
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
982
|
+
for (const source of balanceDataSources) {
|
|
915
983
|
const availableChains = new Set(source.getActiveChainsSync());
|
|
916
984
|
const assignedChains = [];
|
|
917
985
|
for (const chainId of remainingChains) {
|