ConnectionString.utils.ts90 lines · main
1import type { ConnectionStringMethod } from './Connect.constants'
2import type { ConnectionStringPooler } from './Connect.types'
3
4export const DEFAULT_PORT = '5432'
5export const PASSWORD_PLACEHOLDER = '[YOUR-PASSWORD]'
6
7export type ConnectionParams = {
8 host: string
9 port: string
10 user: string
11 database: string
12}
13
14export const resolveConnectionString = ({
15 connectionMethod,
16 useSharedPooler,
17 connectionStringPooler,
18}: {
19 connectionMethod: ConnectionStringMethod
20 useSharedPooler: boolean
21 connectionStringPooler: ConnectionStringPooler | undefined
22}) => {
23 if (!connectionStringPooler) return ''
24
25 if (connectionMethod === 'direct') {
26 return connectionStringPooler.direct ?? ''
27 }
28
29 if (connectionMethod === 'session') {
30 return connectionStringPooler.sessionShared ?? ''
31 }
32
33 if (useSharedPooler || !connectionStringPooler.transactionDedicated) {
34 return connectionStringPooler.transactionShared ?? ''
35 }
36
37 return connectionStringPooler.transactionDedicated ?? ''
38}
39
40export const parseConnectionParams = (connectionString: string): ConnectionParams => {
41 if (!connectionString) {
42 return {
43 host: 'hidden',
44 port: DEFAULT_PORT,
45 user: 'hidden',
46 database: 'hidden',
47 }
48 }
49
50 try {
51 const parsed = new URL(connectionString)
52 return {
53 host: parsed.hostname || 'hidden',
54 port: parsed.port || DEFAULT_PORT,
55 user: parsed.username || 'hidden',
56 database: parsed.pathname?.replace(/^\//, '') || 'hidden',
57 }
58 } catch (error) {
59 return {
60 host: 'hidden',
61 port: DEFAULT_PORT,
62 user: 'hidden',
63 database: 'hidden',
64 }
65 }
66}
67
68export const buildSafeConnectionString = (
69 connectionString: string,
70 params: ConnectionParams
71): string => {
72 if (!connectionString) return ''
73
74 const search = (() => {
75 try {
76 return new URL(connectionString).search
77 } catch (error) {
78 return ''
79 }
80 })()
81
82 return `postgresql://${params.user}:${PASSWORD_PLACEHOLDER}@${params.host}:${params.port}/${params.database}${search}`
83}
84
85export const buildConnectionParameters = (params: ConnectionParams) => [
86 { key: 'host', value: params.host },
87 { key: 'port', value: params.port },
88 { key: 'database', value: params.database },
89 { key: 'user', value: params.user },
90]