diff --git a/src/runtime/internal/database.client.ts b/src/runtime/internal/database.client.ts index 6a389aa9e..a21bb01a4 100644 --- a/src/runtime/internal/database.client.ts +++ b/src/runtime/internal/database.client.ts @@ -6,20 +6,26 @@ import type { DatabaseAdapter, DatabaseBindParams } from '@nuxt/content' import { checksums, tables } from '#content/manifest' let db: Database -const loadedCollections: Record = {} -const dbPromises: Record> = {} +const loadedCollections = new Map() +const dbPromises = new Map>() export function loadDatabaseAdapter(collection: T): DatabaseAdapter { async function loadAdapter(collection: T) { + const collectionKey = String(collection) if (!db) { - dbPromises._ = dbPromises._ || initializeDatabase() - db = await dbPromises._ - Reflect.deleteProperty(dbPromises, '_') + if (!dbPromises.has('_')) { + dbPromises.set('_', initializeDatabase()) + } + db = await dbPromises.get('_')! + dbPromises.delete('_') } - if (!loadedCollections[String(collection)]) { - dbPromises[String(collection)] = dbPromises[String(collection)] || loadCollectionDatabase(collection) - await dbPromises[String(collection)] - loadedCollections[String(collection)] = 'loaded' - Reflect.deleteProperty(dbPromises, String(collection)) + if (!loadedCollections.has(collectionKey)) { + if (!dbPromises.has(collectionKey)) { + dbPromises.set(collectionKey, loadCollectionDatabase(collection)) + } + + await dbPromises.get(collectionKey) + loadedCollections.set(collectionKey, 'loaded') + dbPromises.delete(collectionKey) } return db diff --git a/src/runtime/internal/database.server.ts b/src/runtime/internal/database.server.ts index c01e88c48..9251f5802 100644 --- a/src/runtime/internal/database.server.ts +++ b/src/runtime/internal/database.server.ts @@ -38,24 +38,28 @@ export default function loadDatabaseAdapter(config: RuntimeConfig['content']) { } } -const checkDatabaseIntegrity = {} as Record -const integrityCheckPromise = {} as Record | null> +const checkDatabaseIntegrity = new Map() +const integrityCheckPromise = new Map | null>() export async function checkAndImportDatabaseIntegrity(event: H3Event, collection: string, config: RuntimeConfig['content']): Promise { - if (checkDatabaseIntegrity[String(collection)] !== false) { - checkDatabaseIntegrity[String(collection)] = false - integrityCheckPromise[String(collection)] = integrityCheckPromise[String(collection)] || _checkAndImportDatabaseIntegrity(event, collection, checksums[String(collection)]!, checksumsStructure[String(collection)]!, config) - .then((isValid) => { - checkDatabaseIntegrity[String(collection)] = !isValid - }) - .catch((error) => { - console.error('Database integrity check failed', error) - checkDatabaseIntegrity[String(collection)] = true - integrityCheckPromise[String(collection)] = null - }) + if (checkDatabaseIntegrity.get(collection) !== false) { + checkDatabaseIntegrity.set(collection, false) + if (!integrityCheckPromise.has(collection)) { + const _integrityCheck = _checkAndImportDatabaseIntegrity(event, collection, checksums[collection]!, checksumsStructure[collection]!, config) + .then((isValid) => { + checkDatabaseIntegrity.set(collection, !isValid) + }) + .catch((error) => { + console.error('Database integrity check failed', error) + checkDatabaseIntegrity.set(collection, true) + integrityCheckPromise.delete(collection) + }) + + integrityCheckPromise.set(collection, _integrityCheck) + } } - if (integrityCheckPromise[String(collection)]) { - await integrityCheckPromise[String(collection)] + if (integrityCheckPromise.has(collection)) { + await integrityCheckPromise.get(collection)! } } @@ -193,7 +197,7 @@ async function waitUntilDatabaseIsReady(db: DatabaseAdapter, collection: string) } async function loadDatabaseDump(event: H3Event, collection: string): Promise { - return await fetchDatabase(event, String(collection)) + return await fetchDatabase(event, collection) .catch((e) => { console.error('Failed to fetch compressed dump', e) return ''