mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-23 10:30:04 +01:00
5009ceae53
The CurrencyRateController has been migrated to the BaseControllerV2 API, which includes various API changes. These changes include: * The constructor now expects to be passed a `RestrictedControllerMessenger`. * State changes are subscribed to via the `ControllerMessenger` now, rather than via a `subscribe` function. * The state and configration are passed in as one "options" object, rather than as two separate parameters * The polling needs to be started explicitly by calling `start`. It can be stopped and started on-demand now as well. * Changing the current currency or native currency will now throw an error if we fail to update the conversion rate. The `ComposableObservableStore` has been updated to accomodate these new types of controllers. The constructor has been updated to use an options bag pattern as well, to make the addition of the new required `controllerMessenger` parameter a bit less unweildly.
91 lines
2.7 KiB
JavaScript
91 lines
2.7 KiB
JavaScript
import { ObservableStore } from '@metamask/obs-store';
|
|
|
|
/**
|
|
* @typedef {import('@metamask/controllers').ControllerMessenger} ControllerMessenger
|
|
*/
|
|
|
|
/**
|
|
* An ObservableStore that can composes a flat
|
|
* structure of child stores based on configuration
|
|
*/
|
|
export default class ComposableObservableStore extends ObservableStore {
|
|
/**
|
|
* Describes which stores are being composed. The key is the name of the
|
|
* store, and the value is either an ObserableStore, or a controller that
|
|
* extends one of the two base controllers in the `@metamask/controllers`
|
|
* package.
|
|
* @type {Record<string, Object>}
|
|
*/
|
|
config = {};
|
|
|
|
/**
|
|
* Create a new store
|
|
*
|
|
* @param {Object} options
|
|
* @param {Object} [options.config] - Map of internal state keys to child stores
|
|
* @param {ControllerMessenger} options.controllerMessenger - The controller
|
|
* messenger, used for subscribing to events from BaseControllerV2-based
|
|
* controllers.
|
|
* @param {Object} [options.state] - The initial store state
|
|
*/
|
|
constructor({ config, controllerMessenger, state }) {
|
|
super(state);
|
|
this.controllerMessenger = controllerMessenger;
|
|
if (config) {
|
|
this.updateStructure(config);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Composes a new internal store subscription structure
|
|
*
|
|
* @param {Record<string, Object>} config - Describes which stores are being
|
|
* composed. The key is the name of the store, and the value is either an
|
|
* ObserableStore, or a controller that extends one of the two base
|
|
* controllers in the `@metamask/controllers` package.
|
|
*/
|
|
updateStructure(config) {
|
|
this.config = config;
|
|
this.removeAllListeners();
|
|
for (const key of Object.keys(config)) {
|
|
if (!config[key]) {
|
|
throw new Error(`Undefined '${key}'`);
|
|
}
|
|
const store = config[key];
|
|
if (store.subscribe) {
|
|
config[key].subscribe((state) => {
|
|
this.updateState({ [key]: state });
|
|
});
|
|
} else {
|
|
this.controllerMessenger.subscribe(
|
|
`${store.name}:stateChange`,
|
|
(state) => {
|
|
this.updateState({ [key]: state });
|
|
},
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Merges all child store state into a single object rather than
|
|
* returning an object keyed by child store class name
|
|
*
|
|
* @returns {Object} Object containing merged child store state
|
|
*/
|
|
getFlatState() {
|
|
if (!this.config) {
|
|
return {};
|
|
}
|
|
let flatState = {};
|
|
for (const key of Object.keys(this.config)) {
|
|
const controller = this.config[key];
|
|
const state = controller.getState
|
|
? controller.getState()
|
|
: controller.state;
|
|
flatState = { ...flatState, ...state };
|
|
}
|
|
return flatState;
|
|
}
|
|
}
|