velocious 1.0.430 → 1.0.432

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 (831) hide show
  1. package/bin/velocious.js +48 -0
  2. package/build/application.js +229 -0
  3. package/build/authorization/ability.js +329 -0
  4. package/build/authorization/base-resource.js +143 -0
  5. package/build/background-jobs/client.js +50 -0
  6. package/build/background-jobs/cron-expression.js +277 -0
  7. package/build/background-jobs/forked-runner-child.js +86 -0
  8. package/build/background-jobs/job-record.js +13 -0
  9. package/build/background-jobs/job-registry.js +92 -0
  10. package/build/background-jobs/job-runner.js +107 -0
  11. package/build/background-jobs/job.js +77 -0
  12. package/build/background-jobs/json-socket.js +78 -0
  13. package/build/background-jobs/main.js +926 -0
  14. package/build/background-jobs/normalize-error.js +26 -0
  15. package/build/background-jobs/scheduler.js +274 -0
  16. package/build/background-jobs/socket-request.js +68 -0
  17. package/build/background-jobs/status-reporter.js +101 -0
  18. package/build/background-jobs/store.js +994 -0
  19. package/build/background-jobs/types.js +70 -0
  20. package/build/background-jobs/web/authorization.js +89 -0
  21. package/build/background-jobs/web/controller.js +280 -0
  22. package/build/background-jobs/web/index.js +57 -0
  23. package/build/background-jobs/web/path-matcher.js +74 -0
  24. package/build/background-jobs/web/registry.js +49 -0
  25. package/build/background-jobs/worker.js +683 -0
  26. package/build/beacon/client.js +330 -0
  27. package/build/beacon/in-process-broker.js +71 -0
  28. package/build/beacon/in-process-client.js +139 -0
  29. package/build/beacon/server.js +148 -0
  30. package/build/beacon/types.js +55 -0
  31. package/build/bin/velocious.js +39 -34
  32. package/build/cli/base-command.js +67 -0
  33. package/build/cli/browser-cli.js +45 -0
  34. package/build/cli/commands/background-jobs-main.js +7 -0
  35. package/build/cli/commands/background-jobs-runner.js +7 -0
  36. package/build/cli/commands/background-jobs-worker.js +7 -0
  37. package/build/cli/commands/beacon.js +7 -0
  38. package/build/cli/commands/console.js +12 -0
  39. package/build/cli/commands/db/base-command.js +82 -0
  40. package/build/cli/commands/db/create.js +64 -0
  41. package/build/cli/commands/db/drop.js +75 -0
  42. package/build/cli/commands/db/migrate.js +17 -0
  43. package/build/cli/commands/db/reset.js +22 -0
  44. package/build/cli/commands/db/rollback.js +15 -0
  45. package/build/cli/commands/db/schema/dump.js +12 -0
  46. package/build/cli/commands/db/schema/load.js +12 -0
  47. package/build/cli/commands/db/seed.js +12 -0
  48. package/build/cli/commands/db/tenants/check.js +38 -0
  49. package/build/cli/commands/db/tenants/create.js +33 -0
  50. package/build/cli/commands/db/tenants/migrate.js +49 -0
  51. package/build/cli/commands/destroy/migration.js +7 -0
  52. package/build/cli/commands/generate/base-models.js +7 -0
  53. package/build/cli/commands/generate/frontend-models.js +12 -0
  54. package/build/cli/commands/generate/migration.js +7 -0
  55. package/build/cli/commands/generate/model.js +7 -0
  56. package/build/cli/commands/init.js +11 -0
  57. package/build/cli/commands/routes.js +7 -0
  58. package/build/cli/commands/run-script.js +12 -0
  59. package/build/cli/commands/runner.js +12 -0
  60. package/build/cli/commands/server.js +7 -0
  61. package/build/cli/commands/test.js +9 -0
  62. package/build/cli/index.js +152 -0
  63. package/build/cli/tenant-database-command-helper.js +198 -0
  64. package/build/cli/use-browser-cli.js +30 -0
  65. package/build/configuration-resolver.js +65 -0
  66. package/build/configuration-types.js +429 -0
  67. package/build/configuration.js +2590 -0
  68. package/build/controller.js +421 -0
  69. package/build/current-configuration.js +31 -0
  70. package/build/current.js +80 -0
  71. package/build/database/annotations-async-hooks.js +47 -0
  72. package/build/database/annotations.js +40 -0
  73. package/build/database/drivers/base-column.js +182 -0
  74. package/build/database/drivers/base-columns-index.js +81 -0
  75. package/build/database/drivers/base-foreign-key.js +104 -0
  76. package/build/database/drivers/base-table.js +156 -0
  77. package/build/database/drivers/base.js +1609 -0
  78. package/build/database/drivers/mssql/column.js +74 -0
  79. package/build/database/drivers/mssql/columns-index.js +6 -0
  80. package/build/database/drivers/mssql/connect-connection.js +16 -0
  81. package/build/database/drivers/mssql/foreign-key.js +12 -0
  82. package/build/database/drivers/mssql/index.js +590 -0
  83. package/build/database/drivers/mssql/options.js +79 -0
  84. package/build/database/drivers/mssql/query-parser.js +6 -0
  85. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  87. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  88. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  89. package/build/database/drivers/mssql/sql/delete.js +19 -0
  90. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  91. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  92. package/build/database/drivers/mssql/sql/insert.js +4 -0
  93. package/build/database/drivers/mssql/sql/update.js +31 -0
  94. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  95. package/build/database/drivers/mssql/structure-sql.js +120 -0
  96. package/build/database/drivers/mssql/table.js +145 -0
  97. package/build/database/drivers/mysql/column.js +112 -0
  98. package/build/database/drivers/mysql/columns-index.js +22 -0
  99. package/build/database/drivers/mysql/foreign-key.js +12 -0
  100. package/build/database/drivers/mysql/index.js +473 -0
  101. package/build/database/drivers/mysql/options.js +34 -0
  102. package/build/database/drivers/mysql/query-parser.js +6 -0
  103. package/build/database/drivers/mysql/query.js +37 -0
  104. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  106. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  107. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  108. package/build/database/drivers/mysql/sql/delete.js +21 -0
  109. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  110. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  111. package/build/database/drivers/mysql/sql/insert.js +6 -0
  112. package/build/database/drivers/mysql/sql/update.js +33 -0
  113. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  114. package/build/database/drivers/mysql/structure-sql.js +93 -0
  115. package/build/database/drivers/mysql/table.js +121 -0
  116. package/build/database/drivers/pgsql/column.js +90 -0
  117. package/build/database/drivers/pgsql/columns-index.js +6 -0
  118. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  119. package/build/database/drivers/pgsql/index.js +441 -0
  120. package/build/database/drivers/pgsql/options.js +32 -0
  121. package/build/database/drivers/pgsql/query-parser.js +6 -0
  122. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  124. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  125. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  126. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  127. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  128. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  129. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  130. package/build/database/drivers/pgsql/sql/update.js +33 -0
  131. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  132. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  133. package/build/database/drivers/pgsql/table.js +135 -0
  134. package/build/database/drivers/sqlite/base.js +509 -0
  135. package/build/database/drivers/sqlite/column.js +75 -0
  136. package/build/database/drivers/sqlite/columns-index.js +30 -0
  137. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  138. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  139. package/build/database/drivers/sqlite/index.js +394 -0
  140. package/build/database/drivers/sqlite/index.native.js +72 -0
  141. package/build/database/drivers/sqlite/index.web.js +99 -0
  142. package/build/database/drivers/sqlite/options.js +32 -0
  143. package/build/database/drivers/sqlite/query-parser.js +6 -0
  144. package/build/database/drivers/sqlite/query.js +35 -0
  145. package/build/database/drivers/sqlite/query.native.js +35 -0
  146. package/build/database/drivers/sqlite/query.web.js +49 -0
  147. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  148. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  149. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  151. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  152. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  153. package/build/database/drivers/sqlite/sql/update.js +33 -0
  154. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  155. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  156. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  157. package/build/database/drivers/sqlite/table.js +131 -0
  158. package/build/database/drivers/structure-sql/utils.js +35 -0
  159. package/build/database/handler.js +13 -0
  160. package/build/database/initializer-from-require-context.js +101 -0
  161. package/build/database/migration/index.js +438 -0
  162. package/build/database/migrator/files-finder.js +55 -0
  163. package/build/database/migrator/types.js +31 -0
  164. package/build/database/migrator.js +557 -0
  165. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  166. package/build/database/pool/base-methods-forward.js +52 -0
  167. package/build/database/pool/base.js +380 -0
  168. package/build/database/pool/single-multi-use.js +118 -0
  169. package/build/database/query/alter-table-base.js +104 -0
  170. package/build/database/query/base.js +49 -0
  171. package/build/database/query/create-database-base.js +42 -0
  172. package/build/database/query/create-index-base.js +117 -0
  173. package/build/database/query/create-table-base.js +205 -0
  174. package/build/database/query/delete-base.js +19 -0
  175. package/build/database/query/drop-database-base.js +38 -0
  176. package/build/database/query/drop-table-base.js +58 -0
  177. package/build/database/query/from-base.js +36 -0
  178. package/build/database/query/from-plain.js +16 -0
  179. package/build/database/query/from-table.js +18 -0
  180. package/build/database/query/index.js +533 -0
  181. package/build/database/query/insert-base.js +172 -0
  182. package/build/database/query/join-base.js +43 -0
  183. package/build/database/query/join-object.js +167 -0
  184. package/build/database/query/join-plain.js +18 -0
  185. package/build/database/query/join-tracker.js +93 -0
  186. package/build/database/query/model-class-query.js +1577 -0
  187. package/build/database/query/order-base.js +33 -0
  188. package/build/database/query/order-column.js +77 -0
  189. package/build/database/query/order-plain.js +28 -0
  190. package/build/database/query/preloader/belongs-to.js +267 -0
  191. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  192. package/build/database/query/preloader/has-many.js +316 -0
  193. package/build/database/query/preloader/has-one.js +123 -0
  194. package/build/database/query/preloader/selection.js +152 -0
  195. package/build/database/query/preloader.js +201 -0
  196. package/build/database/query/query-data.js +305 -0
  197. package/build/database/query/select-base.js +30 -0
  198. package/build/database/query/select-plain.js +18 -0
  199. package/build/database/query/select-table-and-column.js +28 -0
  200. package/build/database/query/update-base.js +41 -0
  201. package/build/database/query/upsert-base.js +103 -0
  202. package/build/database/query/where-base.js +38 -0
  203. package/build/database/query/where-combinator.js +31 -0
  204. package/build/database/query/where-hash.js +77 -0
  205. package/build/database/query/where-model-class-hash.js +505 -0
  206. package/build/database/query/where-not.js +23 -0
  207. package/build/database/query/where-plain.js +20 -0
  208. package/build/database/query/with-count.js +219 -0
  209. package/build/database/query-parser/base-query-parser.js +40 -0
  210. package/build/database/query-parser/from-parser.js +49 -0
  211. package/build/database/query-parser/group-parser.js +55 -0
  212. package/build/database/query-parser/joins-parser.js +37 -0
  213. package/build/database/query-parser/limit-parser.js +77 -0
  214. package/build/database/query-parser/options.js +94 -0
  215. package/build/database/query-parser/order-parser.js +45 -0
  216. package/build/database/query-parser/select-parser.js +67 -0
  217. package/build/database/query-parser/where-parser.js +46 -0
  218. package/build/database/record/acts-as-list.js +374 -0
  219. package/build/database/record/attachments/download.js +49 -0
  220. package/build/database/record/attachments/handle.js +188 -0
  221. package/build/database/record/attachments/normalize-input.js +213 -0
  222. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  223. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  224. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  225. package/build/database/record/attachments/store.js +591 -0
  226. package/build/database/record/index.js +4094 -0
  227. package/build/database/record/instance-relationships/base.js +289 -0
  228. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  229. package/build/database/record/instance-relationships/has-many.js +284 -0
  230. package/build/database/record/instance-relationships/has-one.js +117 -0
  231. package/build/database/record/record-not-found-error.js +3 -0
  232. package/build/database/record/relationships/base.js +195 -0
  233. package/build/database/record/relationships/belongs-to.js +57 -0
  234. package/build/database/record/relationships/has-many.js +46 -0
  235. package/build/database/record/relationships/has-one.js +46 -0
  236. package/build/database/record/state-machine.js +278 -0
  237. package/build/database/record/user-module.js +43 -0
  238. package/build/database/record/validators/base.js +27 -0
  239. package/build/database/record/validators/format.js +50 -0
  240. package/build/database/record/validators/presence.js +24 -0
  241. package/build/database/record/validators/uniqueness.js +124 -0
  242. package/build/database/table-data/index.js +241 -0
  243. package/build/database/table-data/table-column.js +416 -0
  244. package/build/database/table-data/table-foreign-key.js +69 -0
  245. package/build/database/table-data/table-index.js +46 -0
  246. package/build/database/table-data/table-reference.js +13 -0
  247. package/build/database/use-database.js +48 -0
  248. package/build/environment-handlers/base.js +561 -0
  249. package/build/environment-handlers/browser.js +338 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  251. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  252. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  253. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  254. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  255. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  256. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  257. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  258. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  259. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  260. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  261. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  262. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  263. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  264. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  265. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  266. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  267. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  268. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  269. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  270. package/build/environment-handlers/node.js +887 -0
  271. package/build/error-logger.js +30 -0
  272. package/build/frontend-model-controller.js +3491 -0
  273. package/build/frontend-model-resource/base-resource.js +935 -0
  274. package/build/frontend-models/base.js +4004 -0
  275. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  276. package/build/frontend-models/event-hook-models.js +49 -0
  277. package/build/frontend-models/model-registry.js +28 -0
  278. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  279. package/build/frontend-models/preloader.js +169 -0
  280. package/build/frontend-models/query.js +2245 -0
  281. package/build/frontend-models/resource-config-validation.js +56 -0
  282. package/build/frontend-models/resource-definition.js +399 -0
  283. package/build/frontend-models/transport-serialization.js +369 -0
  284. package/build/frontend-models/use-created-event.js +21 -0
  285. package/build/frontend-models/use-destroyed-event.js +148 -0
  286. package/build/frontend-models/use-model-class-event.js +164 -0
  287. package/build/frontend-models/use-updated-event.js +152 -0
  288. package/build/frontend-models/websocket-channel.js +494 -0
  289. package/build/frontend-models/websocket-publishers.js +224 -0
  290. package/build/http-client/header.js +17 -0
  291. package/build/http-client/index.js +139 -0
  292. package/build/http-client/request.js +94 -0
  293. package/build/http-client/response.js +151 -0
  294. package/build/http-client/websocket-client.js +27 -0
  295. package/build/http-server/client/index.js +507 -0
  296. package/build/http-server/client/params-to-object.js +152 -0
  297. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  298. package/build/http-server/client/request-buffer/header.js +19 -0
  299. package/build/http-server/client/request-buffer/index.js +535 -0
  300. package/build/http-server/client/request-parser.js +195 -0
  301. package/build/http-server/client/request-runner.js +321 -0
  302. package/build/http-server/client/request-timing.js +171 -0
  303. package/build/http-server/client/request.js +114 -0
  304. package/build/http-server/client/response.js +251 -0
  305. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  306. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  307. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  308. package/build/http-server/client/websocket-request.js +147 -0
  309. package/build/http-server/client/websocket-session.js +1755 -0
  310. package/build/http-server/cookie.js +245 -0
  311. package/build/http-server/development-reloader.js +240 -0
  312. package/build/http-server/index.js +561 -0
  313. package/build/http-server/remote-address.js +77 -0
  314. package/build/http-server/server-client.js +222 -0
  315. package/build/http-server/server-lock.js +178 -0
  316. package/build/http-server/websocket-channel-subscribers.js +110 -0
  317. package/build/http-server/websocket-channel.js +137 -0
  318. package/build/http-server/websocket-connection.js +118 -0
  319. package/build/http-server/websocket-event-log-store.js +433 -0
  320. package/build/http-server/websocket-events-host.js +170 -0
  321. package/build/http-server/websocket-events.js +50 -0
  322. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  323. package/build/http-server/worker-handler/in-process.js +155 -0
  324. package/build/http-server/worker-handler/index.js +370 -0
  325. package/build/http-server/worker-handler/worker-script.js +6 -0
  326. package/build/http-server/worker-handler/worker-thread.js +286 -0
  327. package/build/index.js +1 -2
  328. package/build/initializer.js +39 -0
  329. package/build/jobs/mail-delivery.js +22 -0
  330. package/build/logger/base-logger.js +34 -0
  331. package/build/logger/console-logger.js +28 -0
  332. package/build/logger/file-logger.js +36 -0
  333. package/build/logger/outputs/array-output.js +50 -0
  334. package/build/logger/outputs/console-output.js +32 -0
  335. package/build/logger/outputs/file-output.js +55 -0
  336. package/build/logger/outputs/stdout-output.js +64 -0
  337. package/build/logger.js +507 -0
  338. package/build/mailer/backends/smtp.js +197 -0
  339. package/build/mailer/base.js +337 -0
  340. package/build/mailer/delivery.js +70 -0
  341. package/build/mailer/index.js +24 -0
  342. package/build/mailer.js +15 -0
  343. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  344. package/build/plugins/sqljs-wasm-route.js +71 -0
  345. package/build/record-payload-values.js +83 -0
  346. package/build/routes/app-routes.js +17 -0
  347. package/build/routes/base-route.js +133 -0
  348. package/build/routes/basic-route.js +109 -0
  349. package/build/routes/built-in/debug/controller.js +12 -0
  350. package/build/routes/built-in/errors/controller.js +7 -0
  351. package/build/routes/get-route.js +75 -0
  352. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  353. package/build/routes/index.js +50 -0
  354. package/build/routes/namespace-route.js +51 -0
  355. package/build/routes/plugin-routes.js +141 -0
  356. package/build/routes/post-route.js +74 -0
  357. package/build/routes/resolver.js +535 -0
  358. package/build/routes/resource-route.js +154 -0
  359. package/build/routes/root-route.js +11 -0
  360. package/build/src/authorization/ability.d.ts +24 -23
  361. package/build/src/authorization/ability.d.ts.map +1 -1
  362. package/build/src/authorization/ability.js +14 -13
  363. package/build/src/authorization/base-resource.d.ts +20 -26
  364. package/build/src/authorization/base-resource.d.ts.map +1 -1
  365. package/build/src/authorization/base-resource.js +13 -11
  366. package/build/src/configuration-types.d.ts +21 -2
  367. package/build/src/configuration-types.d.ts.map +1 -1
  368. package/build/src/configuration-types.js +8 -2
  369. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  370. package/build/src/database/query/where-combinator.js +1 -2
  371. package/build/src/database/record/acts-as-list.js +2 -2
  372. package/build/src/database/record/attachments/store.d.ts +1 -1
  373. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  374. package/build/src/database/record/attachments/store.js +2 -2
  375. package/build/src/database/record/index.d.ts +82 -20
  376. package/build/src/database/record/index.d.ts.map +1 -1
  377. package/build/src/database/record/index.js +126 -13
  378. package/build/src/database/record/relationships/base.d.ts +2 -2
  379. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  380. package/build/src/database/record/relationships/base.js +3 -3
  381. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  382. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  383. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +59 -36
  384. package/build/src/frontend-model-controller.d.ts +6 -6
  385. package/build/src/frontend-model-controller.d.ts.map +1 -1
  386. package/build/src/frontend-model-controller.js +4 -4
  387. package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
  388. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  389. package/build/src/frontend-model-resource/base-resource.js +22 -10
  390. package/build/src/frontend-models/base.d.ts +19 -12
  391. package/build/src/frontend-models/base.d.ts.map +1 -1
  392. package/build/src/frontend-models/base.js +79 -48
  393. package/build/src/frontend-models/preloader.d.ts +6 -6
  394. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  395. package/build/src/frontend-models/preloader.js +5 -5
  396. package/build/src/frontend-models/query.d.ts.map +1 -1
  397. package/build/src/frontend-models/query.js +1 -4
  398. package/build/src/utils/ransack.d.ts.map +1 -1
  399. package/build/src/utils/ransack.js +1 -2
  400. package/build/templates/configuration.js +61 -0
  401. package/build/templates/generate-migration.js +11 -0
  402. package/build/templates/generate-model.js +6 -0
  403. package/build/templates/routes.js +11 -0
  404. package/build/testing/base-expect.js +17 -0
  405. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  406. package/build/testing/browser-test-app.js +32 -0
  407. package/build/testing/expect-to-change.js +55 -0
  408. package/build/testing/expect-utils.js +269 -0
  409. package/build/testing/expect.js +763 -0
  410. package/build/testing/request-client.js +90 -0
  411. package/build/testing/test-files-finder.js +364 -0
  412. package/build/testing/test-filter-parser.js +198 -0
  413. package/build/testing/test-runner.js +1168 -0
  414. package/build/testing/test-suite-splitter.js +177 -0
  415. package/build/testing/test.js +370 -0
  416. package/build/utils/backtrace-cleaner-node.js +87 -0
  417. package/build/utils/backtrace-cleaner.js +266 -0
  418. package/build/utils/ensure-error.js +15 -0
  419. package/build/utils/event-emitter.js +8 -0
  420. package/build/utils/file-exists.js +18 -0
  421. package/build/utils/format-value.js +101 -0
  422. package/build/utils/model-scope.js +56 -0
  423. package/build/utils/nest-callbacks.js +22 -0
  424. package/build/utils/plain-object.js +14 -0
  425. package/build/utils/ransack.js +859 -0
  426. package/build/utils/rest-args-error.js +14 -0
  427. package/build/utils/singularize-model-name.js +18 -0
  428. package/build/utils/split-sql-statements.js +88 -0
  429. package/build/utils/to-import-specifier.js +53 -0
  430. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  431. package/build/utils/with-tracked-stack.js +38 -0
  432. package/build/velocious-error.js +34 -0
  433. package/index.js +1 -0
  434. package/package.json +10 -4
  435. package/scripts/clean-build.js +8 -0
  436. package/scripts/ensure-bin-executable.js +13 -0
  437. package/scripts/run-tests.js +37 -0
  438. package/scripts/test-browser.js +486 -0
  439. package/src/application.js +229 -0
  440. package/src/authorization/ability.js +329 -0
  441. package/src/authorization/base-resource.js +143 -0
  442. package/src/background-jobs/client.js +50 -0
  443. package/src/background-jobs/cron-expression.js +277 -0
  444. package/src/background-jobs/forked-runner-child.js +86 -0
  445. package/src/background-jobs/job-record.js +13 -0
  446. package/src/background-jobs/job-registry.js +92 -0
  447. package/src/background-jobs/job-runner.js +107 -0
  448. package/src/background-jobs/job.js +77 -0
  449. package/src/background-jobs/json-socket.js +78 -0
  450. package/src/background-jobs/main.js +926 -0
  451. package/src/background-jobs/normalize-error.js +26 -0
  452. package/src/background-jobs/scheduler.js +274 -0
  453. package/src/background-jobs/socket-request.js +68 -0
  454. package/src/background-jobs/status-reporter.js +101 -0
  455. package/src/background-jobs/store.js +994 -0
  456. package/src/background-jobs/types.js +70 -0
  457. package/src/background-jobs/web/authorization.js +89 -0
  458. package/src/background-jobs/web/controller.js +280 -0
  459. package/src/background-jobs/web/index.js +57 -0
  460. package/src/background-jobs/web/path-matcher.js +74 -0
  461. package/src/background-jobs/web/registry.js +49 -0
  462. package/src/background-jobs/worker.js +683 -0
  463. package/src/beacon/client.js +330 -0
  464. package/src/beacon/in-process-broker.js +71 -0
  465. package/src/beacon/in-process-client.js +139 -0
  466. package/src/beacon/server.js +148 -0
  467. package/src/beacon/types.js +55 -0
  468. package/src/cli/base-command.js +67 -0
  469. package/src/cli/browser-cli.js +45 -0
  470. package/src/cli/commands/background-jobs-main.js +7 -0
  471. package/src/cli/commands/background-jobs-runner.js +7 -0
  472. package/src/cli/commands/background-jobs-worker.js +7 -0
  473. package/src/cli/commands/beacon.js +7 -0
  474. package/src/cli/commands/console.js +12 -0
  475. package/src/cli/commands/db/base-command.js +82 -0
  476. package/src/cli/commands/db/create.js +64 -0
  477. package/src/cli/commands/db/drop.js +75 -0
  478. package/src/cli/commands/db/migrate.js +17 -0
  479. package/src/cli/commands/db/reset.js +22 -0
  480. package/src/cli/commands/db/rollback.js +15 -0
  481. package/src/cli/commands/db/schema/dump.js +12 -0
  482. package/src/cli/commands/db/schema/load.js +12 -0
  483. package/src/cli/commands/db/seed.js +12 -0
  484. package/src/cli/commands/db/tenants/check.js +38 -0
  485. package/src/cli/commands/db/tenants/create.js +33 -0
  486. package/src/cli/commands/db/tenants/migrate.js +49 -0
  487. package/src/cli/commands/destroy/migration.js +7 -0
  488. package/src/cli/commands/generate/base-models.js +7 -0
  489. package/src/cli/commands/generate/frontend-models.js +12 -0
  490. package/src/cli/commands/generate/migration.js +7 -0
  491. package/src/cli/commands/generate/model.js +7 -0
  492. package/src/cli/commands/init.js +11 -0
  493. package/src/cli/commands/routes.js +7 -0
  494. package/src/cli/commands/run-script.js +12 -0
  495. package/src/cli/commands/runner.js +12 -0
  496. package/src/cli/commands/server.js +7 -0
  497. package/src/cli/commands/test.js +9 -0
  498. package/src/cli/index.js +152 -0
  499. package/src/cli/tenant-database-command-helper.js +198 -0
  500. package/src/cli/use-browser-cli.js +30 -0
  501. package/src/configuration-resolver.js +65 -0
  502. package/src/configuration-types.js +429 -0
  503. package/src/configuration.js +2590 -0
  504. package/src/controller.js +421 -0
  505. package/src/current-configuration.js +31 -0
  506. package/src/current.js +80 -0
  507. package/src/database/annotations-async-hooks.js +47 -0
  508. package/src/database/annotations.js +40 -0
  509. package/src/database/drivers/base-column.js +182 -0
  510. package/src/database/drivers/base-columns-index.js +81 -0
  511. package/src/database/drivers/base-foreign-key.js +104 -0
  512. package/src/database/drivers/base-table.js +156 -0
  513. package/src/database/drivers/base.js +1609 -0
  514. package/src/database/drivers/mssql/column.js +74 -0
  515. package/src/database/drivers/mssql/columns-index.js +6 -0
  516. package/src/database/drivers/mssql/connect-connection.js +16 -0
  517. package/src/database/drivers/mssql/foreign-key.js +12 -0
  518. package/src/database/drivers/mssql/index.js +590 -0
  519. package/src/database/drivers/mssql/options.js +79 -0
  520. package/src/database/drivers/mssql/query-parser.js +6 -0
  521. package/src/database/drivers/mssql/sql/alter-table.js +4 -0
  522. package/src/database/drivers/mssql/sql/create-database.js +36 -0
  523. package/src/database/drivers/mssql/sql/create-index.js +4 -0
  524. package/src/database/drivers/mssql/sql/create-table.js +4 -0
  525. package/src/database/drivers/mssql/sql/delete.js +19 -0
  526. package/src/database/drivers/mssql/sql/drop-database.js +36 -0
  527. package/src/database/drivers/mssql/sql/drop-table.js +4 -0
  528. package/src/database/drivers/mssql/sql/insert.js +4 -0
  529. package/src/database/drivers/mssql/sql/update.js +31 -0
  530. package/src/database/drivers/mssql/sql/upsert.js +23 -0
  531. package/src/database/drivers/mssql/structure-sql.js +120 -0
  532. package/src/database/drivers/mssql/table.js +145 -0
  533. package/src/database/drivers/mysql/column.js +112 -0
  534. package/src/database/drivers/mysql/columns-index.js +22 -0
  535. package/src/database/drivers/mysql/foreign-key.js +12 -0
  536. package/src/database/drivers/mysql/index.js +473 -0
  537. package/src/database/drivers/mysql/options.js +34 -0
  538. package/src/database/drivers/mysql/query-parser.js +6 -0
  539. package/src/database/drivers/mysql/query.js +37 -0
  540. package/src/database/drivers/mysql/sql/alter-table.js +6 -0
  541. package/src/database/drivers/mysql/sql/create-database.js +39 -0
  542. package/src/database/drivers/mysql/sql/create-index.js +6 -0
  543. package/src/database/drivers/mysql/sql/create-table.js +6 -0
  544. package/src/database/drivers/mysql/sql/delete.js +21 -0
  545. package/src/database/drivers/mysql/sql/drop-database.js +6 -0
  546. package/src/database/drivers/mysql/sql/drop-table.js +6 -0
  547. package/src/database/drivers/mysql/sql/insert.js +6 -0
  548. package/src/database/drivers/mysql/sql/update.js +33 -0
  549. package/src/database/drivers/mysql/sql/upsert.js +13 -0
  550. package/src/database/drivers/mysql/structure-sql.js +93 -0
  551. package/src/database/drivers/mysql/table.js +121 -0
  552. package/src/database/drivers/pgsql/column.js +90 -0
  553. package/src/database/drivers/pgsql/columns-index.js +6 -0
  554. package/src/database/drivers/pgsql/foreign-key.js +12 -0
  555. package/src/database/drivers/pgsql/index.js +441 -0
  556. package/src/database/drivers/pgsql/options.js +32 -0
  557. package/src/database/drivers/pgsql/query-parser.js +6 -0
  558. package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
  559. package/src/database/drivers/pgsql/sql/create-database.js +38 -0
  560. package/src/database/drivers/pgsql/sql/create-index.js +6 -0
  561. package/src/database/drivers/pgsql/sql/create-table.js +6 -0
  562. package/src/database/drivers/pgsql/sql/delete.js +21 -0
  563. package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
  564. package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
  565. package/src/database/drivers/pgsql/sql/insert.js +6 -0
  566. package/src/database/drivers/pgsql/sql/update.js +33 -0
  567. package/src/database/drivers/pgsql/sql/upsert.js +14 -0
  568. package/src/database/drivers/pgsql/structure-sql.js +126 -0
  569. package/src/database/drivers/pgsql/table.js +135 -0
  570. package/src/database/drivers/sqlite/base.js +509 -0
  571. package/src/database/drivers/sqlite/column.js +75 -0
  572. package/src/database/drivers/sqlite/columns-index.js +30 -0
  573. package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
  574. package/src/database/drivers/sqlite/foreign-key.js +24 -0
  575. package/src/database/drivers/sqlite/index.js +394 -0
  576. package/src/database/drivers/sqlite/index.native.js +72 -0
  577. package/src/database/drivers/sqlite/index.web.js +99 -0
  578. package/src/database/drivers/sqlite/options.js +32 -0
  579. package/src/database/drivers/sqlite/query-parser.js +6 -0
  580. package/src/database/drivers/sqlite/query.js +35 -0
  581. package/src/database/drivers/sqlite/query.native.js +35 -0
  582. package/src/database/drivers/sqlite/query.web.js +49 -0
  583. package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
  584. package/src/database/drivers/sqlite/sql/create-index.js +6 -0
  585. package/src/database/drivers/sqlite/sql/create-table.js +6 -0
  586. package/src/database/drivers/sqlite/sql/delete.js +26 -0
  587. package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
  588. package/src/database/drivers/sqlite/sql/insert.js +6 -0
  589. package/src/database/drivers/sqlite/sql/update.js +33 -0
  590. package/src/database/drivers/sqlite/sql/upsert.js +14 -0
  591. package/src/database/drivers/sqlite/structure-sql.js +56 -0
  592. package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
  593. package/src/database/drivers/sqlite/table.js +131 -0
  594. package/src/database/drivers/structure-sql/utils.js +35 -0
  595. package/src/database/handler.js +13 -0
  596. package/src/database/initializer-from-require-context.js +101 -0
  597. package/src/database/migration/index.js +438 -0
  598. package/src/database/migrator/files-finder.js +55 -0
  599. package/src/database/migrator/types.js +31 -0
  600. package/src/database/migrator.js +557 -0
  601. package/src/database/pool/async-tracked-multi-connection.js +1164 -0
  602. package/src/database/pool/base-methods-forward.js +52 -0
  603. package/src/database/pool/base.js +380 -0
  604. package/src/database/pool/single-multi-use.js +118 -0
  605. package/src/database/query/alter-table-base.js +104 -0
  606. package/src/database/query/base.js +49 -0
  607. package/src/database/query/create-database-base.js +42 -0
  608. package/src/database/query/create-index-base.js +117 -0
  609. package/src/database/query/create-table-base.js +205 -0
  610. package/src/database/query/delete-base.js +19 -0
  611. package/src/database/query/drop-database-base.js +38 -0
  612. package/src/database/query/drop-table-base.js +58 -0
  613. package/src/database/query/from-base.js +36 -0
  614. package/src/database/query/from-plain.js +16 -0
  615. package/src/database/query/from-table.js +18 -0
  616. package/src/database/query/index.js +533 -0
  617. package/src/database/query/insert-base.js +172 -0
  618. package/src/database/query/join-base.js +43 -0
  619. package/src/database/query/join-object.js +167 -0
  620. package/src/database/query/join-plain.js +18 -0
  621. package/src/database/query/join-tracker.js +93 -0
  622. package/src/database/query/model-class-query.js +1577 -0
  623. package/src/database/query/order-base.js +33 -0
  624. package/src/database/query/order-column.js +77 -0
  625. package/src/database/query/order-plain.js +28 -0
  626. package/src/database/query/preloader/belongs-to.js +267 -0
  627. package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
  628. package/src/database/query/preloader/has-many.js +316 -0
  629. package/src/database/query/preloader/has-one.js +123 -0
  630. package/src/database/query/preloader/selection.js +152 -0
  631. package/src/database/query/preloader.js +201 -0
  632. package/src/database/query/query-data.js +305 -0
  633. package/src/database/query/select-base.js +30 -0
  634. package/src/database/query/select-plain.js +18 -0
  635. package/src/database/query/select-table-and-column.js +28 -0
  636. package/src/database/query/update-base.js +41 -0
  637. package/src/database/query/upsert-base.js +103 -0
  638. package/src/database/query/where-base.js +38 -0
  639. package/src/database/query/where-combinator.js +31 -0
  640. package/src/database/query/where-hash.js +77 -0
  641. package/src/database/query/where-model-class-hash.js +505 -0
  642. package/src/database/query/where-not.js +23 -0
  643. package/src/database/query/where-plain.js +20 -0
  644. package/src/database/query/with-count.js +219 -0
  645. package/src/database/query-parser/base-query-parser.js +40 -0
  646. package/src/database/query-parser/from-parser.js +49 -0
  647. package/src/database/query-parser/group-parser.js +55 -0
  648. package/src/database/query-parser/joins-parser.js +37 -0
  649. package/src/database/query-parser/limit-parser.js +77 -0
  650. package/src/database/query-parser/options.js +94 -0
  651. package/src/database/query-parser/order-parser.js +45 -0
  652. package/src/database/query-parser/select-parser.js +67 -0
  653. package/src/database/query-parser/where-parser.js +46 -0
  654. package/src/database/record/acts-as-list.js +374 -0
  655. package/src/database/record/attachments/download.js +49 -0
  656. package/src/database/record/attachments/handle.js +188 -0
  657. package/src/database/record/attachments/normalize-input.js +213 -0
  658. package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
  659. package/src/database/record/attachments/storage-drivers/native.js +146 -0
  660. package/src/database/record/attachments/storage-drivers/s3.js +245 -0
  661. package/src/database/record/attachments/store.js +591 -0
  662. package/src/database/record/index.js +4094 -0
  663. package/src/database/record/instance-relationships/base.js +289 -0
  664. package/src/database/record/instance-relationships/belongs-to.js +84 -0
  665. package/src/database/record/instance-relationships/has-many.js +284 -0
  666. package/src/database/record/instance-relationships/has-one.js +117 -0
  667. package/src/database/record/record-not-found-error.js +3 -0
  668. package/src/database/record/relationships/base.js +195 -0
  669. package/src/database/record/relationships/belongs-to.js +57 -0
  670. package/src/database/record/relationships/has-many.js +46 -0
  671. package/src/database/record/relationships/has-one.js +46 -0
  672. package/src/database/record/state-machine.js +278 -0
  673. package/src/database/record/user-module.js +43 -0
  674. package/src/database/record/validators/base.js +27 -0
  675. package/src/database/record/validators/format.js +50 -0
  676. package/src/database/record/validators/presence.js +24 -0
  677. package/src/database/record/validators/uniqueness.js +124 -0
  678. package/src/database/table-data/index.js +241 -0
  679. package/src/database/table-data/table-column.js +416 -0
  680. package/src/database/table-data/table-foreign-key.js +69 -0
  681. package/src/database/table-data/table-index.js +46 -0
  682. package/src/database/table-data/table-reference.js +13 -0
  683. package/src/database/use-database.js +48 -0
  684. package/src/environment-handlers/base.js +561 -0
  685. package/src/environment-handlers/browser.js +338 -0
  686. package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  687. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  688. package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  689. package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
  690. package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  691. package/src/environment-handlers/node/cli/commands/console.js +149 -0
  692. package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  693. package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  694. package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
  695. package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  696. package/src/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  697. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  698. package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  699. package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
  700. package/src/environment-handlers/node/cli/commands/init.js +68 -0
  701. package/src/environment-handlers/node/cli/commands/routes.js +63 -0
  702. package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
  703. package/src/environment-handlers/node/cli/commands/runner.js +84 -0
  704. package/src/environment-handlers/node/cli/commands/server.js +151 -0
  705. package/src/environment-handlers/node/cli/commands/test.js +118 -0
  706. package/src/environment-handlers/node.js +887 -0
  707. package/src/error-logger.js +30 -0
  708. package/src/frontend-model-controller.js +3491 -0
  709. package/src/frontend-model-resource/base-resource.js +935 -0
  710. package/src/frontend-models/base.js +4004 -0
  711. package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
  712. package/src/frontend-models/event-hook-models.js +49 -0
  713. package/src/frontend-models/model-registry.js +28 -0
  714. package/src/frontend-models/outgoing-event-buffer.js +51 -0
  715. package/src/frontend-models/preloader.js +169 -0
  716. package/src/frontend-models/query.js +2245 -0
  717. package/src/frontend-models/resource-config-validation.js +56 -0
  718. package/src/frontend-models/resource-definition.js +399 -0
  719. package/src/frontend-models/transport-serialization.js +369 -0
  720. package/src/frontend-models/use-created-event.js +21 -0
  721. package/src/frontend-models/use-destroyed-event.js +148 -0
  722. package/src/frontend-models/use-model-class-event.js +164 -0
  723. package/src/frontend-models/use-updated-event.js +152 -0
  724. package/src/frontend-models/websocket-channel.js +494 -0
  725. package/src/frontend-models/websocket-publishers.js +224 -0
  726. package/src/http-client/header.js +17 -0
  727. package/src/http-client/index.js +139 -0
  728. package/src/http-client/request.js +94 -0
  729. package/src/http-client/response.js +151 -0
  730. package/src/http-client/websocket-client.js +27 -0
  731. package/src/http-server/client/index.js +507 -0
  732. package/src/http-server/client/params-to-object.js +152 -0
  733. package/src/http-server/client/request-buffer/form-data-part.js +139 -0
  734. package/src/http-server/client/request-buffer/header.js +19 -0
  735. package/src/http-server/client/request-buffer/index.js +535 -0
  736. package/src/http-server/client/request-parser.js +195 -0
  737. package/src/http-server/client/request-runner.js +321 -0
  738. package/src/http-server/client/request-timing.js +171 -0
  739. package/src/http-server/client/request.js +114 -0
  740. package/src/http-server/client/response.js +251 -0
  741. package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  742. package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  743. package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
  744. package/src/http-server/client/websocket-request.js +147 -0
  745. package/src/http-server/client/websocket-session.js +1755 -0
  746. package/src/http-server/cookie.js +245 -0
  747. package/src/http-server/development-reloader.js +240 -0
  748. package/src/http-server/index.js +561 -0
  749. package/src/http-server/remote-address.js +77 -0
  750. package/src/http-server/server-client.js +222 -0
  751. package/src/http-server/server-lock.js +178 -0
  752. package/src/http-server/websocket-channel-subscribers.js +110 -0
  753. package/src/http-server/websocket-channel.js +137 -0
  754. package/src/http-server/websocket-connection.js +118 -0
  755. package/src/http-server/websocket-event-log-store.js +433 -0
  756. package/src/http-server/websocket-events-host.js +170 -0
  757. package/src/http-server/websocket-events.js +50 -0
  758. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  759. package/src/http-server/worker-handler/in-process.js +155 -0
  760. package/src/http-server/worker-handler/index.js +370 -0
  761. package/src/http-server/worker-handler/worker-script.js +6 -0
  762. package/src/http-server/worker-handler/worker-thread.js +286 -0
  763. package/src/initializer.js +39 -0
  764. package/src/jobs/.gitkeep +1 -0
  765. package/src/jobs/mail-delivery.js +22 -0
  766. package/src/logger/base-logger.js +34 -0
  767. package/src/logger/console-logger.js +28 -0
  768. package/src/logger/file-logger.js +36 -0
  769. package/src/logger/outputs/array-output.js +50 -0
  770. package/src/logger/outputs/console-output.js +32 -0
  771. package/src/logger/outputs/file-output.js +55 -0
  772. package/src/logger/outputs/stdout-output.js +64 -0
  773. package/src/logger.js +507 -0
  774. package/src/mailer/backends/smtp.js +197 -0
  775. package/src/mailer/base.js +337 -0
  776. package/src/mailer/delivery.js +70 -0
  777. package/src/mailer/index.js +24 -0
  778. package/src/mailer.js +15 -0
  779. package/src/plugins/sqljs-wasm-route-controller.js +70 -0
  780. package/src/plugins/sqljs-wasm-route.js +71 -0
  781. package/src/record-payload-values.js +83 -0
  782. package/src/routes/app-routes.js +17 -0
  783. package/src/routes/base-route.js +133 -0
  784. package/src/routes/basic-route.js +109 -0
  785. package/src/routes/built-in/debug/controller.js +12 -0
  786. package/src/routes/built-in/errors/controller.js +7 -0
  787. package/src/routes/built-in/errors/not-found.ejs +1 -0
  788. package/src/routes/get-route.js +75 -0
  789. package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
  790. package/src/routes/index.js +50 -0
  791. package/src/routes/namespace-route.js +51 -0
  792. package/src/routes/plugin-routes.js +141 -0
  793. package/src/routes/post-route.js +74 -0
  794. package/src/routes/resolver.js +535 -0
  795. package/src/routes/resource-route.js +154 -0
  796. package/src/routes/root-route.js +11 -0
  797. package/src/templates/configuration.js +61 -0
  798. package/src/templates/generate-migration.js +11 -0
  799. package/src/templates/generate-model.js +6 -0
  800. package/src/templates/routes.js +11 -0
  801. package/src/testing/base-expect.js +17 -0
  802. package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  803. package/src/testing/browser-test-app.js +32 -0
  804. package/src/testing/expect-to-change.js +55 -0
  805. package/src/testing/expect-utils.js +269 -0
  806. package/src/testing/expect.js +763 -0
  807. package/src/testing/request-client.js +90 -0
  808. package/src/testing/test-files-finder.js +364 -0
  809. package/src/testing/test-filter-parser.js +198 -0
  810. package/src/testing/test-runner.js +1168 -0
  811. package/src/testing/test-suite-splitter.js +177 -0
  812. package/src/testing/test.js +370 -0
  813. package/src/types/external-modules.d.ts +57 -0
  814. package/src/utils/backtrace-cleaner-node.js +87 -0
  815. package/src/utils/backtrace-cleaner.js +266 -0
  816. package/src/utils/ensure-error.js +15 -0
  817. package/src/utils/event-emitter.js +8 -0
  818. package/src/utils/file-exists.js +18 -0
  819. package/src/utils/format-value.js +101 -0
  820. package/src/utils/model-scope.js +56 -0
  821. package/src/utils/nest-callbacks.js +22 -0
  822. package/src/utils/plain-object.js +14 -0
  823. package/src/utils/ransack.js +859 -0
  824. package/src/utils/rest-args-error.js +14 -0
  825. package/src/utils/singularize-model-name.js +18 -0
  826. package/src/utils/split-sql-statements.js +88 -0
  827. package/src/utils/to-import-specifier.js +53 -0
  828. package/src/utils/with-tracked-stack-async-hooks.js +103 -0
  829. package/src/utils/with-tracked-stack.js +38 -0
  830. package/src/velocious-error.js +34 -0
  831. package/tsconfig.json +16 -0
