hydrogen-web/src/matrix/storage/idb/StorageFactory.js

54 lines
2 KiB
JavaScript
Raw Normal View History

import {Storage} from "./Storage.js";
2019-10-13 00:46:48 +05:30
import { openDatabase, reqAsPromise } from "./utils.js";
2019-12-14 22:59:35 +05:30
import { exportSession, importSession } from "./export.js";
const sessionName = sessionId => `brawl_session_${sessionId}`;
const openDatabaseWithSessionId = sessionId => openDatabase(sessionName(sessionId), createStores, 1);
2019-02-07 03:34:39 +05:30
export class StorageFactory {
2019-10-13 00:46:48 +05:30
async create(sessionId) {
2019-12-14 22:59:35 +05:30
const db = await openDatabaseWithSessionId(sessionId);
2019-10-13 00:46:48 +05:30
return new Storage(db);
}
delete(sessionId) {
2019-12-14 22:59:35 +05:30
const databaseName = sessionName(sessionId);
2019-10-13 00:46:48 +05:30
const req = window.indexedDB.deleteDatabase(databaseName);
return reqAsPromise(req);
}
2019-12-14 22:59:35 +05:30
async export(sessionId) {
const db = await openDatabaseWithSessionId(sessionId);
return await exportSession(db);
}
async import(sessionId, data) {
const db = await openDatabaseWithSessionId(sessionId);
return await importSession(db, data);
}
2019-02-05 04:51:50 +05:30
}
function createStores(db) {
db.createObjectStore("session", {keyPath: "key"});
// any way to make keys unique here? (just use put?)
db.createObjectStore("roomSummary", {keyPath: "roomId"});
2019-04-18 23:49:43 +05:30
// need index to find live fragment? prooobably ok without for now
//key = room_id | fragment_id
db.createObjectStore("timelineFragments", {keyPath: "key"});
//key = room_id | fragment_id | event_index
const timelineEvents = db.createObjectStore("timelineEvents", {keyPath: "key"});
//eventIdKey = room_id | event_id
timelineEvents.createIndex("byEventId", "eventIdKey", {unique: true});
//key = room_id | event.type | event.state_key,
db.createObjectStore("roomState", {keyPath: "key"});
2019-07-01 13:30:29 +05:30
db.createObjectStore("pendingEvents", {keyPath: "key"});
// const roomMembers = db.createObjectStore("roomMembers", {keyPath: [
// "event.room_id",
// "event.content.membership",
// "event.state_key"
// ]});
// roomMembers.createIndex("byName", ["room_id", "content.name"]);
2019-04-18 23:49:43 +05:30
}