🌳
pt0/serverF/dbF/dbConnWrapF.mts
5import { doKnexConn } from './doKnexConnF.mts'
6import { doKysConn } from './doKysConnF.mts'
7import { getEnvConf } from '../envConfF.mts'
10import type { DbConn, DbConnInfo } from './dbTypesF.mts'
13export const secMapDbConnWrap = async <T,>(
14 { qsName, reuseConn, pgAdType }: { qsName: string; reuseConn?: boolean; pgAdType: string },
15 fnc: (db?: DbConn) => Promise<T>
16): Promise<T | undefined> => {
17 const {secretsMapping} = getEnvConf()
19 if (qsName == disabledSecret || secretsMapping?.[qsName] == disabledSecret) {
20 return await fnc() // bypass
21 }
23 // Map generic qsName (e.g. 'defaultdb_qs') to actual secret if defined
24 // If qsName is already an actual secret (from dbSecrets), mapping won't exist
25 const mappedQsName = secretsMapping?.[qsName]
26 if (mappedQsName) qsName = mappedQsName
28 const connInfo = await decomposeForkedKubeQs({ qsName, dbFork: true })
30 return dbConnWrapNoMap({connInfo, reuseConn, pgAdType}, fnc)
34export const dbConnWrapNoMap = async <T,>(
35 { connInfo, reuseConn = true, pgAdType }: { connInfo: DbConnInfo; reuseConn?: boolean; pgAdType: string },
36 fnc: (db: DbConn) => Promise<T>
37): Promise<T> => {
38 const {qsName} = connInfo
40 const cacheKey = `${qsName}:${pgAdType}`
41 const db: DbConn = (() => {
42 if (reuseConn) {
43 const existingConn = existingConnsH[cacheKey] as DbConn | undefined
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] = newConn
54 }
55 return newConn
56 })()
58 let ret: T
59 try {
60 ret = await fnc(db)
61 } finally {
62 if (!reuseConn) {
63 if (process.env.VERYVERBOSE) {
64 betLog('db.destroy', db)
65 }
66 await db.destroy()
67 }
68 }
70 return ret