1import './pgLuxonPatchAI.mts'2import './betLogDbFormattersAI.mts'3import { betLog } from '../../sharedF/betterConsLogF.mts'4import { decomposeForkedKubeQs } from './decompForkedKubeQsF.mts'5import { doKnexConn } from './doKnexConnF.mts'6import { doKysConn } from './doKysConnF.mts'7import { getEnvConf } from '../envConfF.mts'8import { assertDefined } from '../../sharedF/assertsF/assertDefinedF.mts'9import { disabledSecret } from '../../sharedF/disabledSecretF.mts'10import type { DbConn, DbConnInfo } from './dbTypesF.mts'11import { existingConnsH } from './dbConnCacheF.mts'13export const secMapDbConnWrap = async <T,>(14 { qsName, reuseConn, pgAdType }: { qsName: string; reuseConn?: boolean; pgAdType: string },16): Promise<T | undefined> => {17 const {secretsMapping} = getEnvConf()19 if (qsName == disabledSecret || secretsMapping?.[qsName] == disabledSecret) {20 return await fnc() // bypass21 }23 // Map generic qsName (e.g. 'defaultdb_qs') to actual secret if defined24 // If qsName is already an actual secret (from dbSecrets), mapping won't exist25 const mappedQsName = secretsMapping?.[qsName]26 if (mappedQsName) qsName = mappedQsName28 const connInfo = await decomposeForkedKubeQs({ qsName, dbFork: true })30 return dbConnWrapNoMap({connInfo, reuseConn, pgAdType}, fnc)31}34export const dbConnWrapNoMap = async <T,>(35 { connInfo, reuseConn = true, pgAdType }: { connInfo: DbConnInfo; reuseConn?: boolean; pgAdType: string },37): Promise<T> => {38 const {qsName} = connInfo39 assertDefined(qsName)40 const cacheKey = `${qsName}:${pgAdType}`42 if (reuseConn) {44 if (existingConn) return existingConn 45 }46 const adapterFnc = {47 'Knex': doKnexConn,48 'Kys': doKysConn,49 }[pgAdType]50 assertDefined(adapterFnc, {pgAdType})51 const newConn = adapterFnc(connInfo)52 if (reuseConn) {53 existingConnsH[cacheKey] = newConn54 }55 return newConn56 })()58 let ret: T59 try {60 ret = await fnc(db)61 } finally {62 if (!reuseConn) {63 if (process.env.VERYVERBOSE) {65 }66 await db.destroy()67 }68 }70 return ret71}