cinny/src/client/initMatrix.js

133 lines
3.5 KiB
JavaScript

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;