@metamask-previews/assets-controller 1.0.0-preview-38a9cf6c3 → 1.0.0-preview-eb9a46682
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 +4 -0
- package/dist/AssetsController.cjs +64 -33
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +28 -1
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +28 -1
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +64 -33
- 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 +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,10 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
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))
|
|
12
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))
|
|
13
16
|
|
|
14
17
|
### Changed
|
|
15
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`.
|
|
16
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))
|
|
17
21
|
- Bump `@metamask/keyring-api` from `^21.0.0` to `^21.5.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
18
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_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _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;
|
|
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, isBasicFunctionality, subscribeToBasicFunctionalityChange, 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,
|
|
@@ -199,6 +199,10 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
199
199
|
_AssetsController_isBasicFunctionality.set(this, void 0);
|
|
200
200
|
/** Default update interval hint passed to data sources */
|
|
201
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);
|
|
202
206
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
203
207
|
/**
|
|
204
208
|
* Active balance subscriptions keyed by account ID.
|
|
@@ -220,6 +224,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
220
224
|
__classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
|
|
221
225
|
__classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
|
|
222
226
|
__classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
|
|
227
|
+
__classPrivateFieldSet(this, _AssetsController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
|
|
223
228
|
const rpcConfig = rpcDataSourceConfig ?? {};
|
|
224
229
|
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
|
|
225
230
|
__classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource_1.BackendWebsocketDataSource({
|
|
@@ -230,6 +235,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
230
235
|
__classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource_1.AccountsApiDataSource({
|
|
231
236
|
queryApiClient,
|
|
232
237
|
onActiveChainsUpdated,
|
|
238
|
+
...accountsApiDataSourceConfig,
|
|
233
239
|
}), "f");
|
|
234
240
|
__classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_1.SnapDataSource({
|
|
235
241
|
messenger: this.messenger,
|
|
@@ -245,6 +251,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
245
251
|
}), "f");
|
|
246
252
|
__classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource_1.PriceDataSource({
|
|
247
253
|
queryApiClient,
|
|
254
|
+
...priceDataSourceConfig,
|
|
248
255
|
}), "f");
|
|
249
256
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
|
|
250
257
|
if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
|
|
@@ -324,27 +331,34 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
324
331
|
customAssets.push(...accountCustomAssets);
|
|
325
332
|
}
|
|
326
333
|
if (options?.forceUpdate) {
|
|
334
|
+
const startTime = Date.now();
|
|
327
335
|
const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
328
336
|
assetTypes,
|
|
329
337
|
dataTypes,
|
|
330
338
|
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
331
339
|
forceUpdate: true,
|
|
332
340
|
});
|
|
333
|
-
const
|
|
341
|
+
const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
334
342
|
? [
|
|
335
|
-
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")
|
|
336
|
-
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f")
|
|
337
|
-
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")
|
|
338
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")
|
|
339
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f")
|
|
340
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f")
|
|
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"),
|
|
341
349
|
]
|
|
342
|
-
: [
|
|
343
|
-
|
|
344
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
|
|
345
|
-
];
|
|
346
|
-
const response = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, middlewares, request);
|
|
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);
|
|
347
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
|
+
}
|
|
348
362
|
}
|
|
349
363
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
350
364
|
}
|
|
@@ -581,11 +595,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
581
595
|
});
|
|
582
596
|
// Run through enrichment middlewares (Event Stack: Detection → Token → Price)
|
|
583
597
|
// Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
|
|
584
|
-
const enrichedResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
585
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
|
|
586
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").assetsMiddleware,
|
|
587
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").assetsMiddleware,
|
|
588
|
-
], 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 ?? {
|
|
589
599
|
accountsWithSupportedChains: [],
|
|
590
600
|
chainIds: [],
|
|
591
601
|
dataTypes: ['balance', 'metadata', 'price'],
|
|
@@ -624,7 +634,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
624
634
|
}
|
|
625
635
|
}
|
|
626
636
|
exports.AssetsController = AssetsController;
|
|
627
|
-
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = 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_unsubscribeBasicFunctionality = 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() {
|
|
628
638
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
629
639
|
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
630
640
|
return [
|
|
@@ -685,14 +695,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
685
695
|
// ============================================================================
|
|
686
696
|
/**
|
|
687
697
|
* Execute middlewares with request/response context.
|
|
698
|
+
* Returns response and exclusive duration per source (sum ≈ wall time).
|
|
688
699
|
*
|
|
689
|
-
* @param
|
|
700
|
+
* @param sources - Data sources or middlewares with getName() and assetsMiddleware (executed in order).
|
|
690
701
|
* @param request - The data request.
|
|
691
702
|
* @param initialResponse - Optional initial response (for enriching existing data).
|
|
692
|
-
* @returns
|
|
703
|
+
* @returns Response and durationByDataSource (exclusive ms per source name).
|
|
693
704
|
*/
|
|
694
|
-
async function _AssetsController_executeMiddlewares(
|
|
695
|
-
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) => {
|
|
696
719
|
try {
|
|
697
720
|
return await middleware(ctx, next);
|
|
698
721
|
}
|
|
@@ -706,7 +729,16 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
|
|
|
706
729
|
response: initialResponse,
|
|
707
730
|
getAssetsState: () => this.state,
|
|
708
731
|
});
|
|
709
|
-
|
|
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 };
|
|
710
742
|
}, _AssetsController_updateState =
|
|
711
743
|
// ============================================================================
|
|
712
744
|
// STATE MANAGEMENT
|
|
@@ -901,19 +933,18 @@ async function _AssetsController_updateState(response) {
|
|
|
901
933
|
enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
|
|
902
934
|
});
|
|
903
935
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
});
|
|
911
|
-
}
|
|
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
|
+
});
|
|
912
942
|
}, _AssetsController_stop = function _AssetsController_stop() {
|
|
913
943
|
log('Stopping asset tracking', {
|
|
914
944
|
activeSubscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
915
945
|
hasPriceSubscription: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").has('ds:PriceDataSource'),
|
|
916
946
|
});
|
|
947
|
+
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
|
|
917
948
|
// Stop price subscription first (uses direct messenger call)
|
|
918
949
|
this.unsubscribeAssetsPrice();
|
|
919
950
|
// Stop balance subscriptions by properly notifying data sources via messenger
|