@metamask/polling-controller
Version:
Polling Controller is the base for controllers that polling by networkClientId
85 lines • 4.11 kB
JavaScript
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
function $importDefault(module) {
if (module?.__esModule) {
return module.default;
}
return module;
}
import $stringify from "fast-json-stable-stringify";
const stringify = $importDefault($stringify);
import { v4 as random } from "uuid";
export const getKey = (input) => stringify(input);
/**
* AbstractPollingControllerBaseMixin
*
* @param Base - The base class to mix onto.
* @returns The composed class.
*/
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
// eslint-disable-next-line @typescript-eslint/naming-convention
export function AbstractPollingControllerBaseMixin(Base) {
var _AbstractPollingControllerBase_pollingTokenSets, _AbstractPollingControllerBase_callbacks;
class AbstractPollingControllerBase extends Base {
constructor() {
super(...arguments);
_AbstractPollingControllerBase_pollingTokenSets.set(this, new Map());
_AbstractPollingControllerBase_callbacks.set(this, new Map());
}
startPolling(input) {
const pollToken = random();
const key = getKey(input);
const pollingTokenSet = __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").get(key) ?? new Set();
pollingTokenSet.add(pollToken);
__classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").set(key, pollingTokenSet);
if (pollingTokenSet.size === 1) {
this._startPolling(input);
}
return pollToken;
}
stopAllPolling() {
__classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").forEach((tokenSet, _key) => {
tokenSet.forEach((token) => {
this.stopPollingByPollingToken(token);
});
});
}
stopPollingByPollingToken(pollingToken) {
if (!pollingToken) {
throw new Error('pollingToken required');
}
let keyToDelete = null;
for (const [key, tokenSet] of __classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f")) {
if (tokenSet.delete(pollingToken)) {
if (tokenSet.size === 0) {
keyToDelete = key;
}
break;
}
}
if (keyToDelete) {
this._stopPollingByPollingTokenSetId(keyToDelete);
__classPrivateFieldGet(this, _AbstractPollingControllerBase_pollingTokenSets, "f").delete(keyToDelete);
const callbacks = __classPrivateFieldGet(this, _AbstractPollingControllerBase_callbacks, "f").get(keyToDelete);
if (callbacks) {
for (const callback of callbacks) {
callback(JSON.parse(keyToDelete));
}
callbacks.clear();
}
}
}
onPollingComplete(input, callback) {
const key = getKey(input);
const callbacks = __classPrivateFieldGet(this, _AbstractPollingControllerBase_callbacks, "f").get(key) ?? new Set();
callbacks.add(callback);
__classPrivateFieldGet(this, _AbstractPollingControllerBase_callbacks, "f").set(key, callbacks);
}
}
_AbstractPollingControllerBase_pollingTokenSets = new WeakMap(), _AbstractPollingControllerBase_callbacks = new WeakMap();
return AbstractPollingControllerBase;
}
//# sourceMappingURL=AbstractPollingController.mjs.map