matrix-react-sdk
Version:
SDK for matrix.org using React
76 lines (73 loc) • 9.58 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _SettingsHandler = _interopRequireDefault(require("./SettingsHandler"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Copyright 2017 Travis Ralston
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* A wrapper for a SettingsHandler that performs local echo on
* changes to settings. This wrapper will use the underlying
* handler as much as possible to ensure values are not stale.
*/
class LocalEchoWrapper extends _SettingsHandler.default {
/**
* Creates a new local echo wrapper
* @param {SettingsHandler} handler The handler to wrap
* @param {SettingLevel} level The level to notify updates at
*/
constructor(handler, level) {
super();
(0, _defineProperty2.default)(this, "cache", {});
this.handler = handler;
this.level = level;
}
getValue(settingName, roomId) {
const cacheRoomId = roomId ?? "UNDEFINED"; // avoid weird keys
const bySetting = this.cache[settingName];
if (bySetting?.hasOwnProperty(cacheRoomId)) {
return bySetting[cacheRoomId];
}
return this.handler.getValue(settingName, roomId);
}
async setValue(settingName, roomId, newValue) {
if (!this.cache[settingName]) this.cache[settingName] = {};
const bySetting = this.cache[settingName];
const cacheRoomId = roomId ?? "UNDEFINED"; // avoid weird keys
bySetting[cacheRoomId] = newValue;
const currentValue = this.handler.getValue(settingName, roomId);
const handlerPromise = this.handler.setValue(settingName, roomId, newValue);
this.handler.watchers?.notifyUpdate(settingName, roomId, this.level, newValue);
try {
await handlerPromise;
} catch (e) {
// notify of a rollback
this.handler.watchers?.notifyUpdate(settingName, roomId, this.level, currentValue);
} finally {
// only expire the cache if our value hasn't been overwritten yet
if (bySetting[cacheRoomId] === newValue) {
delete bySetting[cacheRoomId];
}
}
}
canSetValue(settingName, roomId) {
return this.handler.canSetValue(settingName, roomId);
}
isSupported() {
return this.handler.isSupported();
}
reset() {
this.cache = {};
this.handler.reset();
}
}
exports.default = LocalEchoWrapper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU2V0dGluZ3NIYW5kbGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJMb2NhbEVjaG9XcmFwcGVyIiwiU2V0dGluZ3NIYW5kbGVyIiwiY29uc3RydWN0b3IiLCJoYW5kbGVyIiwibGV2ZWwiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImdldFZhbHVlIiwic2V0dGluZ05hbWUiLCJyb29tSWQiLCJjYWNoZVJvb21JZCIsImJ5U2V0dGluZyIsImNhY2hlIiwiaGFzT3duUHJvcGVydHkiLCJzZXRWYWx1ZSIsIm5ld1ZhbHVlIiwiY3VycmVudFZhbHVlIiwiaGFuZGxlclByb21pc2UiLCJ3YXRjaGVycyIsIm5vdGlmeVVwZGF0ZSIsImUiLCJjYW5TZXRWYWx1ZSIsImlzU3VwcG9ydGVkIiwicmVzZXQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NldHRpbmdzL2hhbmRsZXJzL0xvY2FsRWNob1dyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTksIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE3IFRyYXZpcyBSYWxzdG9uXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBTZXR0aW5nc0hhbmRsZXIgZnJvbSBcIi4vU2V0dGluZ3NIYW5kbGVyXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGV2ZWwgfSBmcm9tIFwiLi4vU2V0dGluZ0xldmVsXCI7XG5cbi8qKlxuICogQSB3cmFwcGVyIGZvciBhIFNldHRpbmdzSGFuZGxlciB0aGF0IHBlcmZvcm1zIGxvY2FsIGVjaG8gb25cbiAqIGNoYW5nZXMgdG8gc2V0dGluZ3MuIFRoaXMgd3JhcHBlciB3aWxsIHVzZSB0aGUgdW5kZXJseWluZ1xuICogaGFuZGxlciBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVuc3VyZSB2YWx1ZXMgYXJlIG5vdCBzdGFsZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9jYWxFY2hvV3JhcHBlciBleHRlbmRzIFNldHRpbmdzSGFuZGxlciB7XG4gICAgcHJpdmF0ZSBjYWNoZToge1xuICAgICAgICBbc2V0dGluZ05hbWU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyb29tSWQ6IHN0cmluZ106IGFueTtcbiAgICAgICAgfTtcbiAgICB9ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2FsIGVjaG8gd3JhcHBlclxuICAgICAqIEBwYXJhbSB7U2V0dGluZ3NIYW5kbGVyfSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIHdyYXBcbiAgICAgKiBAcGFyYW0ge1NldHRpbmdMZXZlbH0gbGV2ZWwgVGhlIGxldmVsIHRvIG5vdGlmeSB1cGRhdGVzIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXI6IFNldHRpbmdzSGFuZGxlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsZXZlbDogU2V0dGluZ0xldmVsLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWYWx1ZShzZXR0aW5nTmFtZTogc3RyaW5nLCByb29tSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNhY2hlUm9vbUlkID0gcm9vbUlkID8/IFwiVU5ERUZJTkVEXCI7IC8vIGF2b2lkIHdlaXJkIGtleXNcbiAgICAgICAgY29uc3QgYnlTZXR0aW5nID0gdGhpcy5jYWNoZVtzZXR0aW5nTmFtZV07XG4gICAgICAgIGlmIChieVNldHRpbmc/Lmhhc093blByb3BlcnR5KGNhY2hlUm9vbUlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGJ5U2V0dGluZ1tjYWNoZVJvb21JZF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLmdldFZhbHVlKHNldHRpbmdOYW1lLCByb29tSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXRWYWx1ZShzZXR0aW5nTmFtZTogc3RyaW5nLCByb29tSWQ6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbc2V0dGluZ05hbWVdKSB0aGlzLmNhY2hlW3NldHRpbmdOYW1lXSA9IHt9O1xuICAgICAgICBjb25zdCBieVNldHRpbmcgPSB0aGlzLmNhY2hlW3NldHRpbmdOYW1lXTtcblxuICAgICAgICBjb25zdCBjYWNoZVJvb21JZCA9IHJvb21JZCA/PyBcIlVOREVGSU5FRFwiOyAvLyBhdm9pZCB3ZWlyZCBrZXlzXG4gICAgICAgIGJ5U2V0dGluZ1tjYWNoZVJvb21JZF0gPSBuZXdWYWx1ZTtcblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmhhbmRsZXIuZ2V0VmFsdWUoc2V0dGluZ05hbWUsIHJvb21JZCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJQcm9taXNlID0gdGhpcy5oYW5kbGVyLnNldFZhbHVlKHNldHRpbmdOYW1lLCByb29tSWQsIG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5oYW5kbGVyLndhdGNoZXJzPy5ub3RpZnlVcGRhdGUoc2V0dGluZ05hbWUsIHJvb21JZCwgdGhpcy5sZXZlbCwgbmV3VmFsdWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyUHJvbWlzZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gbm90aWZ5IG9mIGEgcm9sbGJhY2tcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlci53YXRjaGVycz8ubm90aWZ5VXBkYXRlKHNldHRpbmdOYW1lLCByb29tSWQsIHRoaXMubGV2ZWwsIGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAvLyBvbmx5IGV4cGlyZSB0aGUgY2FjaGUgaWYgb3VyIHZhbHVlIGhhc24ndCBiZWVuIG92ZXJ3cml0dGVuIHlldFxuICAgICAgICAgICAgaWYgKGJ5U2V0dGluZ1tjYWNoZVJvb21JZF0gPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGJ5U2V0dGluZ1tjYWNoZVJvb21JZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuU2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5jYW5TZXRWYWx1ZShzZXR0aW5nTmFtZSwgcm9vbUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuaXNTdXBwb3J0ZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5oYW5kbGVyLnJlc2V0KCk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLGdCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxNQUFNQyxnQkFBZ0IsU0FBU0Msd0JBQWUsQ0FBQztFQU8xRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ1dDLFdBQVdBLENBQ0dDLE9BQXdCLEVBQ3hCQyxLQUFtQixFQUN0QztJQUNFLEtBQUssQ0FBQyxDQUFDO0lBQUMsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSxpQkFYUixDQUFDLENBQUM7SUFB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