matrix-react-sdk
Version:
SDK for matrix.org using React
70 lines (63 loc) • 9.47 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.WatchManager = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
/*
Copyright 2019-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const IRRELEVANT_ROOM = null;
/**
* Generalized management class for dealing with watchers on a per-handler (per-level)
* basis without duplicating code. Handlers are expected to push updates through this
* class, which are then proxied outwards to any applicable watchers.
*/
class WatchManager {
constructor() {
(0, _defineProperty2.default)(this, "watchers", new Map());
}
// settingName -> roomId -> CallbackFn[]
// Proxy for handlers to delegate changes to this manager
watchSetting(settingName, roomId, cb) {
if (!this.watchers.has(settingName)) this.watchers.set(settingName, new Map());
if (!this.watchers.get(settingName).has(roomId)) this.watchers.get(settingName).set(roomId, []);
this.watchers.get(settingName).get(roomId).push(cb);
}
// Proxy for handlers to delegate changes to this manager
unwatchSetting(cb) {
this.watchers.forEach(map => {
map.forEach(callbacks => {
let idx;
while ((idx = callbacks.indexOf(cb)) !== -1) {
callbacks.splice(idx, 1);
}
});
});
}
notifyUpdate(settingName, inRoomId, atLevel, newValueAtLevel) {
// Dev note: We could avoid raising changes for ultimately inconsequential changes, but
// we also don't have a reliable way to get the old value of a setting. Instead, we'll just
// let it fall through regardless and let the receiver dedupe if they want to.
if (!this.watchers.has(settingName)) return;
const roomWatchers = this.watchers.get(settingName);
const callbacks = [];
if (inRoomId !== null && roomWatchers.has(inRoomId)) {
callbacks.push(...roomWatchers.get(inRoomId));
}
if (!inRoomId) {
// Fire updates to all the individual room watchers too, as they probably care about the change higher up.
callbacks.push(...Array.from(roomWatchers.values()).flat(1));
} else if (roomWatchers.has(IRRELEVANT_ROOM)) {
callbacks.push(...roomWatchers.get(IRRELEVANT_ROOM));
}
for (const callback of callbacks) {
callback(inRoomId, atLevel, newValueAtLevel);
}
}
}
exports.WatchManager = WatchManager;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJUlJFTEVWQU5UX1JPT00iLCJXYXRjaE1hbmFnZXIiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiTWFwIiwid2F0Y2hTZXR0aW5nIiwic2V0dGluZ05hbWUiLCJyb29tSWQiLCJjYiIsIndhdGNoZXJzIiwiaGFzIiwic2V0IiwiZ2V0IiwicHVzaCIsInVud2F0Y2hTZXR0aW5nIiwiZm9yRWFjaCIsIm1hcCIsImNhbGxiYWNrcyIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJub3RpZnlVcGRhdGUiLCJpblJvb21JZCIsImF0TGV2ZWwiLCJuZXdWYWx1ZUF0TGV2ZWwiLCJyb29tV2F0Y2hlcnMiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJmbGF0IiwiY2FsbGJhY2siLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NldHRpbmdzL1dhdGNoTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTktMjAyNCBOZXcgVmVjdG9yIEx0ZC5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgU2V0dGluZ0xldmVsIH0gZnJvbSBcIi4vU2V0dGluZ0xldmVsXCI7XG5cbmV4cG9ydCB0eXBlIENhbGxiYWNrRm4gPSAoY2hhbmdlZEluUm9vbUlkOiBzdHJpbmcgfCBudWxsLCBhdExldmVsOiBTZXR0aW5nTGV2ZWwsIG5ld1ZhbEF0TGV2ZWw6IGFueSkgPT4gdm9pZDtcblxuY29uc3QgSVJSRUxFVkFOVF9ST09NOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBHZW5lcmFsaXplZCBtYW5hZ2VtZW50IGNsYXNzIGZvciBkZWFsaW5nIHdpdGggd2F0Y2hlcnMgb24gYSBwZXItaGFuZGxlciAocGVyLWxldmVsKVxuICogYmFzaXMgd2l0aG91dCBkdXBsaWNhdGluZyBjb2RlLiBIYW5kbGVycyBhcmUgZXhwZWN0ZWQgdG8gcHVzaCB1cGRhdGVzIHRocm91Z2ggdGhpc1xuICogY2xhc3MsIHdoaWNoIGFyZSB0aGVuIHByb3hpZWQgb3V0d2FyZHMgdG8gYW55IGFwcGxpY2FibGUgd2F0Y2hlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRjaE1hbmFnZXIge1xuICAgIHByaXZhdGUgd2F0Y2hlcnMgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZyB8IG51bGwsIENhbGxiYWNrRm5bXT4+KCk7IC8vIHNldHRpbmdOYW1lIC0+IHJvb21JZCAtPiBDYWxsYmFja0ZuW11cblxuICAgIC8vIFByb3h5IGZvciBoYW5kbGVycyB0byBkZWxlZ2F0ZSBjaGFuZ2VzIHRvIHRoaXMgbWFuYWdlclxuICAgIHB1YmxpYyB3YXRjaFNldHRpbmcoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcgfCBudWxsLCBjYjogQ2FsbGJhY2tGbik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnMuaGFzKHNldHRpbmdOYW1lKSkgdGhpcy53YXRjaGVycy5zZXQoc2V0dGluZ05hbWUsIG5ldyBNYXAoKSk7XG4gICAgICAgIGlmICghdGhpcy53YXRjaGVycy5nZXQoc2V0dGluZ05hbWUpIS5oYXMocm9vbUlkKSkgdGhpcy53YXRjaGVycy5nZXQoc2V0dGluZ05hbWUpIS5zZXQocm9vbUlkLCBbXSk7XG4gICAgICAgIHRoaXMud2F0Y2hlcnMuZ2V0KHNldHRpbmdOYW1lKSEuZ2V0KHJvb21JZCkhLnB1c2goY2IpO1xuICAgIH1cblxuICAgIC8vIFByb3h5IGZvciBoYW5kbGVycyB0byBkZWxlZ2F0ZSBjaGFuZ2VzIHRvIHRoaXMgbWFuYWdlclxuICAgIHB1YmxpYyB1bndhdGNoU2V0dGluZyhjYjogQ2FsbGJhY2tGbik6IHZvaWQge1xuICAgICAgICB0aGlzLndhdGNoZXJzLmZvckVhY2goKG1hcCkgPT4ge1xuICAgICAgICAgICAgbWFwLmZvckVhY2goKGNhbGxiYWNrcykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpZHg6IG51bWJlcjtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGlkeCA9IGNhbGxiYWNrcy5pbmRleE9mKGNiKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeVVwZGF0ZShcbiAgICAgICAgc2V0dGluZ05hbWU6IHN0cmluZyxcbiAgICAgICAgaW5Sb29tSWQ6IHN0cmluZyB8IG51bGwsXG4gICAgICAgIGF0TGV2ZWw6IFNldHRpbmdMZXZlbCxcbiAgICAgICAgbmV3VmFsdWVBdExldmVsOiBhbnksXG4gICAgKTogdm9pZCB7XG4gICAgICAgIC8vIERldiBub3RlOiBXZSBjb3VsZCBhdm9pZCByYWlzaW5nIGNoYW5nZXMgZm9yIHVsdGltYXRlbHkgaW5jb25zZXF1ZW50aWFsIGNoYW5nZXMsIGJ1dFxuICAgICAgICAvLyB3ZSBhbHNvIGRvbid0IGhhdmUgYSByZWxpYWJsZSB3YXkgdG8gZ2V0IHRoZSBvbGQgdmFsdWUgb2YgYSBzZXR0aW5nLiBJbnN0ZWFkLCB3ZSdsbCBqdXN0XG4gICAgICAgIC8vIGxldCBpdCBmYWxsIHRocm91Z2ggcmVnYXJkbGVzcyBhbmQgbGV0IHRoZSByZWNlaXZlciBkZWR1cGUgaWYgdGhleSB3YW50IHRvLlxuXG4gICAgICAgIGlmICghdGhpcy53YXRjaGVycy5oYXMoc2V0dGluZ05hbWUpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgcm9vbVdhdGNoZXJzID0gdGhpcy53YXRjaGVycy5nZXQoc2V0dGluZ05hbWUpITtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzOiBDYWxsYmFja0ZuW10gPSBbXTtcblxuICAgICAgICBpZiAoaW5Sb29tSWQgIT09IG51bGwgJiYgcm9vbVdhdGNoZXJzLmhhcyhpblJvb21JZCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKC4uLnJvb21XYXRjaGVycy5nZXQoaW5Sb29tSWQpISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWluUm9vbUlkKSB7XG4gICAgICAgICAgICAvLyBGaXJlIHVwZGF0ZXMgdG8gYWxsIHRoZSBpbmRpdmlkdWFsIHJvb20gd2F0Y2hlcnMgdG9vLCBhcyB0aGV5IHByb2JhYmx5IGNhcmUgYWJvdXQgdGhlIGNoYW5nZSBoaWdoZXIgdXAuXG4gICAgICAgICAgICBjYWxsYmFja3MucHVzaCguLi5BcnJheS5mcm9tKHJvb21XYXRjaGVycy52YWx1ZXMoKSkuZmxhdCgxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vbVdhdGNoZXJzLmhhcyhJUlJFTEVWQU5UX1JPT00pKSB7XG4gICAgICAgICAgICBjYWxsYmFja3MucHVzaCguLi5yb29tV2F0Y2hlcnMuZ2V0KElSUkVMRVZBTlRfUk9PTSkhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhpblJvb21JZCwgYXRMZXZlbCwgbmV3VmFsdWVBdExldmVsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTUEsTUFBTUEsZUFBOEIsR0FBRyxJQUFJOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUMsWUFBWSxDQUFDO0VBQUFDLFlBQUE7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBLG9CQUNILElBQUlDLEdBQUcsQ0FBMkMsQ0FBQztFQUFBO0VBQUU7O0VBRXhFO0VBQ09DLFlBQVlBLENBQUNDLFdBQW1CLEVBQUVDLE1BQXFCLEVBQUVDLEVBQWMsRUFBUTtJQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDQyxRQUFR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