@metamask/polling-controller 0.0.0 → 0.1.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 +6 -1
- package/dist/PollingController.d.ts +96 -0
- package/dist/PollingController.d.ts.map +1 -0
- package/dist/PollingController.js +161 -0
- package/dist/PollingController.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/package.json +9 -8
package/CHANGELOG.md
CHANGED
|
@@ -6,4 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
-
[
|
|
9
|
+
## [0.1.0]
|
|
10
|
+
### Added
|
|
11
|
+
- Initial release
|
|
12
|
+
|
|
13
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/polling-controller@0.1.0...HEAD
|
|
14
|
+
[0.1.0]: https://github.com/MetaMask/core/releases/tag/@metamask/polling-controller@0.1.0
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
/// <reference types="node" />
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import { BaseController, BaseControllerV2 } from '@metamask/base-controller';
|
|
7
|
+
import type { NetworkClientId } from '@metamask/network-controller';
|
|
8
|
+
export declare const PollingController: (abstract new (...args: any[]) => {
|
|
9
|
+
readonly "__#112124@#networkClientIdTokensMap": Map<NetworkClientId, Set<string>>;
|
|
10
|
+
readonly "__#112124@#intervalIds": Record<NetworkClientId, NodeJS.Timeout>;
|
|
11
|
+
"__#112124@#callbacks": Map<string, Set<(networkClientId: NetworkClientId) => void>>;
|
|
12
|
+
"__#112124@#intervalLength": number;
|
|
13
|
+
getIntervalLength(): number;
|
|
14
|
+
/**
|
|
15
|
+
* Sets the length of the polling interval
|
|
16
|
+
*
|
|
17
|
+
* @param length - The length of the polling interval in milliseconds
|
|
18
|
+
*/
|
|
19
|
+
setIntervalLength(length: number): void;
|
|
20
|
+
/**
|
|
21
|
+
* Starts polling for a networkClientId
|
|
22
|
+
*
|
|
23
|
+
* @param networkClientId - The networkClientId to start polling for
|
|
24
|
+
* @returns void
|
|
25
|
+
*/
|
|
26
|
+
startPollingByNetworkClientId(networkClientId: NetworkClientId): string;
|
|
27
|
+
/**
|
|
28
|
+
* Stops polling for all networkClientIds
|
|
29
|
+
*/
|
|
30
|
+
stopAllPolling(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Stops polling for a networkClientId
|
|
33
|
+
*
|
|
34
|
+
* @param pollingToken - The polling token to stop polling for
|
|
35
|
+
*/
|
|
36
|
+
stopPollingByNetworkClientId(pollingToken: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Executes the poll for a networkClientId
|
|
39
|
+
*
|
|
40
|
+
* @param networkClientId - The networkClientId to execute the poll for
|
|
41
|
+
*/
|
|
42
|
+
executePoll(networkClientId: NetworkClientId): Promise<void>;
|
|
43
|
+
"__#112124@#poll"(networkClientId: NetworkClientId): void;
|
|
44
|
+
/**
|
|
45
|
+
* Adds a callback to execute when polling is complete
|
|
46
|
+
*
|
|
47
|
+
* @param networkClientId - The networkClientId to listen for polling complete events
|
|
48
|
+
* @param callback - The callback to execute when polling is complete
|
|
49
|
+
*/
|
|
50
|
+
onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void): void;
|
|
51
|
+
}) & typeof BaseControllerV2;
|
|
52
|
+
export declare const PollingControllerV1: (abstract new (...args: any[]) => {
|
|
53
|
+
readonly "__#112124@#networkClientIdTokensMap": Map<NetworkClientId, Set<string>>;
|
|
54
|
+
readonly "__#112124@#intervalIds": Record<NetworkClientId, NodeJS.Timeout>;
|
|
55
|
+
"__#112124@#callbacks": Map<string, Set<(networkClientId: NetworkClientId) => void>>;
|
|
56
|
+
"__#112124@#intervalLength": number;
|
|
57
|
+
getIntervalLength(): number;
|
|
58
|
+
/**
|
|
59
|
+
* Sets the length of the polling interval
|
|
60
|
+
*
|
|
61
|
+
* @param length - The length of the polling interval in milliseconds
|
|
62
|
+
*/
|
|
63
|
+
setIntervalLength(length: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* Starts polling for a networkClientId
|
|
66
|
+
*
|
|
67
|
+
* @param networkClientId - The networkClientId to start polling for
|
|
68
|
+
* @returns void
|
|
69
|
+
*/
|
|
70
|
+
startPollingByNetworkClientId(networkClientId: NetworkClientId): string;
|
|
71
|
+
/**
|
|
72
|
+
* Stops polling for all networkClientIds
|
|
73
|
+
*/
|
|
74
|
+
stopAllPolling(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Stops polling for a networkClientId
|
|
77
|
+
*
|
|
78
|
+
* @param pollingToken - The polling token to stop polling for
|
|
79
|
+
*/
|
|
80
|
+
stopPollingByNetworkClientId(pollingToken: string): void;
|
|
81
|
+
/**
|
|
82
|
+
* Executes the poll for a networkClientId
|
|
83
|
+
*
|
|
84
|
+
* @param networkClientId - The networkClientId to execute the poll for
|
|
85
|
+
*/
|
|
86
|
+
executePoll(networkClientId: NetworkClientId): Promise<void>;
|
|
87
|
+
"__#112124@#poll"(networkClientId: NetworkClientId): void;
|
|
88
|
+
/**
|
|
89
|
+
* Adds a callback to execute when polling is complete
|
|
90
|
+
*
|
|
91
|
+
* @param networkClientId - The networkClientId to listen for polling complete events
|
|
92
|
+
* @param callback - The callback to execute when polling is complete
|
|
93
|
+
*/
|
|
94
|
+
onPollingCompleteByNetworkClientId(networkClientId: NetworkClientId, callback: (networkClientId: NetworkClientId) => void): void;
|
|
95
|
+
}) & typeof BaseController;
|
|
96
|
+
//# sourceMappingURL=PollingController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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;AA4JpE,eAAO,MAAM,iBAAiB,0BAvJG,GAAG,EAAE;oDAgBE,IAAI,eAAe,EAAE,IAAI,MAAM,CAAC,CAAC;uCAG9C,OAAO,eAAe,EAAE,OAAO,OAAO,CAAC;8DAItC,eAAe,KAAK,IAAI;;;IAShD;;;;OAIG;8BACuB,MAAM;IAIhC;;;;;OAKG;mDAC4C,eAAe;IAc9D;;OAEG;;IASH;;;;OAIG;+CACwC,MAAM;IA2BjD;;;;OAIG;iCACmC,eAAe,GAAG,QAAQ,IAAI,CAAC;uCAE9C,eAAe;IAkBtC;;;;;OAKG;wDAEgB,eAAe,8BACJ,eAAe,KAAK,IAAI;4BAce,CAAC;AAC1E,eAAO,MAAM,mBAAmB,0BAxJC,GAAG,EAAE;oDAgBE,IAAI,eAAe,EAAE,IAAI,MAAM,CAAC,CAAC;uCAG9C,OAAO,eAAe,EAAE,OAAO,OAAO,CAAC;8DAItC,eAAe,KAAK,IAAI;;;IAShD;;;;OAIG;8BACuB,MAAM;IAIhC;;;;;OAKG;mDAC4C,eAAe;IAc9D;;OAEG;;IASH;;;;OAIG;+CACwC,MAAM;IA2BjD;;;;OAIG;iCACmC,eAAe,GAAG,QAAQ,IAAI,CAAC;uCAE9C,eAAe;IAkBtC;;;;;OAKG;wDAEgB,eAAe,8BACJ,eAAe,KAAK,IAAI;0BAee,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.PollingControllerV1 = exports.PollingController = void 0;
|
|
24
|
+
const base_controller_1 = require("@metamask/base-controller");
|
|
25
|
+
const uuid_1 = require("uuid");
|
|
26
|
+
/**
|
|
27
|
+
* PollingControllerMixin
|
|
28
|
+
*
|
|
29
|
+
* @param Base - The base class to mix onto.
|
|
30
|
+
* @returns The composed class.
|
|
31
|
+
*/
|
|
32
|
+
function PollingControllerMixin(Base) {
|
|
33
|
+
var _PollingControllerBase_instances, _PollingControllerBase_networkClientIdTokensMap, _PollingControllerBase_intervalIds, _PollingControllerBase_callbacks, _PollingControllerBase_intervalLength, _PollingControllerBase_poll;
|
|
34
|
+
/**
|
|
35
|
+
* PollingController is an abstract class that implements the polling
|
|
36
|
+
* functionality for a controller. It is meant to be extended by a controller
|
|
37
|
+
* that needs to poll for data by networkClientId.
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
class PollingControllerBase extends Base {
|
|
41
|
+
constructor() {
|
|
42
|
+
super(...arguments);
|
|
43
|
+
_PollingControllerBase_instances.add(this);
|
|
44
|
+
_PollingControllerBase_networkClientIdTokensMap.set(this, new Map());
|
|
45
|
+
_PollingControllerBase_intervalIds.set(this, {});
|
|
46
|
+
_PollingControllerBase_callbacks.set(this, new Map());
|
|
47
|
+
_PollingControllerBase_intervalLength.set(this, 1000);
|
|
48
|
+
}
|
|
49
|
+
getIntervalLength() {
|
|
50
|
+
return __classPrivateFieldGet(this, _PollingControllerBase_intervalLength, "f");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sets the length of the polling interval
|
|
54
|
+
*
|
|
55
|
+
* @param length - The length of the polling interval in milliseconds
|
|
56
|
+
*/
|
|
57
|
+
setIntervalLength(length) {
|
|
58
|
+
__classPrivateFieldSet(this, _PollingControllerBase_intervalLength, length, "f");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Starts polling for a networkClientId
|
|
62
|
+
*
|
|
63
|
+
* @param networkClientId - The networkClientId to start polling for
|
|
64
|
+
* @returns void
|
|
65
|
+
*/
|
|
66
|
+
startPollingByNetworkClientId(networkClientId) {
|
|
67
|
+
const innerPollToken = (0, uuid_1.v4)();
|
|
68
|
+
if (__classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").has(networkClientId)) {
|
|
69
|
+
const set = __classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").get(networkClientId);
|
|
70
|
+
set === null || set === void 0 ? void 0 : set.add(innerPollToken);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const set = new Set();
|
|
74
|
+
set.add(innerPollToken);
|
|
75
|
+
__classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").set(networkClientId, set);
|
|
76
|
+
}
|
|
77
|
+
__classPrivateFieldGet(this, _PollingControllerBase_instances, "m", _PollingControllerBase_poll).call(this, networkClientId);
|
|
78
|
+
return innerPollToken;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Stops polling for all networkClientIds
|
|
82
|
+
*/
|
|
83
|
+
stopAllPolling() {
|
|
84
|
+
__classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").forEach((tokens, _networkClientId) => {
|
|
85
|
+
tokens.forEach((token) => {
|
|
86
|
+
this.stopPollingByNetworkClientId(token);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Stops polling for a networkClientId
|
|
92
|
+
*
|
|
93
|
+
* @param pollingToken - The polling token to stop polling for
|
|
94
|
+
*/
|
|
95
|
+
stopPollingByNetworkClientId(pollingToken) {
|
|
96
|
+
if (!pollingToken) {
|
|
97
|
+
throw new Error('pollingToken required');
|
|
98
|
+
}
|
|
99
|
+
let found = false;
|
|
100
|
+
__classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").forEach((tokens, networkClientId) => {
|
|
101
|
+
var _a, _b, _c, _d;
|
|
102
|
+
if (tokens.has(pollingToken)) {
|
|
103
|
+
found = true;
|
|
104
|
+
(_a = __classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f")
|
|
105
|
+
.get(networkClientId)) === null || _a === void 0 ? void 0 : _a.delete(pollingToken);
|
|
106
|
+
if (((_b = __classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").get(networkClientId)) === null || _b === void 0 ? void 0 : _b.size) === 0) {
|
|
107
|
+
clearTimeout(__classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[networkClientId]);
|
|
108
|
+
delete __classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[networkClientId];
|
|
109
|
+
__classPrivateFieldGet(this, _PollingControllerBase_networkClientIdTokensMap, "f").delete(networkClientId);
|
|
110
|
+
(_c = __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").get(networkClientId)) === null || _c === void 0 ? void 0 : _c.forEach((callback) => {
|
|
111
|
+
callback(networkClientId);
|
|
112
|
+
});
|
|
113
|
+
(_d = __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").get(networkClientId)) === null || _d === void 0 ? void 0 : _d.clear();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
if (!found) {
|
|
118
|
+
throw new Error('pollingToken not found');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Adds a callback to execute when polling is complete
|
|
123
|
+
*
|
|
124
|
+
* @param networkClientId - The networkClientId to listen for polling complete events
|
|
125
|
+
* @param callback - The callback to execute when polling is complete
|
|
126
|
+
*/
|
|
127
|
+
onPollingCompleteByNetworkClientId(networkClientId, callback) {
|
|
128
|
+
var _a;
|
|
129
|
+
if (__classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").has(networkClientId)) {
|
|
130
|
+
(_a = __classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").get(networkClientId)) === null || _a === void 0 ? void 0 : _a.add(callback);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const set = new Set();
|
|
134
|
+
set.add(callback);
|
|
135
|
+
__classPrivateFieldGet(this, _PollingControllerBase_callbacks, "f").set(networkClientId, set);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
_PollingControllerBase_networkClientIdTokensMap = new WeakMap(), _PollingControllerBase_intervalIds = new WeakMap(), _PollingControllerBase_callbacks = new WeakMap(), _PollingControllerBase_intervalLength = new WeakMap(), _PollingControllerBase_instances = new WeakSet(), _PollingControllerBase_poll = function _PollingControllerBase_poll(networkClientId) {
|
|
140
|
+
if (__classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[networkClientId]) {
|
|
141
|
+
clearTimeout(__classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[networkClientId]);
|
|
142
|
+
delete __classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[networkClientId];
|
|
143
|
+
}
|
|
144
|
+
// setTimeout is not `await`ing this async function, which is expected
|
|
145
|
+
// We're just using async here for improved stack traces
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
147
|
+
__classPrivateFieldGet(this, _PollingControllerBase_intervalIds, "f")[networkClientId] = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
148
|
+
try {
|
|
149
|
+
yield this.executePoll(networkClientId);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.error(error);
|
|
153
|
+
}
|
|
154
|
+
__classPrivateFieldGet(this, _PollingControllerBase_instances, "m", _PollingControllerBase_poll).call(this, networkClientId);
|
|
155
|
+
}), __classPrivateFieldGet(this, _PollingControllerBase_intervalLength, "f"));
|
|
156
|
+
};
|
|
157
|
+
return PollingControllerBase;
|
|
158
|
+
}
|
|
159
|
+
exports.PollingController = PollingControllerMixin(base_controller_1.BaseControllerV2);
|
|
160
|
+
exports.PollingControllerV1 = PollingControllerMixin(base_controller_1.BaseController);
|
|
161
|
+
//# sourceMappingURL=PollingController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PollingController.js","sourceRoot":"","sources":["../src/PollingController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController, BaseControllerV2 } from '@metamask/base-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\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 * 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 #networkClientIdTokensMap: Map<NetworkClientId, Set<string>> =\n new Map();\n\n readonly #intervalIds: Record<NetworkClientId, 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 * @returns void\n */\n startPollingByNetworkClientId(networkClientId: NetworkClientId) {\n const innerPollToken = random();\n if (this.#networkClientIdTokensMap.has(networkClientId)) {\n const set = this.#networkClientIdTokensMap.get(networkClientId);\n set?.add(innerPollToken);\n } else {\n const set = new Set<string>();\n set.add(innerPollToken);\n this.#networkClientIdTokensMap.set(networkClientId, set);\n }\n this.#poll(networkClientId);\n return innerPollToken;\n }\n\n /**\n * Stops polling for all networkClientIds\n */\n stopAllPolling() {\n this.#networkClientIdTokensMap.forEach((tokens, _networkClientId) => {\n tokens.forEach((token) => {\n this.stopPollingByNetworkClientId(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 stopPollingByNetworkClientId(pollingToken: string) {\n if (!pollingToken) {\n throw new Error('pollingToken required');\n }\n let found = false;\n this.#networkClientIdTokensMap.forEach((tokens, networkClientId) => {\n if (tokens.has(pollingToken)) {\n found = true;\n this.#networkClientIdTokensMap\n .get(networkClientId)\n ?.delete(pollingToken);\n if (this.#networkClientIdTokensMap.get(networkClientId)?.size === 0) {\n clearTimeout(this.#intervalIds[networkClientId]);\n delete this.#intervalIds[networkClientId];\n this.#networkClientIdTokensMap.delete(networkClientId);\n this.#callbacks.get(networkClientId)?.forEach((callback) => {\n callback(networkClientId);\n });\n this.#callbacks.get(networkClientId)?.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 */\n abstract executePoll(networkClientId: NetworkClientId): Promise<void>;\n\n #poll(networkClientId: NetworkClientId) {\n if (this.#intervalIds[networkClientId]) {\n clearTimeout(this.#intervalIds[networkClientId]);\n delete this.#intervalIds[networkClientId];\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[networkClientId] = setTimeout(async () => {\n try {\n await this.executePoll(networkClientId);\n } catch (error) {\n console.error(error);\n }\n this.#poll(networkClientId);\n }, this.#intervalLength);\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 */\n onPollingCompleteByNetworkClientId(\n networkClientId: NetworkClientId,\n callback: (networkClientId: NetworkClientId) => void,\n ) {\n if (this.#callbacks.has(networkClientId)) {\n this.#callbacks.get(networkClientId)?.add(callback);\n } else {\n const set = new Set<typeof callback>();\n set.add(callback);\n this.#callbacks.set(networkClientId, set);\n }\n }\n }\n return PollingControllerBase;\n}\n\nexport const PollingController = PollingControllerMixin(BaseControllerV2);\nexport const PollingControllerV1 = PollingControllerMixin(BaseController);\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
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
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAApE,sHAAA,iBAAiB,OAAA;AAAE,wHAAA,mBAAmB,OAAA","sourcesContent":["export { PollingController, PollingControllerV1 } from './PollingController';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/polling-controller",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "Polling Controller is the base for controllers that polling by networkClientId",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -25,13 +25,14 @@
|
|
|
25
25
|
"changelog:validate": "../../scripts/validate-changelog.sh @metamask/polling-controller",
|
|
26
26
|
"publish:preview": "yarn npm publish --tag preview",
|
|
27
27
|
"test": "jest",
|
|
28
|
+
"test:clean": "jest --clearCache",
|
|
28
29
|
"test:watch": "jest --watch"
|
|
29
30
|
},
|
|
30
31
|
"dependencies": {
|
|
31
|
-
"@metamask/base-controller": "^3.2.
|
|
32
|
-
"@metamask/controller-utils": "^5.0.
|
|
33
|
-
"@metamask/network-controller": "^
|
|
34
|
-
"@metamask/utils": "^
|
|
32
|
+
"@metamask/base-controller": "^3.2.3",
|
|
33
|
+
"@metamask/controller-utils": "^5.0.2",
|
|
34
|
+
"@metamask/network-controller": "^14.0.0",
|
|
35
|
+
"@metamask/utils": "^8.1.0",
|
|
35
36
|
"@types/uuid": "^8.3.0",
|
|
36
37
|
"uuid": "^8.3.2"
|
|
37
38
|
},
|
|
@@ -41,12 +42,12 @@
|
|
|
41
42
|
"deepmerge": "^4.2.2",
|
|
42
43
|
"jest": "^27.5.1",
|
|
43
44
|
"ts-jest": "^27.1.4",
|
|
44
|
-
"typedoc": "^0.
|
|
45
|
-
"typedoc-plugin-missing-exports": "^0.
|
|
45
|
+
"typedoc": "^0.24.8",
|
|
46
|
+
"typedoc-plugin-missing-exports": "^2.0.0",
|
|
46
47
|
"typescript": "~4.8.4"
|
|
47
48
|
},
|
|
48
49
|
"peerDependencies": {
|
|
49
|
-
"@metamask/network-controller": "^
|
|
50
|
+
"@metamask/network-controller": "^14.0.0"
|
|
50
51
|
},
|
|
51
52
|
"engines": {
|
|
52
53
|
"node": ">=16.0.0"
|