import { createClient, MatrixClient, IndexedDBStore, IndexedDBCryptoStore } from 'matrix-js-sdk'; import Olm from '@matrix-org/olm'; import { logger } from 'matrix-js-sdk/lib/logger'; import { cryptoCallbacks } from './state/secretStorageKeys'; global.Olm = Olm; if (import.meta.env.PROD) { logger.disableAll(); } type Session = { baseUrl: string; accessToken: string; userId: string; deviceId: string; }; export const initClient = async (session: Session): Promise => { const indexedDBStore = new IndexedDBStore({ indexedDB: global.indexedDB, localStorage: global.localStorage, dbName: 'web-sync-store', }); const mx = createClient({ baseUrl: session.baseUrl, accessToken: session.accessToken, userId: session.userId, store: indexedDBStore, cryptoStore: new IndexedDBCryptoStore(global.indexedDB, 'crypto-store'), deviceId: session.deviceId, timelineSupport: true, cryptoCallbacks: cryptoCallbacks as any, verificationMethods: ['m.sas.v1'], }); await mx.initCrypto(); await indexedDBStore.startup(); mx.setGlobalErrorOnUnknownDevices(false); mx.setMaxListeners(50); return mx; }; export const startClient = async (mx: MatrixClient) => { await mx.startClient({ lazyLoadMembers: true, }); }; export const clearCacheAndReload = async (mx: MatrixClient) => { mx.stopClient(); await mx.store.deleteAllData(); window.location.reload(); }; export const logoutClient = async (mx: MatrixClient) => { mx.stopClient(); try { await mx.logout(); } catch { // ignore if failed to logout } await mx.clearStores(); window.localStorage.clear(); window.location.reload(); };