@@ -4,11 +4,12 @@ import type { DatabaseDriverName } from '~/lib/db/drivers'
44import cluster from 'node:cluster'
55
66import { hash } from 'node:crypto'
7+ import { createSingletonPromise } from '@antfu/utils'
78import { Kysely , Migrator } from 'kysely'
89import { getDatabaseDriver } from '~/lib/db/drivers'
910import { migrations } from '~/lib/db/migrations'
10- import { ENV } from '~/lib/env'
1111
12+ import { ENV } from '~/lib/env'
1213import { logger } from '~/lib/logger'
1314
1415export interface CacheKeysTable {
@@ -23,12 +24,10 @@ export interface UploadsTable {
2324 key : string
2425 version : string
2526 id : string
26- driver_upload_id : string
2727}
2828export interface UploadPartsTable {
2929 upload_id : string
3030 part_number : number
31- e_tag : string | null
3231}
3332
3433export interface MetaTable {
@@ -43,62 +42,46 @@ export interface Database {
4342 meta : MetaTable
4443}
4544
46- let _db : Kysely < Database >
47-
48- let initializationPromise : Promise < void > | undefined
49- export async function initializeDatabase ( ) {
50- if ( initializationPromise ) return initializationPromise
51-
52- // eslint-disable-next-line unicorn/consistent-function-scoping
53- const init = async ( ) => {
54- const driverName = ENV . DB_DRIVER
55- const driverSetup = getDatabaseDriver ( driverName )
56- if ( ! driverSetup ) {
57- logger . error ( `No database driver found for ${ driverName } ` )
58- // eslint-disable-next-line unicorn/no-process-exit
59- process . exit ( 1 )
60- }
61- if ( cluster . isPrimary ) logger . info ( `Using database driver: ${ driverName } ` )
45+ export const useDB = createSingletonPromise ( async ( ) => {
46+ const driverName = ENV . DB_DRIVER
47+ const driverSetup = getDatabaseDriver ( driverName )
48+ if ( ! driverSetup ) {
49+ logger . error ( `No database driver found for ${ driverName } ` )
50+ // eslint-disable-next-line unicorn/no-process-exit
51+ process . exit ( 1 )
52+ }
53+ if ( cluster . isPrimary ) logger . info ( `Using database driver: ${ driverName } ` )
6254
63- const driver = await driverSetup ( )
55+ const driver = await driverSetup ( )
6456
65- _db = new Kysely < Database > ( {
66- dialect : driver ,
67- } )
57+ const db = new Kysely < Database > ( {
58+ dialect : driver ,
59+ } )
6860
69- if ( cluster . isPrimary ) {
70- logger . info ( 'Migrating database...' )
71- const migrator = new Migrator ( {
72- db : _db ,
73- provider : {
74- async getMigrations ( ) {
75- return migrations ( driverName as DatabaseDriverName )
76- } ,
61+ if ( cluster . isPrimary ) {
62+ logger . info ( 'Migrating database...' )
63+ const migrator = new Migrator ( {
64+ db,
65+ provider : {
66+ async getMigrations ( ) {
67+ return migrations ( driverName as DatabaseDriverName )
7768 } ,
78- } )
79- const { error, results } = await migrator . migrateToLatest ( )
80- if ( error ) {
81- logger . error ( 'Database migration failed' , error )
82- // eslint-disable-next-line unicorn/no-process-exit
83- process . exit ( 1 )
84- }
85- logger . debug ( 'Migration results' , results )
86- logger . success ( 'Database migrated' )
69+ } ,
70+ } )
71+ const { error, results } = await migrator . migrateToLatest ( )
72+ if ( error ) {
73+ logger . error ( 'Database migration failed' , error )
74+ // eslint-disable-next-line unicorn/no-process-exit
75+ process . exit ( 1 )
8776 }
77+ logger . debug ( 'Migration results' , results )
78+ logger . success ( 'Database migrated' )
8879 }
8980
90- initializationPromise = init ( )
91- return initializationPromise
92- }
93-
94- export async function useDB ( ) {
95- if ( ! _db ) {
96- await initializeDatabase ( )
97- }
98- return _db
99- }
81+ return db
82+ } )
10083
101- type DB = typeof _db
84+ type DB = Awaited < ReturnType < typeof useDB > >
10285
10386/**
10487 * @see https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key
0 commit comments