From 997c8065410d61be519f067a720e9a26e5f24889 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 11 Dec 2023 10:24:30 -0600 Subject: [PATCH] add IPollingController type --- .../src/CurrencyRateController.ts | 14 +++++---- .../src/NftDetectionController.ts | 9 +++--- .../src/TokenDetectionController.ts | 9 +++--- .../src/TokenListController.ts | 14 +++++---- .../src/TokenRatesController.ts | 9 +++--- .../src/GasFeeController.ts | 14 +++++---- .../src/AbstractPollingController.ts | 29 ++++++++++++++++++- .../src/StaticIntervalPollingController.ts | 12 +++++--- packages/polling-controller/src/index.ts | 2 ++ 9 files changed, 80 insertions(+), 32 deletions(-) diff --git a/packages/assets-controllers/src/CurrencyRateController.ts b/packages/assets-controllers/src/CurrencyRateController.ts index bf3509f310..2b95fe0481 100644 --- a/packages/assets-controllers/src/CurrencyRateController.ts +++ b/packages/assets-controllers/src/CurrencyRateController.ts @@ -11,6 +11,7 @@ import type { NetworkClientId, NetworkControllerGetNetworkClientByIdAction, } from '@metamask/network-controller'; +import type { IPollingController } from '@metamask/polling-controller'; import { StaticIntervalPollingController } from '@metamask/polling-controller'; import { Mutex } from 'async-mutex'; @@ -82,11 +83,14 @@ const defaultState = { * Controller that passively polls on a set interval for an exchange rate from the current network * asset to the user's preferred currency. */ -export class CurrencyRateController extends StaticIntervalPollingController< - typeof name, - CurrencyRateState, - CurrencyRateMessenger -> { +export class CurrencyRateController + extends StaticIntervalPollingController< + typeof name, + CurrencyRateState, + CurrencyRateMessenger + > + implements IPollingController +{ private readonly mutex = new Mutex(); private readonly fetchExchangeRate; diff --git a/packages/assets-controllers/src/NftDetectionController.ts b/packages/assets-controllers/src/NftDetectionController.ts index 9db76bb073..83f7ab41bb 100644 --- a/packages/assets-controllers/src/NftDetectionController.ts +++ b/packages/assets-controllers/src/NftDetectionController.ts @@ -11,6 +11,7 @@ import type { NetworkState, NetworkClient, } from '@metamask/network-controller'; +import type { IPollingController } from '@metamask/polling-controller'; import { StaticIntervalPollingControllerV1 } from '@metamask/polling-controller'; import type { PreferencesState } from '@metamask/preferences-controller'; import type { Hex } from '@metamask/utils'; @@ -147,10 +148,10 @@ export interface NftDetectionConfig extends BaseConfig { /** * Controller that passively polls on a set interval for NFT auto detection */ -export class NftDetectionController extends StaticIntervalPollingControllerV1< - NftDetectionConfig, - BaseState -> { +export class NftDetectionController + extends StaticIntervalPollingControllerV1 + implements IPollingController +{ private intervalId?: ReturnType; private getOwnerNftApi({ diff --git a/packages/assets-controllers/src/TokenDetectionController.ts b/packages/assets-controllers/src/TokenDetectionController.ts index 30a3249f18..544e5a5a58 100644 --- a/packages/assets-controllers/src/TokenDetectionController.ts +++ b/packages/assets-controllers/src/TokenDetectionController.ts @@ -8,6 +8,7 @@ import type { NetworkController, NetworkState, } from '@metamask/network-controller'; +import type { IPollingController } from '@metamask/polling-controller'; import { StaticIntervalPollingControllerV1 } from '@metamask/polling-controller'; import type { PreferencesState } from '@metamask/preferences-controller'; import type { Hex } from '@metamask/utils'; @@ -44,10 +45,10 @@ export interface TokenDetectionConfig extends BaseConfig { /** * Controller that passively polls on a set interval for Tokens auto detection */ -export class TokenDetectionController extends StaticIntervalPollingControllerV1< - TokenDetectionConfig, - BaseState -> { +export class TokenDetectionController + extends StaticIntervalPollingControllerV1 + implements IPollingController +{ private intervalId?: ReturnType; /** diff --git a/packages/assets-controllers/src/TokenListController.ts b/packages/assets-controllers/src/TokenListController.ts index 73863088ee..876a749e2d 100644 --- a/packages/assets-controllers/src/TokenListController.ts +++ b/packages/assets-controllers/src/TokenListController.ts @@ -10,6 +10,7 @@ import type { NetworkState, NetworkControllerGetNetworkClientByIdAction, } from '@metamask/network-controller'; +import type { IPollingController } from '@metamask/polling-controller'; import { StaticIntervalPollingController } from '@metamask/polling-controller'; import type { Hex } from '@metamask/utils'; import { Mutex } from 'async-mutex'; @@ -91,11 +92,14 @@ const defaultState: TokenListState = { /** * Controller that passively polls on a set interval for the list of tokens from metaswaps api */ -export class TokenListController extends StaticIntervalPollingController< - typeof name, - TokenListState, - TokenListMessenger -> { +export class TokenListController + extends StaticIntervalPollingController< + typeof name, + TokenListState, + TokenListMessenger + > + implements IPollingController +{ private readonly mutex = new Mutex(); private intervalId?: ReturnType; diff --git a/packages/assets-controllers/src/TokenRatesController.ts b/packages/assets-controllers/src/TokenRatesController.ts index 4cb8c3c76f..580f0dfb32 100644 --- a/packages/assets-controllers/src/TokenRatesController.ts +++ b/packages/assets-controllers/src/TokenRatesController.ts @@ -10,6 +10,7 @@ import type { NetworkController, NetworkState, } from '@metamask/network-controller'; +import type { IPollingController } from '@metamask/polling-controller'; import { StaticIntervalPollingControllerV1 } from '@metamask/polling-controller'; import type { PreferencesState } from '@metamask/preferences-controller'; import type { Hex } from '@metamask/utils'; @@ -135,10 +136,10 @@ async function getCurrencyConversionRate({ * Controller that passively polls on a set interval for token-to-fiat exchange rates * for tokens stored in the TokensController */ -export class TokenRatesController extends StaticIntervalPollingControllerV1< - TokenRatesConfig, - TokenRatesState -> { +export class TokenRatesController + extends StaticIntervalPollingControllerV1 + implements IPollingController +{ private handle?: ReturnType; #pollState = PollState.Inactive; diff --git a/packages/gas-fee-controller/src/GasFeeController.ts b/packages/gas-fee-controller/src/GasFeeController.ts index ecb397e607..a9c50bbc1d 100644 --- a/packages/gas-fee-controller/src/GasFeeController.ts +++ b/packages/gas-fee-controller/src/GasFeeController.ts @@ -18,6 +18,7 @@ import type { NetworkState, ProviderProxy, } from '@metamask/network-controller'; +import type { IPollingController } from '@metamask/polling-controller'; import { StaticIntervalPollingController } from '@metamask/polling-controller'; import type { Hex } from '@metamask/utils'; import { v1 as random } from 'uuid'; @@ -253,11 +254,14 @@ const defaultState: GasFeeState = { /** * Controller that retrieves gas fee estimate data and polls for updated data on a set interval */ -export class GasFeeController extends StaticIntervalPollingController< - typeof name, - GasFeeState, - GasFeeMessenger -> { +export class GasFeeController + extends StaticIntervalPollingController< + typeof name, + GasFeeState, + GasFeeMessenger + > + implements IPollingController +{ private intervalId?: ReturnType; private readonly intervalDelay; diff --git a/packages/polling-controller/src/AbstractPollingController.ts b/packages/polling-controller/src/AbstractPollingController.ts index 5f95a0e60a..4ac1ba4569 100644 --- a/packages/polling-controller/src/AbstractPollingController.ts +++ b/packages/polling-controller/src/AbstractPollingController.ts @@ -3,6 +3,30 @@ import type { Json } from '@metamask/utils'; import stringify from 'fast-json-stable-stringify'; import { v4 as random } from 'uuid'; +export type IPollingController = { + startPollingByNetworkClientId( + networkClientId: NetworkClientId, + options: Json, + ): string; + + stopAllPolling(): void; + + stopPollingByPollingToken(pollingToken: string): void; + + onPollingCompleteByNetworkClientId( + networkClientId: NetworkClientId, + callback: (networkClientId: NetworkClientId) => void, + options: Json, + ): void; + + _executePoll(networkClientId: NetworkClientId, options: Json): Promise; + _startPollingByNetworkClientId( + networkClientId: NetworkClientId, + options: Json, + ): void; + _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void; +}; + export const getKey = ( networkClientId: NetworkClientId, options: Json, @@ -21,7 +45,10 @@ type Constructor = new (...args: any[]) => object; export function AbstractPollingControllerBaseMixin( Base: TBase, ) { - abstract class AbstractPollingControllerBase extends Base { + abstract class AbstractPollingControllerBase + extends Base + implements IPollingController + { readonly #pollingTokenSets: Map> = new Map(); #callbacks: Map< diff --git a/packages/polling-controller/src/StaticIntervalPollingController.ts b/packages/polling-controller/src/StaticIntervalPollingController.ts index 255da9e799..6042a96973 100644 --- a/packages/polling-controller/src/StaticIntervalPollingController.ts +++ b/packages/polling-controller/src/StaticIntervalPollingController.ts @@ -6,7 +6,10 @@ import { AbstractPollingControllerBaseMixin, getKey, } from './AbstractPollingController'; -import type { PollingTokenSetId } from './AbstractPollingController'; +import type { + IPollingController, + PollingTokenSetId, +} from './AbstractPollingController'; type Constructor = new (...args: any[]) => object; @@ -20,9 +23,10 @@ type Constructor = new (...args: any[]) => object; function StaticIntervalPollingControllerMixin( Base: TBase, ) { - abstract class StaticIntervalPollingController extends AbstractPollingControllerBaseMixin( - Base, - ) { + abstract class StaticIntervalPollingController + extends AbstractPollingControllerBaseMixin(Base) + implements IPollingController + { readonly #intervalIds: Record = {}; intervalLength: number | undefined = 1000; diff --git a/packages/polling-controller/src/index.ts b/packages/polling-controller/src/index.ts index 38997dda91..5bfd5e5366 100644 --- a/packages/polling-controller/src/index.ts +++ b/packages/polling-controller/src/index.ts @@ -9,3 +9,5 @@ export { StaticIntervalPollingController, StaticIntervalPollingControllerV1, } from './StaticIntervalPollingController'; + +export type { IPollingController } from './AbstractPollingController';