@metamask/polling-controller
Version:
Polling Controller is the base for controllers that polling by networkClientId
86 lines • 4.42 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);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractPollingControllerBaseMixin = exports.getKey = void 0;
const fast_json_stable_stringify_1 = __importDefault(require("fast-json-stable-stringify"));
const uuid_1 = require("uuid");
const getKey = (input) => (0, fast_json_stable_stringify_1.default)(input);
exports.getKey = getKey;
/**
* 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
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 = (0, uuid_1.v4)();
const key = (0, exports.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 = (0, exports.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;
}
exports.AbstractPollingControllerBaseMixin = AbstractPollingControllerBaseMixin;
//# sourceMappingURL=AbstractPollingController.cjs.map