@take-out/postgres 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/cli.cjs +3 -0
  4. package/dist/cjs/build.cjs +26 -0
  5. package/dist/cjs/build.js +21 -0
  6. package/dist/cjs/build.js.map +6 -0
  7. package/dist/cjs/build.native.js +29 -0
  8. package/dist/cjs/build.native.js.map +1 -0
  9. package/dist/cjs/cli.cjs +156 -0
  10. package/dist/cjs/cli.js +128 -0
  11. package/dist/cjs/cli.js.map +6 -0
  12. package/dist/cjs/cli.native.js +164 -0
  13. package/dist/cjs/cli.native.js.map +1 -0
  14. package/dist/cjs/createServerHelpers.cjs +37 -0
  15. package/dist/cjs/createServerHelpers.js +28 -0
  16. package/dist/cjs/createServerHelpers.js.map +6 -0
  17. package/dist/cjs/createServerHelpers.native.js +43 -0
  18. package/dist/cjs/createServerHelpers.native.js.map +1 -0
  19. package/dist/cjs/helpers/chunkedQuery.cjs +60 -0
  20. package/dist/cjs/helpers/chunkedQuery.js +51 -0
  21. package/dist/cjs/helpers/chunkedQuery.js.map +6 -0
  22. package/dist/cjs/helpers/chunkedQuery.native.js +73 -0
  23. package/dist/cjs/helpers/chunkedQuery.native.js.map +1 -0
  24. package/dist/cjs/helpers/getDBClient.cjs +172 -0
  25. package/dist/cjs/helpers/getDBClient.js +179 -0
  26. package/dist/cjs/helpers/getDBClient.js.map +6 -0
  27. package/dist/cjs/helpers/getDBClient.native.js +189 -0
  28. package/dist/cjs/helpers/getDBClient.native.js.map +1 -0
  29. package/dist/cjs/index.cjs +59 -0
  30. package/dist/cjs/index.js +45 -0
  31. package/dist/cjs/index.js.map +6 -0
  32. package/dist/cjs/index.native.js +64 -0
  33. package/dist/cjs/index.native.js.map +1 -0
  34. package/dist/cjs/migrate.cjs +117 -0
  35. package/dist/cjs/migrate.js +106 -0
  36. package/dist/cjs/migrate.js.map +6 -0
  37. package/dist/cjs/migrate.native.js +185 -0
  38. package/dist/cjs/migrate.native.js.map +1 -0
  39. package/dist/cjs/scripts/build-migrations.cjs +81 -0
  40. package/dist/cjs/scripts/build-migrations.js +69 -0
  41. package/dist/cjs/scripts/build-migrations.js.map +6 -0
  42. package/dist/cjs/scripts/build-migrations.native.js +86 -0
  43. package/dist/cjs/scripts/build-migrations.native.js.map +1 -0
  44. package/dist/cjs/scripts/drizzle-migrations-sync.cjs +111 -0
  45. package/dist/cjs/scripts/drizzle-migrations-sync.js +101 -0
  46. package/dist/cjs/scripts/drizzle-migrations-sync.js.map +6 -0
  47. package/dist/cjs/scripts/drizzle-migrations-sync.native.js +209 -0
  48. package/dist/cjs/scripts/drizzle-migrations-sync.native.js.map +1 -0
  49. package/dist/cjs/scripts/migration-add.cjs +53 -0
  50. package/dist/cjs/scripts/migration-add.js +40 -0
  51. package/dist/cjs/scripts/migration-add.js.map +6 -0
  52. package/dist/cjs/scripts/migration-add.native.js +72 -0
  53. package/dist/cjs/scripts/migration-add.native.js.map +1 -0
  54. package/dist/cjs/scripts/pg_dump.cjs +49 -0
  55. package/dist/cjs/scripts/pg_dump.js +36 -0
  56. package/dist/cjs/scripts/pg_dump.js.map +6 -0
  57. package/dist/cjs/scripts/pg_dump.native.js +55 -0
  58. package/dist/cjs/scripts/pg_dump.native.js.map +1 -0
  59. package/dist/cjs/scripts/psql.cjs +50 -0
  60. package/dist/cjs/scripts/psql.js +37 -0
  61. package/dist/cjs/scripts/psql.js.map +6 -0
  62. package/dist/cjs/scripts/psql.native.js +56 -0
  63. package/dist/cjs/scripts/psql.native.js.map +1 -0
  64. package/dist/cjs/sql.cjs +40 -0
  65. package/dist/cjs/sql.js +35 -0
  66. package/dist/cjs/sql.js.map +6 -0
  67. package/dist/cjs/sql.native.js +49 -0
  68. package/dist/cjs/sql.native.js.map +1 -0
  69. package/dist/esm/build.js +5 -0
  70. package/dist/esm/build.js.map +6 -0
  71. package/dist/esm/build.mjs +3 -0
  72. package/dist/esm/build.mjs.map +1 -0
  73. package/dist/esm/build.native.js +3 -0
  74. package/dist/esm/build.native.js.map +1 -0
  75. package/dist/esm/cli.js +134 -0
  76. package/dist/esm/cli.js.map +6 -0
  77. package/dist/esm/cli.mjs +157 -0
  78. package/dist/esm/cli.mjs.map +1 -0
  79. package/dist/esm/cli.native.js +162 -0
  80. package/dist/esm/cli.native.js.map +1 -0
  81. package/dist/esm/createServerHelpers.js +13 -0
  82. package/dist/esm/createServerHelpers.js.map +6 -0
  83. package/dist/esm/createServerHelpers.mjs +14 -0
  84. package/dist/esm/createServerHelpers.mjs.map +1 -0
  85. package/dist/esm/createServerHelpers.native.js +17 -0
  86. package/dist/esm/createServerHelpers.native.js.map +1 -0
  87. package/dist/esm/helpers/chunkedQuery.js +35 -0
  88. package/dist/esm/helpers/chunkedQuery.js.map +6 -0
  89. package/dist/esm/helpers/chunkedQuery.mjs +36 -0
  90. package/dist/esm/helpers/chunkedQuery.mjs.map +1 -0
  91. package/dist/esm/helpers/chunkedQuery.native.js +46 -0
  92. package/dist/esm/helpers/chunkedQuery.native.js.map +1 -0
  93. package/dist/esm/helpers/getDBClient.js +155 -0
  94. package/dist/esm/helpers/getDBClient.js.map +6 -0
  95. package/dist/esm/helpers/getDBClient.mjs +136 -0
  96. package/dist/esm/helpers/getDBClient.mjs.map +1 -0
  97. package/dist/esm/helpers/getDBClient.native.js +150 -0
  98. package/dist/esm/helpers/getDBClient.native.js.map +1 -0
  99. package/dist/esm/index.js +29 -0
  100. package/dist/esm/index.js.map +6 -0
  101. package/dist/esm/index.mjs +18 -0
  102. package/dist/esm/index.mjs.map +1 -0
  103. package/dist/esm/index.native.js +20 -0
  104. package/dist/esm/index.native.js.map +1 -0
  105. package/dist/esm/migrate.js +91 -0
  106. package/dist/esm/migrate.js.map +6 -0
  107. package/dist/esm/migrate.mjs +94 -0
  108. package/dist/esm/migrate.mjs.map +1 -0
  109. package/dist/esm/migrate.native.js +159 -0
  110. package/dist/esm/migrate.native.js.map +1 -0
  111. package/dist/esm/scripts/build-migrations.js +46 -0
  112. package/dist/esm/scripts/build-migrations.js.map +6 -0
  113. package/dist/esm/scripts/build-migrations.mjs +47 -0
  114. package/dist/esm/scripts/build-migrations.mjs.map +1 -0
  115. package/dist/esm/scripts/build-migrations.native.js +49 -0
  116. package/dist/esm/scripts/build-migrations.native.js.map +1 -0
  117. package/dist/esm/scripts/drizzle-migrations-sync.js +87 -0
  118. package/dist/esm/scripts/drizzle-migrations-sync.js.map +6 -0
  119. package/dist/esm/scripts/drizzle-migrations-sync.mjs +88 -0
  120. package/dist/esm/scripts/drizzle-migrations-sync.mjs.map +1 -0
  121. package/dist/esm/scripts/drizzle-migrations-sync.native.js +183 -0
  122. package/dist/esm/scripts/drizzle-migrations-sync.native.js.map +1 -0
  123. package/dist/esm/scripts/migration-add.js +25 -0
  124. package/dist/esm/scripts/migration-add.js.map +6 -0
  125. package/dist/esm/scripts/migration-add.mjs +30 -0
  126. package/dist/esm/scripts/migration-add.mjs.map +1 -0
  127. package/dist/esm/scripts/migration-add.native.js +46 -0
  128. package/dist/esm/scripts/migration-add.native.js.map +1 -0
  129. package/dist/esm/scripts/pg_dump.js +20 -0
  130. package/dist/esm/scripts/pg_dump.js.map +6 -0
  131. package/dist/esm/scripts/pg_dump.mjs +26 -0
  132. package/dist/esm/scripts/pg_dump.mjs.map +1 -0
  133. package/dist/esm/scripts/pg_dump.native.js +29 -0
  134. package/dist/esm/scripts/pg_dump.native.js.map +1 -0
  135. package/dist/esm/scripts/psql.js +21 -0
  136. package/dist/esm/scripts/psql.js.map +6 -0
  137. package/dist/esm/scripts/psql.mjs +27 -0
  138. package/dist/esm/scripts/psql.mjs.map +1 -0
  139. package/dist/esm/scripts/psql.native.js +30 -0
  140. package/dist/esm/scripts/psql.native.js.map +1 -0
  141. package/dist/esm/sql.js +19 -0
  142. package/dist/esm/sql.js.map +6 -0
  143. package/dist/esm/sql.mjs +15 -0
  144. package/dist/esm/sql.mjs.map +1 -0
  145. package/dist/esm/sql.native.js +21 -0
  146. package/dist/esm/sql.native.js.map +1 -0
  147. package/package.json +67 -0
  148. package/src/build.ts +2 -0
  149. package/src/cli.ts +153 -0
  150. package/src/createServerHelpers.ts +20 -0
  151. package/src/helpers/chunkedQuery.ts +91 -0
  152. package/src/helpers/getDBClient.ts +264 -0
  153. package/src/index.ts +36 -0
  154. package/src/migrate.ts +192 -0
  155. package/src/scripts/build-migrations.ts +66 -0
  156. package/src/scripts/drizzle-migrations-sync.ts +179 -0
  157. package/src/scripts/migration-add.ts +54 -0
  158. package/src/scripts/pg_dump.ts +46 -0
  159. package/src/scripts/psql.ts +51 -0
  160. package/src/sql.ts +36 -0
  161. package/types/build.d.ts +2 -0
  162. package/types/build.d.ts.map +1 -0
  163. package/types/cli.d.ts +3 -0
  164. package/types/cli.d.ts.map +1 -0
  165. package/types/createServerHelpers.d.ts +9 -0
  166. package/types/createServerHelpers.d.ts.map +1 -0
  167. package/types/helpers/chunkedQuery.d.ts +17 -0
  168. package/types/helpers/chunkedQuery.d.ts.map +1 -0
  169. package/types/helpers/getDBClient.d.ts +11 -0
  170. package/types/helpers/getDBClient.d.ts.map +1 -0
  171. package/types/index.d.ts +10 -0
  172. package/types/index.d.ts.map +1 -0
  173. package/types/migrate.d.ts +25 -0
  174. package/types/migrate.d.ts.map +1 -0
  175. package/types/scripts/build-migrations.d.ts +8 -0
  176. package/types/scripts/build-migrations.d.ts.map +1 -0
  177. package/types/scripts/drizzle-migrations-sync.d.ts +11 -0
  178. package/types/scripts/drizzle-migrations-sync.d.ts.map +1 -0
  179. package/types/scripts/migration-add.d.ts +6 -0
  180. package/types/scripts/migration-add.d.ts.map +1 -0
  181. package/types/scripts/pg_dump.d.ts +11 -0
  182. package/types/scripts/pg_dump.d.ts.map +1 -0
  183. package/types/scripts/psql.d.ts +11 -0
  184. package/types/scripts/psql.d.ts.map +1 -0
  185. package/types/sql.d.ts +9 -0
  186. package/types/sql.d.ts.map +1 -0
