diff --git a/src/storages.ts b/src/storages.ts index a51cbd1..056228b 100644 --- a/src/storages.ts +++ b/src/storages.ts @@ -1,3 +1,4 @@ +// deno-lint-ignore-file require-await import { NCache } from '@nostrify/nostrify'; import { Conf } from '@/config.ts'; import { db } from '@/db.ts'; @@ -12,89 +13,97 @@ import { UserStore } from '@/storages/UserStore.ts'; import { Time } from '@/utils/time.ts'; export class Storages { - private static _db: EventsDB | undefined; - private static _admin: UserStore | undefined; - private static _cache: NCache | undefined; - private static _client: PoolStore | undefined; - private static _optimizer: Optimizer | undefined; - private static _reqmeister: Reqmeister | undefined; - private static _pubsub: InternalRelay | undefined; - private static _search: SearchStore | undefined; + private static _db: Promise | undefined; + private static _admin: Promise | undefined; + private static _cache: Promise | undefined; + private static _client: Promise | undefined; + private static _optimizer: Promise | undefined; + private static _reqmeister: Promise | undefined; + private static _pubsub: Promise | undefined; + private static _search: Promise | undefined; /** SQLite database to store events this Ditto server cares about. */ - public static get db(): EventsDB { + public static async db(): Promise { if (!this._db) { - this._db = new EventsDB(db); + this._db = Promise.resolve(new EventsDB(db)); } return this._db; } /** Admin user storage. */ - public static get admin(): UserStore { + public static async admin(): Promise { if (!this._admin) { - this._admin = new UserStore(Conf.pubkey, this.db); + this._admin = Promise.resolve(new UserStore(Conf.pubkey, await this.db())); } return this._admin; } /** Internal pubsub relay between controllers and the pipeline. */ - public static get pubsub(): InternalRelay { + public static async pubsub(): Promise { if (!this._pubsub) { - this._pubsub = new InternalRelay(); + this._pubsub = Promise.resolve(new InternalRelay()); } return this._pubsub; } /** Relay pool storage. */ - public static get client(): PoolStore { + public static async client(): Promise { if (!this._client) { - this._client = new PoolStore({ - pool, - relays: activeRelays, - }); + this._client = Promise.resolve( + new PoolStore({ + pool, + relays: activeRelays, + }), + ); } return this._client; } /** In-memory data store for cached events. */ - public static get cache(): NCache { + public static async cache(): Promise { if (!this._cache) { - this._cache = new NCache({ max: 3000 }); + this._cache = Promise.resolve(new NCache({ max: 3000 })); } return this._cache; } /** Batches requests for single events. */ - public static get reqmeister(): Reqmeister { + public static async reqmeister(): Promise { if (!this._reqmeister) { - this._reqmeister = new Reqmeister({ - client: this.client, - delay: Time.seconds(1), - timeout: Time.seconds(1), - }); + this._reqmeister = Promise.resolve( + new Reqmeister({ + client: await this.client(), + delay: Time.seconds(1), + timeout: Time.seconds(1), + }), + ); } return this._reqmeister; } /** Main Ditto storage adapter */ - public static get optimizer(): Optimizer { + public static async optimizer(): Promise { if (!this._optimizer) { - this._optimizer = new Optimizer({ - db: this.db, - cache: this.cache, - client: this.reqmeister, - }); + this._optimizer = Promise.resolve( + new Optimizer({ + db: await this.db(), + cache: await this.cache(), + client: await this.reqmeister(), + }), + ); } return this._optimizer; } /** Storage to use for remote search. */ - public static get search(): SearchStore { + public static async search(): Promise { if (!this._search) { - this._search = new SearchStore({ - relay: Conf.searchRelay, - fallback: this.optimizer, - }); + this._search = Promise.resolve( + new SearchStore({ + relay: Conf.searchRelay, + fallback: await this.optimizer(), + }), + ); } return this._search; }