ConnectionString.utils.ts90 lines · main
| 1 | import type { ConnectionStringMethod } from './Connect.constants' |
| 2 | import type { ConnectionStringPooler } from './Connect.types' |
| 3 | |
| 4 | export const DEFAULT_PORT = '5432' |
| 5 | export const PASSWORD_PLACEHOLDER = '[YOUR-PASSWORD]' |
| 6 | |
| 7 | export type ConnectionParams = { |
| 8 | host: string |
| 9 | port: string |
| 10 | user: string |
| 11 | database: string |
| 12 | } |
| 13 | |
| 14 | export 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 | |
| 40 | export 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 | |
| 68 | export 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 | |
| 85 | export 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 | ] |