@@ -0,0 +1,1164 @@
1
+ // @ts-check
2
+
3
+ import {AsyncLocalStorage} from "async_hooks"
4
+ import BasePool, {POOL_CONFIGURATION_KEY} from "./base.js"
5
+
6
+ export const CLOSED_CONNECTION = Symbol("velociousClosedConnection")
7
+ const IDLE_CONNECTION_CHECKED_IN_AT = Symbol("velociousIdleConnectionCheckedInAt")
8
+ const CONNECTION_CHECKED_OUT_AT = Symbol("velociousConnectionCheckedOutAt")
9
+ const DEFAULT_IDLE_TIMEOUT_MILLIS = 5000
10
+
11
+ /**
12
+ * PendingCheckout type.
13
+ * @typedef {object} PendingCheckout
14
+ * @property {import("../../configuration-types.js").DatabaseConfigurationType} databaseConfig - Resolved database configuration needed by the checkout.
15
+ * @property {number} enqueuedAt - Timestamp when the checkout started waiting.
16
+ * @property {import("./base.js").ConnectionCheckoutOptions} options - Checkout options.
17
+ * @property {string} reuseKey - Database configuration reuse key needed by the checkout.
18
+ * @property {(connection: import("../drivers/base.js").default) => void} resolve - Resolves with an activated connection.
19
+ * @property {(error: Error) => void} reject - Rejects when checkout cannot complete.
20
+ */
21
+
22
+ export default class VelociousDatabasePoolAsyncTrackedMultiConnection extends BasePool {
23
+ /**
24
+ * Global fallback connections keyed by configuration instance and pool identifier.
25
+ * @type {WeakMap<import("../../configuration.js").default, Record<string, import("../drivers/base.js").default>>}
26
+ */
27
+ static globalConnections = new WeakMap()
28
+
29
+ asyncLocalStorage = new AsyncLocalStorage()
30
+
31
+ /**
32
+ * When set, returned by getCurrentContextConnection when no async context exists.
33
+ * Used by the test runner to share a connection between test code and HTTP handlers
34
+ * running in the same process (in-process test server mode).
35
+ * @type {import("../drivers/base.js").default | undefined}
36
+ */
37
+ _testSharedConnection = undefined
38
+
39
+ /**
40
+ * Connections.
41
+ @type {import("../drivers/base.js").default[]} */
42
+ connections = []
43
+
44
+ /**
45
+ * Connections in use.
46
+ @type {Record<number, import("../drivers/base.js").default>} */
47
+ connectionsInUse = {}
48
+
49
+ /**
50
+ * Pending checkouts.
51
+ @type {PendingCheckout[]} */
52
+ pendingCheckouts = []
53
+
54
+ /**
55
+ * Connections being spawned.
56
+ @type {number} */
57
+ connectionsBeingSpawned = 0
58
+
59
+ /**
60
+ * Pending checkout drain promise.
61
+ @type {Promise<void> | undefined} */
62
+ pendingCheckoutDrainPromise = undefined
63
+
64
+ /**
65
+ * Idle connection reaper timer.
66
+ @type {ReturnType<typeof setTimeout> | undefined} */
67
+ idleConnectionReaperTimer = undefined
68
+
69
+ /**
70
+ * In-flight connection-close promises. The idle reaper is armed on check-in
71
+ * and runs fire-and-forget when its timer fires, so a scheduled reap can be
72
+ * closing a connection while an explicit `reapIdleConnections()` (or
73
+ * `clearIdleConnectionReaperTimer()`) runs. Tracking the in-flight closes lets
74
+ * those callers await them, so once a reap resolves the connections it
75
+ * expired are fully closed instead of half-closed mid-`close()`.
76
+ * @type {Set<Promise<void>>}
77
+ */
78
+ inflightConnectionCloses = new Set()
79
+
80
+ /**
81
+ * In-flight close promise per connection, so concurrent closes of the same
82
+ * connection await the same close rather than closing the driver handle twice.
83
+ * @type {WeakMap<object, Promise<void>>}
84
+ */
85
+ connectionClosePromises = new WeakMap()
86
+
87
+ idSeq = 0
88
+
89
+ /**
90
+ * Runs constructor.
91
+ * @param {object} args - Options object.
92
+ * @param {import("../../configuration.js").default} args.configuration - Configuration instance.
93
+ * @param {string} args.identifier - Identifier.
94
+ */
95
+ constructor({configuration, identifier}) {
96
+ super({configuration, identifier})
97
+ this._withoutCurrentConnectionContext = /**
98
+ * Narrows the runtime value to the documented type.
99
+ @type {(callback: () => ?) => ?} */ ((callback) => this.asyncLocalStorage.run(undefined, callback))
100
+ }
101
+
102
+ /**
103
+ * Runs checkin.
104
+ * @param {import("../drivers/base.js").default} connection - Database connection instance.
105
+ * @returns {Promise<void>} - Resolves when the connection is checked in or closed.
106
+ */
107
+ async checkin(connection) {
108
+ const id = connection.getIdSeq()
109
+ const trackedConnection = /**
110
+ * Narrows the runtime value to the documented type.
111
+ @type {import("../drivers/base.js").default & {[CLOSED_CONNECTION]?: boolean, [CONNECTION_CHECKED_OUT_AT]?: number, [IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection)
112
+
113
+ if (trackedConnection[CLOSED_CONNECTION]) {
114
+ this.untrackConnectionInUse(connection, id)
115
+ await this.drainPendingCheckouts()
116
+ return
117
+ }
118
+
119
+ try {
120
+ await this.rollbackLeftOpenTransaction(connection)
121
+ await connection.clearConnectionCheckoutName()
122
+ } catch (error) {
123
+ await this.closeCheckedOutConnectionAfterCheckinFailure(connection, id, error)
124
+ throw error
125
+ }
126
+
127
+ this.untrackConnectionInUse(connection, id)
128
+ trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT] = Date.now()
129
+ delete trackedConnection[CONNECTION_CHECKED_OUT_AT]
130
+ this.connections.push(connection)
131
+ await this.drainPendingCheckouts()
132
+ if (this.connections.includes(connection)) await this.handleCheckedInIdleConnection()
133
+ }
134
+
135
+ /**
136
+ * Runs close checked out connection after checkin failure.
137
+ * @param {import("../drivers/base.js").default} connection - Connection that failed check-in cleanup.
138
+ * @param {number | undefined} id - Connection checkout id.
139
+ * @param {?} originalError - Error that caused check-in cleanup to fail.
140
+ * @returns {Promise<void>} - Resolves when cleanup has been attempted.
141
+ */
142
+ async closeCheckedOutConnectionAfterCheckinFailure(connection, id, originalError) {
143
+ this.untrackConnectionInUse(connection, id)
144
+
145
+ try {
146
+ await this.closeConnection(connection)
147
+ } catch (error) {
148
+ this.logger.warn("Failed to close database connection after check-in cleanup failed", {error, originalError})
149
+ }
150
+
151
+ try {
152
+ await this.drainPendingCheckouts()
153
+ } catch (error) {
154
+ this.logger.warn("Failed to drain pending database checkouts after check-in cleanup failed", {error, originalError})
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Runs untrack connection in use.
160
+ * @param {import("../drivers/base.js").default} connection - Connection being checked in.
161
+ * @param {number | undefined} id - Connection checkout id.
162
+ * @returns {void}
163
+ */
164
+ untrackConnectionInUse(connection, id) {
165
+ if (typeof id !== "number") {
166
+ throw new Error(`idSeq on connection wasn't set? '${typeof id}' = ${id}`)
167
+ }
168
+
169
+ delete this.connectionsInUse[id]
170
+ connection.setIdSeq(undefined)
171
+ }
172
+
173
+ /**
174
+ * Runs handle checked in idle connection.
175
+ * @returns {Promise<void>} - Resolves once idle reaping has been scheduled or run.
176
+ */
177
+ async handleCheckedInIdleConnection() {
178
+ if (this.idleTimeoutMillis() === 0) {
179
+ await this.reapIdleConnections()
180
+ } else {
181
+ this.scheduleIdleConnectionReaper()
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Runs checkout.
187
+ * @param {import("./base.js").ConnectionCheckoutOptions} [options] - Checkout options.
188
+ * @returns {Promise<import("../drivers/base.js").default>} - Resolves with the checkout.
189
+ */
190
+ async checkout(options = {}) {
191
+ const databaseConfig = this.getConfiguration()
192
+ const reuseKey = this.getConfigurationReuseKey()
193
+ let connection = this.takeIdleConnectionForReuseKey(reuseKey)
194
+
195
+ if (connection) return await this.activateConnection(connection, options)
196
+
197
+ await this.reapIdleConnections()
198
+ connection = this.takeIdleConnectionForReuseKey(reuseKey)
199
+
200
+ if (connection) return await this.activateConnection(connection, options)
201
+
202
+ if (this.canSpawnConnection()) {
203
+ // Spawn via spawnConnection() so the tenant-aware configuration is resolved FRESH at
204
+ // spawn time for the current caller. Reusing the databaseConfig captured at the top of
205
+ // checkout() could bind the connection to a stale tenant/database, which breaks
206
+ // per-request isolation (e.g. test truncation appearing not to take effect). The queued
207
+ // path below keeps the waiting caller's captured config via waitForCheckout().
208
+ connection = await this.spawnConnectionForCheckout(this.getConfiguration(), this.getConfigurationReuseKey())
209
+
210
+ return await this.activateConnection(connection, options)
211
+ }
212
+
213
+ return await this.waitForCheckout(databaseConfig, reuseKey, options)
214
+ }
215
+
216
+ /**
217
+ * Runs take idle connection for reuse key.
218
+ * @param {string} reuseKey - Database configuration reuse key.
219
+ * @param {object} [args] - Options.
220
+ * @param {boolean} [args.includeOpenTransactions] - Whether connections with open transactions may be returned.
221
+ * @returns {import("../drivers/base.js").default | undefined} - Matching idle connection.
222
+ */
223
+ takeIdleConnectionForReuseKey(reuseKey, {includeOpenTransactions = true} = {}) {
224
+ const connectionIndex = this.connections.findIndex((queuedConnection) => {
225
+ if (!includeOpenTransactions && this.connectionHasOpenTransaction(queuedConnection)) return false
226
+
227
+ return this.connectionMatchesReuseKey(queuedConnection, reuseKey)
228
+ })
229
+ const connection = connectionIndex === -1 ? undefined : this.connections.splice(connectionIndex, 1)[0]
230
+
231
+ return connection
232
+ }
233
+
234
+ /**
235
+ * Runs connection matches reuse key.
236
+ * @param {import("../drivers/base.js").default} connection - Connection.
237
+ * @param {string} reuseKey - Database configuration reuse key.
238
+ * @returns {boolean} - Whether the connection matches the reuse key.
239
+ */
240
+ connectionMatchesReuseKey(connection, reuseKey) {
241
+ const connectionWithPoolKey = /**
242
+ * Narrows the runtime value to the documented type.
243
+ @type {import("../drivers/base.js").default & {[POOL_CONFIGURATION_KEY]?: string}} */ (connection)
244
+
245
+ return connectionWithPoolKey[POOL_CONFIGURATION_KEY] === reuseKey
246
+ }
247
+
248
+ /**
249
+ * Runs activate connection.
250
+ * @param {import("../drivers/base.js").default} connection - Connection.
251
+ * @param {import("./base.js").ConnectionCheckoutOptions} [options] - Checkout options.
252
+ * @returns {Promise<import("../drivers/base.js").default>} - Activated connection.
253
+ */
254
+ async activateConnection(connection, options = {}) {
255
+ if (connection.getIdSeq() !== undefined) throw new Error(`Connection already has an ID-seq - is it in use? ${connection.getIdSeq()}`)
256
+
257
+ const id = this.idSeq++
258
+
259
+ const trackedConnection = /**
260
+ * Narrows the runtime value to the documented type.
261
+ @type {import("../drivers/base.js").default & {[CONNECTION_CHECKED_OUT_AT]?: number, [IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection)
262
+ delete trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT]
263
+ trackedConnection[CONNECTION_CHECKED_OUT_AT] = Date.now()
264
+
265
+ connection.setIdSeq(id)
266
+ this.connectionsInUse[id] = connection
267
+
268
+ try {
269
+ await connection.setConnectionCheckoutName(options.name)
270
+ } catch (error) {
271
+ delete this.connectionsInUse[id]
272
+ connection.setIdSeq(undefined)
273
+ await this.closeConnection(connection)
274
+
275
+ throw error
276
+ }
277
+
278
+ return connection
279
+ }
280
+
281
+ /**
282
+ * Runs max connections.
283
+ * @returns {number | undefined} - Configured max live connections.
284
+ */
285
+ maxConnections() {
286
+ const value = this.getConfiguration().pool?.max
287
+
288
+ if (this.validMaxConnections(value)) return value
289
+
290
+ return
291
+ }
292
+
293
+ /**
294
+ * Runs valid max connections.
295
+ * @param {?} value - Candidate max connection count.
296
+ * @returns {value is number} - Whether the value is a valid max connection count.
297
+ */
298
+ validMaxConnections(value) {
299
+ return typeof value === "number" && Number.isFinite(value) && value >= 1
300
+ }
301
+
302
+ /**
303
+ * Runs live connection count.
304
+ * @returns {number} - Number of live and in-progress connections.
305
+ */
306
+ liveConnectionCount() {
307
+ const connections = new Set([
308
+ ...this.connections,
309
+ ...Object.values(this.connectionsInUse),
310
+ this.getGlobalConnectionForIdentifier()
311
+ ].filter(Boolean))
312
+
313
+ return connections.size + this.connectionsBeingSpawned
314
+ }
315
+
316
+ /**
317
+ * Runs can spawn connection.
318
+ * @returns {boolean} - Whether a new connection can be spawned.
319
+ */
320
+ canSpawnConnection() {
321
+ const maxConnections = this.maxConnections()
322
+
323
+ return maxConnections === undefined || this.liveConnectionCount() < maxConnections
324
+ }
325
+
326
+ /**
327
+ * Runs spawn connection for checkout.
328
+ * @param {import("../../configuration-types.js").DatabaseConfigurationType} databaseConfig - Resolved database config for the checkout.
329
+ * @param {string} reuseKey - Database configuration reuse key for the checkout.
330
+ * @returns {Promise<import("../drivers/base.js").default>} - Spawned connection.
331
+ */
332
+ async spawnConnectionForCheckout(databaseConfig, reuseKey) {
333
+ this.connectionsBeingSpawned++
334
+
335
+ try {
336
+ const connection = await this.spawnConnectionWithConfiguration(databaseConfig)
337
+ const connectionWithPoolKey = /**
338
+ * Narrows the runtime value to the documented type.
339
+ @type {import("../drivers/base.js").default & {[POOL_CONFIGURATION_KEY]?: string}} */ (connection)
340
+
341
+ connectionWithPoolKey[POOL_CONFIGURATION_KEY] = reuseKey
342
+ connection.setSchemaCacheInvalidator(() => {
343
+ this.clearSchemaCache()
344
+ this.configuration.clearSchemaCachesForReuseKey(reuseKey)
345
+ })
346
+
347
+ return connection
348
+ } finally {
349
+ this.connectionsBeingSpawned--
350
+ }
351
+ }
352
+
353
+ /**
354
+ * Runs wait for checkout.
355
+ * @param {import("../../configuration-types.js").DatabaseConfigurationType} databaseConfig - Resolved database config for the checkout.
356
+ * @param {string} reuseKey - Database configuration reuse key.
357
+ * @param {import("./base.js").ConnectionCheckoutOptions} [options] - Checkout options.
358
+ * @returns {Promise<import("../drivers/base.js").default>} - Resolves with an activated connection.
359
+ */
360
+ async waitForCheckout(databaseConfig, reuseKey, options = {}) {
361
+ return await new Promise((resolve, reject) => {
362
+ this.pendingCheckouts.push({databaseConfig, enqueuedAt: Date.now(), options, reject, resolve, reuseKey})
363
+ void this.drainPendingCheckouts().catch((error) => {
364
+ const checkoutError = error instanceof Error ? error : new Error("Failed to drain pending database connection checkouts.", {cause: error})
365
+
366
+ this.rejectPendingCheckouts(checkoutError)
367
+ })
368
+ })
369
+ }
370
+
371
+ /**
372
+ * Runs drain pending checkouts.
373
+ * @returns {Promise<void>} - Resolves when pending checkouts have been drained as far as possible.
374
+ */
375
+ async drainPendingCheckouts() {
376
+ if (this.pendingCheckoutDrainPromise) {
377
+ await this.pendingCheckoutDrainPromise
378
+ return
379
+ }
380
+
381
+ this.pendingCheckoutDrainPromise = this.drainPendingCheckoutsActual()
382
+
383
+ try {
384
+ await this.pendingCheckoutDrainPromise
385
+ } finally {
386
+ this.pendingCheckoutDrainPromise = undefined
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Runs drain pending checkouts actual.
392
+ * @returns {Promise<void>} - Resolves when pending checkouts have been drained as far as possible.
393
+ */
394
+ async drainPendingCheckoutsActual() {
395
+ while (this.pendingCheckouts.length > 0) {
396
+ if (await this.resolvePendingCheckoutWithMatchingIdleConnection()) continue
397
+
398
+ const checkout = this.pendingCheckouts[0]
399
+
400
+ if (await this.closeIdleConnectionForPendingCheckoutCapacity(checkout)) continue
401
+ if (this.canSpawnConnection()) {
402
+ this.pendingCheckouts.shift()
403
+ await this.spawnAndResolvePendingCheckout(checkout)
404
+ continue
405
+ }
406
+
407
+ const reapedConnection = await this.idleConnectionForPendingCheckout(checkout)
408
+
409
+ if (!reapedConnection) return
410
+
411
+ this.pendingCheckouts.shift()
412
+ await this.resolvePendingCheckout(checkout, reapedConnection)
413
+ }
414
+ }
415
+
416
+ /**
417
+ * Runs resolve pending checkout with matching idle connection.
418
+ * @returns {Promise<boolean>} - Whether a pending checkout was resolved with an idle connection.
419
+ */
420
+ async resolvePendingCheckoutWithMatchingIdleConnection() {
421
+ for (let index = 0; index < this.pendingCheckouts.length; index++) {
422
+ const checkout = this.pendingCheckouts[index]
423
+ const connection = this.takeIdleConnectionForReuseKey(checkout.reuseKey, {includeOpenTransactions: false})
424
+
425
+ if (!connection) continue
426
+
427
+ this.pendingCheckouts.splice(index, 1)
428
+ await this.resolvePendingCheckout(checkout, connection)
429
+
430
+ return true
431
+ }
432
+
433
+ return false
434
+ }
435
+
436
+ /**
437
+ * Runs close idle connection for pending checkout capacity.
438
+ * @param {PendingCheckout} checkout - Checkout waiting for a connection.
439
+ * @returns {Promise<boolean>} - Whether an idle connection was closed to free capacity.
440
+ */
441
+ async closeIdleConnectionForPendingCheckoutCapacity(checkout) {
442
+ const connection = this.findIdleConnectionForReuseKey(checkout.reuseKey)
443
+
444
+ if (connection) return false
445
+
446
+ await this.reapIdleConnections()
447
+
448
+ if (this.findIdleConnectionForReuseKey(checkout.reuseKey)) return false
449
+
450
+ return this.canSpawnConnection() ? false : await this.closeOneIdleConnectionForCapacity()
451
+ }
452
+
453
+ /**
454
+ * Runs find idle connection for reuse key.
455
+ * @param {string} reuseKey - Database configuration reuse key.
456
+ * @returns {import("../drivers/base.js").default | undefined} - Matching idle connection, if present.
457
+ */
458
+ findIdleConnectionForReuseKey(reuseKey) {
459
+ return this.connections.find((connection) => !this.connectionHasOpenTransaction(connection) && this.connectionMatchesReuseKey(connection, reuseKey))
460
+ }
461
+
462
+ /**
463
+ * Runs idle connection for pending checkout.
464
+ * @param {PendingCheckout} checkout - Checkout waiting for a connection.
465
+ * @returns {Promise<import("../drivers/base.js").default | undefined>} - Matching idle connection, if one can be reused.
466
+ */
467
+ async idleConnectionForPendingCheckout(checkout) {
468
+ let connection = this.takeIdleConnectionForReuseKey(checkout.reuseKey, {includeOpenTransactions: false})
469
+
470
+ if (connection) return connection
471
+
472
+ await this.reapIdleConnections()
473
+ connection = this.takeIdleConnectionForReuseKey(checkout.reuseKey, {includeOpenTransactions: false})
474
+
475
+ return connection
476
+ }
477
+
478
+ /**
479
+ * Runs spawn and resolve pending checkout.
480
+ * @param {PendingCheckout} checkout - Checkout request to resolve.
481
+ * @returns {Promise<void>} - Resolves when the checkout has been handled.
482
+ */
483
+ async spawnAndResolvePendingCheckout(checkout) {
484
+ let connection
485
+
486
+ try {
487
+ connection = await this.spawnConnectionForCheckout(checkout.databaseConfig, checkout.reuseKey)
488
+ } catch (error) {
489
+ checkout.reject(error instanceof Error ? error : new Error("Failed to spawn database connection.", {cause: error}))
490
+ return
491
+ }
492
+
493
+ await this.resolvePendingCheckout(checkout, connection)
494
+ }
495
+
496
+ /**
497
+ * Runs resolve pending checkout.
498
+ * @param {PendingCheckout} checkout - Checkout request to resolve.
499
+ * @param {import("../drivers/base.js").default} connection - Connection to activate.
500
+ * @returns {Promise<void>} - Resolves when the checkout has been handled.
501
+ */
502
+ async resolvePendingCheckout(checkout, connection) {
503
+ try {
504
+ checkout.resolve(await this.activateConnection(connection, checkout.options))
505
+ } catch (error) {
506
+ checkout.reject(error instanceof Error ? error : new Error("Failed to activate database connection.", {cause: error}))
507
+ }
508
+ }
509
+
510
+ /**
511
+ * Runs close one idle connection for capacity.
512
+ * @returns {Promise<boolean>} - Whether an idle connection was closed to free capacity.
513
+ */
514
+ async closeOneIdleConnectionForCapacity() {
515
+ const connection = this.connections.find((candidate) => !this.connectionHasOpenTransaction(candidate))
516
+
517
+ if (!connection) return false
518
+
519
+ this.connections = this.connections.filter((candidate) => candidate !== connection)
520
+ await this.closeConnection(connection)
521
+
522
+ return true
523
+ }
524
+
525
+ /**
526
+ * Runs with connection.
527
+ * @template T
528
+ * @param {import("./base.js").ConnectionCheckoutOptions | function(import("../drivers/base.js").default) : Promise<T>} optionsOrCallback - Checkout options or callback to invoke with the connection.
529
+ * @param {function(import("../drivers/base.js").default) : Promise<T>} [callback] - Callback to invoke with the connection.
530
+ * @returns {Promise<T>} - Resolves with the callback result.
531
+ */
532
+ async withConnection(optionsOrCallback, callback) {
533
+ const options = typeof optionsOrCallback == "function" ? {} : optionsOrCallback
534
+ const actualCallback = typeof optionsOrCallback == "function" ? optionsOrCallback : callback
535
+
536
+ if (!actualCallback) throw new Error("withConnection requires a callback")
537
+
538
+ const connection = await this.checkout(options)
539
+ const id = connection.getIdSeq()
540
+
541
+ return await this.asyncLocalStorage.run(id, async () => {
542
+ try {
543
+ return await actualCallback(connection)
544
+ } finally {
545
+ await this.checkin(connection)
546
+ }
547
+ })
548
+ }
549
+
550
+ /**
551
+ * Runs get current connection.
552
+ * @returns {import("../drivers/base.js").default} - The current connection.
553
+ */
554
+ getCurrentConnection() {
555
+ const id = this.asyncLocalStorage.getStore()
556
+
557
+ if (id === undefined) return this.currentFallbackConnectionOrFail()
558
+
559
+ this.ensureConnectionIsInUse(id)
560
+
561
+ const currentConnection = this.connectionsInUse[id]
562
+
563
+ if (!currentConnection) {
564
+ throw new Error(`Couldn't get current connection from that ID: ${id}`)
565
+ }
566
+
567
+ return currentConnection
568
+ }
569
+
570
+ /**
571
+ * Runs current fallback connection or fail.
572
+ * @returns {import("../drivers/base.js").default} - Fallback connection, if present.
573
+ */
574
+ currentFallbackConnectionOrFail() {
575
+ const fallbackConnection = this.getGlobalConnection()
576
+
577
+ if (fallbackConnection) return fallbackConnection
578
+
579
+ throw new Error("ID hasn't been set for this async context")
580
+ }
581
+
582
+ /**
583
+ * Runs ensure connection is in use.
584
+ * @param {number} id - Checked-out connection id.
585
+ * @returns {void}
586
+ */
587
+ ensureConnectionIsInUse(id) {
588
+ if (!(id in this.connectionsInUse)) {
589
+ throw new Error(`Connection ${id} doesn't exist any more - has it been checked in again?`)
590
+ }
591
+ }
592
+
593
+ /**
594
+ * Registers a fallback connection for this pool identifier that will be used when no async context is available.
595
+ * @param {import("../drivers/base.js").default} connection - Connection.
596
+ * @returns {void} - No return value.
597
+ */
598
+ setGlobalConnection(connection) {
599
+ const klass = /**
600
+ * Narrows the runtime value to the documented type.
601
+ @type {typeof VelociousDatabasePoolAsyncTrackedMultiConnection} */ (this.constructor)
602
+ let mapForConfiguration = klass.globalConnections.get(this.configuration)
603
+
604
+ if (!mapForConfiguration) {
605
+ mapForConfiguration = {}
606
+ klass.globalConnections.set(this.configuration, mapForConfiguration)
607
+ }
608
+
609
+ mapForConfiguration[this.identifier] = connection
610
+ }
611
+
612
+ /**
613
+ * Ensures a global fallback connection exists for this pool identifier and returns it.
614
+ * If one is already set, it is returned and also made available in the pool queue.
615
+ * Otherwise a new connection is spawned, registered, and queued.
616
+ * @returns {Promise<import("../drivers/base.js").default>} - Resolves with the global connection.
617
+ */
618
+ async ensureGlobalConnection() {
619
+ const existing = this.getGlobalConnection()
620
+
621
+ if (existing) return existing
622
+
623
+ const connection = await this.spawnConnection()
624
+
625
+ this.setGlobalConnection(connection)
626
+
627
+ return connection
628
+ }
629
+
630
+ /**
631
+ * Set a shared connection for test mode so that HTTP handlers running
632
+ * in the same process can reuse the test runner's database connection.
633
+ * @param {import("../drivers/base.js").default} connection - Shared connection.
634
+ * @returns {void}
635
+ */
636
+ setTestSharedConnection(connection) {
637
+ this._testSharedConnection = connection
638
+ }
639
+
640
+ /**
641
+ * Runs clear test shared connection.
642
+ @returns {void} */
643
+ clearTestSharedConnection() {
644
+ this._testSharedConnection = undefined
645
+ }
646
+
647
+ /**
648
+ * Returns the connection tied to the current async context, if any.
649
+ * Falls back to the test shared connection when no async context exists.
650
+ * @returns {import("../drivers/base.js").default | undefined} - The current context connection.
651
+ */
652
+ getCurrentContextConnection() {
653
+ const id = this.asyncLocalStorage.getStore()
654
+
655
+ if (id === undefined) return this._testSharedConnection
656
+
657
+ return this.getCurrentConnection()
658
+ }
659
+
660
+ /**
661
+ * Runs get debug snapshot.
662
+ * @returns {import("./base.js").DatabasePoolDebugSnapshot} - Diagnostic snapshot for this pool.
663
+ */
664
+ getDebugSnapshot() {
665
+ const snapshot = super.getDebugSnapshot()
666
+ const now = Date.now()
667
+ const {connections} = this.debugConnectionSnapshots(now)
668
+
669
+ return {
670
+ ...snapshot,
671
+ connections,
672
+ connectionsBeingSpawned: this.connectionsBeingSpawned,
673
+ idleCount: this.connections.length,
674
+ inUseCount: Object.keys(this.connectionsInUse).length,
675
+ pendingCheckouts: this.pendingCheckoutDebugSnapshots(now),
676
+ pendingCheckoutCount: this.pendingCheckouts.length
677
+ }
678
+ }
679
+
680
+ /**
681
+ * Runs debug connection snapshots.
682
+ * @param {number} now - Current timestamp.
683
+ * @returns {{connections: Array<Record<string, ?>>, seenConnections: Set<import("../drivers/base.js").default>}} - Connection snapshots and seen set.
684
+ */
685
+ debugConnectionSnapshots(now) {
686
+ /**
687
+ * Connections.
688
+ @type {Array<Record<string, ?>>} */
689
+ const connections = []
690
+ const seenConnections = new Set()
691
+
692
+ this.addInUseDebugConnectionSnapshots({connections, now, seenConnections})
693
+ this.addIdleDebugConnectionSnapshots({connections, now, seenConnections})
694
+ this.addFallbackDebugConnectionSnapshots({connections, seenConnections})
695
+
696
+ return {connections, seenConnections}
697
+ }
698
+
699
+ /**
700
+ * Runs add in use debug connection snapshots.
701
+ * @param {{connections: Array<Record<string, ?>>, now: number, seenConnections: Set<import("../drivers/base.js").default>}} args - Snapshot collection state.
702
+ * @returns {void}
703
+ */
704
+ addInUseDebugConnectionSnapshots({connections, now, seenConnections}) {
705
+ for (const [id, connection] of Object.entries(this.connectionsInUse)) {
706
+ const trackedConnection = /**
707
+ * Narrows the runtime value to the documented type.
708
+ @type {import("../drivers/base.js").default & {[CONNECTION_CHECKED_OUT_AT]?: number}} */ (connection)
709
+ const checkedOutAt = trackedConnection[CONNECTION_CHECKED_OUT_AT]
710
+ const checkedOutForMs = typeof checkedOutAt === "number" ? Math.max(0, now - checkedOutAt) : undefined
711
+
712
+ seenConnections.add(connection)
713
+ connections.push(this.debugConnectionSnapshot(connection, {checkedOutAt, checkedOutForMs, checkoutId: id, state: "in-use"}))
714
+ }
715
+ }
716
+
717
+ /**
718
+ * Runs add idle debug connection snapshots.
719
+ * @param {{connections: Array<Record<string, ?>>, now: number, seenConnections: Set<import("../drivers/base.js").default>}} args - Snapshot collection state.
720
+ * @returns {void}
721
+ */
722
+ addIdleDebugConnectionSnapshots({connections, now, seenConnections}) {
723
+ for (const connection of this.connections) {
724
+ if (seenConnections.has(connection)) continue
725
+
726
+ seenConnections.add(connection)
727
+
728
+ const trackedConnection = /**
729
+ * Narrows the runtime value to the documented type.
730
+ @type {import("../drivers/base.js").default & {[IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection)
731
+ const checkedInAt = trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT]
732
+ const idleForMs = typeof checkedInAt === "number" ? Math.max(0, now - checkedInAt) : undefined
733
+
734
+ connections.push(this.debugConnectionSnapshot(connection, {checkedInAt, idleForMs, state: "idle"}))
735
+ }
736
+ }
737
+
738
+ /**
739
+ * Runs add fallback debug connection snapshots.
740
+ * @param {{connections: Array<Record<string, ?>>, seenConnections: Set<import("../drivers/base.js").default>}} args - Snapshot collection state.
741
+ * @returns {void}
742
+ */
743
+ addFallbackDebugConnectionSnapshots({connections, seenConnections}) {
744
+ this.addDebugConnectionSnapshotIfUnseen({connection: this.getGlobalConnectionForIdentifier(), connections, reapable: false, seenConnections, state: "global"})
745
+ this.addDebugConnectionSnapshotIfUnseen({connection: this._testSharedConnection, connections, reapable: false, seenConnections, state: "test-shared"})
746
+ }
747
+
748
+ /**
749
+ * Runs add debug connection snapshot if unseen.
750
+ * @param {{connection: import("../drivers/base.js").default | undefined, connections: Array<Record<string, ?>>, reapable?: boolean, seenConnections: Set<import("../drivers/base.js").default>, state: string}} args - Snapshot collection state.
751
+ * @returns {void}
752
+ */
753
+ addDebugConnectionSnapshotIfUnseen({connection, connections, reapable, seenConnections, state}) {
754
+ if (!connection || seenConnections.has(connection)) return
755
+
756
+ seenConnections.add(connection)
757
+ connections.push(this.debugConnectionSnapshot(connection, {reapable, state}))
758
+ }
759
+
760
+ /**
761
+ * Runs pending checkout debug snapshots.
762
+ * @param {number} now - Current timestamp.
763
+ * @returns {Array<Record<string, ?>>} - Pending checkout snapshots.
764
+ */
765
+ pendingCheckoutDebugSnapshots(now) {
766
+ return this.pendingCheckouts.map((checkout, index) => ({
767
+ checkoutName: checkout.options.name,
768
+ enqueuedAt: checkout.enqueuedAt,
769
+ index,
770
+ reuseKey: checkout.reuseKey,
771
+ waitingForMs: Math.max(0, now - checkout.enqueuedAt)
772
+ }))
773
+ }
774
+
775
+ /**
776
+ * Runs get global connection.
777
+ * @returns {import("../drivers/base.js").default | undefined} - The global connection.
778
+ */
779
+ getGlobalConnection() {
780
+ const connection = this.getGlobalConnectionForIdentifier()
781
+
782
+ if (!connection) return
783
+ if (!this.connectionMatchesCurrentConfiguration(connection)) return
784
+
785
+ return connection
786
+ }
787
+
788
+ /**
789
+ * Runs get global connection for identifier.
790
+ * @returns {import("../drivers/base.js").default | undefined} - The global connection for this pool identifier.
791
+ */
792
+ getGlobalConnectionForIdentifier() {
793
+ const klass = /**
794
+ * Narrows the runtime value to the documented type.
795
+ @type {typeof VelociousDatabasePoolAsyncTrackedMultiConnection} */ (this.constructor)
796
+ const mapForConfiguration = klass.globalConnections.get(this.configuration)
797
+
798
+ return mapForConfiguration?.[this.identifier]
799
+ }
800
+
801
+ /**
802
+ * Runs clear global connection for identifier.
803
+ * @returns {void} - No return value.
804
+ */
805
+ clearGlobalConnectionForIdentifier() {
806
+ const klass = /**
807
+ * Narrows the runtime value to the documented type.
808
+ @type {typeof VelociousDatabasePoolAsyncTrackedMultiConnection} */ (this.constructor)
809
+ const mapForConfiguration = klass.globalConnections.get(this.configuration)
810
+
811
+ if (!mapForConfiguration) return
812
+
813
+ delete mapForConfiguration[this.identifier]
814
+ }
815
+
816
+ /**
817
+ * Clears schema metadata cached by every live connection owned by this pool.
818
+ * @returns {void} - No return value.
819
+ */
820
+ clearSchemaCache() {
821
+ const connections = new Set([
822
+ ...this.connections,
823
+ ...Object.values(this.connectionsInUse),
824
+ this.getGlobalConnection(),
825
+ this._testSharedConnection
826
+ ].filter(Boolean))
827
+
828
+ for (const connection of connections) {
829
+ if (connection) this._clearConnectionSchemaCache(connection)
830
+ }
831
+ }
832
+
833
+ /**
834
+ * Runs idle timeout millis.
835
+ * @returns {number | null} - Idle timeout in milliseconds, or null when disabled.
836
+ */
837
+ idleTimeoutMillis() {
838
+ const value = this.getConfiguration().pool?.idleTimeoutMillis
839
+
840
+ if (value === null) return null
841
+ if (this.validIdleTimeoutMillis(value)) return value
842
+
843
+ return DEFAULT_IDLE_TIMEOUT_MILLIS
844
+ }
845
+
846
+ /**
847
+ * Runs valid idle timeout millis.
848
+ * @param {?} value - Candidate idle timeout value.
849
+ * @returns {value is number} - Whether the value is a valid idle timeout.
850
+ */
851
+ validIdleTimeoutMillis(value) {
852
+ return typeof value === "number" && Number.isFinite(value) && value >= 0
853
+ }
854
+
855
+ /**
856
+ * Runs schedule idle connection reaper.
857
+ @returns {void} */
858
+ scheduleIdleConnectionReaper() {
859
+ if (this.idleConnectionReaperTimer) return
860
+ if (!this.hasIdleConnectionsToReap()) return
861
+
862
+ const delay = this.nextIdleConnectionReapDelay(/**
863
+ * Narrows the runtime value to the documented type.
864
+ @type {number} */ (this.idleTimeoutMillis()))
865
+
866
+ this.idleConnectionReaperTimer = setTimeout(() => {
867
+ this.idleConnectionReaperTimer = undefined
868
+ void this.reapIdleConnections().catch((error) => {
869
+ this.logger.warn(() => ["Failed to reap idle database connections:", error])
870
+ })
871
+ }, delay)
872
+
873
+ if (typeof this.idleConnectionReaperTimer.unref === "function") {
874
+ this.idleConnectionReaperTimer.unref()
875
+ }
876
+ }
877
+
878
+ /**
879
+ * Runs has idle connections to reap.
880
+ * @returns {boolean} - Whether an idle reaper timer should be scheduled.
881
+ */
882
+ hasIdleConnectionsToReap() {
883
+ return this.connections.length > 0 && this.idleTimeoutMillis() !== null
884
+ }
885
+
886
+ /**
887
+ * Runs next idle connection reap delay.
888
+ * @param {number} idleTimeoutMillis - Idle timeout in milliseconds.
889
+ * @returns {number} - Delay before the next reap.
890
+ */
891
+ nextIdleConnectionReapDelay(idleTimeoutMillis) {
892
+ let delay = idleTimeoutMillis
893
+ const now = Date.now()
894
+
895
+ for (const connection of this.connections) {
896
+ if (this.connectionHasOpenTransaction(connection)) continue
897
+
898
+ const trackedConnection = /**
899
+ * Narrows the runtime value to the documented type.
900
+ @type {import("../drivers/base.js").default & {[IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection)
901
+ const checkedInAt = trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT]
902
+
903
+ if (typeof checkedInAt !== "number") continue
904
+
905
+ delay = Math.min(delay, Math.max(0, idleTimeoutMillis - (now - checkedInAt)))
906
+ }
907
+
908
+ return delay
909
+ }
910
+
911
+ /**
912
+ * Closes idle checked-in connections that have exceeded the configured timeout.
913
+ * @returns {Promise<void>} - Resolves when complete.
914
+ */
915
+ async reapIdleConnections() {
916
+ if (this.connections.length === 0) return
917
+
918
+ const idleTimeoutMillis = this.idleTimeoutMillis()
919
+
920
+ if (idleTimeoutMillis === null) return
921
+
922
+ const {expiredConnections, keptConnections} = this.classifyIdleConnectionsForReaping({idleTimeoutMillis, now: Date.now()})
923
+
924
+ this.connections = keptConnections
925
+ await this.closeExpiredIdleConnections(expiredConnections)
926
+ await this.awaitInflightConnectionCloses()
927
+ if (this.connections.length > 0) this.scheduleIdleConnectionReaper()
928
+ }
929
+
930
+ /**
931
+ * Runs close expired idle connections.
932
+ * @param {import("../drivers/base.js").default[]} expiredConnections - Connections to close.
933
+ * @returns {Promise<void>} - Resolves when closed.
934
+ */
935
+ async closeExpiredIdleConnections(expiredConnections) {
936
+ for (const connection of expiredConnections) {
937
+ await this.closeConnection(connection)
938
+ }
939
+ }
940
+
941
+ /**
942
+ * Runs await inflight connection closes.
943
+ * @returns {Promise<void>} - Resolves once in-flight connection closes settle.
944
+ */
945
+ async awaitInflightConnectionCloses() {
946
+ if (this.inflightConnectionCloses.size > 0) {
947
+ await Promise.allSettled([...this.inflightConnectionCloses])
948
+ }
949
+ }
950
+
951
+ /**
952
+ * Runs classify idle connections for reaping.
953
+ * @param {{idleTimeoutMillis: number, now: number}} args - Reaper classification inputs.
954
+ * @returns {{expiredConnections: import("../drivers/base.js").default[], keptConnections: import("../drivers/base.js").default[]}} - Classified idle connections.
955
+ */
956
+ classifyIdleConnectionsForReaping({idleTimeoutMillis, now}) {
957
+ /**
958
+ * Kept connections.
959
+ @type {import("../drivers/base.js").default[]} */
960
+ const keptConnections = []
961
+ /**
962
+ * Expired connections.
963
+ @type {import("../drivers/base.js").default[]} */
964
+ const expiredConnections = []
965
+
966
+ for (const connection of this.connections) {
967
+ this.classifyIdleConnectionForReaping({connection, expiredConnections, idleTimeoutMillis, keptConnections, now})
968
+ }
969
+
970
+ return {expiredConnections, keptConnections}
971
+ }
972
+
973
+ /**
974
+ * Runs classify idle connection for reaping.
975
+ * @param {{connection: import("../drivers/base.js").default, expiredConnections: import("../drivers/base.js").default[], idleTimeoutMillis: number, keptConnections: import("../drivers/base.js").default[], now: number}} args - Classification state.
976
+ * @returns {void}
977
+ */
978
+ classifyIdleConnectionForReaping({connection, expiredConnections, idleTimeoutMillis, keptConnections, now}) {
979
+ if (this.connectionIsClosed(connection)) return
980
+ if (this.connectionHasOpenTransaction(connection)) {
981
+ keptConnections.push(connection)
982
+ return
983
+ }
984
+
985
+ const target = this.idleConnectionExpired({connection, idleTimeoutMillis, now}) ? expiredConnections : keptConnections
986
+
987
+ target.push(connection)
988
+ }
989
+
990
+ /**
991
+ * Runs connection is closed.
992
+ * @param {import("../drivers/base.js").default} connection - Connection to inspect.
993
+ * @returns {boolean} - Whether the connection is marked closed.
994
+ */
995
+ connectionIsClosed(connection) {
996
+ const trackedConnection = /**
997
+ * Narrows the runtime value to the documented type.
998
+ @type {import("../drivers/base.js").default & {[CLOSED_CONNECTION]?: boolean}} */ (connection)
999
+
1000
+ return Boolean(trackedConnection[CLOSED_CONNECTION])
1001
+ }
1002
+
1003
+ /**
1004
+ * Runs idle connection expired.
1005
+ * @param {{connection: import("../drivers/base.js").default, idleTimeoutMillis: number, now: number}} args - Expiry inputs.
1006
+ * @returns {boolean} - Whether the idle connection expired.
1007
+ */
1008
+ idleConnectionExpired({connection, idleTimeoutMillis, now}) {
1009
+ const trackedConnection = /**
1010
+ * Narrows the runtime value to the documented type.
1011
+ @type {import("../drivers/base.js").default & {[IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection)
1012
+ const checkedInAt = trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT]
1013
+
1014
+ return typeof checkedInAt === "number" && now - checkedInAt >= idleTimeoutMillis
1015
+ }
1016
+
1017
+ /**
1018
+ * Runs connection has open transaction.
1019
+ * @param {import("../drivers/base.js").default} connection - Connection to inspect.
1020
+ * @returns {boolean} - Whether the connection has an open transaction.
1021
+ */
1022
+ connectionHasOpenTransaction(connection) {
1023
+ return connection._transactionsCount > 0
1024
+ }
1025
+
1026
+ /**
1027
+ * Rolls back any transaction a previous holder left open before a connection
1028
+ * re-enters the idle pool. A connection returned to the pool with an open
1029
+ * transaction would otherwise be handed to an unrelated checkout, whose
1030
+ * startTransaction() then fails with "A transaction is already running" and
1031
+ * poisons every following caller that reuses it.
1032
+ * @param {import("../drivers/base.js").default} connection - Connection being checked in.
1033
+ * @returns {Promise<void>} - Resolves when the connection holds no open transaction.
1034
+ */
1035
+ async rollbackLeftOpenTransaction(connection) {
1036
+ if (!this.connectionHasOpenTransaction(connection)) return
1037
+
1038
+ this.logger.warn(() => [`Rolling back a transaction left open on a connection being checked in (identifier=${this.identifier}).`])
1039
+
1040
+ while (this.connectionHasOpenTransaction(connection)) {
1041
+ await connection.rollbackTransaction()
1042
+ }
1043
+ }
1044
+
1045
+ /**
1046
+ * Runs close connection.
1047
+ * @param {import("../drivers/base.js").default} connection - Connection to close.
1048
+ * @returns {Promise<void>} - Resolves when complete.
1049
+ */
1050
+ async closeConnection(connection) {
1051
+ // Idempotent: a fire-and-forget scheduled reap and an explicit reap can both
1052
+ // target the same connection. Await the in-flight close instead of closing
1053
+ // twice (which can throw on the driver) or returning while the underlying
1054
+ // handle is still open.
1055
+ const existingClose = this.connectionClosePromises.get(connection)
1056
+
1057
+ if (existingClose) {
1058
+ return await existingClose
1059
+ }
1060
+
1061
+ const trackedConnection = /**
1062
+ * Narrows the runtime value to the documented type.
1063
+ @type {import("../drivers/base.js").default & {[CLOSED_CONNECTION]?: boolean, [CONNECTION_CHECKED_OUT_AT]?: number, [IDLE_CONNECTION_CHECKED_IN_AT]?: number}} */ (connection)
1064
+
1065
+ trackedConnection[CLOSED_CONNECTION] = true
1066
+ delete trackedConnection[CONNECTION_CHECKED_OUT_AT]
1067
+ delete trackedConnection[IDLE_CONNECTION_CHECKED_IN_AT]
1068
+
1069
+ const closePromise = (async () => {
1070
+ await trackedConnection.close()
1071
+ })()
1072
+
1073
+ this.connectionClosePromises.set(connection, closePromise)
1074
+ this.inflightConnectionCloses.add(closePromise)
1075
+
1076
+ try {
1077
+ await closePromise
1078
+ } finally {
1079
+ this.inflightConnectionCloses.delete(closePromise)
1080
+ }
1081
+ }
1082
+
1083
+ /**
1084
+ * Runs clear idle connection reaper timer.
1085
+ @returns {void} */
1086
+ clearIdleConnectionReaperTimer() {
1087
+ if (!this.idleConnectionReaperTimer) return
1088
+
1089
+ clearTimeout(this.idleConnectionReaperTimer)
1090
+ this.idleConnectionReaperTimer = undefined
1091
+ }
1092
+
1093
+ /**
1094
+ * Closes all active and cached connections for this pool.
1095
+ * @returns {Promise<void>} - Resolves when complete.
1096
+ */
1097
+ async closeAll() {
1098
+ this.clearIdleConnectionReaperTimer()
1099
+ this.rejectPendingCheckouts(new Error("Database pool was closed before checkout completed."))
1100
+
1101
+ const connections = new Set([
1102
+ ...this.connections,
1103
+ ...Object.values(this.connectionsInUse),
1104
+ this.getGlobalConnectionForIdentifier(),
1105
+ this._testSharedConnection
1106
+ ].filter(Boolean))
1107
+
1108
+ this.connections = []
1109
+ this.connectionsInUse = {}
1110
+ this._testSharedConnection = undefined
1111
+ this.clearGlobalConnectionForIdentifier()
1112
+
1113
+ for (const connection of connections) {
1114
+ if (!connection) continue
1115
+
1116
+ await this.closeConnection(connection)
1117
+ }
1118
+
1119
+ }
1120
+
1121
+ /**
1122
+ * Runs reject pending checkouts.
1123
+ * @param {Error} error - Error to reject pending checkouts with.
1124
+ * @returns {void}
1125
+ */
1126
+ rejectPendingCheckouts(error) {
1127
+ const pendingCheckouts = this.pendingCheckouts
1128
+
1129
+ this.pendingCheckouts = []
1130
+
1131
+ for (const checkout of pendingCheckouts) {
1132
+ checkout.reject(error)
1133
+ }
1134
+ }
1135
+
1136
+ /**
1137
+ * Replaces all globally registered fallback connections.
1138
+ * @param {Record<string, import("../drivers/base.js").default>} [connections] - Connections.
1139
+ * @param {import("../../configuration.js").default} [configuration] - Configuration instance.
1140
+ * @returns {void} - No return value.
1141
+ */
1142
+ static setGlobalConnections(connections, configuration) {
1143
+ if (!configuration) {
1144
+ this.globalConnections = new WeakMap()
1145
+ return
1146
+ }
1147
+
1148
+ this.globalConnections.set(configuration, connections || {})
1149
+ }
1150
+
1151
+ /**
1152
+ * Clears globally registered fallback connections for all configurations or a single configuration.
1153
+ * @param {import("../../configuration.js").default} [configuration] - Configuration instance.
1154
+ * @returns {void} - No return value.
1155
+ */
1156
+ static clearGlobalConnections(configuration) {
1157
+ if (!configuration) {
1158
+ this.globalConnections = new WeakMap()
1159
+ return
1160
+ }
1161
+
1162
+ this.globalConnections.delete(configuration)
1163
+ }
1164
+ }