import { Rules } from "./rules"; import Settings from "../settings"; import getLevelDB from "../storage"; import PathLock from "./lock"; import Query from "./query"; export class DatabaseManager { static databases = new Map(); static async init() { let databases = await Settings.getDatabases(); databases.forEach(dbconfig => { let db = new Database(dbconfig.name, dbconfig.accesskey, dbconfig.rules, dbconfig.publickey); this.databases.set(dbconfig.name, db); }) } static addDatabase(name: string) { if (this.databases.has(name)) throw new Error("Database already exists!"); let database = new Database(name); this.databases.set(name, database); return database; } static getDatabase(name: string) { return this.databases.get(name); } static async deleteDatabase(name: string) { let db = this.databases.get(name) if (db) { await Settings.deleteDatabase(name); await db.stop(); } } } export class Database { public level = getLevelDB(this.name); private rules: Rules; public locks = new PathLock() toJSON() { return { name: this.name, accesskey: this.accesskey, publickey: this.publickey, rules: this.rules } } constructor(public name: string, public accesskey?: string, rawRules?: string, public publickey?: string) { if (rawRules) this.rules = new Rules(rawRules); } async setRules(rawRules: string) { let rules = new Rules(rawRules); await Settings.setDatabaseRules(this.name, rawRules); this.rules = rules; } async setAccessKey(key: string) { await Settings.setDatabaseAccessKey(this.name, key); this.accesskey = key; } async setPublicKey(key: string) { await Settings.setDatabasePublicKey(this.name, key); this.publickey = key; } getQuery(path: string[]) { return new Query(this, path); } async stop() { await this.level.close(); } }