matrix-react-sdk
Version:
SDK for matrix.org using React
106 lines (97 loc) • 11.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UPDATE_EVENT = exports.AsyncStore = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _events = require("events");
var _awaitLock = _interopRequireDefault(require("await-lock"));
/*
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.
*/
/**
* The event/channel to listen for in an AsyncStore.
*/
const UPDATE_EVENT = exports.UPDATE_EVENT = "update";
/**
* Represents a minimal store which works similar to Flux stores. Instead
* of everything needing to happen in a dispatch cycle, everything can
* happen async to that cycle.
*
* The store operates by using Object.assign() to mutate state - it sends the
* state objects (current and new) through the function onto a new empty
* object. Because of this, it is recommended to break out your state to be as
* safe as possible. The state mutations are also locked, preventing concurrent
* writes.
*
* All updates to the store happen on the UPDATE_EVENT event channel with the
* one argument being the instance of the store.
*
* To update the state, use updateState() and preferably await the result to
* help prevent lock conflicts.
*/
class AsyncStore extends _events.EventEmitter {
/**
* Creates a new AsyncStore using the given dispatcher.
* @param {Dispatcher<ActionPayload>} dispatcher The dispatcher to rely upon.
* @param {T} initialState The initial state for the store.
*/
constructor(dispatcher, initialState = {}) {
super();
(0, _defineProperty2.default)(this, "storeState", void 0);
(0, _defineProperty2.default)(this, "lock", new _awaitLock.default());
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
this.dispatcher = dispatcher;
this.dispatcherRef = dispatcher.register(this.onDispatch.bind(this));
this.storeState = initialState;
}
/**
* The current state of the store. Cannot be mutated.
*/
get state() {
return this.storeState;
}
/**
* Stops the store's listening functions, such as the listener to the dispatcher.
*/
stop() {
if (this.dispatcherRef) this.dispatcher.unregister(this.dispatcherRef);
}
/**
* Updates the state of the store.
* @param {T|*} newState The state to update in the store using Object.assign()
*/
async updateState(newState) {
await this.lock.acquireAsync();
try {
this.storeState = Object.freeze(Object.assign({}, this.storeState, newState));
this.emit(UPDATE_EVENT, this);
} finally {
await this.lock.release();
}
}
/**
* Resets the store's to the provided state or an empty object.
* @param {T|*} newState The new state of the store.
* @param {boolean} quiet If true, the function will not raise an UPDATE_EVENT.
*/
async reset(newState = null, quiet = false) {
await this.lock.acquireAsync();
try {
this.storeState = Object.freeze(newState || {});
if (!quiet) this.emit(UPDATE_EVENT, this);
} finally {
await this.lock.release();
}
}
/**
* Called when the dispatcher broadcasts a dispatch event.
* @param {ActionPayload} payload The event being dispatched.
*/
}
exports.AsyncStore = AsyncStore;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl9hd2FpdExvY2siLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiVVBEQVRFX0VWRU5UIiwiZXhwb3J0cyIsIkFzeW5jU3RvcmUiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsImRpc3BhdGNoZXIiLCJpbml0aWFsU3RhdGUiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIkF3YWl0TG9jayIsImRpc3BhdGNoZXJSZWYiLCJyZWdpc3RlciIsIm9uRGlzcGF0Y2giLCJiaW5kIiwic3RvcmVTdGF0ZSIsInN0YXRlIiwic3RvcCIsInVucmVnaXN0ZXIiLCJ1cGRhdGVTdGF0ZSIsIm5ld1N0YXRlIiwibG9jayIsImFjcXVpcmVBc3luYyIsIk9iamVjdCIsImZyZWV6ZSIsImFzc2lnbiIsImVtaXQiLCJyZWxlYXNlIiwicmVzZXQiLCJxdWlldCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvQXN5bmNTdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgQXdhaXRMb2NrIGZyb20gXCJhd2FpdC1sb2NrXCI7XG5cbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IHsgTWF0cml4RGlzcGF0Y2hlciB9IGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcblxuLyoqXG4gKiBUaGUgZXZlbnQvY2hhbm5lbCB0byBsaXN0ZW4gZm9yIGluIGFuIEFzeW5jU3RvcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBVUERBVEVfRVZFTlQgPSBcInVwZGF0ZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtaW5pbWFsIHN0b3JlIHdoaWNoIHdvcmtzIHNpbWlsYXIgdG8gRmx1eCBzdG9yZXMuIEluc3RlYWRcbiAqIG9mIGV2ZXJ5dGhpbmcgbmVlZGluZyB0byBoYXBwZW4gaW4gYSBkaXNwYXRjaCBjeWNsZSwgZXZlcnl0aGluZyBjYW5cbiAqIGhhcHBlbiBhc3luYyB0byB0aGF0IGN5Y2xlLlxuICpcbiAqIFRoZSBzdG9yZSBvcGVyYXRlcyBieSB1c2luZyBPYmplY3QuYXNzaWduKCkgdG8gbXV0YXRlIHN0YXRlIC0gaXQgc2VuZHMgdGhlXG4gKiBzdGF0ZSBvYmplY3RzIChjdXJyZW50IGFuZCBuZXcpIHRocm91Z2ggdGhlIGZ1bmN0aW9uIG9udG8gYSBuZXcgZW1wdHlcbiAqIG9iamVjdC4gQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyByZWNvbW1lbmRlZCB0byBicmVhayBvdXQgeW91ciBzdGF0ZSB0byBiZSBhc1xuICogc2FmZSBhcyBwb3NzaWJsZS4gVGhlIHN0YXRlIG11dGF0aW9ucyBhcmUgYWxzbyBsb2NrZWQsIHByZXZlbnRpbmcgY29uY3VycmVudFxuICogd3JpdGVzLlxuICpcbiAqIEFsbCB1cGRhdGVzIHRvIHRoZSBzdG9yZSBoYXBwZW4gb24gdGhlIFVQREFURV9FVkVOVCBldmVudCBjaGFubmVsIHdpdGggdGhlXG4gKiBvbmUgYXJndW1lbnQgYmVpbmcgdGhlIGluc3RhbmNlIG9mIHRoZSBzdG9yZS5cbiAqXG4gKiBUbyB1cGRhdGUgdGhlIHN0YXRlLCB1c2UgdXBkYXRlU3RhdGUoKSBhbmQgcHJlZmVyYWJseSBhd2FpdCB0aGUgcmVzdWx0IHRvXG4gKiBoZWxwIHByZXZlbnQgbG9jayBjb25mbGljdHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBc3luY1N0b3JlPFQgZXh0ZW5kcyBPYmplY3Q+IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBwcml2YXRlIHN0b3JlU3RhdGU6IFJlYWRvbmx5PFQ+O1xuICAgIHByaXZhdGUgbG9jayA9IG5ldyBBd2FpdExvY2soKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc3BhdGNoZXJSZWY6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQXN5bmNTdG9yZSB1c2luZyB0aGUgZ2l2ZW4gZGlzcGF0Y2hlci5cbiAgICAgKiBAcGFyYW0ge0Rpc3BhdGNoZXI8QWN0aW9uUGF5bG9hZD59IGRpc3BhdGNoZXIgVGhlIGRpc3BhdGNoZXIgdG8gcmVseSB1cG9uLlxuICAgICAqIEBwYXJhbSB7VH0gaW5pdGlhbFN0YXRlIFRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGUgc3RvcmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGRpc3BhdGNoZXI6IE1hdHJpeERpc3BhdGNoZXIsXG4gICAgICAgIGluaXRpYWxTdGF0ZTogVCA9IDxUPnt9LFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlclJlZiA9IGRpc3BhdGNoZXIucmVnaXN0ZXIodGhpcy5vbkRpc3BhdGNoLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnN0b3JlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0b3JlLiBDYW5ub3QgYmUgbXV0YXRlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHN0YXRlKCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBzdG9yZSdzIGxpc3RlbmluZyBmdW5jdGlvbnMsIHN1Y2ggYXMgdGhlIGxpc3RlbmVyIHRvIHRoZSBkaXNwYXRjaGVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdG9wKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyUmVmKSB0aGlzLmRpc3BhdGNoZXIudW5yZWdpc3Rlcih0aGlzLmRpc3BhdGNoZXJSZWYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge1R8Kn0gbmV3U3RhdGUgVGhlIHN0YXRlIHRvIHVwZGF0ZSBpbiB0aGUgc3RvcmUgdXNpbmcgT2JqZWN0LmFzc2lnbigpXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVN0YXRlKG5ld1N0YXRlOiBUIHwgT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlQXN5bmMoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVTdGF0ZSA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmFzc2lnbig8VD57fSwgdGhpcy5zdG9yZVN0YXRlLCBuZXdTdGF0ZSkpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KFVQREFURV9FVkVOVCwgdGhpcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBzdG9yZSdzIHRvIHRoZSBwcm92aWRlZCBzdGF0ZSBvciBhbiBlbXB0eSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtUfCp9IG5ld1N0YXRlIFRoZSBuZXcgc3RhdGUgb2YgdGhlIHN0b3JlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcXVpZXQgSWYgdHJ1ZSwgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IHJhaXNlIGFuIFVQREFURV9FVkVOVC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmVzZXQobmV3U3RhdGU6IFQgfCBPYmplY3QgfCBudWxsID0gbnVsbCwgcXVpZXQgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZUFzeW5jKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlU3RhdGUgPSBPYmplY3QuZnJlZXplKDxUPihuZXdTdGF0ZSB8fCB7fSkpO1xuICAgICAgICAgICAgaWYgKCFxdWlldCkgdGhpcy5lbWl0KFVQREFURV9FVkVOVCwgdGhpcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGRpc3BhdGNoZXIgYnJvYWRjYXN0cyBhIGRpc3BhdGNoIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7QWN0aW9uUGF5bG9hZH0gcGF5bG9hZCBUaGUgZXZlbnQgYmVpbmcgZGlzcGF0Y2hlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25EaXNwYXRjaChwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogdm9pZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFRQTtBQUNBO0FBQ0E7QUFDTyxNQUFNRyxZQUFZLEdBQUFDLE9BQUEsQ0FBQUQsWUFBQSxHQUFHLFFBQVE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFlRSxVQUFVLFNBQTJCQyxvQkFBWSxDQUFDO0VBS3BFO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDY0MsV0FBV0EsQ0FDVEMsVUFBNEIsRUFDcENDLFlBQWUsR0FBTSxDQUFDLENBQUMsRUFDekI7SUFDRSxLQUFLLENBQUMsQ0FBQztJQUFDLElBQUFDLGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLGdCQVpHLElBQUlDLGtCQUFTLENBQUMsQ0FBQztJQUFBLElBQUFGLGdCQUFBLENBQUFDLE9BQUE7SUFBQSxLQVNsQkgsVUFBNEIsR0FBNUJBLFVBQTRCO0lBS3BDLElBQUksQ0FBQ0ssYUFBYSxHQUFHTCxVQUFVLENBQUNNLFFBQVEsQ0FBQyxJQUFJLENBQUNDLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BFLElBQUksQ0FBQ0MsVUFBVSxHQUFHUixZQUFZO0VBQ2xDOztFQUVBO0FBQ0o7QUFDQTtFQUNJLElBQWNTLEtBQUtBLENBQUEsRUFBTTtJQUNyQixPQUFPLElBQUksQ0FBQ0QsVUFBVTtFQUMxQjs7RUFFQTtBQUNKO0FBQ0E7RUFDY0UsSUFBSUEsQ0FBQSxFQUFTO0lBQ25CLElBQUksSUFBSSxDQUFDTixhQUFhLEVBQUUsSUFBSSxDQUFDTCxVQUFVLENBQUNZLFVBQVUsQ0FBQyxJQUFJLENBQUNQLGFBQWEsQ0FBQztFQUMxRTs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtFQUNJLE1BQWdCUSxXQUFXQSxDQUFDQyxRQUFvQixFQUFpQjtJQUM3RCxNQUFNLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxZQUFZLENBQUMsQ0FBQztJQUM5QixJQUFJO01BQ0EsSUFBSSxDQUFDUCxVQUFVLEdBQUdRLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDRCxNQUFNLENBQUNFLE1BQU0sQ0FBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNWLFVBQVUsRUFBRUssUUFBUSxDQUFDLENBQUM7TUFDaEYsSUFBSSxDQUFDTSxJQUFJLENBQUN6QixZQUFZLEVBQUUsSUFBSSxDQUFDO0lBQ2pDLENBQUMsU0FBUztNQUNOLE1BQU0sSUFBSSxDQUFDb0IsSUFBSSxDQUFDTSxPQUFPLENBQUMsQ0FBQztJQUM3QjtFQUNKOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxNQUFnQkMsS0FBS0EsQ0FBQ1IsUUFBMkIsR0FBRyxJQUFJLEVBQUVTLEtBQUssR0FBRyxLQUFLLEVBQWlCO0lBQ3BGLE1BQU0sSUFBSSxDQUFDUixJQUFJLENBQUNDLFlBQVksQ0FBQyxDQUFDO0lBQzlCLElBQUk7TUFDQSxJQUFJLENBQUNQLFVBQVUsR0FBR1EsTUFBTSxDQUFDQyxNQUFNLENBQUtKLFFBQVEsSUFBSSxDQUFDLENBQUUsQ0FBQztNQUNwRCxJQUFJLENBQUNTLEtBQUssRUFBRSxJQUFJLENBQUNILElBQUksQ0FBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUM7SUFDN0MsQ0FBQyxTQUFTO01BQ04sTUFBTSxJQUFJLENBQUNvQixJQUFJLENBQUNNLE9BQU8sQ0FBQyxDQUFDO0lBQzdCO0VBQ0o7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFFQTtBQUFDekIsT0FBQSxDQUFBQyxVQUFBLEdBQUFBLFVBQUEiLCJpZ25vcmVMaXN0IjpbXX0=