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,683 @@
1
+ // @ts-check
2
+
3
+ import net from "net"
4
+ import {fork, spawn} from "node:child_process"
5
+ import JsonSocket from "./json-socket.js"
6
+ import BackgroundJobRegistry from "./job-registry.js"
7
+ import configurationResolver from "../configuration-resolver.js"
8
+ import BackgroundJobsStatusReporter from "./status-reporter.js"
9
+ import {randomUUID} from "crypto"
10
+ import {fileURLToPath} from "node:url"
11
+
12
+ /** Grace period after SIGTERM before a lingering process runner is SIGKILLed. */
13
+ const FORKED_CHILD_SIGKILL_GRACE_MS = 5000
14
+ const FORKED_RUNNER_ENTRY_PATH = fileURLToPath(new URL("./forked-runner-child.js", import.meta.url))
15
+ /**
16
+ * Execution modes.
17
+ @type {import("./types.js").BackgroundJobExecutionMode[]} */
18
+ const EXECUTION_MODES = ["inline", "forked", "spawned"]
19
+
20
+ export default class BackgroundJobsWorker {
21
+ /**
22
+ * Runs constructor.
23
+ * @param {object} [args] - Options.
24
+ * @param {import("../configuration.js").default} [args.configuration] - Configuration.
25
+ * @param {string} [args.host] - Hostname.
26
+ * @param {number} [args.port] - Port.
27
+ * @param {number} [args.maxConcurrentForkedJobs] - Override the process runner concurrency cap from `configuration.getBackgroundJobsConfig()`.
28
+ * @param {number} [args.maxConcurrentInlineJobs] - Override the inline-job concurrency cap from `configuration.getBackgroundJobsConfig()`.
29
+ * @param {number} [args.forkedChildSigkillGraceMs] - Override the grace period between SIGTERM and SIGKILL when reaping lingering process runners on stop.
30
+ */
31
+ constructor({configuration, host, port, maxConcurrentForkedJobs, maxConcurrentInlineJobs, forkedChildSigkillGraceMs} = {}) {
32
+ /**
33
+ * Narrows the runtime value to the documented type.
34
+ @type {Promise<import("../configuration.js").default>} */
35
+ this.configurationPromise = configuration ? Promise.resolve(configuration) : configurationResolver()
36
+ /**
37
+ * Narrows the runtime value to the documented type.
38
+ @type {import("../configuration.js").default | undefined} */
39
+ this.configuration = undefined
40
+ this.host = host
41
+ this.port = port
42
+ /**
43
+ * Constructor override for the inline-job concurrency cap. When unset
44
+ * the cap is read from `configuration.getBackgroundJobsConfig()` in
45
+ * `start()` (default: 4).
46
+ * @type {number | undefined}
47
+ */
48
+ this.maxConcurrentInlineJobsOverride = typeof maxConcurrentInlineJobs === "number" && maxConcurrentInlineJobs >= 1
49
+ ? maxConcurrentInlineJobs
50
+ : undefined
51
+ /**
52
+ * Narrows the runtime value to the documented type.
53
+ @type {number | undefined} */
54
+ this.maxConcurrentForkedJobsOverride = typeof maxConcurrentForkedJobs === "number" && maxConcurrentForkedJobs >= 1
55
+ ? maxConcurrentForkedJobs
56
+ : undefined
57
+ /**
58
+ * Resolved cap for inline-job concurrency. Set in `start()`; defaults to
59
+ * 4 if no configuration value is available.
60
+ * @type {number}
61
+ */
62
+ this.maxConcurrentInlineJobs = this.maxConcurrentInlineJobsOverride || 4
63
+ /**
64
+ * Narrows the runtime value to the documented type.
65
+ @type {number} */
66
+ this.maxConcurrentForkedJobs = this.maxConcurrentForkedJobsOverride || 4
67
+ /**
68
+ * Grace period between SIGTERM and SIGKILL when reaping process runners that
69
+ * outlast a bounded shutdown drain.
70
+ * @type {number}
71
+ */
72
+ this.forkedChildSigkillGraceMs = typeof forkedChildSigkillGraceMs === "number" && forkedChildSigkillGraceMs >= 0
73
+ ? forkedChildSigkillGraceMs
74
+ : FORKED_CHILD_SIGKILL_GRACE_MS
75
+ this.shouldStop = false
76
+ this.workerId = randomUUID()
77
+ /**
78
+ * Narrows the runtime value to the documented type.
79
+ @type {JsonSocket | undefined} */
80
+ this.jsonSocket = undefined
81
+ /**
82
+ * Narrows the runtime value to the documented type.
83
+ @type {BackgroundJobsStatusReporter | undefined} */
84
+ this.statusReporter = undefined
85
+ /**
86
+ * Up to `this.maxConcurrentInlineJobs` of these run in parallel. They
87
+ * share the worker's process and DB connection pool, so concurrency is
88
+ * about overlapping I/O waits — use forking for memory isolation across
89
+ * long-running jobs and for using more cores.
90
+ * @type {Set<Promise<void>>}
91
+ */
92
+ this.inflightInlineJobs = new Set()
93
+ /**
94
+ * In-flight process runner exit promises. Tracked so process-job handoff
95
+ * stays bounded while running and so a graceful `stop()` can drain them.
96
+ * @type {Set<Promise<void>>}
97
+ */
98
+ this.inflightProcessJobs = new Set()
99
+ /**
100
+ * Live process runner child processes, kept so a graceful `stop()` can
101
+ * terminate any that outlast the shutdown drain instead of orphaning them
102
+ * across a deploy (where they would keep running against deleted release
103
+ * code and holding database connections).
104
+ * @type {Set<import("node:child_process").ChildProcess>}
105
+ */
106
+ this.inflightProcessChildren = new Set()
107
+ }
108
+
109
+ /**
110
+ * Runs start.
111
+ * @returns {Promise<void>} - Resolves when connected.
112
+ */
113
+ async start() {
114
+ this.configuration = await this.configurationPromise
115
+ this.configuration.setCurrent()
116
+ await this.configuration.initialize({type: "background-jobs-worker"})
117
+ await this.configuration.connectBeacon({peerType: "background-jobs-worker"})
118
+
119
+ // Constructor overrides win; otherwise pick up the configured caps.
120
+ if (typeof this.maxConcurrentInlineJobsOverride !== "number") {
121
+ const config = this.configuration.getBackgroundJobsConfig()
122
+
123
+ this.maxConcurrentInlineJobs = config.maxConcurrentInlineJobs || this.maxConcurrentInlineJobs
124
+ }
125
+ if (typeof this.maxConcurrentForkedJobsOverride !== "number") {
126
+ const config = this.configuration.getBackgroundJobsConfig()
127
+
128
+ this.maxConcurrentForkedJobs = config.maxConcurrentForkedJobs || this.maxConcurrentForkedJobs
129
+ }
130
+
131
+ this.statusReporter = new BackgroundJobsStatusReporter({
132
+ configuration: this.configuration,
133
+ host: this.host,
134
+ port: this.port
135
+ })
136
+ await this._connect()
137
+ }
138
+
139
+ /**
140
+ * Gracefully stops the worker: announces draining to the main process so
141
+ * no new jobs are dispatched, waits for in-flight inline jobs and process
142
+ * runners to finish (so their results can be reported), then closes the
143
+ * socket and disconnects from the beacon.
144
+ *
145
+ * Process runners are child processes. When a `timeoutMs` is given (e.g. a
146
+ * deploy draining the old release) any runner still alive after the drain
147
+ * window is terminated (SIGTERM, then SIGKILL) rather than left to orphan
148
+ * across the deploy. With no `timeoutMs` the drain waits for runners to
149
+ * finish on their own.
150
+ * @param {object} [args] - Options.
151
+ * @param {number} [args.timeoutMs] - Max wait for in-flight jobs (per phase) in ms.
152
+ * @returns {Promise<void>} - Resolves when stopped.
153
+ */
154
+ async stop({timeoutMs} = {}) {
155
+ if (this.shouldStop) return
156
+ this.shouldStop = true
157
+
158
+ // Announce drain so main stops dispatching but keeps the connection
159
+ // open until we close it ourselves below.
160
+ if (this.jsonSocket) {
161
+ try {
162
+ this.jsonSocket.send({type: "draining"})
163
+ } catch {
164
+ // Socket may already be closing; nothing to do.
165
+ }
166
+ }
167
+
168
+ await this._drainInflight(this.inflightInlineJobs, timeoutMs)
169
+ await this._drainInflight(this.inflightProcessJobs, timeoutMs)
170
+ await this._terminateProcessChildren()
171
+
172
+ if (this.jsonSocket) this.jsonSocket.close()
173
+ if (this.configuration) {
174
+ try {
175
+ await this.configuration.disconnectBeacon()
176
+ } finally {
177
+ await this.configuration.closeDatabaseConnections()
178
+ }
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Waits for a set of in-flight job promises to settle, optionally bounded by
184
+ * `timeoutMs`.
185
+ * @param {Set<Promise<void>>} inflight - In-flight job promises.
186
+ * @param {number} [timeoutMs] - Max wait in ms; unbounded when omitted.
187
+ * @returns {Promise<void>} - Resolves when settled or the timeout elapses.
188
+ */
189
+ async _drainInflight(inflight, timeoutMs) {
190
+ if (inflight.size === 0) return
191
+
192
+ const drain = Promise.allSettled([...inflight])
193
+
194
+ if (typeof timeoutMs === "number" && timeoutMs >= 0) {
195
+ let timer
196
+ const timeout = new Promise((resolve) => { timer = setTimeout(resolve, timeoutMs) })
197
+
198
+ await Promise.race([drain, timeout])
199
+ clearTimeout(timer)
200
+ } else {
201
+ await drain
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Terminates any process runner children still alive after the drain window so
207
+ * they don't outlive the worker as orphans. SIGTERM lets the runner close its
208
+ * connections cleanly; survivors are SIGKILLed after a short grace.
209
+ * @returns {Promise<void>} - Resolves once survivors have been signalled.
210
+ */
211
+ async _terminateProcessChildren() {
212
+ if (this.inflightProcessChildren.size === 0) return
213
+
214
+ for (const child of this.inflightProcessChildren) {
215
+ try {
216
+ child.kill("SIGTERM")
217
+ } catch {
218
+ // Child already exited; nothing to do.
219
+ }
220
+ }
221
+
222
+ await new Promise((resolve) => setTimeout(resolve, this.forkedChildSigkillGraceMs))
223
+
224
+ for (const child of this.inflightProcessChildren) {
225
+ try {
226
+ child.kill("SIGKILL")
227
+ } catch {
228
+ // Child already exited; nothing to do.
229
+ }
230
+ }
231
+ }
232
+
233
+ async _connect() {
234
+ const configuration = this.configuration
235
+ if (!configuration) throw new Error("Background jobs worker configuration not initialized")
236
+
237
+ const config = configuration.getBackgroundJobsConfig()
238
+ const host = this.host || config.host
239
+ const port = typeof this.port === "number" ? this.port : config.port
240
+ const socket = net.createConnection({host, port})
241
+ const jsonSocket = new JsonSocket(socket)
242
+ this.jsonSocket = jsonSocket
243
+
244
+ /**
245
+ * Handles a background job socket message.
246
+ * @param {import("./types.js").BackgroundJobSocketMessage} message - Socket message.
247
+ */
248
+ jsonSocket.on("message", async (message) => {
249
+ if (message?.type === "job") {
250
+ await this._handleJob(message.payload)
251
+ }
252
+ })
253
+
254
+ jsonSocket.on("error", (error) => {
255
+ console.error("Background jobs worker socket error:", error)
256
+ })
257
+
258
+ jsonSocket.on("close", () => {
259
+ if (this.shouldStop) return
260
+ setTimeout(() => { void this._connect() }, 1000)
261
+ })
262
+
263
+ socket.on("connect", () => {
264
+ jsonSocket.send({type: "hello", role: "worker", workerId: this.workerId})
265
+ this._sendReadyIfRunning()
266
+ })
267
+ }
268
+
269
+ /**
270
+ * Runs handle job.
271
+ * @param {import("./types.js").BackgroundJobPayload} payload - Payload.
272
+ * @returns {Promise<void>} - Resolves when done.
273
+ */
274
+ async _handleJob(payload) {
275
+ if (!payload.id) throw new Error("Background job payload missing id")
276
+ /**
277
+ * Identified payload.
278
+ @type {import("./types.js").BackgroundJobPayload & {id: string}} */
279
+ const identifiedPayload = /**
280
+ * Narrows the runtime value to the documented type.
281
+ @type {?} */ (payload)
282
+
283
+ const executionMode = this._executionModeForPayload(identifiedPayload)
284
+
285
+ if (executionMode !== "inline") {
286
+ this._trackProcessJob(this._startProcessJob({executionMode, payload: identifiedPayload}))
287
+ return
288
+ }
289
+
290
+ this._handleInlineJob(identifiedPayload)
291
+ }
292
+
293
+ /**
294
+ * Runs start process job.
295
+ * @param {object} args - Options.
296
+ * @param {import("./types.js").BackgroundJobExecutionMode} args.executionMode - Execution mode.
297
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} args.payload - Payload.
298
+ * @returns {Promise<void>} - Resolves when the process job exits.
299
+ */
300
+ _startProcessJob({executionMode, payload}) {
301
+ if (executionMode === "forked") return this._forkJob(payload)
302
+
303
+ return this._spawnJob(payload)
304
+ }
305
+
306
+ /**
307
+ * Runs handle inline job.
308
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} payload - Payload.
309
+ * @returns {void}
310
+ */
311
+ _handleInlineJob(payload) {
312
+ // Inline jobs share the worker's process and DB pool, but each one
313
+ // is its own async chain — there's no semantic reason to serialize
314
+ // them. We kick off the job, register it with `inflightInlineJobs`
315
+ // for shutdown drain, and signal capacity to main:
316
+ // - If we still have a free slot we ask for the next job right
317
+ // away, so a slow job (e.g. a docker alive check that waits 15s
318
+ // on a gone server) no longer starves every other inline job.
319
+ // - When the job finishes, if the worker had been at the cap, we
320
+ // ask for the next job to refill the slot.
321
+ // The bookkeeping in `finally()` ratchets capacity back up
322
+ // regardless of success or failure.
323
+ /**
324
+ * Defines inflight.
325
+ @type {Promise<void>} */
326
+ let inflight
327
+
328
+ inflight = this._runInlineJobAndReport(payload).finally(() => {
329
+ this.inflightInlineJobs.delete(inflight)
330
+
331
+ if (!this.shouldStop && this.inflightInlineJobs.size === this.maxConcurrentInlineJobs - 1) {
332
+ this._sendReadyIfRunning()
333
+ }
334
+ })
335
+
336
+ this.inflightInlineJobs.add(inflight)
337
+
338
+ if (this.inflightInlineJobs.size < this.maxConcurrentInlineJobs) {
339
+ this._sendReadyIfRunning()
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Runs execution mode for payload.
345
+ * @param {import("./types.js").BackgroundJobPayload} payload - Payload.
346
+ * @returns {import("./types.js").BackgroundJobExecutionMode} - Execution mode.
347
+ */
348
+ _executionModeForPayload(payload) {
349
+ const options = payload.options || {}
350
+ const executionMode = options.executionMode
351
+
352
+ if (executionMode) return this._normalizeExecutionMode(executionMode)
353
+
354
+ return options.forked === false ? "inline" : "forked"
355
+ }
356
+
357
+ /**
358
+ * Runs normalize execution mode.
359
+ * @param {string} executionMode - Execution mode.
360
+ * @returns {import("./types.js").BackgroundJobExecutionMode} - Normalized execution mode.
361
+ */
362
+ _normalizeExecutionMode(executionMode) {
363
+ for (const mode of EXECUTION_MODES) {
364
+ if (mode === executionMode) return mode
365
+ }
366
+
367
+ throw new Error(`Invalid background job executionMode: ${executionMode}`)
368
+ }
369
+
370
+ /**
371
+ * Runs track process job.
372
+ * @param {Promise<void>} processJob - Process job promise.
373
+ * @returns {void}
374
+ */
375
+ _trackProcessJob(processJob) {
376
+ /**
377
+ * Defines inflight.
378
+ @type {Promise<void>} */
379
+ let inflight
380
+
381
+ inflight = processJob.finally(() => {
382
+ this.inflightProcessJobs.delete(inflight)
383
+
384
+ if (!this.shouldStop && this.inflightProcessJobs.size === this.maxConcurrentForkedJobs - 1) {
385
+ this._sendReadyIfRunning()
386
+ }
387
+ })
388
+
389
+ this.inflightProcessJobs.add(inflight)
390
+ this._sendReadyIfRunning()
391
+ }
392
+
393
+ /**
394
+ * Runs run inline job and report.
395
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} payload - Payload with required id.
396
+ * @returns {Promise<void>} - Resolves when complete (success or failure reported).
397
+ */
398
+ async _runInlineJobAndReport(payload) {
399
+ try {
400
+ await this._runJobInline(payload)
401
+ await this._reportJobResult({
402
+ jobId: payload.id,
403
+ status: "completed",
404
+ handedOffAtMs: payload.handedOffAtMs,
405
+ workerId: payload.workerId || this.workerId
406
+ })
407
+ } catch (error) {
408
+ await this._reportJobResult({
409
+ jobId: payload.id,
410
+ status: "failed",
411
+ error,
412
+ handedOffAtMs: payload.handedOffAtMs,
413
+ workerId: payload.workerId || this.workerId
414
+ })
415
+ }
416
+ }
417
+
418
+ /**
419
+ * Tells main we're ready for the next job — but only if we haven't been
420
+ * asked to drain. Once we've sent `draining` we don't want to take more
421
+ * work.
422
+ * @returns {void}
423
+ */
424
+ _sendReadyIfRunning() {
425
+ if (this.shouldStop) return
426
+ if (!this.jsonSocket) return
427
+
428
+ const readyMessage = this._readyMessage()
429
+
430
+ if (!readyMessage) return
431
+ this.jsonSocket.send(readyMessage)
432
+ }
433
+
434
+ /**
435
+ * Runs ready message.
436
+ * @returns {import("./types.js").BackgroundJobSocketMessage | null} - Ready message or null when the worker has no capacity.
437
+ */
438
+ _readyMessage() {
439
+ const acceptsProcessJob = this.inflightProcessJobs.size < this.maxConcurrentForkedJobs
440
+ const acceptsInline = this.inflightInlineJobs.size < this.maxConcurrentInlineJobs
441
+
442
+ if (!acceptsProcessJob && !acceptsInline) return null
443
+
444
+ return {
445
+ type: "ready",
446
+ acceptsForked: acceptsProcessJob,
447
+ acceptsInline,
448
+ acceptsSpawned: acceptsProcessJob
449
+ }
450
+ }
451
+
452
+ /**
453
+ * Runs run job inline.
454
+ * @param {import("./types.js").BackgroundJobPayload} payload - Payload.
455
+ * @returns {Promise<void>} - Resolves when done.
456
+ */
457
+ async _runJobInline(payload) {
458
+ const configuration = this.configuration
459
+ if (!configuration) throw new Error("Background jobs worker configuration not initialized")
460
+
461
+ const registry = new BackgroundJobRegistry({configuration})
462
+ await registry.load()
463
+ const JobClass = registry.getJobByName(payload.jobName)
464
+ const jobInstance = new JobClass()
465
+ /**
466
+ * Perform.
467
+ @type {(...args: Array<?>) => Promise<void>} */
468
+ const perform = jobInstance.perform
469
+
470
+ await configuration.withConnections({name: `Background job worker inline: ${payload.jobName}`}, async () => {
471
+ await perform.apply(jobInstance, payload.args || [])
472
+ })
473
+ }
474
+
475
+ /**
476
+ * Runs fork job.
477
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} payload - Payload.
478
+ * @returns {Promise<void>} - Resolves when the forked runner exits or fork fails.
479
+ */
480
+ _forkJob(payload) {
481
+ const child = this._createForkedChild()
482
+
483
+ this.inflightProcessChildren.add(child)
484
+
485
+ const finished = this._waitForForkedChild({child, payload})
486
+
487
+ this._sendForkedPayload({child, payload})
488
+
489
+ return finished
490
+ }
491
+
492
+ /**
493
+ * Runs create forked child.
494
+ * @returns {import("node:child_process").ChildProcess} - Forked child process.
495
+ */
496
+ _createForkedChild() {
497
+ const configuration = this.configuration
498
+ if (!configuration) throw new Error("Background jobs worker configuration not initialized")
499
+
500
+ const directory = configuration.getDirectory()
501
+ const backgroundJobsConfig = configuration.getBackgroundJobsConfig()
502
+
503
+ return fork(FORKED_RUNNER_ENTRY_PATH, [], {
504
+ cwd: directory,
505
+ execArgv: [],
506
+ stdio: ["ignore", "ignore", "ignore", "ipc"],
507
+ env: Object.assign({}, process.env, {
508
+ VELOCIOUS_ENV: configuration.getEnvironment(),
509
+ VELOCIOUS_BACKGROUND_JOBS_HOST: backgroundJobsConfig.host,
510
+ VELOCIOUS_BACKGROUND_JOBS_PORT: `${backgroundJobsConfig.port}`
511
+ })
512
+ })
513
+ }
514
+
515
+ /**
516
+ * Runs wait for forked child.
517
+ * @param {object} args - Options.
518
+ * @param {import("node:child_process").ChildProcess} args.child - Forked child process.
519
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} args.payload - Payload.
520
+ * @returns {Promise<void>} - Resolves when the child exits.
521
+ */
522
+ _waitForForkedChild({child, payload}) {
523
+ return new Promise((resolve) => {
524
+ child.once("exit", (code, signal) => {
525
+ void this._handleForkedChildExit({child, code, signal, payload, resolve})
526
+ })
527
+ child.once("error", (error) => {
528
+ void this._handleForkedChildError({child, error, payload, resolve})
529
+ })
530
+ })
531
+ }
532
+
533
+ /**
534
+ * Runs handle forked child exit.
535
+ * @param {object} args - Options.
536
+ * @param {import("node:child_process").ChildProcess} args.child - Forked child process.
537
+ * @param {number | null} args.code - Exit code.
538
+ * @param {NodeJS.Signals | null} args.signal - Exit signal.
539
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} args.payload - Payload.
540
+ * @param {(value: void) => void} args.resolve - Promise resolver.
541
+ * @returns {Promise<void>} - Resolves after failure is reported.
542
+ */
543
+ async _handleForkedChildExit({child, code, signal, payload, resolve}) {
544
+ this.inflightProcessChildren.delete(child)
545
+
546
+ if (this._forkedChildExitedCleanly({code, signal})) {
547
+ resolve(undefined)
548
+ return
549
+ }
550
+
551
+ await this._reportForkedChildFailure({
552
+ payload,
553
+ error: new Error(`Forked background job runner exited before reporting: code=${code} signal=${signal || "none"}`)
554
+ })
555
+
556
+ resolve(undefined)
557
+ }
558
+
559
+ /**
560
+ * Runs forked child exited cleanly.
561
+ * @param {object} args - Options.
562
+ * @param {number | null} args.code - Exit code.
563
+ * @param {NodeJS.Signals | null} args.signal - Exit signal.
564
+ * @returns {boolean} - Whether the child exited cleanly.
565
+ */
566
+ _forkedChildExitedCleanly({code, signal}) {
567
+ return code === 0 && !signal
568
+ }
569
+
570
+ /**
571
+ * Runs handle forked child error.
572
+ * @param {object} args - Options.
573
+ * @param {import("node:child_process").ChildProcess} args.child - Forked child process.
574
+ * @param {Error} args.error - Child process error.
575
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} args.payload - Payload.
576
+ * @param {(value: void) => void} args.resolve - Promise resolver.
577
+ * @returns {Promise<void>} - Resolves after failure is reported.
578
+ */
579
+ async _handleForkedChildError({child, error, payload, resolve}) {
580
+ this.inflightProcessChildren.delete(child)
581
+ console.error("Background jobs forked runner error:", error)
582
+ await this._reportForkedChildFailure({payload, error})
583
+ resolve(undefined)
584
+ }
585
+
586
+ /**
587
+ * Runs send forked payload.
588
+ * @param {object} args - Options.
589
+ * @param {import("node:child_process").ChildProcess} args.child - Forked child process.
590
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} args.payload - Payload.
591
+ * @returns {void}
592
+ */
593
+ _sendForkedPayload({child, payload}) {
594
+ try {
595
+ child.send({type: "job", payload})
596
+ } catch (error) {
597
+ child.kill("SIGTERM")
598
+ void this._reportForkedChildFailure({payload, error})
599
+ }
600
+ }
601
+
602
+ /**
603
+ * Runs report forked child failure.
604
+ * @param {object} args - Options.
605
+ * @param {import("./types.js").BackgroundJobPayload & {id: string}} args.payload - Payload.
606
+ * @param {?} args.error - Error.
607
+ * @returns {Promise<void>} - Resolves after failure is reported.
608
+ */
609
+ async _reportForkedChildFailure({payload, error}) {
610
+ await this._reportJobResult({
611
+ jobId: payload.id,
612
+ status: "failed",
613
+ error,
614
+ handedOffAtMs: payload.handedOffAtMs,
615
+ workerId: payload.workerId || this.workerId
616
+ })
617
+ }
618
+
619
+ /**
620
+ * Runs spawn job.
621
+ * @param {import("./types.js").BackgroundJobPayload} payload - Payload.
622
+ * @returns {Promise<void>} - Resolves when the spawned runner exits or spawn fails.
623
+ */
624
+ _spawnJob(payload) {
625
+ const configuration = this.configuration
626
+ if (!configuration) throw new Error("Background jobs worker configuration not initialized")
627
+
628
+ const directory = configuration.getDirectory()
629
+ const argvCommand = process.argv[1]
630
+ const command = argvCommand ? argvCommand : `${directory}/bin/velocious.js`
631
+ const encodedPayload = Buffer.from(JSON.stringify(payload)).toString("base64")
632
+ const backgroundJobsConfig = configuration.getBackgroundJobsConfig()
633
+ const child = spawn(process.execPath, [command, "background-jobs-runner"], {
634
+ cwd: directory,
635
+ detached: true,
636
+ stdio: "ignore",
637
+ env: Object.assign({}, process.env, {
638
+ VELOCIOUS_ENV: configuration.getEnvironment(),
639
+ VELOCIOUS_BACKGROUND_JOBS_HOST: backgroundJobsConfig.host,
640
+ VELOCIOUS_BACKGROUND_JOBS_PORT: `${backgroundJobsConfig.port}`,
641
+ VELOCIOUS_JOB_PAYLOAD: encodedPayload
642
+ })
643
+ })
644
+
645
+ this.inflightProcessChildren.add(child)
646
+
647
+ const finished = new Promise((resolve) => {
648
+ child.once("exit", () => {
649
+ this.inflightProcessChildren.delete(child)
650
+ resolve(undefined)
651
+ })
652
+ child.once("error", (error) => {
653
+ this.inflightProcessChildren.delete(child)
654
+ console.error("Background jobs spawned runner error:", error)
655
+ resolve(undefined)
656
+ })
657
+ })
658
+
659
+ child.unref()
660
+
661
+ return finished
662
+ }
663
+
664
+ /**
665
+ * Runs report job result.
666
+ * @param {object} args - Options.
667
+ * @param {string} args.jobId - Job id.
668
+ * @param {"completed" | "failed"} args.status - Status.
669
+ * @param {?} [args.error] - Error.
670
+ * @param {number} [args.handedOffAtMs] - Handed off timestamp.
671
+ * @param {string} [args.workerId] - Worker id.
672
+ * @returns {Promise<void>} - Resolves when reported.
673
+ */
674
+ async _reportJobResult({jobId, status, error, handedOffAtMs, workerId}) {
675
+ if (!this.statusReporter) return
676
+
677
+ try {
678
+ await this.statusReporter.reportWithRetry({jobId, status, error, handedOffAtMs, workerId})
679
+ } catch (reportError) {
680
+ console.error("Background job status reporting failed:", reportError)
681
+ }
682
+ }
683
+ }