@metamask/polling-controller 2.0.0 → 4.0.0

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 CHANGED
@@ -6,6 +6,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [4.0.0]
10
+ ### Changed
11
+ - **BREAKING:** Bump `@metamask/network-controller` dependency and peer dependency from `^17.0.0` to `^17.1.1` ([#3695](https://github.com/MetaMask/core/pull/3695))
12
+ - Bump `@metamask/base-controller` to `^4.0.1` ([#3695](https://github.com/MetaMask/core/pull/3695))
13
+ - Bump `@metamask/controller-utils` to `^8.0.1` ([#3695](https://github.com/MetaMask/core/pull/3695), [#3678](https://github.com/MetaMask/core/pull/3678))
14
+
15
+ ## [3.0.0]
16
+ ### Added
17
+ - `BlockTrackerPollingController`, `BlockTrackerPollingControllerV1` and `BlockTrackerPollingControllerOnly` have been added and can be used by subclasses to poll with a blockTracker using the same API as the `StaticIntervalPollingController` versions - the only exception is the requirement to implement the abstract method `_getNetworkClientById` on subclasses.
18
+
19
+ ### Changed
20
+ - **BREAKING:** `PollingController`, `PollingControllerV1` and `PollingControllerOnly` are all removed and replaced by `StaticIntervalPollingController`, `StaticIntervalPollingControllerV1` and `StaticIntervalPollingControllerOnly` ([#3636](https://github.com/MetaMask/core/pull/3636))
21
+
9
22
  ## [2.0.0]
10
23
  ### Changed
11
24
  - **BREAKING:** Bump `@metamask/base-controller` to ^4.0.0 ([#2063](https://github.com/MetaMask/core/pull/2063))
@@ -46,7 +59,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
46
59
  ### Added
47
60
  - Initial release
48
61
 
49
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@2.0.0...HEAD
62
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@4.0.0...HEAD
63
+ [4.0.0]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@3.0.0...@metamask/polling-controller@4.0.0
64
+ [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@2.0.0...@metamask/polling-controller@3.0.0
50
65
  [2.0.0]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@1.0.2...@metamask/polling-controller@2.0.0
51
66
  [1.0.2]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@1.0.1...@metamask/polling-controller@1.0.2
52
67
  [1.0.1]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@1.0.0...@metamask/polling-controller@1.0.1
@@ -0,0 +1,33 @@
1
+ import type { NetworkClientId } from '@metamask/network-controller';
2
+ import type { Json } from '@metamask/utils';
3
+ export declare type IPollingController = {
4
+ startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): string;
5
+ stopAllPolling(): void;
6
+ stopPollingByPollingToken(pollingToken: string): void;
7
+ onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void, options: Json): void;
8
+ _executePoll(networkClientId: NetworkClientId, options: Json): Promise<void>;
9
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
10
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
11
+ };
12
+ export declare const getKey: (networkClientId: NetworkClientId, options: Json) => PollingTokenSetId;
13
+ export declare type PollingTokenSetId = `${NetworkClientId}:${string}`;
14
+ declare type Constructor = new (...args: any[]) => object;
15
+ /**
16
+ * AbstractPollingControllerBaseMixin
17
+ *
18
+ * @param Base - The base class to mix onto.
19
+ * @returns The composed class.
20
+ */
21
+ export declare function AbstractPollingControllerBaseMixin<TBase extends Constructor>(Base: TBase): (abstract new (...args: any[]) => {
22
+ readonly "__#93085@#pollingTokenSets": Map<PollingTokenSetId, Set<string>>;
23
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
24
+ _executePoll(networkClientId: NetworkClientId, options: Json): Promise<void>;
25
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
26
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
27
+ startPollingByNetworkClientId(networkClientId: NetworkClientId, options?: Json): string;
28
+ stopAllPolling(): void;
29
+ stopPollingByPollingToken(pollingToken: string): void;
30
+ onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void, options?: Json): void;
31
+ }) & TBase;
32
+ export {};
33
+ //# sourceMappingURL=AbstractPollingController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractPollingController.d.ts","sourceRoot":"","sources":["../src/AbstractPollingController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAI5C,oBAAY,kBAAkB,GAAG;IAC/B,6BAA6B,CAC3B,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,IAAI,GACZ,MAAM,CAAC;IAEV,cAAc,IAAI,IAAI,CAAC;IAEvB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtD,kCAAkC,CAChC,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,EACpD,OAAO,EAAE,IAAI,GACZ,IAAI,CAAC;IAER,YAAY,CAAC,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,8BAA8B,CAC5B,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,IAAI,GACZ,IAAI,CAAC;IACR,+BAA+B,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,MAAM,oBACA,eAAe,WACvB,IAAI,KACZ,iBAA+D,CAAC;AAEnE,oBAAY,iBAAiB,GAAG,GAAG,eAAe,IAAI,MAAM,EAAE,CAAC;AAI/D,aAAK,WAAW,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,KAAK,SAAS,WAAW,EAC1E,IAAI,EAAE,KAAK;2CAMmB,IAAI,iBAAiB,EAAE,IAAI,MAAM,CAAC,CAAC;wGAIf,IAAI;kCAIjC,eAAe,WACvB,IAAI,GACZ,QAAQ,IAAI,CAAC;oDAGG,eAAe,WACvB,IAAI,GACZ,IAAI;yCAEuC,iBAAiB,GAAG,IAAI;mDAGnD,eAAe,YACvB,IAAI,GACZ,MAAM;;4CAuB+B,MAAM;wDA8B3B,eAAe,8BACJ,eAAe,KAAK,IAAI,YAC3C,IAAI;WASlB"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.AbstractPollingControllerBaseMixin = exports.getKey = void 0;
12
+ const fast_json_stable_stringify_1 = __importDefault(require("fast-json-stable-stringify"));
13
+ const uuid_1 = require("uuid");
14
+ const getKey = (networkClientId, options) => `${networkClientId}:${(0, fast_json_stable_stringify_1.default)(options)}`;
15
+ exports.getKey = getKey;
16
+ /**
17
+ * AbstractPollingControllerBaseMixin
18
+ *
19
+ * @param Base - The base class to mix onto.
20
+ * @returns The composed class.
21
+ */
22
+ function AbstractPollingControllerBaseMixin(Base) {
23
+ var _AbstractPollingControllerBase_pollingTokenSets, _AbstractPollingControllerBase_callbacks;
24
+ class AbstractPollingControllerBase extends Base {
25
+ constructor() {
26
+ super(...arguments);
27
+ _AbstractPollingControllerBase_pollingTokenSets.set(this, new Map());
28
+ _AbstractPollingControllerBase_callbacks.set(this, new Map());
29
+ }
30
+ startPollingByNetworkClientId(networkClientId, options = {}) {
31
+ var _a;
32
+ const pollToken = (0, uuid_1.v4)();
33
+ const key = (0, exports.getKey)(networkClientId, options);
34
+ const pollingTokenSet = (_a = __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").get(key)) !== null && _a !== void 0 ? _a : new Set();
35
+ pollingTokenSet.add(pollToken);
36
+ __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").set(key, pollingTokenSet);
37
+ if (pollingTokenSet.size === 1) {
38
+ this._startPollingByNetworkClientId(networkClientId, options);
39
+ }
40
+ return pollToken;
41
+ }
42
+ stopAllPolling() {
43
+ __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").forEach((tokenSet, _key) => {
44
+ tokenSet.forEach((token) => {
45
+ this.stopPollingByPollingToken(token);
46
+ });
47
+ });
48
+ }
49
+ stopPollingByPollingToken(pollingToken) {
50
+ if (!pollingToken) {
51
+ throw new Error('pollingToken required');
52
+ }
53
+ let keyToDelete = null;
54
+ for (const [key, tokenSet] of __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f")) {
55
+ if (tokenSet.delete(pollingToken)) {
56
+ if (tokenSet.size === 0) {
57
+ keyToDelete = key;
58
+ }
59
+ break;
60
+ }
61
+ }
62
+ if (keyToDelete) {
63
+ this._stopPollingByPollingTokenSetId(keyToDelete);
64
+ __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").delete(keyToDelete);
65
+ const callbacks = __classPrivateFieldGet(this, _AbstractPollingControllerBase_callbacks, "f").get(keyToDelete);
66
+ if (callbacks) {
67
+ for (const callback of callbacks) {
68
+ // eslint-disable-next-line n/callback-return
69
+ callback(keyToDelete);
70
+ }
71
+ callbacks.clear();
72
+ }
73
+ }
74
+ }
75
+ onPollingCompleteByNetworkClientId(networkClientId, callback, options = {}) {
76
+ var _a;
77
+ const key = (0, exports.getKey)(networkClientId, options);
78
+ const callbacks = (_a = __classPrivateFieldGet(this, _AbstractPollingControllerBase_callbacks, "f").get(key)) !== null && _a !== void 0 ? _a : new Set();
79
+ callbacks.add(callback);
80
+ __classPrivateFieldGet(this, _AbstractPollingControllerBase_callbacks, "f").set(key, callbacks);
81
+ }
82
+ }
83
+ _AbstractPollingControllerBase_pollingTokenSets = new WeakMap(), _AbstractPollingControllerBase_callbacks = new WeakMap();
84
+ return AbstractPollingControllerBase;
85
+ }
86
+ exports.AbstractPollingControllerBaseMixin = AbstractPollingControllerBaseMixin;
87
+ //# sourceMappingURL=AbstractPollingController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractPollingController.js","sourceRoot":"","sources":["../src/AbstractPollingController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport type { Json } from '@metamask/utils';\nimport stringify from 'fast-json-stable-stringify';\nimport { v4 as random } from 'uuid';\n\nexport type IPollingController = {\n startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json,\n ): string;\n\n stopAllPolling(): void;\n\n stopPollingByPollingToken(pollingToken: string): void;\n\n onPollingCompleteByNetworkClientId(\n networkClientId: NetworkClientId,\n callback: (networkClientId: NetworkClientId) => void,\n options: Json,\n ): void;\n\n _executePoll(networkClientId: NetworkClientId, options: Json): Promise<void>;\n _startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json,\n ): void;\n _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;\n};\n\nexport const getKey = (\n networkClientId: NetworkClientId,\n options: Json,\n): PollingTokenSetId => `${networkClientId}:${stringify(options)}`;\n\nexport type PollingTokenSetId = `${NetworkClientId}:${string}`;\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor = new (...args: any[]) => object;\n\n/**\n * AbstractPollingControllerBaseMixin\n *\n * @param Base - The base class to mix onto.\n * @returns The composed class.\n */\nexport function AbstractPollingControllerBaseMixin<TBase extends Constructor>(\n Base: TBase,\n) {\n abstract class AbstractPollingControllerBase\n extends Base\n implements IPollingController\n {\n readonly #pollingTokenSets: Map<PollingTokenSetId, Set<string>> = new Map();\n\n #callbacks: Map<\n PollingTokenSetId,\n Set<(PollingTokenSetId: PollingTokenSetId) => void>\n > = new Map();\n\n abstract _executePoll(\n networkClientId: NetworkClientId,\n options: Json,\n ): Promise<void>;\n\n abstract _startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json,\n ): void;\n\n abstract _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;\n\n startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json = {},\n ): string {\n const pollToken = random();\n const key = getKey(networkClientId, options);\n const pollingTokenSet =\n this.#pollingTokenSets.get(key) ?? new Set<string>();\n pollingTokenSet.add(pollToken);\n this.#pollingTokenSets.set(key, pollingTokenSet);\n\n if (pollingTokenSet.size === 1) {\n this._startPollingByNetworkClientId(networkClientId, options);\n }\n\n return pollToken;\n }\n\n stopAllPolling() {\n this.#pollingTokenSets.forEach((tokenSet, _key) => {\n tokenSet.forEach((token) => {\n this.stopPollingByPollingToken(token);\n });\n });\n }\n\n stopPollingByPollingToken(pollingToken: string) {\n if (!pollingToken) {\n throw new Error('pollingToken required');\n }\n\n let keyToDelete: PollingTokenSetId | null = null;\n for (const [key, tokenSet] of this.#pollingTokenSets) {\n if (tokenSet.delete(pollingToken)) {\n if (tokenSet.size === 0) {\n keyToDelete = key;\n }\n break;\n }\n }\n\n if (keyToDelete) {\n this._stopPollingByPollingTokenSetId(keyToDelete);\n this.#pollingTokenSets.delete(keyToDelete);\n const callbacks = this.#callbacks.get(keyToDelete);\n if (callbacks) {\n for (const callback of callbacks) {\n // eslint-disable-next-line n/callback-return\n callback(keyToDelete);\n }\n callbacks.clear();\n }\n }\n }\n\n onPollingCompleteByNetworkClientId(\n networkClientId: NetworkClientId,\n callback: (networkClientId: NetworkClientId) => void,\n options: Json = {},\n ) {\n const key = getKey(networkClientId, options);\n const callbacks = this.#callbacks.get(key) ?? new Set<typeof callback>();\n callbacks.add(callback);\n this.#callbacks.set(key, callbacks);\n }\n }\n return AbstractPollingControllerBase;\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { BaseController, BaseControllerV1 } from '@metamask/base-controller';
2
+ import type { NetworkClientId, NetworkClient } from '@metamask/network-controller';
3
+ import type { Json } from '@metamask/utils';
4
+ import type { PollingTokenSetId } from './AbstractPollingController';
5
+ declare class Empty {
6
+ }
7
+ export declare const BlockTrackerPollingControllerOnly: (abstract new (...args: any[]) => {
8
+ "__#93086@#activeListeners": Record<string, (options: Json) => Promise<void>>;
9
+ _getNetworkClientById(networkClientId: NetworkClientId): NetworkClient | undefined;
10
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
11
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
12
+ readonly "__#93085@#pollingTokenSets": Map<`${string}:${string}`, Set<string>>;
13
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
14
+ _executePoll(networkClientId: string, options: Json): Promise<void>;
15
+ startPollingByNetworkClientId(networkClientId: string, options?: Json): string;
16
+ stopAllPolling(): void;
17
+ stopPollingByPollingToken(pollingToken: string): void;
18
+ onPollingCompleteByNetworkClientId(networkClientId: string, callback: (networkClientId: string) => void, options?: Json): void;
19
+ }) & typeof Empty;
20
+ export declare const BlockTrackerPollingController: (abstract new (...args: any[]) => {
21
+ "__#93086@#activeListeners": Record<string, (options: Json) => Promise<void>>;
22
+ _getNetworkClientById(networkClientId: NetworkClientId): NetworkClient | undefined;
23
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
24
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
25
+ readonly "__#93085@#pollingTokenSets": Map<`${string}:${string}`, Set<string>>;
26
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
27
+ _executePoll(networkClientId: string, options: Json): Promise<void>;
28
+ startPollingByNetworkClientId(networkClientId: string, options?: Json): string;
29
+ stopAllPolling(): void;
30
+ stopPollingByPollingToken(pollingToken: string): void;
31
+ onPollingCompleteByNetworkClientId(networkClientId: string, callback: (networkClientId: string) => void, options?: Json): void;
32
+ }) & typeof BaseController;
33
+ export declare const BlockTrackerPollingControllerV1: (abstract new (...args: any[]) => {
34
+ "__#93086@#activeListeners": Record<string, (options: Json) => Promise<void>>;
35
+ _getNetworkClientById(networkClientId: NetworkClientId): NetworkClient | undefined;
36
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
37
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
38
+ readonly "__#93085@#pollingTokenSets": Map<`${string}:${string}`, Set<string>>;
39
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
40
+ _executePoll(networkClientId: string, options: Json): Promise<void>;
41
+ startPollingByNetworkClientId(networkClientId: string, options?: Json): string;
42
+ stopAllPolling(): void;
43
+ stopPollingByPollingToken(pollingToken: string): void;
44
+ onPollingCompleteByNetworkClientId(networkClientId: string, callback: (networkClientId: string) => void, options?: Json): void;
45
+ }) & typeof BaseControllerV1;
46
+ export {};
47
+ //# sourceMappingURL=BlockTrackerPollingController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockTrackerPollingController.d.ts","sourceRoot":"","sources":["../src/BlockTrackerPollingController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAsErE,cAAM,KAAK;CAAG;AAEd,eAAO,MAAM,iCAAiC;0DArDC,IAAI,KAAK,QAAQ,IAAI,CAAC;2CAG9C,eAAe,GAC/B,aAAa,GAAG,SAAS;oDAGT,eAAe,WACvB,IAAI;yCAwBsB,iBAAiB;;;;;;;;iBAsBf,CAAC;AAC5C,eAAO,MAAM,6BAA6B;0DAvDK,IAAI,KAAK,QAAQ,IAAI,CAAC;2CAG9C,eAAe,GAC/B,aAAa,GAAG,SAAS;oDAGT,eAAe,WACvB,IAAI;yCAwBsB,iBAAiB;;;;;;;;0BAwBN,CAAC;AACrD,eAAO,MAAM,+BAA+B;0DAzDG,IAAI,KAAK,QAAQ,IAAI,CAAC;2CAG9C,eAAe,GAC/B,aAAa,GAAG,SAAS;oDAGT,eAAe,WACvB,IAAI;yCAwBsB,iBAAiB;;;;;;;;4BA0BJ,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BlockTrackerPollingControllerV1 = exports.BlockTrackerPollingController = exports.BlockTrackerPollingControllerOnly = void 0;
9
+ const base_controller_1 = require("@metamask/base-controller");
10
+ const AbstractPollingController_1 = require("./AbstractPollingController");
11
+ /**
12
+ * BlockTrackerPollingControllerMixin
13
+ * A polling controller that polls using a block tracker.
14
+ *
15
+ * @param Base - The base class to mix onto.
16
+ * @returns The composed class.
17
+ */
18
+ function BlockTrackerPollingControllerMixin(Base) {
19
+ var _BlockTrackerPollingController_activeListeners;
20
+ class BlockTrackerPollingController extends (0, AbstractPollingController_1.AbstractPollingControllerBaseMixin)(Base) {
21
+ constructor() {
22
+ super(...arguments);
23
+ _BlockTrackerPollingController_activeListeners.set(this, {});
24
+ }
25
+ _startPollingByNetworkClientId(networkClientId, options) {
26
+ const key = (0, AbstractPollingController_1.getKey)(networkClientId, options);
27
+ if (__classPrivateFieldGet(this, _BlockTrackerPollingController_activeListeners, "f")[key]) {
28
+ return;
29
+ }
30
+ const networkClient = this._getNetworkClientById(networkClientId);
31
+ if (networkClient) {
32
+ const updateOnNewBlock = this._executePoll.bind(this, networkClientId, options);
33
+ networkClient.blockTracker.addListener('latest', updateOnNewBlock);
34
+ __classPrivateFieldGet(this, _BlockTrackerPollingController_activeListeners, "f")[key] = updateOnNewBlock;
35
+ }
36
+ else {
37
+ throw new Error(`Unable to retrieve blockTracker for networkClientId ${networkClientId}`);
38
+ }
39
+ }
40
+ _stopPollingByPollingTokenSetId(key) {
41
+ const [networkClientId] = key.split(':');
42
+ const networkClient = this._getNetworkClientById(networkClientId);
43
+ if (networkClient && __classPrivateFieldGet(this, _BlockTrackerPollingController_activeListeners, "f")[key]) {
44
+ const listener = __classPrivateFieldGet(this, _BlockTrackerPollingController_activeListeners, "f")[key];
45
+ if (listener) {
46
+ networkClient.blockTracker.removeListener('latest', listener);
47
+ delete __classPrivateFieldGet(this, _BlockTrackerPollingController_activeListeners, "f")[key];
48
+ }
49
+ }
50
+ }
51
+ }
52
+ _BlockTrackerPollingController_activeListeners = new WeakMap();
53
+ return BlockTrackerPollingController;
54
+ }
55
+ class Empty {
56
+ }
57
+ exports.BlockTrackerPollingControllerOnly = BlockTrackerPollingControllerMixin(Empty);
58
+ exports.BlockTrackerPollingController = BlockTrackerPollingControllerMixin(base_controller_1.BaseController);
59
+ exports.BlockTrackerPollingControllerV1 = BlockTrackerPollingControllerMixin(base_controller_1.BaseControllerV1);
60
+ //# sourceMappingURL=BlockTrackerPollingController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockTrackerPollingController.js","sourceRoot":"","sources":["../src/BlockTrackerPollingController.ts"],"names":[],"mappings":";;;;;;;;AAAA,+DAA6E;AAO7E,2EAGqC;AAOrC;;;;;;GAMG;AACH,SAAS,kCAAkC,CACzC,IAAW;;IAEX,MAAe,6BAA8B,SAAQ,IAAA,8DAAkC,EACrF,IAAI,CACL;QAFD;;YAGE,yDAAqE,EAAE,EAAC;QA8C1E,CAAC;QAxCC,8BAA8B,CAC5B,eAAgC,EAChC,OAAa;YAEb,MAAM,GAAG,GAAG,IAAA,kCAAM,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAE7C,IAAI,uBAAA,IAAI,sDAAiB,CAAC,GAAG,CAAC,EAAE;gBAC9B,OAAO;aACR;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;YAClE,IAAI,aAAa,EAAE;gBACjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC7C,IAAI,EACJ,eAAe,EACf,OAAO,CACR,CAAC;gBACF,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;gBACnE,uBAAA,IAAI,sDAAiB,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;aAC/C;iBAAM;gBACL,MAAM,IAAI,KAAK,CACb,uDAAuD,eAAe,EAAE,CACzE,CAAC;aACH;QACH,CAAC;QAED,+BAA+B,CAAC,GAAsB;YACpD,MAAM,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAC9C,eAAkC,CACnC,CAAC;YAEF,IAAI,aAAa,IAAI,uBAAA,IAAI,sDAAiB,CAAC,GAAG,CAAC,EAAE;gBAC/C,MAAM,QAAQ,GAAG,uBAAA,IAAI,sDAAiB,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,QAAQ,EAAE;oBACZ,aAAa,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBAC9D,OAAO,uBAAA,IAAI,sDAAiB,CAAC,GAAG,CAAC,CAAC;iBACnC;aACF;QACH,CAAC;KACF;;IAED,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAED,MAAM,KAAK;CAAG;AAED,QAAA,iCAAiC,GAC5C,kCAAkC,CAAC,KAAK,CAAC,CAAC;AAC/B,QAAA,6BAA6B,GACxC,kCAAkC,CAAC,gCAAc,CAAC,CAAC;AACxC,QAAA,+BAA+B,GAC1C,kCAAkC,CAAC,kCAAgB,CAAC,CAAC","sourcesContent":["import { BaseController, BaseControllerV1 } from '@metamask/base-controller';\nimport type {\n NetworkClientId,\n NetworkClient,\n} from '@metamask/network-controller';\nimport type { Json } from '@metamask/utils';\n\nimport {\n AbstractPollingControllerBaseMixin,\n getKey,\n} from './AbstractPollingController';\nimport type { PollingTokenSetId } from './AbstractPollingController';\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor = new (...args: any[]) => object;\n\n/**\n * BlockTrackerPollingControllerMixin\n * A polling controller that polls using a block tracker.\n *\n * @param Base - The base class to mix onto.\n * @returns The composed class.\n */\nfunction BlockTrackerPollingControllerMixin<TBase extends Constructor>(\n Base: TBase,\n) {\n abstract class BlockTrackerPollingController extends AbstractPollingControllerBaseMixin(\n Base,\n ) {\n #activeListeners: Record<string, (options: Json) => Promise<void>> = {};\n\n abstract _getNetworkClientById(\n networkClientId: NetworkClientId,\n ): NetworkClient | undefined;\n\n _startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json,\n ) {\n const key = getKey(networkClientId, options);\n\n if (this.#activeListeners[key]) {\n return;\n }\n\n const networkClient = this._getNetworkClientById(networkClientId);\n if (networkClient) {\n const updateOnNewBlock = this._executePoll.bind(\n this,\n networkClientId,\n options,\n );\n networkClient.blockTracker.addListener('latest', updateOnNewBlock);\n this.#activeListeners[key] = updateOnNewBlock;\n } else {\n throw new Error(\n `Unable to retrieve blockTracker for networkClientId ${networkClientId}`,\n );\n }\n }\n\n _stopPollingByPollingTokenSetId(key: PollingTokenSetId) {\n const [networkClientId] = key.split(':');\n const networkClient = this._getNetworkClientById(\n networkClientId as NetworkClientId,\n );\n\n if (networkClient && this.#activeListeners[key]) {\n const listener = this.#activeListeners[key];\n if (listener) {\n networkClient.blockTracker.removeListener('latest', listener);\n delete this.#activeListeners[key];\n }\n }\n }\n }\n\n return BlockTrackerPollingController;\n}\n\nclass Empty {}\n\nexport const BlockTrackerPollingControllerOnly =\n BlockTrackerPollingControllerMixin(Empty);\nexport const BlockTrackerPollingController =\n BlockTrackerPollingControllerMixin(BaseController);\nexport const BlockTrackerPollingControllerV1 =\n BlockTrackerPollingControllerMixin(BaseControllerV1);\n"]}
@@ -0,0 +1,58 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ /// <reference types="node" />
5
+ /// <reference types="node" />
6
+ import { BaseController, BaseControllerV1 } from '@metamask/base-controller';
7
+ import type { NetworkClientId } from '@metamask/network-controller';
8
+ import type { Json } from '@metamask/utils';
9
+ import type { PollingTokenSetId } from './AbstractPollingController';
10
+ declare class Empty {
11
+ }
12
+ export declare const StaticIntervalPollingControllerOnly: (abstract new (...args: any[]) => {
13
+ readonly "__#93087@#intervalIds": Record<PollingTokenSetId, NodeJS.Timeout>;
14
+ "__#93087@#intervalLength": number | undefined;
15
+ setIntervalLength(intervalLength: number): void;
16
+ getIntervalLength(): number | undefined;
17
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
18
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
19
+ readonly "__#93085@#pollingTokenSets": Map<`${string}:${string}`, Set<string>>;
20
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
21
+ _executePoll(networkClientId: string, options: Json): Promise<void>;
22
+ startPollingByNetworkClientId(networkClientId: string, options?: Json): string;
23
+ stopAllPolling(): void;
24
+ stopPollingByPollingToken(pollingToken: string): void;
25
+ onPollingCompleteByNetworkClientId(networkClientId: string, callback: (networkClientId: string) => void, options?: Json): void;
26
+ }) & typeof Empty;
27
+ export declare const StaticIntervalPollingController: (abstract new (...args: any[]) => {
28
+ readonly "__#93087@#intervalIds": Record<PollingTokenSetId, NodeJS.Timeout>;
29
+ "__#93087@#intervalLength": number | undefined;
30
+ setIntervalLength(intervalLength: number): void;
31
+ getIntervalLength(): number | undefined;
32
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
33
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
34
+ readonly "__#93085@#pollingTokenSets": Map<`${string}:${string}`, Set<string>>;
35
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
36
+ _executePoll(networkClientId: string, options: Json): Promise<void>;
37
+ startPollingByNetworkClientId(networkClientId: string, options?: Json): string;
38
+ stopAllPolling(): void;
39
+ stopPollingByPollingToken(pollingToken: string): void;
40
+ onPollingCompleteByNetworkClientId(networkClientId: string, callback: (networkClientId: string) => void, options?: Json): void;
41
+ }) & typeof BaseController;
42
+ export declare const StaticIntervalPollingControllerV1: (abstract new (...args: any[]) => {
43
+ readonly "__#93087@#intervalIds": Record<PollingTokenSetId, NodeJS.Timeout>;
44
+ "__#93087@#intervalLength": number | undefined;
45
+ setIntervalLength(intervalLength: number): void;
46
+ getIntervalLength(): number | undefined;
47
+ _startPollingByNetworkClientId(networkClientId: NetworkClientId, options: Json): void;
48
+ _stopPollingByPollingTokenSetId(key: PollingTokenSetId): void;
49
+ readonly "__#93085@#pollingTokenSets": Map<`${string}:${string}`, Set<string>>;
50
+ "__#93085@#callbacks": Map<`${string}:${string}`, Set<(PollingTokenSetId: `${string}:${string}`) => void>>;
51
+ _executePoll(networkClientId: string, options: Json): Promise<void>;
52
+ startPollingByNetworkClientId(networkClientId: string, options?: Json): string;
53
+ stopAllPolling(): void;
54
+ stopPollingByPollingToken(pollingToken: string): void;
55
+ onPollingCompleteByNetworkClientId(networkClientId: string, callback: (networkClientId: string) => void, options?: Json): void;
56
+ }) & typeof BaseControllerV1;
57
+ export {};
58
+ //# sourceMappingURL=StaticIntervalPollingController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticIntervalPollingController.d.ts","sourceRoot":"","sources":["../src/StaticIntervalPollingController.ts"],"names":[],"mappings":";;;;;AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM5C,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAqErC,cAAM,KAAK;CAAG;AAEd,eAAO,MAAM,mCAAmC;sCAnDrB,OAAO,iBAAiB,EAAE,OAAO,OAAO,CAAC;gCAE/C,MAAM,GAAG,SAAS;sCAED,MAAM;;oDASrB,eAAe,WACvB,IAAI;yCAuBsB,iBAAiB;;;;;;;;iBAeb,CAAC;AAC9C,eAAO,MAAM,+BAA+B;sCArDjB,OAAO,iBAAiB,EAAE,OAAO,OAAO,CAAC;gCAE/C,MAAM,GAAG,SAAS;sCAED,MAAM;;oDASrB,eAAe,WACvB,IAAI;yCAuBsB,iBAAiB;;;;;;;;0BAiBJ,CAAC;AACvD,eAAO,MAAM,iCAAiC;sCAvDnB,OAAO,iBAAiB,EAAE,OAAO,OAAO,CAAC;gCAE/C,MAAM,GAAG,SAAS;sCAED,MAAM;;oDASrB,eAAe,WACvB,IAAI;yCAuBsB,iBAAiB;;;;;;;;4BAmBF,CAAC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
12
+ if (kind === "m") throw new TypeError("Private method is not writable");
13
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
14
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
15
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
16
+ };
17
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
19
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.StaticIntervalPollingControllerV1 = exports.StaticIntervalPollingController = exports.StaticIntervalPollingControllerOnly = void 0;
24
+ const base_controller_1 = require("@metamask/base-controller");
25
+ const AbstractPollingController_1 = require("./AbstractPollingController");
26
+ /**
27
+ * StaticIntervalPollingControllerMixin
28
+ * A polling controller that polls on a static interval.
29
+ *
30
+ * @param Base - The base class to mix onto.
31
+ * @returns The composed class.
32
+ */
33
+ function StaticIntervalPollingControllerMixin(Base) {
34
+ var _StaticIntervalPollingController_intervalIds, _StaticIntervalPollingController_intervalLength;
35
+ class StaticIntervalPollingController extends (0, AbstractPollingController_1.AbstractPollingControllerBaseMixin)(Base) {
36
+ constructor() {
37
+ super(...arguments);
38
+ _StaticIntervalPollingController_intervalIds.set(this, {});
39
+ _StaticIntervalPollingController_intervalLength.set(this, 1000);
40
+ }
41
+ setIntervalLength(intervalLength) {
42
+ __classPrivateFieldSet(this, _StaticIntervalPollingController_intervalLength, intervalLength, "f");
43
+ }
44
+ getIntervalLength() {
45
+ return __classPrivateFieldGet(this, _StaticIntervalPollingController_intervalLength, "f");
46
+ }
47
+ _startPollingByNetworkClientId(networkClientId, options) {
48
+ if (!__classPrivateFieldGet(this, _StaticIntervalPollingController_intervalLength, "f")) {
49
+ throw new Error('intervalLength must be defined and greater than 0');
50
+ }
51
+ const key = (0, AbstractPollingController_1.getKey)(networkClientId, options);
52
+ const existingInterval = __classPrivateFieldGet(this, _StaticIntervalPollingController_intervalIds, "f")[key];
53
+ this._stopPollingByPollingTokenSetId(key);
54
+ __classPrivateFieldGet(this, _StaticIntervalPollingController_intervalIds, "f")[key] = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
55
+ try {
56
+ yield this._executePoll(networkClientId, options);
57
+ }
58
+ catch (error) {
59
+ console.error(error);
60
+ }
61
+ this._startPollingByNetworkClientId(networkClientId, options);
62
+ }), existingInterval ? __classPrivateFieldGet(this, _StaticIntervalPollingController_intervalLength, "f") : 0);
63
+ }
64
+ _stopPollingByPollingTokenSetId(key) {
65
+ const intervalId = __classPrivateFieldGet(this, _StaticIntervalPollingController_intervalIds, "f")[key];
66
+ if (intervalId) {
67
+ clearTimeout(intervalId);
68
+ delete __classPrivateFieldGet(this, _StaticIntervalPollingController_intervalIds, "f")[key];
69
+ }
70
+ }
71
+ }
72
+ _StaticIntervalPollingController_intervalIds = new WeakMap(), _StaticIntervalPollingController_intervalLength = new WeakMap();
73
+ return StaticIntervalPollingController;
74
+ }
75
+ class Empty {
76
+ }
77
+ exports.StaticIntervalPollingControllerOnly = StaticIntervalPollingControllerMixin(Empty);
78
+ exports.StaticIntervalPollingController = StaticIntervalPollingControllerMixin(base_controller_1.BaseController);
79
+ exports.StaticIntervalPollingControllerV1 = StaticIntervalPollingControllerMixin(base_controller_1.BaseControllerV1);
80
+ //# sourceMappingURL=StaticIntervalPollingController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticIntervalPollingController.js","sourceRoot":"","sources":["../src/StaticIntervalPollingController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAA6E;AAI7E,2EAGqC;AAUrC;;;;;;GAMG;AACH,SAAS,oCAAoC,CAC3C,IAAW;;IAEX,MAAe,+BACb,SAAQ,IAAA,8DAAkC,EAAC,IAAI,CAAC;QADlD;;YAIE,uDAAmE,EAAE,EAAC;YAEtE,0DAAsC,IAAI,EAAC;QA0C7C,CAAC;QAxCC,iBAAiB,CAAC,cAAsB;YACtC,uBAAA,IAAI,mDAAmB,cAAc,MAAA,CAAC;QACxC,CAAC;QAED,iBAAiB;YACf,OAAO,uBAAA,IAAI,uDAAgB,CAAC;QAC9B,CAAC;QAED,8BAA8B,CAC5B,eAAgC,EAChC,OAAa;YAEb,IAAI,CAAC,uBAAA,IAAI,uDAAgB,EAAE;gBACzB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;aACtE;YAED,MAAM,GAAG,GAAG,IAAA,kCAAM,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,gBAAgB,GAAG,uBAAA,IAAI,oDAAa,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC;YAE1C,uBAAA,IAAI,oDAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CACjC,GAAS,EAAE;gBACT,IAAI;oBACF,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;iBACnD;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;iBACtB;gBACD,IAAI,CAAC,8BAA8B,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAChE,CAAC,CAAA,EACD,gBAAgB,CAAC,CAAC,CAAC,uBAAA,IAAI,uDAAgB,CAAC,CAAC,CAAC,CAAC,CAC5C,CAAC;QACJ,CAAC;QAED,+BAA+B,CAAC,GAAsB;YACpD,MAAM,UAAU,GAAG,uBAAA,IAAI,oDAAa,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,UAAU,EAAE;gBACd,YAAY,CAAC,UAAU,CAAC,CAAC;gBACzB,OAAO,uBAAA,IAAI,oDAAa,CAAC,GAAG,CAAC,CAAC;aAC/B;QACH,CAAC;KACF;;IAED,OAAO,+BAA+B,CAAC;AACzC,CAAC;AAED,MAAM,KAAK;CAAG;AAED,QAAA,mCAAmC,GAC9C,oCAAoC,CAAC,KAAK,CAAC,CAAC;AACjC,QAAA,+BAA+B,GAC1C,oCAAoC,CAAC,gCAAc,CAAC,CAAC;AAC1C,QAAA,iCAAiC,GAC5C,oCAAoC,CAAC,kCAAgB,CAAC,CAAC","sourcesContent":["import { BaseController, BaseControllerV1 } from '@metamask/base-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type { Json } from '@metamask/utils';\n\nimport {\n AbstractPollingControllerBaseMixin,\n getKey,\n} from './AbstractPollingController';\nimport type {\n IPollingController,\n PollingTokenSetId,\n} from './AbstractPollingController';\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor = new (...args: any[]) => object;\n\n/**\n * StaticIntervalPollingControllerMixin\n * A polling controller that polls on a static interval.\n *\n * @param Base - The base class to mix onto.\n * @returns The composed class.\n */\nfunction StaticIntervalPollingControllerMixin<TBase extends Constructor>(\n Base: TBase,\n) {\n abstract class StaticIntervalPollingController\n extends AbstractPollingControllerBaseMixin(Base)\n implements IPollingController\n {\n readonly #intervalIds: Record<PollingTokenSetId, NodeJS.Timeout> = {};\n\n #intervalLength: number | undefined = 1000;\n\n setIntervalLength(intervalLength: number) {\n this.#intervalLength = intervalLength;\n }\n\n getIntervalLength() {\n return this.#intervalLength;\n }\n\n _startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json,\n ) {\n if (!this.#intervalLength) {\n throw new Error('intervalLength must be defined and greater than 0');\n }\n\n const key = getKey(networkClientId, options);\n const existingInterval = this.#intervalIds[key];\n this._stopPollingByPollingTokenSetId(key);\n\n this.#intervalIds[key] = setTimeout(\n async () => {\n try {\n await this._executePoll(networkClientId, options);\n } catch (error) {\n console.error(error);\n }\n this._startPollingByNetworkClientId(networkClientId, options);\n },\n existingInterval ? this.#intervalLength : 0,\n );\n }\n\n _stopPollingByPollingTokenSetId(key: PollingTokenSetId) {\n const intervalId = this.#intervalIds[key];\n if (intervalId) {\n clearTimeout(intervalId);\n delete this.#intervalIds[key];\n }\n }\n }\n\n return StaticIntervalPollingController;\n}\n\nclass Empty {}\n\nexport const StaticIntervalPollingControllerOnly =\n StaticIntervalPollingControllerMixin(Empty);\nexport const StaticIntervalPollingController =\n StaticIntervalPollingControllerMixin(BaseController);\nexport const StaticIntervalPollingControllerV1 =\n StaticIntervalPollingControllerMixin(BaseControllerV1);\n"]}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
- export { PollingController, PollingControllerV1, PollingControllerOnly, } from './PollingController';
1
+ export { BlockTrackerPollingControllerOnly, BlockTrackerPollingController, BlockTrackerPollingControllerV1, } from './BlockTrackerPollingController';
2
+ export { StaticIntervalPollingControllerOnly, StaticIntervalPollingController, StaticIntervalPollingControllerV1, } from './StaticIntervalPollingController';
3
+ export type { IPollingController } from './AbstractPollingController';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,mCAAmC,EACnC,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PollingControllerOnly = exports.PollingControllerV1 = exports.PollingController = void 0;
4
- var PollingController_1 = require("./PollingController");
5
- Object.defineProperty(exports, "PollingController", { enumerable: true, get: function () { return PollingController_1.PollingController; } });
6
- Object.defineProperty(exports, "PollingControllerV1", { enumerable: true, get: function () { return PollingController_1.PollingControllerV1; } });
7
- Object.defineProperty(exports, "PollingControllerOnly", { enumerable: true, get: function () { return PollingController_1.PollingControllerOnly; } });
3
+ exports.StaticIntervalPollingControllerV1 = exports.StaticIntervalPollingController = exports.StaticIntervalPollingControllerOnly = exports.BlockTrackerPollingControllerV1 = exports.BlockTrackerPollingController = exports.BlockTrackerPollingControllerOnly = void 0;
4
+ var BlockTrackerPollingController_1 = require("./BlockTrackerPollingController");
5
+ Object.defineProperty(exports, "BlockTrackerPollingControllerOnly", { enumerable: true, get: function () { return BlockTrackerPollingController_1.BlockTrackerPollingControllerOnly; } });
6
+ Object.defineProperty(exports, "BlockTrackerPollingController", { enumerable: true, get: function () { return BlockTrackerPollingController_1.BlockTrackerPollingController; } });
7
+ Object.defineProperty(exports, "BlockTrackerPollingControllerV1", { enumerable: true, get: function () { return BlockTrackerPollingController_1.BlockTrackerPollingControllerV1; } });
8
+ var StaticIntervalPollingController_1 = require("./StaticIntervalPollingController");
9
+ Object.defineProperty(exports, "StaticIntervalPollingControllerOnly", { enumerable: true, get: function () { return StaticIntervalPollingController_1.StaticIntervalPollingControllerOnly; } });
10
+ Object.defineProperty(exports, "StaticIntervalPollingController", { enumerable: true, get: function () { return StaticIntervalPollingController_1.StaticIntervalPollingController; } });
11
+ Object.defineProperty(exports, "StaticIntervalPollingControllerV1", { enumerable: true, get: function () { return StaticIntervalPollingController_1.StaticIntervalPollingControllerV1; } });
8
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAI6B;AAH3B,sHAAA,iBAAiB,OAAA;AACjB,wHAAA,mBAAmB,OAAA;AACnB,0HAAA,qBAAqB,OAAA","sourcesContent":["export {\n PollingController,\n PollingControllerV1,\n PollingControllerOnly,\n} from './PollingController';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iFAIyC;AAHvC,kJAAA,iCAAiC,OAAA;AACjC,8IAAA,6BAA6B,OAAA;AAC7B,gJAAA,+BAA+B,OAAA;AAGjC,qFAI2C;AAHzC,sJAAA,mCAAmC,OAAA;AACnC,kJAAA,+BAA+B,OAAA;AAC/B,oJAAA,iCAAiC,OAAA","sourcesContent":["export {\n BlockTrackerPollingControllerOnly,\n BlockTrackerPollingController,\n BlockTrackerPollingControllerV1,\n} from './BlockTrackerPollingController';\n\nexport {\n StaticIntervalPollingControllerOnly,\n StaticIntervalPollingController,\n StaticIntervalPollingControllerV1,\n} from './StaticIntervalPollingController';\n\nexport type { IPollingController } from './AbstractPollingController';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/polling-controller",
3
- "version": "2.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "Polling Controller is the base for controllers that polling by networkClientId",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -22,6 +22,7 @@
22
22
  ],
23
23
  "scripts": {
24
24
  "build:docs": "typedoc",
25
+ "changelog:update": "../../scripts/update-changelog.sh @metamask/polling-controller",
25
26
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/polling-controller",
26
27
  "publish:preview": "yarn npm publish --tag preview",
27
28
  "test": "jest --reporters=jest-silent-reporter",
@@ -30,16 +31,16 @@
30
31
  "test:watch": "jest --watch"
31
32
  },
32
33
  "dependencies": {
33
- "@metamask/base-controller": "^4.0.0",
34
- "@metamask/controller-utils": "^6.0.0",
35
- "@metamask/network-controller": "^17.0.0",
34
+ "@metamask/base-controller": "^4.0.1",
35
+ "@metamask/controller-utils": "^8.0.1",
36
+ "@metamask/network-controller": "^17.1.0",
36
37
  "@metamask/utils": "^8.2.0",
37
38
  "@types/uuid": "^8.3.0",
38
39
  "fast-json-stable-stringify": "^2.1.0",
39
40
  "uuid": "^8.3.2"
40
41
  },
41
42
  "devDependencies": {
42
- "@metamask/auto-changelog": "^3.4.3",
43
+ "@metamask/auto-changelog": "^3.4.4",
43
44
  "@types/jest": "^27.4.1",
44
45
  "deepmerge": "^4.2.2",
45
46
  "jest": "^27.5.1",
@@ -50,7 +51,7 @@
50
51
  "typescript": "~4.8.4"
51
52
  },
52
53
  "peerDependencies": {
53
- "@metamask/network-controller": "^17.0.0"
54
+ "@metamask/network-controller": "^17.1.0"
54
55
  },
55
56
  "engines": {
56
57
  "node": ">=16.0.0"
@@ -1,161 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
4
- /// <reference types="node" />
5
- /// <reference types="node" />
6
- import { BaseController, BaseControllerV1 } from '@metamask/base-controller';
7
- import type { NetworkClientId } from '@metamask/network-controller';
8
- import type { Json } from '@metamask/utils';
9
- /**
10
- * Returns a unique key for a networkClientId and options. This is used to group networkClientId polls with the same options
11
- * @param networkClientId - The networkClientId to get a key for
12
- * @param options - The options used to group the polling events
13
- * @returns The unique key
14
- */
15
- export declare const getKey: (networkClientId: NetworkClientId, options: Json) => PollingTokenSetId;
16
- declare type PollingTokenSetId = `${NetworkClientId}:${string}`;
17
- declare class Empty {
18
- }
19
- export declare const PollingControllerOnly: (abstract new (...args: any[]) => {
20
- readonly "__#91333@#pollingTokenSets": Map<PollingTokenSetId, Set<string>>;
21
- readonly "__#91333@#intervalIds": Record<PollingTokenSetId, NodeJS.Timeout>;
22
- "__#91333@#callbacks": Map<string, Set<(networkClientId: NetworkClientId) => void>>;
23
- "__#91333@#intervalLength": number;
24
- getIntervalLength(): number;
25
- /**
26
- * Sets the length of the polling interval
27
- *
28
- * @param length - The length of the polling interval in milliseconds
29
- */
30
- setIntervalLength(length: number): void;
31
- /**
32
- * Starts polling for a networkClientId
33
- *
34
- * @param networkClientId - The networkClientId to start polling for
35
- * @param options - The options used to group the polling events
36
- * @returns void
37
- */
38
- startPollingByNetworkClientId(networkClientId: NetworkClientId, options?: Json): string;
39
- /**
40
- * Stops polling for all networkClientIds
41
- */
42
- stopAllPolling(): void;
43
- /**
44
- * Stops polling for a networkClientId
45
- *
46
- * @param pollingToken - The polling token to stop polling for
47
- */
48
- stopPollingByPollingToken(pollingToken: string): void;
49
- /**
50
- * Executes the poll for a networkClientId
51
- *
52
- * @param networkClientId - The networkClientId to execute the poll for
53
- * @param options - The options passed to startPollingByNetworkClientId
54
- */
55
- _executePoll(networkClientId: NetworkClientId, options: Json): Promise<void>;
56
- "__#91333@#poll"(networkClientId: NetworkClientId, options: Json): void;
57
- /**
58
- * Adds a callback to execute when polling is complete
59
- *
60
- * @param networkClientId - The networkClientId to listen for polling complete events
61
- * @param callback - The callback to execute when polling is complete
62
- * @param options - The options used to group the polling events
63
- */
64
- onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void, options?: Json): void;
65
- }) & typeof Empty;
66
- export declare const PollingController: (abstract new (...args: any[]) => {
67
- readonly "__#91333@#pollingTokenSets": Map<PollingTokenSetId, Set<string>>;
68
- readonly "__#91333@#intervalIds": Record<PollingTokenSetId, NodeJS.Timeout>;
69
- "__#91333@#callbacks": Map<string, Set<(networkClientId: NetworkClientId) => void>>;
70
- "__#91333@#intervalLength": number;
71
- getIntervalLength(): number;
72
- /**
73
- * Sets the length of the polling interval
74
- *
75
- * @param length - The length of the polling interval in milliseconds
76
- */
77
- setIntervalLength(length: number): void;
78
- /**
79
- * Starts polling for a networkClientId
80
- *
81
- * @param networkClientId - The networkClientId to start polling for
82
- * @param options - The options used to group the polling events
83
- * @returns void
84
- */
85
- startPollingByNetworkClientId(networkClientId: NetworkClientId, options?: Json): string;
86
- /**
87
- * Stops polling for all networkClientIds
88
- */
89
- stopAllPolling(): void;
90
- /**
91
- * Stops polling for a networkClientId
92
- *
93
- * @param pollingToken - The polling token to stop polling for
94
- */
95
- stopPollingByPollingToken(pollingToken: string): void;
96
- /**
97
- * Executes the poll for a networkClientId
98
- *
99
- * @param networkClientId - The networkClientId to execute the poll for
100
- * @param options - The options passed to startPollingByNetworkClientId
101
- */
102
- _executePoll(networkClientId: NetworkClientId, options: Json): Promise<void>;
103
- "__#91333@#poll"(networkClientId: NetworkClientId, options: Json): void;
104
- /**
105
- * Adds a callback to execute when polling is complete
106
- *
107
- * @param networkClientId - The networkClientId to listen for polling complete events
108
- * @param callback - The callback to execute when polling is complete
109
- * @param options - The options used to group the polling events
110
- */
111
- onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void, options?: Json): void;
112
- }) & typeof BaseController;
113
- export declare const PollingControllerV1: (abstract new (...args: any[]) => {
114
- readonly "__#91333@#pollingTokenSets": Map<PollingTokenSetId, Set<string>>;
115
- readonly "__#91333@#intervalIds": Record<PollingTokenSetId, NodeJS.Timeout>;
116
- "__#91333@#callbacks": Map<string, Set<(networkClientId: NetworkClientId) => void>>;
117
- "__#91333@#intervalLength": number;
118
- getIntervalLength(): number;
119
- /**
120
- * Sets the length of the polling interval
121
- *
122
- * @param length - The length of the polling interval in milliseconds
123
- */
124
- setIntervalLength(length: number): void;
125
- /**
126
- * Starts polling for a networkClientId
127
- *
128
- * @param networkClientId - The networkClientId to start polling for
129
- * @param options - The options used to group the polling events
130
- * @returns void
131
- */
132
- startPollingByNetworkClientId(networkClientId: NetworkClientId, options?: Json): string;
133
- /**
134
- * Stops polling for all networkClientIds
135
- */
136
- stopAllPolling(): void;
137
- /**
138
- * Stops polling for a networkClientId
139
- *
140
- * @param pollingToken - The polling token to stop polling for
141
- */
142
- stopPollingByPollingToken(pollingToken: string): void;
143
- /**
144
- * Executes the poll for a networkClientId
145
- *
146
- * @param networkClientId - The networkClientId to execute the poll for
147
- * @param options - The options passed to startPollingByNetworkClientId
148
- */
149
- _executePoll(networkClientId: NetworkClientId, options: Json): Promise<void>;
150
- "__#91333@#poll"(networkClientId: NetworkClientId, options: Json): void;
151
- /**
152
- * Adds a callback to execute when polling is complete
153
- *
154
- * @param networkClientId - The networkClientId to listen for polling complete events
155
- * @param callback - The callback to execute when polling is complete
156
- * @param options - The options used to group the polling events
157
- */
158
- onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void, options?: Json): void;
159
- }) & typeof BaseControllerV1;
160
- export {};
161
- //# sourceMappingURL=PollingController.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PollingController.d.ts","sourceRoot":"","sources":["../src/PollingController.ts"],"names":[],"mappings":";;;;;AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAQ5C;;;;;GAKG;AACH,eAAO,MAAM,MAAM,oBACA,eAAe,WACvB,IAAI,KACZ,iBAA+D,CAAC;AAEnE,aAAK,iBAAiB,GAAG,GAAG,eAAe,IAAI,MAAM,EAAE,CAAC;AAwKxD,cAAM,KAAK;CAAG;AAEd,eAAO,MAAM,qBAAqB,0BAvLD,GAAG,EAAE;2CA4BN,IAAI,iBAAiB,EAAE,IAAI,MAAM,CAAC,CAAC;sCAExC,OAAO,iBAAiB,EAAE,OAAO,OAAO,CAAC;6DAIxC,eAAe,KAAK,IAAI;;;IAShD;;;;OAIG;8BACuB,MAAM;IAIhC;;;;;;OAMG;mDAEgB,eAAe,YACvB,IAAI;IAkBf;;OAEG;;IASH;;;;OAIG;4CACqC,MAAM;IAyB9C;;;;;OAKG;kCAEgB,eAAe,WACvB,IAAI,GACZ,QAAQ,IAAI,CAAC;sCAEO,eAAe,WAAW,IAAI;IAuBrD;;;;;;OAMG;wDAEgB,eAAe,8BACJ,eAAe,KAAK,IAAI,YAC3C,IAAI;iBAmB+C,CAAC;AACnE,eAAO,MAAM,iBAAiB,0BAxLG,GAAG,EAAE;2CA4BN,IAAI,iBAAiB,EAAE,IAAI,MAAM,CAAC,CAAC;sCAExC,OAAO,iBAAiB,EAAE,OAAO,OAAO,CAAC;6DAIxC,eAAe,KAAK,IAAI;;;IAShD;;;;OAIG;8BACuB,MAAM;IAIhC;;;;;;OAMG;mDAEgB,eAAe,YACvB,IAAI;IAkBf;;OAEG;;IASH;;;;OAIG;4CACqC,MAAM;IAyB9C;;;;;OAKG;kCAEgB,eAAe,WACvB,IAAI,GACZ,QAAQ,IAAI,CAAC;sCAEO,eAAe,WAAW,IAAI;IAuBrD;;;;;;OAMG;wDAEgB,eAAe,8BACJ,eAAe,KAAK,IAAI,YAC3C,IAAI;0BAoBoD,CAAC;AACxE,eAAO,MAAM,mBAAmB,0BAzLC,GAAG,EAAE;2CA4BN,IAAI,iBAAiB,EAAE,IAAI,MAAM,CAAC,CAAC;sCAExC,OAAO,iBAAiB,EAAE,OAAO,OAAO,CAAC;6DAIxC,eAAe,KAAK,IAAI;;;IAShD;;;;OAIG;8BACuB,MAAM;IAIhC;;;;;;OAMG;mDAEgB,eAAe,YACvB,IAAI;IAkBf;;OAEG;;IASH;;;;OAIG;4CACqC,MAAM;IAyB9C;;;;;OAKG;kCAEgB,eAAe,WACvB,IAAI,GACZ,QAAQ,IAAI,CAAC;sCAEO,eAAe,WAAW,IAAI;IAuBrD;;;;;;OAMG;wDAEgB,eAAe,8BACJ,eAAe,KAAK,IAAI,YAC3C,IAAI;4BAqBwD,CAAC"}
@@ -1,181 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
- };
16
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
17
- if (kind === "m") throw new TypeError("Private method is not writable");
18
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
19
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
20
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
21
- };
22
- var __importDefault = (this && this.__importDefault) || function (mod) {
23
- return (mod && mod.__esModule) ? mod : { "default": mod };
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.PollingControllerV1 = exports.PollingController = exports.PollingControllerOnly = exports.getKey = void 0;
27
- const base_controller_1 = require("@metamask/base-controller");
28
- const fast_json_stable_stringify_1 = __importDefault(require("fast-json-stable-stringify"));
29
- const uuid_1 = require("uuid");
30
- /**
31
- * Returns a unique key for a networkClientId and options. This is used to group networkClientId polls with the same options
32
- * @param networkClientId - The networkClientId to get a key for
33
- * @param options - The options used to group the polling events
34
- * @returns The unique key
35
- */
36
- const getKey = (networkClientId, options) => `${networkClientId}:${(0, fast_json_stable_stringify_1.default)(options)}`;
37
- exports.getKey = getKey;
38
- /**
39
- * PollingControllerMixin
40
- *
41
- * @param Base - The base class to mix onto.
42
- * @returns The composed class.
43
- */
44
- function PollingControllerMixin(Base) {
45
- var _PollingControllerBase_instances, _PollingControllerBase_pollingTokenSets, _PollingControllerBase_intervalIds, _PollingControllerBase_callbacks, _PollingControllerBase_intervalLength, _PollingControllerBase_poll;
46
- /**
47
- * PollingController is an abstract class that implements the polling
48
- * functionality for a controller. It is meant to be extended by a controller
49
- * that needs to poll for data by networkClientId.
50
- *
51
- */
52
- class PollingControllerBase extends Base {
53
- constructor() {
54
- super(...arguments);
55
- _PollingControllerBase_instances.add(this);
56
- _PollingControllerBase_pollingTokenSets.set(this, new Map());
57
- _PollingControllerBase_intervalIds.set(this, {});
58
- _PollingControllerBase_callbacks.set(this, new Map());
59
- _PollingControllerBase_intervalLength.set(this, 1000);
60
- }
61
- getIntervalLength() {
62
- return __classPrivateFieldGet(this, _PollingControllerBase_intervalLength, "f");
63
- }
64
- /**
65
- * Sets the length of the polling interval
66
- *
67
- * @param length - The length of the polling interval in milliseconds
68
- */
69
- setIntervalLength(length) {
70
- __classPrivateFieldSet(this, _PollingControllerBase_intervalLength, length, "f");
71
- }
72
- /**
73
- * Starts polling for a networkClientId
74
- *
75
- * @param networkClientId - The networkClientId to start polling for
76
- * @param options - The options used to group the polling events
77
- * @returns void
78
- */
79
- startPollingByNetworkClientId(networkClientId, options = {}) {
80
- const pollToken = (0, uuid_1.v4)();
81
- const key = (0, exports.getKey)(networkClientId, options);
82
- const pollingTokenSet = __classPrivateFieldGet(this, _PollingControllerBase_pollingTokenSets, "f").get(key);
83
- if (pollingTokenSet) {
84
- pollingTokenSet.add(pollToken);
85
- }
86
- else {
87
- const set = new Set();
88
- set.add(pollToken);
89
- __classPrivateFieldGet(this, _PollingControllerBase_pollingTokenSets, "f").set(key, set);
90
- }
91
- __classPrivateFieldGet(this, _PollingControllerBase_instances, "m", _PollingControllerBase_poll).call(this, networkClientId, options);
92
- return pollToken;
93
- }
94
- /**
95
- * Stops polling for all networkClientIds
96
- */
97
- stopAllPolling() {
98
- __classPrivateFieldGet(this, _PollingControllerBase_pollingTokenSets, "f").forEach((tokenSet, _networkClientId) => {
99
- tokenSet.forEach((token) => {
100
- this.stopPollingByPollingToken(token);
101
- });
102
- });
103
- }
104
- /**
105
- * Stops polling for a networkClientId
106
- *
107
- * @param pollingToken - The polling token to stop polling for
108
- */
109
- stopPollingByPollingToken(pollingToken) {
110
- if (!pollingToken) {
111
- throw new Error('pollingToken required');
112
- }
113
- let found = false;
114
- __classPrivateFieldGet(this, _PollingControllerBase_pollingTokenSets, "f").forEach((tokenSet, key) => {
115
- var _a, _b;
116
- if (tokenSet.has(pollingToken)) {
117
- found = true;
118
- tokenSet.delete(pollingToken);
119
- if (tokenSet.size === 0) {
120
- clearTimeout(__classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[key]);
121
- delete __classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[key];
122
- __classPrivateFieldGet(this, _PollingControllerBase_pollingTokenSets, "f").delete(key);
123
- (_a = __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").get(key)) === null || _a === void 0 ? void 0 : _a.forEach((callback) => {
124
- callback(key);
125
- });
126
- (_b = __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").get(key)) === null || _b === void 0 ? void 0 : _b.clear();
127
- }
128
- }
129
- });
130
- if (!found) {
131
- throw new Error('pollingToken not found');
132
- }
133
- }
134
- /**
135
- * Adds a callback to execute when polling is complete
136
- *
137
- * @param networkClientId - The networkClientId to listen for polling complete events
138
- * @param callback - The callback to execute when polling is complete
139
- * @param options - The options used to group the polling events
140
- */
141
- onPollingCompleteByNetworkClientId(networkClientId, callback, options = {}) {
142
- const key = (0, exports.getKey)(networkClientId, options);
143
- const callbacks = __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").get(key);
144
- if (callbacks === undefined) {
145
- const set = new Set();
146
- set.add(callback);
147
- __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").set(key, set);
148
- }
149
- else {
150
- callbacks.add(callback);
151
- }
152
- }
153
- }
154
- _PollingControllerBase_pollingTokenSets = new WeakMap(), _PollingControllerBase_intervalIds = new WeakMap(), _PollingControllerBase_callbacks = new WeakMap(), _PollingControllerBase_intervalLength = new WeakMap(), _PollingControllerBase_instances = new WeakSet(), _PollingControllerBase_poll = function _PollingControllerBase_poll(networkClientId, options) {
155
- const key = (0, exports.getKey)(networkClientId, options);
156
- const interval = __classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[key];
157
- if (interval) {
158
- clearTimeout(interval);
159
- delete __classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[key];
160
- }
161
- // setTimeout is not `await`ing this async function, which is expected
162
- // We're just using async here for improved stack traces
163
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
164
- __classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[key] = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
165
- try {
166
- yield this._executePoll(networkClientId, options);
167
- }
168
- catch (error) {
169
- console.error(error);
170
- }
171
- __classPrivateFieldGet(this, _PollingControllerBase_instances, "m", _PollingControllerBase_poll).call(this, networkClientId, options);
172
- }), interval ? __classPrivateFieldGet(this, _PollingControllerBase_intervalLength, "f") : 0);
173
- };
174
- return PollingControllerBase;
175
- }
176
- class Empty {
177
- }
178
- exports.PollingControllerOnly = PollingControllerMixin(Empty);
179
- exports.PollingController = PollingControllerMixin(base_controller_1.BaseController);
180
- exports.PollingControllerV1 = PollingControllerMixin(base_controller_1.BaseControllerV1);
181
- //# sourceMappingURL=PollingController.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PollingController.js","sourceRoot":"","sources":["../src/PollingController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController, BaseControllerV1 } from '@metamask/base-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type { Json } from '@metamask/utils';\nimport stringify from 'fast-json-stable-stringify';\nimport { v4 as random } from 'uuid';\n\n// Mixin classes require a constructor with an `...any[]` parameter\n// See TS2545\ntype Constructor = new (...args: any[]) => object;\n\n/**\n * Returns a unique key for a networkClientId and options. This is used to group networkClientId polls with the same options\n * @param networkClientId - The networkClientId to get a key for\n * @param options - The options used to group the polling events\n * @returns The unique key\n */\nexport const getKey = (\n networkClientId: NetworkClientId,\n options: Json,\n): PollingTokenSetId => `${networkClientId}:${stringify(options)}`;\n\ntype PollingTokenSetId = `${NetworkClientId}:${string}`;\n/**\n * PollingControllerMixin\n *\n * @param Base - The base class to mix onto.\n * @returns The composed class.\n */\nfunction PollingControllerMixin<TBase extends Constructor>(Base: TBase) {\n /**\n * PollingController is an abstract class that implements the polling\n * functionality for a controller. It is meant to be extended by a controller\n * that needs to poll for data by networkClientId.\n *\n */\n abstract class PollingControllerBase extends Base {\n readonly #pollingTokenSets: Map<PollingTokenSetId, Set<string>> = new Map();\n\n readonly #intervalIds: Record<PollingTokenSetId, NodeJS.Timeout> = {};\n\n #callbacks: Map<\n NetworkClientId,\n Set<(networkClientId: NetworkClientId) => void>\n > = new Map();\n\n #intervalLength = 1000;\n\n getIntervalLength() {\n return this.#intervalLength;\n }\n\n /**\n * Sets the length of the polling interval\n *\n * @param length - The length of the polling interval in milliseconds\n */\n setIntervalLength(length: number) {\n this.#intervalLength = length;\n }\n\n /**\n * Starts polling for a networkClientId\n *\n * @param networkClientId - The networkClientId to start polling for\n * @param options - The options used to group the polling events\n * @returns void\n */\n startPollingByNetworkClientId(\n networkClientId: NetworkClientId,\n options: Json = {},\n ) {\n const pollToken = random();\n\n const key = getKey(networkClientId, options);\n\n const pollingTokenSet = this.#pollingTokenSets.get(key);\n if (pollingTokenSet) {\n pollingTokenSet.add(pollToken);\n } else {\n const set = new Set<string>();\n set.add(pollToken);\n this.#pollingTokenSets.set(key, set);\n }\n this.#poll(networkClientId, options);\n return pollToken;\n }\n\n /**\n * Stops polling for all networkClientIds\n */\n stopAllPolling() {\n this.#pollingTokenSets.forEach((tokenSet, _networkClientId) => {\n tokenSet.forEach((token) => {\n this.stopPollingByPollingToken(token);\n });\n });\n }\n\n /**\n * Stops polling for a networkClientId\n *\n * @param pollingToken - The polling token to stop polling for\n */\n stopPollingByPollingToken(pollingToken: string) {\n if (!pollingToken) {\n throw new Error('pollingToken required');\n }\n let found = false;\n this.#pollingTokenSets.forEach((tokenSet, key) => {\n if (tokenSet.has(pollingToken)) {\n found = true;\n tokenSet.delete(pollingToken);\n if (tokenSet.size === 0) {\n clearTimeout(this.#intervalIds[key]);\n delete this.#intervalIds[key];\n this.#pollingTokenSets.delete(key);\n this.#callbacks.get(key)?.forEach((callback) => {\n callback(key);\n });\n this.#callbacks.get(key)?.clear();\n }\n }\n });\n if (!found) {\n throw new Error('pollingToken not found');\n }\n }\n\n /**\n * Executes the poll for a networkClientId\n *\n * @param networkClientId - The networkClientId to execute the poll for\n * @param options - The options passed to startPollingByNetworkClientId\n */\n abstract _executePoll(\n networkClientId: NetworkClientId,\n options: Json,\n ): Promise<void>;\n\n #poll(networkClientId: NetworkClientId, options: Json) {\n const key = getKey(networkClientId, options);\n const interval = this.#intervalIds[key];\n if (interval) {\n clearTimeout(interval);\n delete this.#intervalIds[key];\n }\n // setTimeout is not `await`ing this async function, which is expected\n // We're just using async here for improved stack traces\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#intervalIds[key] = setTimeout(\n async () => {\n try {\n await this._executePoll(networkClientId, options);\n } catch (error) {\n console.error(error);\n }\n this.#poll(networkClientId, options);\n },\n interval ? this.#intervalLength : 0,\n );\n }\n\n /**\n * Adds a callback to execute when polling is complete\n *\n * @param networkClientId - The networkClientId to listen for polling complete events\n * @param callback - The callback to execute when polling is complete\n * @param options - The options used to group the polling events\n */\n onPollingCompleteByNetworkClientId(\n networkClientId: NetworkClientId,\n callback: (networkClientId: NetworkClientId) => void,\n options: Json = {},\n ) {\n const key = getKey(networkClientId, options);\n const callbacks = this.#callbacks.get(key);\n\n if (callbacks === undefined) {\n const set = new Set<typeof callback>();\n set.add(callback);\n this.#callbacks.set(key, set);\n } else {\n callbacks.add(callback);\n }\n }\n }\n return PollingControllerBase;\n}\n\nclass Empty {}\n\nexport const PollingControllerOnly = PollingControllerMixin(Empty);\nexport const PollingController = PollingControllerMixin(BaseController);\nexport const PollingControllerV1 = PollingControllerMixin(BaseControllerV1);\n"]}