@metamask-previews/assets-controller 1.0.0-preview-b271ae9 → 1.0.0-preview-1a74d12
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 +60 -23
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +29 -2
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +29 -2
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +60 -23
- package/dist/AssetsController.mjs.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,10 @@ 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 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
|
+
|
|
10
14
|
### Changed
|
|
11
15
|
|
|
12
16
|
- **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,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_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, }) {
|
|
186
186
|
super({
|
|
187
187
|
name: CONTROLLER_NAME,
|
|
188
188
|
messenger,
|
|
@@ -195,6 +195,8 @@ 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);
|
|
200
202
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
@@ -214,7 +216,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
214
216
|
_AssetsController_priceDataSource.set(this, void 0);
|
|
215
217
|
_AssetsController_detectionMiddleware.set(this, void 0);
|
|
216
218
|
_AssetsController_tokenDataSource.set(this, void 0);
|
|
219
|
+
_AssetsController_unsubscribeBasicFunctionality.set(this, null);
|
|
217
220
|
__classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
|
|
221
|
+
__classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
|
|
218
222
|
__classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
|
|
219
223
|
const rpcConfig = rpcDataSourceConfig ?? {};
|
|
220
224
|
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
|
|
@@ -253,6 +257,14 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
253
257
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
|
|
254
258
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
|
|
255
259
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
260
|
+
// Subscribe to basic-functionality changes after construction so a synchronous
|
|
261
|
+
// onChange during subscribe cannot run before data sources are initialized.
|
|
262
|
+
if (subscribeToBasicFunctionalityChange) {
|
|
263
|
+
const unsubscribe = subscribeToBasicFunctionalityChange((isBasic) => this.handleBasicFunctionalityChange(isBasic));
|
|
264
|
+
if (typeof unsubscribe === 'function') {
|
|
265
|
+
__classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, unsubscribe, "f");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
256
268
|
}
|
|
257
269
|
// ============================================================================
|
|
258
270
|
// DATA SOURCE CHAIN MANAGEMENT
|
|
@@ -318,14 +330,20 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
318
330
|
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
319
331
|
forceUpdate: true,
|
|
320
332
|
});
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
333
|
+
const middlewares = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
334
|
+
? [
|
|
335
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").assetsMiddleware,
|
|
336
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f").assetsMiddleware,
|
|
337
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").assetsMiddleware,
|
|
338
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
|
|
339
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").assetsMiddleware,
|
|
340
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").assetsMiddleware,
|
|
341
|
+
]
|
|
342
|
+
: [
|
|
343
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").assetsMiddleware,
|
|
344
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
|
|
345
|
+
];
|
|
346
|
+
const response = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, middlewares, request);
|
|
329
347
|
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
|
|
330
348
|
}
|
|
331
349
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
@@ -492,6 +510,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
492
510
|
* @param options.updateInterval - Polling interval in ms.
|
|
493
511
|
*/
|
|
494
512
|
subscribeAssetsPrice(accounts, chainIds, options = {}) {
|
|
513
|
+
if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
495
516
|
const { updateInterval = __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f") } = options;
|
|
496
517
|
const subscriptionKey = 'ds:PriceDataSource';
|
|
497
518
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
@@ -531,6 +552,18 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
531
552
|
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").unsubscribe(subscriptionKey).catch(console.error);
|
|
532
553
|
existingSubscription.unsubscribe();
|
|
533
554
|
}
|
|
555
|
+
/**
|
|
556
|
+
* Handle basic functionality toggle change. Call this from the consumer (extension or mobile)
|
|
557
|
+
* when the user changes the "Basic functionality" setting. Refreshes subscriptions so the
|
|
558
|
+
* current {@link AssetsControllerOptions.isBasicFunctionality} getter is used (true = APIs on,
|
|
559
|
+
* false = RPC only).
|
|
560
|
+
*
|
|
561
|
+
* @param _isBasic - The new value (for call-site clarity; the getter is the source of truth).
|
|
562
|
+
*/
|
|
563
|
+
handleBasicFunctionalityChange(_isBasic) {
|
|
564
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
565
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
566
|
+
}
|
|
534
567
|
/**
|
|
535
568
|
* Handle assets updated from a data source.
|
|
536
569
|
* Called via the onAssetsUpdate callback passed in SubscriptionRequest when the controller subscribes to a data source.
|
|
@@ -564,21 +597,20 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
564
597
|
// ============================================================================
|
|
565
598
|
destroy() {
|
|
566
599
|
log('Destroying AssetsController', {
|
|
567
|
-
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a",
|
|
600
|
+
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get).length,
|
|
568
601
|
subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
569
602
|
});
|
|
570
603
|
// Destroy instantiated data sources
|
|
571
604
|
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f")?.destroy?.();
|
|
572
605
|
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")?.destroy?.();
|
|
573
606
|
__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
|
-
}
|
|
607
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")?.destroy?.();
|
|
580
608
|
// Stop all active subscriptions
|
|
581
609
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
610
|
+
if (__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f")) {
|
|
611
|
+
__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f").call(this);
|
|
612
|
+
__classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, null, "f");
|
|
613
|
+
}
|
|
582
614
|
// Unregister action handlers
|
|
583
615
|
this.messenger.unregisterActionHandler('AssetsController:getAssets');
|
|
584
616
|
this.messenger.unregisterActionHandler('AssetsController:getAssetsBalance');
|
|
@@ -592,9 +624,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
592
624
|
}
|
|
593
625
|
}
|
|
594
626
|
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() {
|
|
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() {
|
|
596
628
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
597
|
-
},
|
|
629
|
+
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
598
630
|
return [
|
|
599
631
|
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
|
|
600
632
|
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
@@ -885,13 +917,14 @@ async function _AssetsController_updateState(response) {
|
|
|
885
917
|
// Stop price subscription first (uses direct messenger call)
|
|
886
918
|
this.unsubscribeAssetsPrice();
|
|
887
919
|
// Stop balance subscriptions by properly notifying data sources via messenger
|
|
888
|
-
// This ensures data sources stop their polling timers
|
|
889
|
-
//
|
|
920
|
+
// This ensures data sources stop their polling timers.
|
|
921
|
+
// Use #allBalanceDataSources so we unsubscribe from every source that may have
|
|
922
|
+
// been subscribed (e.g. when switching from full to basic functionality).
|
|
890
923
|
const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
|
|
891
924
|
for (const subscriptionKey of subscriptionKeys) {
|
|
892
925
|
if (subscriptionKey.startsWith('ds:')) {
|
|
893
926
|
const sourceId = subscriptionKey.slice(3);
|
|
894
|
-
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a",
|
|
927
|
+
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
|
|
895
928
|
if (source) {
|
|
896
929
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
897
930
|
}
|
|
@@ -911,7 +944,11 @@ async function _AssetsController_updateState(response) {
|
|
|
911
944
|
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
|
|
912
945
|
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
913
946
|
const remainingChains = new Set(chainToAccounts.keys());
|
|
914
|
-
|
|
947
|
+
// When basic functionality is on (getter true), use all balance data sources; when off (getter false), RPC only.
|
|
948
|
+
const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
949
|
+
? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
|
|
950
|
+
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
951
|
+
for (const source of balanceDataSources) {
|
|
915
952
|
const availableChains = new Set(source.getActiveChainsSync());
|
|
916
953
|
const assignedChains = [];
|
|
917
954
|
for (const chainId of remainingChains) {
|