ConnectionString.utils.ts 2.2 KB

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