matrix-react-sdk
Version:
SDK for matrix.org using React
90 lines (84 loc) • 8.13 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Whenable = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _logger = require("matrix-js-sdk/src/logger");
var _arrays = require("./arrays");
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* Whenables are a cheap way to have Observable patterns mixed with typical
* usage of Promises, without having to tear down listeners or calls. Whenables
* are intended to be used when a condition will be met multiple times and
* the consumer needs to know *when* that happens.
*/
class Whenable {
constructor() {
(0, _defineProperty2.default)(this, "listeners", []);
}
/**
* Sets up a call to `fn` *when* the `condition` is met.
* @param condition The condition to match.
* @param fn The function to call.
* @returns This.
*/
when(condition, fn) {
this.listeners.push({
condition,
fn
});
return this;
}
/**
* Sets up a call to `fn` *when* any of the `conditions` are met.
* @param conditions The conditions to match.
* @param fn The function to call.
* @returns This.
*/
whenAnyOf(conditions, fn) {
for (const condition of conditions) {
this.when(condition, fn);
}
return this;
}
/**
* Sets up a call to `fn` *when* any condition is met.
* @param fn The function to call.
* @returns This.
*/
whenAnything(fn) {
this.listeners.push({
condition: null,
fn
});
return this;
}
/**
* Notifies all the listeners of a given condition.
* @param condition The new condition that has been met.
*/
notifyCondition(condition) {
const listeners = (0, _arrays.arrayFastClone)(this.listeners); // clone just in case the handler modifies us
for (const listener of listeners) {
if (listener.condition === null || listener.condition === condition) {
try {
listener.fn(this);
} catch (e) {
_logger.logger.error(`Error calling whenable listener for ${condition}:`, e);
}
}
}
}
destroy() {
this.listeners = [];
}
}
exports.Whenable = Whenable;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9hcnJheXMiLCJXaGVuYWJsZSIsImNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJ3aGVuIiwiY29uZGl0aW9uIiwiZm4iLCJsaXN0ZW5lcnMiLCJwdXNoIiwid2hlbkFueU9mIiwiY29uZGl0aW9ucyIsIndoZW5Bbnl0aGluZyIsIm5vdGlmeUNvbmRpdGlvbiIsImFycmF5RmFzdENsb25lIiwibGlzdGVuZXIiLCJlIiwibG9nZ2VyIiwiZXJyb3IiLCJkZXN0cm95IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9XaGVuYWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IElEZXN0cm95YWJsZSB9IGZyb20gXCIuL0lEZXN0cm95YWJsZVwiO1xuaW1wb3J0IHsgYXJyYXlGYXN0Q2xvbmUgfSBmcm9tIFwiLi9hcnJheXNcIjtcblxuZXhwb3J0IHR5cGUgV2hlbkZuPFQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXI+ID0gKHc6IFdoZW5hYmxlPFQ+KSA9PiB2b2lkO1xuXG4vKipcbiAqIFdoZW5hYmxlcyBhcmUgYSBjaGVhcCB3YXkgdG8gaGF2ZSBPYnNlcnZhYmxlIHBhdHRlcm5zIG1peGVkIHdpdGggdHlwaWNhbFxuICogdXNhZ2Ugb2YgUHJvbWlzZXMsIHdpdGhvdXQgaGF2aW5nIHRvIHRlYXIgZG93biBsaXN0ZW5lcnMgb3IgY2FsbHMuIFdoZW5hYmxlc1xuICogYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiBhIGNvbmRpdGlvbiB3aWxsIGJlIG1ldCBtdWx0aXBsZSB0aW1lcyBhbmRcbiAqIHRoZSBjb25zdW1lciBuZWVkcyB0byBrbm93ICp3aGVuKiB0aGF0IGhhcHBlbnMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXaGVuYWJsZTxUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyPiBpbXBsZW1lbnRzIElEZXN0cm95YWJsZSB7XG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnM6IHsgY29uZGl0aW9uOiBUIHwgbnVsbDsgZm46IFdoZW5GbjxUPiB9W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYSBjYWxsIHRvIGBmbmAgKndoZW4qIHRoZSBgY29uZGl0aW9uYCBpcyBtZXQuXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiBUaGUgY29uZGl0aW9uIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKiBAcmV0dXJucyBUaGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aGVuKGNvbmRpdGlvbjogVCwgZm46IFdoZW5GbjxUPik6IFdoZW5hYmxlPFQ+IHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IGNvbmRpdGlvbiwgZm4gfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgYSBjYWxsIHRvIGBmbmAgKndoZW4qIGFueSBvZiB0aGUgYGNvbmRpdGlvbnNgIGFyZSBtZXQuXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAqIEByZXR1cm5zIFRoaXMuXG4gICAgICovXG4gICAgcHVibGljIHdoZW5BbnlPZihjb25kaXRpb25zOiBUW10sIGZuOiBXaGVuRm48VD4pOiBXaGVuYWJsZTxUPiB7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMud2hlbihjb25kaXRpb24sIGZuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGEgY2FsbCB0byBgZm5gICp3aGVuKiBhbnkgY29uZGl0aW9uIGlzIG1ldC5cbiAgICAgKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICogQHJldHVybnMgVGhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2hlbkFueXRoaW5nKGZuOiBXaGVuRm48VD4pOiBXaGVuYWJsZTxUPiB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goeyBjb25kaXRpb246IG51bGwsIGZuIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpZmllcyBhbGwgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGNvbmRpdGlvbi5cbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uIFRoZSBuZXcgY29uZGl0aW9uIHRoYXQgaGFzIGJlZW4gbWV0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBub3RpZnlDb25kaXRpb24oY29uZGl0aW9uOiBUKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGFycmF5RmFzdENsb25lKHRoaXMubGlzdGVuZXJzKTsgLy8gY2xvbmUganVzdCBpbiBjYXNlIHRoZSBoYW5kbGVyIG1vZGlmaWVzIHVzXG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIuY29uZGl0aW9uID09PSBudWxsIHx8IGxpc3RlbmVyLmNvbmRpdGlvbiA9PT0gY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZm4odGhpcyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGNhbGxpbmcgd2hlbmFibGUgbGlzdGVuZXIgZm9yICR7Y29uZGl0aW9ufTpgLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBR0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBZUUsUUFBUSxDQUFvRDtFQUFBQyxZQUFBO0lBQUEsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSxxQkFDaEIsRUFBRTtFQUFBO0VBRWhFO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNXQyxJQUFJQSxDQUFDQyxTQUFZLEVBQUVDLEVBQWEsRUFBZTtJQUNsRCxJQUFJLENBQUNDLFNBQVMsQ0FBQ0MsSUFBSSxDQUFDO01BQUVILFNBQVM7TUFBRUM7SUFBRyxDQUFDLENBQUM7SUFDdEMsT0FBTyxJQUFJO0VBQ2Y7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ1dHLFNBQVNBLENBQUNDLFVBQWUsRUFBRUosRUFBYSxFQUFlO0lBQzFELEtBQUssTUFBTUQsU0FBUyxJQUFJSyxVQUFVLEVBQUU7TUFDaEMsSUFBSSxDQUFDTixJQUFJLENBQUNDLFNBQVMsRUFBRUMsRUFBRSxDQUFDO0lBQzVCO0lBQ0EsT0FBTyxJQUFJO0VBQ2Y7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNXSyxZQUFZQSxDQUFDTCxFQUFhLEVBQWU7SUFDNUMsSUFBSSxDQUFDQyxTQUFTLENBQUNDLElBQUksQ0FBQztNQUFFSCxTQUFTLEVBQUUsSUFBSTtNQUFFQztJQUFHLENBQUMsQ0FBQztJQUM1QyxPQUFPLElBQUk7RUFDZjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtFQUNjTSxlQUFlQSxDQUFDUCxTQUFZLEVBQVE7SUFDMUMsTUFBTUUsU0FBUyxHQUFHLElBQUFNLHNCQUFjLEVBQUMsSUFBSSxDQUFDTixTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2xELEtBQUssTUFBTU8sUUFBUSxJQUFJUCxTQUFTLEVBQUU7TUFDOUIsSUFBSU8sUUFBUSxDQUFDVCxTQUFTLEtBQUssSUFBSSxJQUFJUyxRQUFRLENBQUNULFNBQVMsS0FBS0EsU0FBUyxFQUFFO1FBQ2pFLElBQUk7VUFDQVMsUUFBUSxDQUFDUixFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxPQUFPUyxDQUFDLEVBQUU7VUFDUkMsY0FBTSxDQUFDQyxLQUFLLENBQUMsdUNBQXVDWixTQUFTLEdBQUcsRUFBRVUsQ0FBQyxDQUFDO1FBQ3hFO01BQ0o7SUFDSjtFQUNKO0VBRU9HLE9BQU9BLENBQUEsRUFBUztJQUNuQixJQUFJLENBQUNYLFNBQVMsR0FBRyxFQUFFO0VBQ3ZCO0FBQ0o7QUFBQ1ksT0FBQSxDQUFBbkIsUUFBQSxHQUFBQSxRQUFBIiwiaWdub3JlTGlzdCI6W119