1import knex, { type Knex } from 'knex' 2import * as _ from 'lodash-es' 10type KnexConnParams = { 14 needsKubePortFwd?: boolean 18 postProcessors?: Array<(result: any) => any> 21export const doKnexConn = ({qsName, extQs, password, needsKubePortFwd}: KnexConnParams): Knex => { 23 console.log('connecting to db (knex)', qsName, maskQs(extQs)) 30 const pool: Knex.PoolConfig = { 32 createTimeoutMillis: 10000, 33 acquireTimeoutMillis: 30000, 34 idleTimeoutMillis: 30000, 35 reapIntervalMillis: 1000, 36 createRetryIntervalMillis: 100, 37 // tarn supports validate but knex's PoolConfig type omits it 38 ...({ validate: async (conn: any) => { 39 try { await conn.query('SELECT 1'); return true } 40 catch { return false } 47 asyncStackTraces: true, 51 const originalPostProcessResponse = db.client.config.postProcessResponse || ((x: any) => x) 52 db.client.config.postProcessResponse = (result: any, queryContext: QueryContext) => { 53 let processedResult = originalPostProcessResponse(result, queryContext) 55 if (queryContext && queryContext.postProcessors && queryContext.postProcessors.length > 0) { 56 for (const processFn of queryContext.postProcessors) { 57 processedResult = Array.isArray(processedResult) 58 ? processedResult.map(processFn) 59 : (processedResult ? processFn(processedResult) : processedResult) 63 return processedResult 66 const qb = db.queryBuilder() 67 const QueryBuilder = qb.constructor 69 _.each(knexKustH, (fnc: any, key: string) => { 70 QueryBuilder.prototype[key] = fnc