/* 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. */ import { MatrixClient } from "matrix-js-sdk/src/matrix"; import { AsyncStore } from "./AsyncStore"; import { ActionPayload } from "../dispatcher/payloads"; import { ReadyWatchingStore } from "./ReadyWatchingStore"; import { MatrixDispatcher } from "../dispatcher/dispatcher"; export abstract class AsyncStoreWithClient extends AsyncStore { protected readyStore: ReadyWatchingStore; protected constructor(dispatcher: MatrixDispatcher, initialState: T = {}) { super(dispatcher, initialState); // Create an anonymous class to avoid code duplication const asyncStore = this; // eslint-disable-line @typescript-eslint/no-this-alias this.readyStore = new (class extends ReadyWatchingStore { public get mxClient(): MatrixClient | null { return this.matrixClient; } protected async onReady(): Promise { return asyncStore.onReady(); } protected async onNotReady(): Promise { return asyncStore.onNotReady(); } })(dispatcher); } public async start(): Promise { await this.readyStore.start(); } public get matrixClient(): MatrixClient | null { return this.readyStore.mxClient; } protected async onReady(): Promise { // Default implementation is to do nothing. } protected async onNotReady(): Promise { // Default implementation is to do nothing. } protected abstract onAction(payload: ActionPayload): Promise; protected async onDispatch(payload: ActionPayload): Promise { await this.onAction(payload); } }