/* Copyright 2024 New Vector Ltd. Copyright 2017-2021 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, createClient, ICreateClientOpts, MemoryCryptoStore, MemoryStore, IndexedDBCryptoStore, IndexedDBStore, LocalStorageCryptoStore, } from "matrix-js-sdk/src/matrix"; import indexeddbWorkerFactory from "../workers/indexeddbWorkerFactory"; const localStorage = window.localStorage; // just *accessing* indexedDB throws an exception in firefox with // indexeddb disabled. let indexedDB: IDBFactory; try { indexedDB = window.indexedDB; } catch {} /** * Create a new matrix client, with the persistent stores set up appropriately * (using localstorage/indexeddb, etc) * * @param {Object} opts options to pass to Matrix.createClient. This will be * extended with `sessionStore` and `store` members. * * @returns {MatrixClient} the newly-created MatrixClient */ export default function createMatrixClient(opts: ICreateClientOpts): MatrixClient { const storeOpts: Partial = { useAuthorizationHeader: true, }; if (indexedDB && localStorage) { storeOpts.store = new IndexedDBStore({ indexedDB: indexedDB, dbName: "riot-web-sync", localStorage, workerFactory: indexeddbWorkerFactory, }); } else if (localStorage) { storeOpts.store = new MemoryStore({ localStorage }); } if (indexedDB) { storeOpts.cryptoStore = new IndexedDBCryptoStore(indexedDB, "matrix-js-sdk:crypto"); } else if (localStorage) { storeOpts.cryptoStore = new LocalStorageCryptoStore(localStorage); } else { storeOpts.cryptoStore = new MemoryCryptoStore(); } return createClient({ ...storeOpts, ...opts, }); }