import EventEmitter from 'events'; import * as sdk from 'matrix-js-sdk'; import Olm from '@matrix-org/olm'; // import { logger } from 'matrix-js-sdk/lib/logger'; import { secret } from './state/auth'; import RoomList from './state/RoomList'; import AccountData from './state/AccountData'; import RoomsInput from './state/RoomsInput'; import Notifications from './state/Notifications'; import { cryptoCallbacks } from './state/secretStorageKeys'; import navigation from './state/navigation'; global.Olm = Olm; // logger.disableAll(); class InitMatrix extends EventEmitter { constructor() { super(); navigation.initMatrix = this; } async init() { await this.startClient(); this.setupSync(); this.listenEvents(); } async startClient() { const indexedDBStore = new sdk.IndexedDBStore({ indexedDB: global.indexedDB, localStorage: global.localStorage, dbName: 'web-sync-store', }); await indexedDBStore.startup(); this.matrixClient = sdk.createClient({ baseUrl: secret.baseUrl, accessToken: secret.accessToken, userId: secret.userId, store: indexedDBStore, cryptoStore: new sdk.IndexedDBCryptoStore(global.indexedDB, 'crypto-store'), deviceId: secret.deviceId, timelineSupport: true, cryptoCallbacks, verificationMethods: [ 'm.sas.v1', ], }); await this.matrixClient.initCrypto(); await this.matrixClient.startClient({ lazyLoadMembers: true, }); this.matrixClient.setGlobalErrorOnUnknownDevices(false); } setupSync() { const sync = { NULL: () => { console.log('NULL state'); }, SYNCING: () => { console.log('SYNCING state'); }, PREPARED: (prevState) => { console.log('PREPARED state'); console.log('Previous state: ', prevState); // TODO: remove global.initMatrix at end global.initMatrix = this; if (prevState === null) { this.roomList = new RoomList(this.matrixClient); this.accountData = new AccountData(this.roomList); this.roomsInput = new RoomsInput(this.matrixClient, this.roomList); this.notifications = new Notifications(this.roomList); this.emit('init_loading_finished'); this.notifications._initNoti(); } else { this.notifications?._initNoti(); } }, RECONNECTING: () => { console.log('RECONNECTING state'); }, CATCHUP: () => { console.log('CATCHUP state'); }, ERROR: () => { console.log('ERROR state'); }, STOPPED: () => { console.log('STOPPED state'); }, }; this.matrixClient.on('sync', (state, prevState) => sync[state](prevState)); } listenEvents() { this.matrixClient.on('Session.logged_out', async () => { this.matrixClient.stopClient(); await this.matrixClient.clearStores(); window.localStorage.clear(); window.location.reload(); }); } async logout() { this.matrixClient.stopClient(); try { await this.matrixClient.logout(); } catch { // ignore if failed to logout } await this.matrixClient.clearStores(); window.localStorage.clear(); window.location.reload(); } clearCacheAndReload() { this.matrixClient.stopClient(); this.matrixClient.store.deleteAllData().then(() => { window.location.reload(); }); } } const initMatrix = new InitMatrix(); export default initMatrix;