@@ -0,0 +1,155 @@
1
+ import pg from "pg";
2
+ const cache = /* @__PURE__ */ new Map(), createPoolKey = (connectionString) => connectionString, getOrCreatePoolCache = (connectionString, config) => {
3
+ const key = createPoolKey(connectionString);
4
+ return cache.has(key) || cache.set(key, {
5
+ pool: new pg.Pool(config),
6
+ maxConnections: null,
7
+ reservedConnections: null,
8
+ openedConnections: null,
9
+ openedConnectionsLastUpdate: null
10
+ }), cache.get(key);
11
+ };
12
+ async function getDBClient(options = {}) {
13
+ const { pool, connectionString, retries = 8 } = options;
14
+ if (!pool && !connectionString)
15
+ throw new Error("Either pool or connectionString must be provided");
16
+ let client = null;
17
+ try {
18
+ return client = await tryToGetNewClientFromPool(pool, connectionString, retries), client;
19
+ } catch (error) {
20
+ throw console.error("Failed to get DB client:", error), error;
21
+ }
22
+ }
23
+ async function tryToGetNewClientFromPool(providedPool, connectionString, retries) {
24
+ const { default: retry } = await import("async-retry");
25
+ return await retry(
26
+ async () => {
27
+ if (providedPool) {
28
+ console.info("Connecting to provided pool...");
29
+ const client2 = await providedPool.connect();
30
+ return console.info("Connected to pool"), client2;
31
+ }
32
+ if (!connectionString)
33
+ throw new Error("No connection string provided");
34
+ const poolCache = getOrCreatePoolCache(connectionString, {
35
+ connectionString,
36
+ connectionTimeoutMillis: 5e3,
37
+ // idle_session_timeout set to 35s on server, client timeout at 30s
38
+ // fix via https://github.com/brianc/node-postgres/issues/2718#issuecomment-2094885323
39
+ idleTimeoutMillis: 3e4,
40
+ allowExitOnIdle: !0
41
+ });
42
+ console.info(`Connecting to pool ${connectionString}...`);
43
+ const client = await poolCache.pool.connect();
44
+ return console.info("Connected to pool"), client;
45
+ },
46
+ {
47
+ retries,
48
+ minTimeout: 300,
49
+ factor: 2,
50
+ maxTimeout: 8e3
51
+ }
52
+ );
53
+ }
54
+ async function queryDb(queryText, params, options = {}) {
55
+ let client = null;
56
+ try {
57
+ return client = await tryToGetNewClientFromPool(
58
+ options.pool,
59
+ options.connectionString,
60
+ options.retries || 8
61
+ ), await client.query(queryText, params);
62
+ } catch (error) {
63
+ throw console.error("Database query failed:", {
64
+ query: queryText,
65
+ error: error instanceof Error ? error.message : String(error)
66
+ }), error;
67
+ } finally {
68
+ if (client && options.connectionString)
69
+ if (await checkForTooManyConnections(
70
+ client,
71
+ options.connectionString
72
+ )) {
73
+ const poolCache = cache.get(createPoolKey(options.connectionString));
74
+ client.release(), await poolCache?.pool.end(), poolCache && cache.delete(createPoolKey(options.connectionString));
75
+ } else
76
+ client.release();
77
+ else client && client.release();
78
+ }
79
+ }
80
+ async function checkForTooManyConnections(client, connectionString) {
81
+ const poolCache = cache.get(createPoolKey(connectionString));
82
+ if (!poolCache) return !1;
83
+ const currentTime = Date.now(), openedConnectionsMaxAge = 1e4, maxConnectionsTolerance = 0.9;
84
+ if (poolCache.maxConnections === null || poolCache.reservedConnections === null) {
85
+ const [maxConnections, reservedConnections] = await getConnectionLimits(client);
86
+ console.info(
87
+ `Max connections: ${maxConnections}, Reserved connections: ${reservedConnections}`
88
+ ), poolCache.maxConnections = maxConnections, poolCache.reservedConnections = reservedConnections;
89
+ }
90
+ if (poolCache.openedConnections === null || poolCache.openedConnectionsLastUpdate === null || currentTime - poolCache.openedConnectionsLastUpdate > openedConnectionsMaxAge) {
91
+ const openedConnections = await getOpenedConnections(client, connectionString);
92
+ poolCache.openedConnections = openedConnections, poolCache.openedConnectionsLastUpdate = currentTime;
93
+ }
94
+ return poolCache.openedConnections > (poolCache.maxConnections - poolCache.reservedConnections) * maxConnectionsTolerance ? (console.warn(
95
+ `Too many connections detected: ${poolCache.openedConnections}/${poolCache.maxConnections - poolCache.reservedConnections}`
96
+ ), !0) : !1;
97
+ }
98
+ async function getConnectionLimits(client) {
99
+ console.info("Getting connection limits...");
100
+ const maxConnectionsResult = await client.query("SHOW max_connections"), reservedConnectionResult = await client.query(
101
+ "SHOW superuser_reserved_connections"
102
+ );
103
+ return [
104
+ Number.parseInt(maxConnectionsResult.rows[0].max_connections, 10),
105
+ Number.parseInt(reservedConnectionResult.rows[0].superuser_reserved_connections, 10)
106
+ ];
107
+ }
108
+ async function getOpenedConnections(client, connectionString) {
109
+ const dbName = new URL(connectionString).pathname.slice(1);
110
+ console.info("Getting opened connections...");
111
+ const openConnectionsResult = await client.query(
112
+ "SELECT numbackends as opened_connections FROM pg_stat_database WHERE datname = $1",
113
+ [dbName]
114
+ ), result = Number.parseInt(
115
+ openConnectionsResult.rows[0]?.opened_connections || 0,
116
+ 10
117
+ );
118
+ return console.info(`Opened connections: ${result}`), result;
119
+ }
120
+ async function getNewClient(options = {}) {
121
+ const { connectionString } = options;
122
+ if (!connectionString)
123
+ throw new Error("connectionString is required for getNewClient");
124
+ try {
125
+ return await tryToGetNewClient(connectionString);
126
+ } catch (error) {
127
+ throw console.error("Failed to get new client:", error), error;
128
+ }
129
+ }
130
+ async function tryToGetNewClient(connectionString) {
131
+ const configurations = {
132
+ connectionString,
133
+ connectionTimeoutMillis: 5e3,
134
+ idleTimeoutMillis: 3e4,
135
+ allowExitOnIdle: !0
136
+ }, { default: retry } = await import("async-retry");
137
+ return await retry(
138
+ async () => {
139
+ const newClient = new pg.Client(configurations);
140
+ return await newClient.connect(), newClient;
141
+ },
142
+ {
143
+ retries: 10,
144
+ minTimeout: 100,
145
+ factor: 2,
146
+ maxTimeout: 5e3
147
+ }
148
+ );
149
+ }
150
+ export {
151
+ getDBClient,
152
+ getNewClient,
153
+ queryDb
154
+ };
155
+ //# sourceMappingURL=getDBClient.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/helpers/getDBClient.ts"],
4
+ "mappings": "AAAA,OAAO,QAAwC;AAY/C,MAAM,QAAQ,oBAAI,IAShB,GAEI,gBAAgB,CAAC,qBAA6B,kBAE9C,uBAAuB,CAAC,kBAA0B,WAA0B;AAChF,QAAM,MAAM,cAAc,gBAAgB;AAE1C,SAAK,MAAM,IAAI,GAAG,KAChB,MAAM,IAAI,KAAK;AAAA,IACb,MAAM,IAAI,GAAG,KAAK,MAAM;AAAA,IACxB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,6BAA6B;AAAA,EAC/B,CAAC,GAGI,MAAM,IAAI,GAAG;AACtB;AAEA,eAAsB,YAAY,UAA8B,CAAC,GAAwB;AACvF,QAAM,EAAE,MAAM,kBAAkB,UAAU,EAAE,IAAI;AAEhD,MAAI,CAAC,QAAQ,CAAC;AACZ,UAAM,IAAI,MAAM,kDAAkD;AAGpE,MAAI,SAA4B;AAEhC,MAAI;AACF,oBAAS,MAAM,0BAA0B,MAAM,kBAAkB,OAAO,GACjE;AAAA,EACT,SAAS,OAAO;AACd,kBAAQ,MAAM,4BAA4B,KAAK,GACzC;AAAA,EACR;AACF;AAEA,eAAe,0BACb,cACA,kBACA,SACqB;AACrB,QAAM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,aAAa;AAsCrD,SArCuB,MAAM;AAAA,IAC3B,YAAY;AACV,UAAI,cAAc;AAChB,gBAAQ,KAAK,gCAAgC;AAC7C,cAAMA,UAAS,MAAM,aAAa,QAAQ;AAC1C,uBAAQ,KAAK,mBAAmB,GACzBA;AAAA,MACT;AAEA,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,+BAA+B;AAYjD,YAAM,YAAY,qBAAqB,kBATD;AAAA,QACpC;AAAA,QACA,yBAAyB;AAAA;AAAA;AAAA,QAGzB,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MACnB,CAEuE;AAEvE,cAAQ,KAAK,sBAAsB,gBAAgB,KAAK;AACxD,YAAM,SAAS,MAAM,UAAU,KAAK,QAAQ;AAC5C,qBAAQ,KAAK,mBAAmB,GACzB;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAGF;AAEA,eAAsB,QACpB,WACA,QACA,UAA8B,CAAC,GACD;AAC9B,MAAI,SAA4B;AAEhC,MAAI;AACF,oBAAS,MAAM;AAAA,MACb,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ,WAAW;AAAA,IACrB,GACO,MAAM,OAAO,MAAM,WAAW,MAAM;AAAA,EAC7C,SAAS,OAAO;AACd,kBAAQ,MAAM,0BAA0B;AAAA,MACtC,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC,GACK;AAAA,EACR,UAAE;AACA,QAAI,UAAU,QAAQ;AAMpB,UAL2B,MAAM;AAAA,QAC/B;AAAA,QACA,QAAQ;AAAA,MACV,GAEwB;AACtB,cAAM,YAAY,MAAM,IAAI,cAAc,QAAQ,gBAAgB,CAAC;AACnE,eAAO,QAAQ,GACf,MAAM,WAAW,KAAK,IAAI,GACtB,aACF,MAAM,OAAO,cAAc,QAAQ,gBAAgB,CAAC;AAAA,MAExD;AACE,eAAO,QAAQ;AAAA,QAEZ,CAAI,UACT,OAAO,QAAQ;AAAA,EAEnB;AACF;AAEA,eAAe,2BACb,QACA,kBACkB;AAClB,QAAM,YAAY,MAAM,IAAI,cAAc,gBAAgB,CAAC;AAC3D,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,cAAc,KAAK,IAAI,GACvB,0BAA0B,KAC1B,0BAA0B;AAEhC,MAAI,UAAU,mBAAmB,QAAQ,UAAU,wBAAwB,MAAM;AAC/E,UAAM,CAAC,gBAAgB,mBAAmB,IAAI,MAAM,oBAAoB,MAAM;AAC9E,YAAQ;AAAA,MACN,oBAAoB,cAAc,2BAA2B,mBAAmB;AAAA,IAClF,GACA,UAAU,iBAAiB,gBAC3B,UAAU,sBAAsB;AAAA,EAClC;AAEA,MACE,UAAU,sBAAsB,QAChC,UAAU,gCAAgC,QAC1C,cAAc,UAAU,8BAA8B,yBACtD;AACA,UAAM,oBAAoB,MAAM,qBAAqB,QAAQ,gBAAgB;AAC7E,cAAU,oBAAoB,mBAC9B,UAAU,8BAA8B;AAAA,EAC1C;AAEA,SACE,UAAU,qBACT,UAAU,iBAAiB,UAAU,uBAAuB,2BAE7D,QAAQ;AAAA,IACN,kCAAkC,UAAU,iBAAiB,IAAI,UAAU,iBAAiB,UAAU,mBAAmB;AAAA,EAC3H,GACO,MAGF;AACT;AAEA,eAAe,oBAAoB,QAA+C;AAChF,UAAQ,KAAK,8BAA8B;AAC3C,QAAM,uBAAuB,MAAM,OAAO,MAAM,sBAAsB,GAChE,2BAA2B,MAAM,OAAO;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,SAAS,qBAAqB,KAAK,CAAC,EAAE,iBAAiB,EAAE;AAAA,IAChE,OAAO,SAAS,yBAAyB,KAAK,CAAC,EAAE,gCAAgC,EAAE;AAAA,EACrF;AACF;AAEA,eAAe,qBACb,QACA,kBACiB;AAEjB,QAAM,SAAS,IAAI,IAAI,gBAAgB,EAAE,SAAS,MAAM,CAAC;AACzD,UAAQ,KAAK,+BAA+B;AAC5C,QAAM,wBAAwB,MAAM,OAAO;AAAA,IACzC;AAAA,IACA,CAAC,MAAM;AAAA,EACT,GACM,SAAS,OAAO;AAAA,IACpB,sBAAsB,KAAK,CAAC,GAAG,sBAAsB;AAAA,IACrD;AAAA,EACF;AACA,iBAAQ,KAAK,uBAAuB,MAAM,EAAE,GACrC;AACT;AAEA,eAAsB,aAAa,UAA8B,CAAC,GAAuB;AACvF,QAAM,EAAE,iBAAiB,IAAI;AAE7B,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,+CAA+C;AAGjE,MAAI;AAEF,WADe,MAAM,kBAAkB,gBAAgB;AAAA,EAEzD,SAAS,OAAO;AACd,kBAAQ,MAAM,6BAA6B,KAAK,GAC1C;AAAA,EACR;AACF;AAEA,eAAe,kBAAkB,kBAA8C;AAC7E,QAAM,iBAAgC;AAAA,IACpC;AAAA,IACA,yBAAyB;AAAA,IACzB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,EACnB,GAEM,EAAE,SAAS,MAAM,IAAI,MAAM,OAAO,aAAa;AAerD,SAde,MAAM;AAAA,IACnB,YAAY;AACV,YAAM,YAAY,IAAI,GAAG,OAAO,cAAc;AAC9C,mBAAM,UAAU,QAAQ,GACjB;AAAA,IACT;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAGF;",
5
+ "names": ["client"]
6
+ }
@@ -0,0 +1,136 @@
1
+ import pg from "pg";
2
+ const cache = /* @__PURE__ */new Map(),
3
+ createPoolKey = connectionString => connectionString,
4
+ getOrCreatePoolCache = (connectionString, config) => {
5
+ const key = createPoolKey(connectionString);
6
+ return cache.has(key) || cache.set(key, {
7
+ pool: new pg.Pool(config),
8
+ maxConnections: null,
9
+ reservedConnections: null,
10
+ openedConnections: null,
11
+ openedConnectionsLastUpdate: null
12
+ }), cache.get(key);
13
+ };
14
+ async function getDBClient(options = {}) {
15
+ const {
16
+ pool,
17
+ connectionString,
18
+ retries = 8
19
+ } = options;
20
+ if (!pool && !connectionString) throw new Error("Either pool or connectionString must be provided");
21
+ let client = null;
22
+ try {
23
+ return client = await tryToGetNewClientFromPool(pool, connectionString, retries), client;
24
+ } catch (error) {
25
+ throw console.error("Failed to get DB client:", error), error;
26
+ }
27
+ }
28
+ async function tryToGetNewClientFromPool(providedPool, connectionString, retries) {
29
+ const {
30
+ default: retry
31
+ } = await import("async-retry");
32
+ return await retry(async () => {
33
+ if (providedPool) {
34
+ console.info("Connecting to provided pool...");
35
+ const client2 = await providedPool.connect();
36
+ return console.info("Connected to pool"), client2;
37
+ }
38
+ if (!connectionString) throw new Error("No connection string provided");
39
+ const poolCache = getOrCreatePoolCache(connectionString, {
40
+ connectionString,
41
+ connectionTimeoutMillis: 5e3,
42
+ // idle_session_timeout set to 35s on server, client timeout at 30s
43
+ // fix via https://github.com/brianc/node-postgres/issues/2718#issuecomment-2094885323
44
+ idleTimeoutMillis: 3e4,
45
+ allowExitOnIdle: !0
46
+ });
47
+ console.info(`Connecting to pool ${connectionString}...`);
48
+ const client = await poolCache.pool.connect();
49
+ return console.info("Connected to pool"), client;
50
+ }, {
51
+ retries,
52
+ minTimeout: 300,
53
+ factor: 2,
54
+ maxTimeout: 8e3
55
+ });
56
+ }
57
+ async function queryDb(queryText, params, options = {}) {
58
+ let client = null;
59
+ try {
60
+ return client = await tryToGetNewClientFromPool(options.pool, options.connectionString, options.retries || 8), await client.query(queryText, params);
61
+ } catch (error) {
62
+ throw console.error("Database query failed:", {
63
+ query: queryText,
64
+ error: error instanceof Error ? error.message : String(error)
65
+ }), error;
66
+ } finally {
67
+ if (client && options.connectionString) {
68
+ if (await checkForTooManyConnections(client, options.connectionString)) {
69
+ const poolCache = cache.get(createPoolKey(options.connectionString));
70
+ client.release(), await poolCache?.pool.end(), poolCache && cache.delete(createPoolKey(options.connectionString));
71
+ } else client.release();
72
+ } else client && client.release();
73
+ }
74
+ }
75
+ async function checkForTooManyConnections(client, connectionString) {
76
+ const poolCache = cache.get(createPoolKey(connectionString));
77
+ if (!poolCache) return !1;
78
+ const currentTime = Date.now(),
79
+ openedConnectionsMaxAge = 1e4,
80
+ maxConnectionsTolerance = 0.9;
81
+ if (poolCache.maxConnections === null || poolCache.reservedConnections === null) {
82
+ const [maxConnections, reservedConnections] = await getConnectionLimits(client);
83
+ console.info(`Max connections: ${maxConnections}, Reserved connections: ${reservedConnections}`), poolCache.maxConnections = maxConnections, poolCache.reservedConnections = reservedConnections;
84
+ }
85
+ if (poolCache.openedConnections === null || poolCache.openedConnectionsLastUpdate === null || currentTime - poolCache.openedConnectionsLastUpdate > openedConnectionsMaxAge) {
86
+ const openedConnections = await getOpenedConnections(client, connectionString);
87
+ poolCache.openedConnections = openedConnections, poolCache.openedConnectionsLastUpdate = currentTime;
88
+ }
89
+ return poolCache.openedConnections > (poolCache.maxConnections - poolCache.reservedConnections) * maxConnectionsTolerance ? (console.warn(`Too many connections detected: ${poolCache.openedConnections}/${poolCache.maxConnections - poolCache.reservedConnections}`), !0) : !1;
90
+ }
91
+ async function getConnectionLimits(client) {
92
+ console.info("Getting connection limits...");
93
+ const maxConnectionsResult = await client.query("SHOW max_connections"),
94
+ reservedConnectionResult = await client.query("SHOW superuser_reserved_connections");
95
+ return [Number.parseInt(maxConnectionsResult.rows[0].max_connections, 10), Number.parseInt(reservedConnectionResult.rows[0].superuser_reserved_connections, 10)];
96
+ }
97
+ async function getOpenedConnections(client, connectionString) {
98
+ const dbName = new URL(connectionString).pathname.slice(1);
99
+ console.info("Getting opened connections...");
100
+ const openConnectionsResult = await client.query("SELECT numbackends as opened_connections FROM pg_stat_database WHERE datname = $1", [dbName]),
101
+ result = Number.parseInt(openConnectionsResult.rows[0]?.opened_connections || 0, 10);
102
+ return console.info(`Opened connections: ${result}`), result;
103
+ }
104
+ async function getNewClient(options = {}) {
105
+ const {
106
+ connectionString
107
+ } = options;
108
+ if (!connectionString) throw new Error("connectionString is required for getNewClient");
109
+ try {
110
+ return await tryToGetNewClient(connectionString);
111
+ } catch (error) {
112
+ throw console.error("Failed to get new client:", error), error;
113
+ }
114
+ }
115
+ async function tryToGetNewClient(connectionString) {
116
+ const configurations = {
117
+ connectionString,
118
+ connectionTimeoutMillis: 5e3,
119
+ idleTimeoutMillis: 3e4,
120
+ allowExitOnIdle: !0
121
+ },
122
+ {
123
+ default: retry
124
+ } = await import("async-retry");
125
+ return await retry(async () => {
126
+ const newClient = new pg.Client(configurations);
127
+ return await newClient.connect(), newClient;
128
+ }, {
129
+ retries: 10,
130
+ minTimeout: 100,
131
+ factor: 2,
132
+ maxTimeout: 5e3
133
+ });
134
+ }
135
+ export { getDBClient, getNewClient, queryDb };
136
+ //# sourceMappingURL=getDBClient.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["pg","cache","Map","createPoolKey","connectionString","getOrCreatePoolCache","config","key","has","set","pool","Pool","maxConnections","reservedConnections","openedConnections","openedConnectionsLastUpdate","get","getDBClient","options","retries","Error","client","tryToGetNewClientFromPool","error","console","providedPool","default","retry","info","client2","connect","poolCache","connectionTimeoutMillis","idleTimeoutMillis","allowExitOnIdle","minTimeout","factor","maxTimeout","queryDb","queryText","params","query","message","String","checkForTooManyConnections","release","end","delete","currentTime","Date","now","openedConnectionsMaxAge","maxConnectionsTolerance","getConnectionLimits","getOpenedConnections","warn","maxConnectionsResult","reservedConnectionResult","Number","parseInt","rows","max_connections","superuser_reserved_connections","dbName","URL","pathname","slice","openConnectionsResult","result","opened_connections","getNewClient","tryToGetNewClient","configurations","newClient","Client"],"sources":["../../../src/helpers/getDBClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,150 @@
1
+ import pg from "pg";
2
+ function _instanceof(left, right) {
3
+ return right != null && typeof Symbol < "u" && right[Symbol.hasInstance] ? !!right[Symbol.hasInstance](left) : left instanceof right;
4
+ }
5
+ var cache = /* @__PURE__ */new Map(),
6
+ createPoolKey = function (connectionString) {
7
+ return connectionString;
8
+ },
9
+ getOrCreatePoolCache = function (connectionString, config) {
10
+ var key = createPoolKey(connectionString);
11
+ return cache.has(key) || cache.set(key, {
12
+ pool: new pg.Pool(config),
13
+ maxConnections: null,
14
+ reservedConnections: null,
15
+ openedConnections: null,
16
+ openedConnectionsLastUpdate: null
17
+ }), cache.get(key);
18
+ };
19
+ async function getDBClient() {
20
+ var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {},
21
+ {
22
+ pool,
23
+ connectionString,
24
+ retries = 8
25
+ } = options;
26
+ if (!pool && !connectionString) throw new Error("Either pool or connectionString must be provided");
27
+ var client = null;
28
+ try {
29
+ return client = await tryToGetNewClientFromPool(pool, connectionString, retries), client;
30
+ } catch (error) {
31
+ throw console.error("Failed to get DB client:", error), error;
32
+ }
33
+ }
34
+ async function tryToGetNewClientFromPool(providedPool, connectionString, retries) {
35
+ var {
36
+ default: retry
37
+ } = await import("async-retry"),
38
+ clientFromPool = await retry(async function () {
39
+ if (providedPool) {
40
+ console.info("Connecting to provided pool...");
41
+ var client = await providedPool.connect();
42
+ return console.info("Connected to pool"), client;
43
+ }
44
+ if (!connectionString) throw new Error("No connection string provided");
45
+ var configurations = {
46
+ connectionString,
47
+ connectionTimeoutMillis: 5e3,
48
+ // idle_session_timeout set to 35s on server, client timeout at 30s
49
+ // fix via https://github.com/brianc/node-postgres/issues/2718#issuecomment-2094885323
50
+ idleTimeoutMillis: 3e4,
51
+ allowExitOnIdle: !0
52
+ },
53
+ poolCache = getOrCreatePoolCache(connectionString, configurations);
54
+ console.info(`Connecting to pool ${connectionString}...`);
55
+ var client1 = await poolCache.pool.connect();
56
+ return console.info("Connected to pool"), client1;
57
+ }, {
58
+ retries,
59
+ minTimeout: 300,
60
+ factor: 2,
61
+ maxTimeout: 8e3
62
+ });
63
+ return clientFromPool;
64
+ }
65
+ async function queryDb(queryText, params) {
66
+ var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {},
67
+ client = null;
68
+ try {
69
+ return client = await tryToGetNewClientFromPool(options.pool, options.connectionString, options.retries || 8), await client.query(queryText, params);
70
+ } catch (error) {
71
+ throw console.error("Database query failed:", {
72
+ query: queryText,
73
+ error: _instanceof(error, Error) ? error.message : String(error)
74
+ }), error;
75
+ } finally {
76
+ if (client && options.connectionString) {
77
+ var tooManyConnections = await checkForTooManyConnections(client, options.connectionString);
78
+ if (tooManyConnections) {
79
+ var poolCache = cache.get(createPoolKey(options.connectionString));
80
+ client.release(), await poolCache?.pool.end(), poolCache && cache.delete(createPoolKey(options.connectionString));
81
+ } else client.release();
82
+ } else client && client.release();
83
+ }
84
+ }
85
+ async function checkForTooManyConnections(client, connectionString) {
86
+ var poolCache = cache.get(createPoolKey(connectionString));
87
+ if (!poolCache) return !1;
88
+ var currentTime = Date.now(),
89
+ openedConnectionsMaxAge = 1e4,
90
+ maxConnectionsTolerance = 0.9;
91
+ if (poolCache.maxConnections === null || poolCache.reservedConnections === null) {
92
+ var [maxConnections, reservedConnections] = await getConnectionLimits(client);
93
+ console.info(`Max connections: ${maxConnections}, Reserved connections: ${reservedConnections}`), poolCache.maxConnections = maxConnections, poolCache.reservedConnections = reservedConnections;
94
+ }
95
+ if (poolCache.openedConnections === null || poolCache.openedConnectionsLastUpdate === null || currentTime - poolCache.openedConnectionsLastUpdate > openedConnectionsMaxAge) {
96
+ var openedConnections = await getOpenedConnections(client, connectionString);
97
+ poolCache.openedConnections = openedConnections, poolCache.openedConnectionsLastUpdate = currentTime;
98
+ }
99
+ return poolCache.openedConnections > (poolCache.maxConnections - poolCache.reservedConnections) * maxConnectionsTolerance ? (console.warn(`Too many connections detected: ${poolCache.openedConnections}/${poolCache.maxConnections - poolCache.reservedConnections}`), !0) : !1;
100
+ }
101
+ async function getConnectionLimits(client) {
102
+ console.info("Getting connection limits...");
103
+ var maxConnectionsResult = await client.query("SHOW max_connections"),
104
+ reservedConnectionResult = await client.query("SHOW superuser_reserved_connections");
105
+ return [Number.parseInt(maxConnectionsResult.rows[0].max_connections, 10), Number.parseInt(reservedConnectionResult.rows[0].superuser_reserved_connections, 10)];
106
+ }
107
+ async function getOpenedConnections(client, connectionString) {
108
+ var _openConnectionsResult_rows_,
109
+ dbName = new URL(connectionString).pathname.slice(1);
110
+ console.info("Getting opened connections...");
111
+ var openConnectionsResult = await client.query("SELECT numbackends as opened_connections FROM pg_stat_database WHERE datname = $1", [dbName]),
112
+ result = Number.parseInt(((_openConnectionsResult_rows_ = openConnectionsResult.rows[0]) === null || _openConnectionsResult_rows_ === void 0 ? void 0 : _openConnectionsResult_rows_.opened_connections) || 0, 10);
113
+ return console.info(`Opened connections: ${result}`), result;
114
+ }
115
+ async function getNewClient() {
116
+ var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {},
117
+ {
118
+ connectionString
119
+ } = options;
120
+ if (!connectionString) throw new Error("connectionString is required for getNewClient");
121
+ try {
122
+ var client = await tryToGetNewClient(connectionString);
123
+ return client;
124
+ } catch (error) {
125
+ throw console.error("Failed to get new client:", error), error;
126
+ }
127
+ }
128
+ async function tryToGetNewClient(connectionString) {
129
+ var configurations = {
130
+ connectionString,
131
+ connectionTimeoutMillis: 5e3,
132
+ idleTimeoutMillis: 3e4,
133
+ allowExitOnIdle: !0
134
+ },
135
+ {
136
+ default: retry
137
+ } = await import("async-retry"),
138
+ client = await retry(async function () {
139
+ var newClient = new pg.Client(configurations);
140
+ return await newClient.connect(), newClient;
141
+ }, {
142
+ retries: 10,
143
+ minTimeout: 100,
144
+ factor: 2,
145
+ maxTimeout: 5e3
146
+ });
147
+ return client;
148
+ }
149
+ export { getDBClient, getNewClient, queryDb };
150
+ //# sourceMappingURL=getDBClient.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["pg","_instanceof","left","right","Symbol","hasInstance","cache","Map","createPoolKey","connectionString","getOrCreatePoolCache","config","key","has","set","pool","Pool","maxConnections","reservedConnections","openedConnections","openedConnectionsLastUpdate","get","getDBClient","options","arguments","length","retries","Error","client","tryToGetNewClientFromPool","error","console","providedPool","default","retry","clientFromPool","info","connect","configurations","connectionTimeoutMillis","idleTimeoutMillis","allowExitOnIdle","poolCache","client1","minTimeout","factor","maxTimeout","queryDb","queryText","params","query","message","String","tooManyConnections","checkForTooManyConnections","release","end","delete","currentTime","Date","now","openedConnectionsMaxAge","maxConnectionsTolerance","getConnectionLimits","getOpenedConnections","warn","maxConnectionsResult","reservedConnectionResult","Number","parseInt","rows","max_connections","superuser_reserved_connections","_openConnectionsResult_rows_","dbName","URL","pathname","slice","openConnectionsResult","result","opened_connections","getNewClient","tryToGetNewClient","newClient","Client"],"sources":["../../../src/helpers/getDBClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ import { drizzle } from "drizzle-orm/node-postgres";
2
+ import pg from "pg";
3
+ import { createSql } from "./sql";
4
+ import { createServerHelpers } from "./createServerHelpers";
5
+ import {
6
+ getDBClient,
7
+ queryDb
8
+ } from "./helpers/getDBClient";
9
+ import { processInChunks, updateInChunks } from "./helpers/chunkedQuery";
10
+ const createPool = (connectionString) => new pg.Pool({
11
+ connectionString
12
+ }), createDb = (connectionString, schema) => {
13
+ const pool = createPool(connectionString);
14
+ return drizzle(pool, {
15
+ schema,
16
+ logger: !1
17
+ });
18
+ };
19
+ export {
20
+ createDb,
21
+ createPool,
22
+ createServerHelpers,
23
+ createSql,
24
+ getDBClient,
25
+ processInChunks,
26
+ queryDb,
27
+ updateInChunks
28
+ };
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "mappings": "AACA,SAAS,eAAe;AAExB,OAAO,QAAQ;AAsBf,SAAS,iBAAgC;AAEzC,SAAS,2BAA+C;AAExD;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,iBAAiB,sBAAsB;AA9BzC,MAAM,aAAa,CAAC,qBAClB,IAAI,GAAG,KAAK;AAAA,EACjB;AACF,CAAC,GAGU,WAAW,CACtB,kBACA,WAC4B;AAC5B,QAAM,OAAO,WAAW,gBAAgB;AACxC,SAAO,QAAQ,MAAM;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACH;",
5
+ "names": []
6
+ }
@@ -0,0 +1,18 @@
1
+ import { drizzle } from "drizzle-orm/node-postgres";
2
+ import pg from "pg";
3
+ import { createSql } from "./sql.mjs";
4
+ import { createServerHelpers } from "./createServerHelpers.mjs";
5
+ import { getDBClient, queryDb } from "./helpers/getDBClient.mjs";
6
+ import { processInChunks, updateInChunks } from "./helpers/chunkedQuery.mjs";
7
+ const createPool = connectionString => new pg.Pool({
8
+ connectionString
9
+ }),
10
+ createDb = (connectionString, schema) => {
11
+ const pool = createPool(connectionString);
12
+ return drizzle(pool, {
13
+ schema,
14
+ logger: !1
15
+ });
16
+ };
17
+ export { createDb, createPool, createServerHelpers, createSql, getDBClient, processInChunks, queryDb, updateInChunks };
18
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["drizzle","pg","createSql","createServerHelpers","getDBClient","queryDb","processInChunks","updateInChunks","createPool","connectionString","Pool","createDb","schema","pool","logger"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AACA,SAASA,OAAA,QAAe;AAExB,OAAOC,EAAA,MAAQ;AAsBf,SAASC,SAAA,QAAgC;AAEzC,SAASC,mBAAA,QAA+C;AAExD,SACEC,WAAA,EACAC,OAAA,QAEK;AAEP,SAASC,eAAA,EAAiBC,cAAA,QAAsB;AA9BzC,MAAMC,UAAA,GAAcC,gBAAA,IAClB,IAAIR,EAAA,CAAGS,IAAA,CAAK;IACjBD;EACF,CAAC;EAGUE,QAAA,GAAWA,CACtBF,gBAAA,EACAG,MAAA,KAC4B;IAC5B,MAAMC,IAAA,GAAOL,UAAA,CAAWC,gBAAgB;IACxC,OAAOT,OAAA,CAAQa,IAAA,EAAM;MACnBD,MAAA;MACAE,MAAA,EAAQ;IACV,CAAC;EACH","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ import { drizzle } from "drizzle-orm/node-postgres";
2
+ import pg from "pg";
3
+ import { createSql } from "./sql.native.js";
4
+ import { createServerHelpers } from "./createServerHelpers.native.js";
5
+ import { getDBClient, queryDb } from "./helpers/getDBClient.native.js";
6
+ import { processInChunks, updateInChunks } from "./helpers/chunkedQuery.native.js";
7
+ var createPool = function (connectionString) {
8
+ return new pg.Pool({
9
+ connectionString
10
+ });
11
+ },
12
+ createDb = function (connectionString, schema) {
13
+ var pool = createPool(connectionString);
14
+ return drizzle(pool, {
15
+ schema,
16
+ logger: !1
17
+ });
18
+ };
19
+ export { createDb, createPool, createServerHelpers, createSql, getDBClient, processInChunks, queryDb, updateInChunks };
20
+ //# sourceMappingURL=index.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["drizzle","pg","createSql","createServerHelpers","getDBClient","queryDb","processInChunks","updateInChunks","createPool","connectionString","Pool","createDb","schema","pool","logger"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AACA,SAASA,OAAA,QAAe;AAExB,OAAOC,EAAA,MAAQ;AAsBf,SAASC,SAAA,QAAgC;AAEzC,SAASC,mBAAA,QAA+C;AAExD,SAAAC,WAAA,EAAAC,OAAA;AAAA,SACEC,eAAA,EAAAC,cAAA;AAAA,IACAC,UAAA,YAAAA,CAAAC,gBAAA;IAAA,OAEK,IAAAR,EAAA,CAAAS,IAAA;MAEPD;IA9BO;EACc;EACjBE,QAAA,YAAAA,CAAAF,gBAAA,EAAAG,MAAA;IACD,IAGUC,IAAA,GAAAL,UACX,CAAAC,gBACA;IAEA,OAAMT,OAAO,CAAAa,IAAA;MACbD,MAAO;MACLE,MAAA;IAAA,EACA;EAAQ;AAEZ,S","ignoreList":[]}
@@ -0,0 +1,91 @@
1
+ import { basename } from "node:path";
2
+ import { getDBClient } from "./helpers/getDBClient";
3
+ const isServerless = !!(process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.AWS_LAMBDA_RUNTIME_API || process.env.LAMBDA_RUNTIME_DIR || process.env.IS_SERVERLESS);
4
+ async function migrate(options) {
5
+ const {
6
+ connectionString,
7
+ migrationsGlob,
8
+ createDatabases = [],
9
+ onMigrationComplete,
10
+ gitSha,
11
+ cvrDb,
12
+ changeDb
13
+ } = options;
14
+ console.info(`Running migrations${gitSha ? ` for git version: ${gitSha}` : ""}`);
15
+ const client = await getDBClient({ connectionString }), hasDB = async (name) => {
16
+ const result = !!(await client.query(`
17
+ SELECT 1 FROM pg_database WHERE datname = '${name}'
18
+ `)).rows.length;
19
+ return console.info(result ? `${name} db exists` : `creating ${name} db`), result;
20
+ };
21
+ if (cvrDb || changeDb) {
22
+ if (!cvrDb)
23
+ throw new Error("Missing cvrDb");
24
+ const zeroDBNames = [basename(cvrDb || ""), basename(changeDb || "")].filter(Boolean);
25
+ for (const name of zeroDBNames)
26
+ await hasDB(name) || await client.query(`CREATE DATABASE ${name};`);
27
+ }
28
+ for (const dbUrl of createDatabases) {
29
+ const name = basename(dbUrl);
30
+ await hasDB(name) || await client.query(`CREATE DATABASE ${name};`);
31
+ }
32
+ try {
33
+ await client.query("BEGIN"), await client.query(`
34
+ CREATE TABLE IF NOT EXISTS migrations (
35
+ id SERIAL PRIMARY KEY,
36
+ name VARCHAR(255) NOT NULL,
37
+ run_on TIMESTAMP NOT NULL DEFAULT NOW()
38
+ )
39
+ `);
40
+ const appliedMigrations = await client.query("SELECT name FROM migrations"), appliedMigrationNames = new Set(appliedMigrations.rows.map((row) => row.name)), tsMigrationsSorted = Object.entries(migrationsGlob).sort(([a], [b]) => a.localeCompare(b)).map(([file, run]) => ({
41
+ name: basename(file).replace(".ts", ""),
42
+ run
43
+ })).filter(({ name }) => /^[\d]+/.test(name));
44
+ console.info(`Found ${tsMigrationsSorted.length} TypeScript migrations`);
45
+ const migrations = [...await Promise.all(
46
+ tsMigrationsSorted.map(async ({ name, run }) => {
47
+ if (appliedMigrationNames.has(name))
48
+ return console.info(`TypeScript migration applied already: ${name}`), null;
49
+ try {
50
+ return { ...await run(), name };
51
+ } catch (error) {
52
+ throw console.error(`Failed to load TypeScript migration ${name}:`, error), error;
53
+ }
54
+ })
55
+ ).then((migrations2) => migrations2.filter(Boolean))].sort((a, b) => a.name.localeCompare(b.name));
56
+ if (!migrations.length)
57
+ console.info("No migrations to apply!"), await client.query("COMMIT");
58
+ else {
59
+ for (const migration of migrations)
60
+ console.info(`Migrating: ${migration.name}`), migration.up && (console.info(`Applying migration: ${migration.name}`), await migration.up(client)), await client.query("INSERT INTO migrations (name) VALUES ($1)", [migration.name]), console.info(`Successfully applied migration: ${migration.name}`);
61
+ await client.query("COMMIT"), console.info("Successfully committed all migrations");
62
+ }
63
+ } catch (e) {
64
+ console.error("Migration failed, rolling back:", e), await client.query("ROLLBACK"), console.info("Releasing client connection...");
65
+ try {
66
+ client.release(!1);
67
+ } catch (releaseErr) {
68
+ console.error("Error releasing connection after rollback:", releaseErr);
69
+ }
70
+ throw e;
71
+ }
72
+ onMigrationComplete && await onMigrationComplete(), console.info("Releasing client connection...");
73
+ try {
74
+ client.release(!1);
75
+ } catch (err) {
76
+ console.error("Error releasing connection gracefully, trying to destroy:", err);
77
+ try {
78
+ client.release(!0);
79
+ } catch (destroyErr) {
80
+ console.error("Error destroying connection:", destroyErr);
81
+ }
82
+ }
83
+ console.info("\u{1F64C} Done migrating"), exitProcess();
84
+ }
85
+ function exitProcess() {
86
+ typeof process > "u" || isServerless || process.exit(0);
87
+ }
88
+ export {
89
+ migrate
90
+ };
91
+ //# sourceMappingURL=migrate.js.map