@zintrust/core 0.1.39 → 0.1.41

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 (475) hide show
  1. package/bin/zintrust-main.d.ts.map +1 -1
  2. package/bin/zintrust-main.js +22 -1
  3. package/package.json +8 -4
  4. package/public/error-pages/404.html +2 -2
  5. package/src/auth/Auth.js +1 -1
  6. package/src/boot/Application.d.ts +1 -16
  7. package/src/boot/Application.d.ts.map +1 -1
  8. package/src/boot/Application.js +2 -262
  9. package/src/boot/Server.d.ts +1 -1
  10. package/src/boot/Server.d.ts.map +1 -1
  11. package/src/boot/bootstrap.js +23 -9
  12. package/src/boot/registry/registerRoute.d.ts +6 -0
  13. package/src/boot/registry/registerRoute.d.ts.map +1 -0
  14. package/src/boot/registry/registerRoute.js +96 -0
  15. package/src/boot/registry/runtime.d.ts +15 -0
  16. package/src/boot/registry/runtime.d.ts.map +1 -0
  17. package/src/boot/registry/runtime.js +353 -0
  18. package/src/boot/registry/type.d.ts +25 -0
  19. package/src/boot/registry/type.d.ts.map +1 -0
  20. package/src/boot/registry/type.js +1 -0
  21. package/src/boot/registry/worker.d.ts +6 -0
  22. package/src/boot/registry/worker.d.ts.map +1 -0
  23. package/src/boot/registry/worker.js +35 -0
  24. package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
  25. package/src/cache/drivers/KVRemoteDriver.js +14 -1
  26. package/src/cli/CLI.d.ts.map +1 -1
  27. package/src/cli/CLI.js +82 -34
  28. package/src/cli/ErrorHandler.js +1 -1
  29. package/src/cli/commands/ContainerProxiesCommand.d.ts +5 -0
  30. package/src/cli/commands/ContainerProxiesCommand.d.ts.map +1 -0
  31. package/src/cli/commands/ContainerProxiesCommand.js +77 -0
  32. package/src/cli/commands/ContainerWorkersCommand.d.ts +5 -0
  33. package/src/cli/commands/ContainerWorkersCommand.d.ts.map +1 -0
  34. package/src/cli/commands/ContainerWorkersCommand.js +57 -0
  35. package/src/cli/commands/DeployCommand.d.ts +16 -0
  36. package/src/cli/commands/DeployCommand.d.ts.map +1 -0
  37. package/src/cli/commands/DeployCommand.js +110 -0
  38. package/src/cli/commands/DeployContainerProxiesCommand.d.ts +5 -0
  39. package/src/cli/commands/DeployContainerProxiesCommand.d.ts.map +1 -0
  40. package/src/cli/commands/DeployContainerProxiesCommand.js +27 -0
  41. package/src/cli/commands/DeployContainerWorkersCommand.d.ts +5 -0
  42. package/src/cli/commands/DeployContainerWorkersCommand.d.ts.map +1 -0
  43. package/src/cli/commands/DeployContainerWorkersCommand.js +27 -0
  44. package/src/cli/commands/DockerComposeCommandUtils.d.ts +3 -0
  45. package/src/cli/commands/DockerComposeCommandUtils.d.ts.map +1 -0
  46. package/src/cli/commands/DockerComposeCommandUtils.js +34 -0
  47. package/src/cli/commands/DoctorArchitectureCommand.d.ts +5 -0
  48. package/src/cli/commands/DoctorArchitectureCommand.d.ts.map +1 -0
  49. package/src/cli/commands/DoctorArchitectureCommand.js +54 -0
  50. package/src/cli/commands/InitContainerCommand.d.ts +5 -0
  51. package/src/cli/commands/InitContainerCommand.d.ts.map +1 -0
  52. package/src/cli/commands/InitContainerCommand.js +216 -0
  53. package/src/cli/commands/InitProducerCommand.d.ts +5 -0
  54. package/src/cli/commands/InitProducerCommand.d.ts.map +1 -0
  55. package/src/cli/commands/InitProducerCommand.js +47 -0
  56. package/src/cli/commands/InitProxyCommand.d.ts +5 -0
  57. package/src/cli/commands/InitProxyCommand.d.ts.map +1 -0
  58. package/src/cli/commands/InitProxyCommand.js +442 -0
  59. package/src/cli/commands/MongoDBProxyCommand.d.ts +5 -0
  60. package/src/cli/commands/MongoDBProxyCommand.d.ts.map +1 -0
  61. package/src/cli/commands/MongoDBProxyCommand.js +98 -0
  62. package/src/cli/commands/MySqlProxyCommand.d.ts +6 -0
  63. package/src/cli/commands/MySqlProxyCommand.d.ts.map +1 -0
  64. package/src/cli/commands/MySqlProxyCommand.js +32 -0
  65. package/src/cli/commands/PostgresProxyCommand.d.ts +6 -0
  66. package/src/cli/commands/PostgresProxyCommand.d.ts.map +1 -0
  67. package/src/cli/commands/PostgresProxyCommand.js +32 -0
  68. package/src/cli/commands/ProxyCommand.d.ts +12 -0
  69. package/src/cli/commands/ProxyCommand.d.ts.map +1 -0
  70. package/src/cli/commands/ProxyCommand.js +80 -0
  71. package/src/cli/commands/ProxyCommandUtils.d.ts +6 -0
  72. package/src/cli/commands/ProxyCommandUtils.d.ts.map +1 -0
  73. package/src/cli/commands/ProxyCommandUtils.js +38 -0
  74. package/src/cli/commands/QueueRecoveryCommand.d.ts +6 -0
  75. package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -0
  76. package/src/cli/commands/QueueRecoveryCommand.js +513 -0
  77. package/src/cli/commands/RedisProxyCommand.d.ts +6 -0
  78. package/src/cli/commands/RedisProxyCommand.d.ts.map +1 -0
  79. package/src/cli/commands/RedisProxyCommand.js +53 -0
  80. package/src/cli/commands/SmtpProxyCommand.d.ts +6 -0
  81. package/src/cli/commands/SmtpProxyCommand.d.ts.map +1 -0
  82. package/src/cli/commands/SmtpProxyCommand.js +56 -0
  83. package/src/cli/commands/SqlProxyCommandUtils.d.ts +46 -0
  84. package/src/cli/commands/SqlProxyCommandUtils.d.ts.map +1 -0
  85. package/src/cli/commands/SqlProxyCommandUtils.js +48 -0
  86. package/src/cli/commands/SqlServerProxyCommand.d.ts +5 -0
  87. package/src/cli/commands/SqlServerProxyCommand.d.ts.map +1 -0
  88. package/src/cli/commands/SqlServerProxyCommand.js +85 -0
  89. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  90. package/src/cli/commands/StartCommand.js +145 -18
  91. package/src/cli/commands/WorkerCommands.d.ts +1 -0
  92. package/src/cli/commands/WorkerCommands.d.ts.map +1 -1
  93. package/src/cli/commands/WorkerCommands.js +140 -6
  94. package/src/cli/commands/index.d.ts +2 -0
  95. package/src/cli/commands/index.d.ts.map +1 -1
  96. package/src/cli/commands/index.js +2 -0
  97. package/src/cli/commands/runner/index.d.ts +2 -2
  98. package/src/cli/commands/runner/index.d.ts.map +1 -1
  99. package/src/cli/commands/runner/index.js +15 -4
  100. package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
  101. package/src/cli/d1/D1SqlMigrations.js +3 -0
  102. package/src/cli/index.d.ts +4 -0
  103. package/src/cli/index.d.ts.map +1 -1
  104. package/src/cli/index.js +4 -0
  105. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  106. package/src/cli/scaffolding/ProjectScaffolder.js +2 -0
  107. package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
  108. package/src/cli/scaffolding/ServiceScaffolder.js +1 -0
  109. package/src/cli/utils/EnvFileLoader.d.ts +2 -1
  110. package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
  111. package/src/cli/utils/EnvFileLoader.js +22 -21
  112. package/src/cli/utils/spawn.d.ts.map +1 -1
  113. package/src/cli/utils/spawn.js +17 -10
  114. package/src/cli/workers/QueueWorkRunner.js +1 -1
  115. package/src/common/ExternalServiceUtils.d.ts.map +1 -1
  116. package/src/common/ExternalServiceUtils.js +7 -2
  117. package/src/common/HealthRoutes.d.ts.map +1 -1
  118. package/src/common/HealthRoutes.js +50 -2
  119. package/src/common/RemoteSignedJson.d.ts +1 -0
  120. package/src/common/RemoteSignedJson.d.ts.map +1 -1
  121. package/src/common/RemoteSignedJson.js +39 -13
  122. package/src/common/index.d.ts +1 -0
  123. package/src/common/index.d.ts.map +1 -1
  124. package/src/common/index.js +12 -1
  125. package/src/config/FileLogWriter.d.ts.map +1 -1
  126. package/src/config/FileLogWriter.js +21 -6
  127. package/src/config/app.d.ts +4 -0
  128. package/src/config/app.d.ts.map +1 -1
  129. package/src/config/app.js +4 -0
  130. package/src/config/cache.d.ts.map +1 -1
  131. package/src/config/cache.js +22 -2
  132. package/src/config/cloudflare.d.ts +5 -1
  133. package/src/config/cloudflare.d.ts.map +1 -1
  134. package/src/config/cloudflare.js +48 -0
  135. package/src/config/database.d.ts.map +1 -1
  136. package/src/config/database.js +48 -13
  137. package/src/config/env.d.ts +90 -2
  138. package/src/config/env.d.ts.map +1 -1
  139. package/src/config/env.js +160 -18
  140. package/src/config/index.d.ts +1 -0
  141. package/src/config/index.d.ts.map +1 -1
  142. package/src/config/logger.d.ts.map +1 -1
  143. package/src/config/logger.js +60 -16
  144. package/src/config/mail.d.ts.map +1 -1
  145. package/src/config/mail.js +16 -10
  146. package/src/config/middleware.d.ts +5 -0
  147. package/src/config/middleware.d.ts.map +1 -1
  148. package/src/config/middleware.js +19 -1
  149. package/src/config/queue.d.ts.map +1 -1
  150. package/src/config/queue.js +70 -9
  151. package/src/config/redis.d.ts.map +1 -1
  152. package/src/config/redis.js +48 -13
  153. package/src/config/storage.d.ts.map +1 -1
  154. package/src/config/storage.js +1 -0
  155. package/src/config/type.d.ts +19 -0
  156. package/src/config/type.d.ts.map +1 -1
  157. package/src/config/workers.d.ts.map +1 -1
  158. package/src/config/workers.js +122 -16
  159. package/src/functions/cloudflare.d.ts.map +1 -1
  160. package/src/functions/cloudflare.js +55 -1
  161. package/src/health/StartupHealthChecks.js +1 -1
  162. package/src/http/FileUpload.d.ts +3 -2
  163. package/src/http/FileUpload.d.ts.map +1 -1
  164. package/src/http/Kernel.d.ts.map +1 -1
  165. package/src/http/Kernel.js +2 -1
  166. package/src/http/error-pages/ErrorPageRenderer.d.ts +4 -0
  167. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -1
  168. package/src/http/error-pages/ErrorPageRenderer.js +141 -1
  169. package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
  170. package/src/http/middleware/BodyParsingMiddleware.js +33 -6
  171. package/src/index.d.ts +25 -53
  172. package/src/index.d.ts.map +1 -1
  173. package/src/index.js +30 -14
  174. package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
  175. package/src/microservices/ServiceAuthMiddleware.js +12 -4
  176. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  177. package/src/middleware/CsrfMiddleware.js +39 -10
  178. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
  179. package/src/middleware/ErrorHandlerMiddleware.js +2 -1
  180. package/src/migrations/MigrationLoader.js +1 -1
  181. package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
  182. package/src/migrations/schema/SchemaCompiler.js +6 -3
  183. package/src/node-singletons/crypto.d.ts +1 -1
  184. package/src/node-singletons/crypto.d.ts.map +1 -1
  185. package/src/node-singletons/crypto.js +1 -1
  186. package/src/node-singletons/fs.d.ts +1 -1
  187. package/src/node-singletons/fs.d.ts.map +1 -1
  188. package/src/node-singletons/path.d.ts +1 -1
  189. package/src/node-singletons/path.d.ts.map +1 -1
  190. package/src/node-singletons/path.js +1 -1
  191. package/src/node-singletons/stream.d.ts +11 -0
  192. package/src/node-singletons/stream.d.ts.map +1 -0
  193. package/src/node-singletons/stream.js +8 -0
  194. package/src/observability/OpenTelemetry.d.ts +7 -0
  195. package/src/observability/OpenTelemetry.d.ts.map +1 -1
  196. package/src/observability/OpenTelemetry.js +49 -2
  197. package/src/orm/Database.d.ts +4 -0
  198. package/src/orm/Database.d.ts.map +1 -1
  199. package/src/orm/Database.js +80 -9
  200. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  201. package/src/orm/DatabaseRuntimeRegistration.js +2 -0
  202. package/src/orm/QueryBuilder.d.ts +1 -0
  203. package/src/orm/QueryBuilder.d.ts.map +1 -1
  204. package/src/orm/QueryBuilder.js +33 -3
  205. package/src/orm/SchemaCompiler.d.ts.map +1 -1
  206. package/src/orm/SchemaCompiler.js +6 -3
  207. package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
  208. package/src/orm/adapters/D1RemoteAdapter.js +14 -1
  209. package/src/orm/adapters/MongoDBProxyAdapter.d.ts +3 -0
  210. package/src/orm/adapters/MongoDBProxyAdapter.d.ts.map +1 -0
  211. package/src/orm/adapters/MongoDBProxyAdapter.js +128 -0
  212. package/src/orm/adapters/MySQLProxyAdapter.d.ts +11 -0
  213. package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -0
  214. package/src/orm/adapters/MySQLProxyAdapter.js +143 -0
  215. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts +11 -0
  216. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -0
  217. package/src/orm/adapters/PostgreSQLProxyAdapter.js +147 -0
  218. package/src/orm/adapters/ProxyCache.d.ts +9 -0
  219. package/src/orm/adapters/ProxyCache.d.ts.map +1 -0
  220. package/src/orm/adapters/ProxyCache.js +24 -0
  221. package/src/orm/adapters/ProxySignedRequest.d.ts +11 -0
  222. package/src/orm/adapters/ProxySignedRequest.d.ts.map +1 -0
  223. package/src/orm/adapters/ProxySignedRequest.js +30 -0
  224. package/src/orm/adapters/ProxySigningPath.d.ts +3 -0
  225. package/src/orm/adapters/ProxySigningPath.d.ts.map +1 -0
  226. package/src/orm/adapters/ProxySigningPath.js +25 -0
  227. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts +19 -0
  228. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -0
  229. package/src/orm/adapters/SqlProxyAdapterUtils.js +35 -0
  230. package/src/orm/adapters/SqlServerProxyAdapter.d.ts +3 -0
  231. package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -0
  232. package/src/orm/adapters/SqlServerProxyAdapter.js +146 -0
  233. package/src/performance/Optimizer.d.ts +1 -0
  234. package/src/performance/Optimizer.d.ts.map +1 -1
  235. package/src/performance/Optimizer.js +21 -8
  236. package/src/proxy/ErrorHandler.d.ts +11 -0
  237. package/src/proxy/ErrorHandler.d.ts.map +1 -0
  238. package/src/proxy/ErrorHandler.js +7 -0
  239. package/src/proxy/PoolManager.d.ts +8 -0
  240. package/src/proxy/PoolManager.d.ts.map +1 -0
  241. package/src/proxy/PoolManager.js +18 -0
  242. package/src/proxy/ProxyBackend.d.ts +18 -0
  243. package/src/proxy/ProxyBackend.d.ts.map +1 -0
  244. package/src/proxy/ProxyBackend.js +1 -0
  245. package/src/proxy/ProxyConfig.d.ts +12 -0
  246. package/src/proxy/ProxyConfig.d.ts.map +1 -0
  247. package/src/proxy/ProxyConfig.js +1 -0
  248. package/src/proxy/ProxyRegistry.d.ts +10 -0
  249. package/src/proxy/ProxyRegistry.d.ts.map +1 -0
  250. package/src/proxy/ProxyRegistry.js +11 -0
  251. package/src/proxy/ProxyServer.d.ts +21 -0
  252. package/src/proxy/ProxyServer.d.ts.map +1 -0
  253. package/src/proxy/ProxyServer.js +84 -0
  254. package/src/proxy/ProxyServerUtils.d.ts +37 -0
  255. package/src/proxy/ProxyServerUtils.d.ts.map +1 -0
  256. package/src/proxy/ProxyServerUtils.js +42 -0
  257. package/src/proxy/ProxySigningConfigResolver.d.ts +22 -0
  258. package/src/proxy/ProxySigningConfigResolver.d.ts.map +1 -0
  259. package/src/proxy/ProxySigningConfigResolver.js +24 -0
  260. package/src/proxy/ProxySigningRequest.d.ts +12 -0
  261. package/src/proxy/ProxySigningRequest.d.ts.map +1 -0
  262. package/src/proxy/ProxySigningRequest.js +31 -0
  263. package/src/proxy/RequestValidator.d.ts +15 -0
  264. package/src/proxy/RequestValidator.d.ts.map +1 -0
  265. package/src/proxy/RequestValidator.js +25 -0
  266. package/src/proxy/SigningService.d.ts +39 -0
  267. package/src/proxy/SigningService.d.ts.map +1 -0
  268. package/src/proxy/SigningService.js +107 -0
  269. package/src/proxy/SqlPayloadValidator.d.ts +13 -0
  270. package/src/proxy/SqlPayloadValidator.d.ts.map +1 -0
  271. package/src/proxy/SqlPayloadValidator.js +14 -0
  272. package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -0
  273. package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -0
  274. package/src/proxy/d1/ZintrustD1Proxy.js +1 -0
  275. package/src/proxy/d1/register.d.ts +2 -0
  276. package/src/proxy/d1/register.d.ts.map +1 -0
  277. package/src/proxy/d1/register.js +5 -0
  278. package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -0
  279. package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -0
  280. package/src/proxy/kv/ZintrustKvProxy.js +1 -0
  281. package/src/proxy/kv/register.d.ts +2 -0
  282. package/src/proxy/kv/register.d.ts.map +1 -0
  283. package/src/proxy/kv/register.js +5 -0
  284. package/src/proxy/mongodb/MongoDBProxyServer.d.ts +33 -0
  285. package/src/proxy/mongodb/MongoDBProxyServer.d.ts.map +1 -0
  286. package/src/proxy/mongodb/MongoDBProxyServer.js +202 -0
  287. package/src/proxy/mongodb/register.d.ts +2 -0
  288. package/src/proxy/mongodb/register.d.ts.map +1 -0
  289. package/src/proxy/mongodb/register.js +5 -0
  290. package/src/proxy/mysql/MySqlProxyServer.d.ts +14 -0
  291. package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -0
  292. package/src/proxy/mysql/MySqlProxyServer.js +169 -0
  293. package/src/proxy/mysql/register.d.ts +2 -0
  294. package/src/proxy/mysql/register.d.ts.map +1 -0
  295. package/src/proxy/mysql/register.js +5 -0
  296. package/src/proxy/postgres/PostgresProxyServer.d.ts +14 -0
  297. package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -0
  298. package/src/proxy/postgres/PostgresProxyServer.js +140 -0
  299. package/src/proxy/postgres/register.d.ts +2 -0
  300. package/src/proxy/postgres/register.d.ts.map +1 -0
  301. package/src/proxy/postgres/register.js +5 -0
  302. package/src/proxy/redis/RedisProxyServer.d.ts +12 -0
  303. package/src/proxy/redis/RedisProxyServer.d.ts.map +1 -0
  304. package/src/proxy/redis/RedisProxyServer.js +192 -0
  305. package/src/proxy/redis/register.d.ts +2 -0
  306. package/src/proxy/redis/register.d.ts.map +1 -0
  307. package/src/proxy/redis/register.js +5 -0
  308. package/src/proxy/smtp/SmtpProxyServer.d.ts +19 -0
  309. package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -0
  310. package/src/proxy/smtp/SmtpProxyServer.js +289 -0
  311. package/src/proxy/smtp/register.d.ts +2 -0
  312. package/src/proxy/smtp/register.d.ts.map +1 -0
  313. package/src/proxy/smtp/register.js +5 -0
  314. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +14 -0
  315. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -0
  316. package/src/proxy/sqlserver/SqlServerProxyServer.js +168 -0
  317. package/src/proxy/sqlserver/register.d.ts +2 -0
  318. package/src/proxy/sqlserver/register.d.ts.map +1 -0
  319. package/src/proxy/sqlserver/register.js +5 -0
  320. package/src/routes/doc.d.ts.map +1 -1
  321. package/src/routes/doc.js +16 -2
  322. package/src/routes/error.d.ts +5 -4
  323. package/src/routes/error.d.ts.map +1 -1
  324. package/src/routes/error.js +15 -13
  325. package/src/routes/errorPages.d.ts +2 -0
  326. package/src/routes/errorPages.d.ts.map +1 -1
  327. package/src/routes/errorPages.js +144 -4
  328. package/src/runtime/PluginAutoImports.d.ts +1 -0
  329. package/src/runtime/PluginAutoImports.d.ts.map +1 -1
  330. package/src/runtime/PluginAutoImports.js +94 -9
  331. package/src/runtime/RuntimeAdapter.d.ts +8 -9
  332. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  333. package/src/runtime/RuntimeAdapter.js +120 -34
  334. package/src/runtime/RuntimeServices.d.ts +47 -0
  335. package/src/runtime/RuntimeServices.d.ts.map +1 -0
  336. package/src/runtime/RuntimeServices.js +164 -0
  337. package/src/runtime/StartupConfigFileRegistry.d.ts +4 -4
  338. package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
  339. package/src/runtime/StartupConfigFileRegistry.js +12 -0
  340. package/src/runtime/WorkerAdapterImports.d.ts +5 -0
  341. package/src/runtime/WorkerAdapterImports.d.ts.map +1 -0
  342. package/src/runtime/WorkerAdapterImports.js +17 -0
  343. package/src/runtime/WorkersModule.d.ts +6 -0
  344. package/src/runtime/WorkersModule.d.ts.map +1 -0
  345. package/src/runtime/WorkersModule.js +278 -0
  346. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  347. package/src/runtime/adapters/CloudflareAdapter.js +19 -2
  348. package/src/runtime/adapters/DenoAdapter.js +1 -0
  349. package/src/runtime/adapters/FargateAdapter.js +1 -1
  350. package/src/runtime/adapters/LambdaAdapter.js +1 -1
  351. package/src/runtime/adapters/NodeServerAdapter.js +1 -1
  352. package/src/runtime/detectRuntime.d.ts +10 -0
  353. package/src/runtime/detectRuntime.d.ts.map +1 -0
  354. package/src/runtime/detectRuntime.js +57 -0
  355. package/src/runtime/useFileLoader.d.ts.map +1 -1
  356. package/src/runtime/useFileLoader.js +16 -0
  357. package/src/scripts/TemplateImportsCheck.js +2 -2
  358. package/src/scripts/TemplateSync.js +3 -4
  359. package/src/security/CsrfTokenManager.d.ts +18 -9
  360. package/src/security/CsrfTokenManager.d.ts.map +1 -1
  361. package/src/security/CsrfTokenManager.js +204 -11
  362. package/src/security/Hash.d.ts +1 -1
  363. package/src/security/Hash.d.ts.map +1 -1
  364. package/src/security/Hash.js +31 -36
  365. package/src/seeders/SeederLoader.js +1 -1
  366. package/src/session/SessionManager.d.ts +3 -0
  367. package/src/session/SessionManager.d.ts.map +1 -1
  368. package/src/session/SessionManager.js +49 -10
  369. package/src/sockets/CloudflareSocket.d.ts +24 -0
  370. package/src/sockets/CloudflareSocket.d.ts.map +1 -0
  371. package/src/sockets/CloudflareSocket.js +259 -0
  372. package/src/start.d.ts.map +1 -1
  373. package/src/start.js +1 -8
  374. package/src/templates/project/basic/app/Middleware/index.ts.tpl +1 -1
  375. package/src/templates/project/basic/src/zintrust.plugins.wg.ts.tpl +8 -0
  376. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -1
  377. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +4 -2
  378. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
  379. package/src/tools/mail/drivers/Smtp.js +223 -18
  380. package/src/tools/mail/index.d.ts.map +1 -1
  381. package/src/tools/mail/index.js +5 -4
  382. package/src/tools/mail/template-loader.d.ts.map +1 -1
  383. package/src/tools/mail/template-loader.js +197 -29
  384. package/src/tools/mail/templates/auth-password-reset.d.ts +3 -0
  385. package/src/tools/mail/templates/auth-password-reset.d.ts.map +1 -0
  386. package/src/tools/mail/templates/auth-password-reset.js +231 -0
  387. package/src/tools/mail/templates/auth-welcome.d.ts +3 -0
  388. package/src/tools/mail/templates/auth-welcome.d.ts.map +1 -0
  389. package/src/tools/mail/templates/auth-welcome.js +236 -0
  390. package/src/tools/mail/templates/general.d.ts +3 -0
  391. package/src/tools/mail/templates/general.d.ts.map +1 -0
  392. package/src/tools/mail/templates/general.js +109 -0
  393. package/src/tools/mail/templates/index.js +2 -2
  394. package/src/tools/mail/templates/job-completed.d.ts +3 -0
  395. package/src/tools/mail/templates/job-completed.d.ts.map +1 -0
  396. package/src/tools/mail/templates/job-completed.js +188 -0
  397. package/src/tools/mail/templates/notifications-new-comment.d.ts +3 -0
  398. package/src/tools/mail/templates/notifications-new-comment.d.ts.map +1 -0
  399. package/src/tools/mail/templates/notifications-new-comment.js +228 -0
  400. package/src/tools/mail/templates/password-reset.d.ts +3 -0
  401. package/src/tools/mail/templates/password-reset.d.ts.map +1 -0
  402. package/src/tools/mail/templates/password-reset.js +221 -0
  403. package/src/tools/mail/templates/performance-report.d.ts +3 -0
  404. package/src/tools/mail/templates/performance-report.d.ts.map +1 -0
  405. package/src/tools/mail/templates/performance-report.js +258 -0
  406. package/src/tools/mail/templates/welcome.d.ts +3 -0
  407. package/src/tools/mail/templates/welcome.d.ts.map +1 -0
  408. package/src/tools/mail/templates/welcome.js +187 -0
  409. package/src/tools/mail/templates/worker-alert.d.ts +3 -0
  410. package/src/tools/mail/templates/worker-alert.d.ts.map +1 -0
  411. package/src/tools/mail/templates/worker-alert.js +229 -0
  412. package/src/tools/notification/Notification.js +1 -1
  413. package/src/tools/notification/testingHelpers.js +6 -5
  414. package/src/tools/queue/AdvancedQueue.js +2 -6
  415. package/src/tools/queue/IdempotencyManager.d.ts +6 -0
  416. package/src/tools/queue/IdempotencyManager.d.ts.map +1 -0
  417. package/src/tools/queue/IdempotencyManager.js +36 -0
  418. package/src/tools/queue/JobHeartbeatStore.d.ts +16 -0
  419. package/src/tools/queue/JobHeartbeatStore.d.ts.map +1 -0
  420. package/src/tools/queue/JobHeartbeatStore.js +67 -0
  421. package/src/tools/queue/JobReconciliationRunner.d.ts +16 -0
  422. package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -0
  423. package/src/tools/queue/JobReconciliationRunner.js +88 -0
  424. package/src/tools/queue/JobRecoveryDaemon.d.ts +27 -0
  425. package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -0
  426. package/src/tools/queue/JobRecoveryDaemon.js +205 -0
  427. package/src/tools/queue/JobStateTracker.d.ts +131 -0
  428. package/src/tools/queue/JobStateTracker.d.ts.map +1 -0
  429. package/src/tools/queue/JobStateTracker.js +387 -0
  430. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts +12 -0
  431. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -0
  432. package/src/tools/queue/JobStateTrackerDbPersistence.js +148 -0
  433. package/src/tools/queue/Queue.d.ts.map +1 -1
  434. package/src/tools/queue/Queue.js +160 -16
  435. package/src/tools/queue/QueueDataRedactor.d.ts +6 -0
  436. package/src/tools/queue/QueueDataRedactor.d.ts.map +1 -0
  437. package/src/tools/queue/QueueDataRedactor.js +45 -0
  438. package/src/tools/queue/QueueExtensions.d.ts.map +1 -1
  439. package/src/tools/queue/QueueExtensions.js +2 -1
  440. package/src/tools/queue/QueueReliabilityMetrics.d.ts +38 -0
  441. package/src/tools/queue/QueueReliabilityMetrics.d.ts.map +1 -0
  442. package/src/tools/queue/QueueReliabilityMetrics.js +131 -0
  443. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts +7 -0
  444. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts.map +1 -0
  445. package/src/tools/queue/QueueReliabilityOrchestrator.js +59 -0
  446. package/src/tools/queue/QueueRuntimeRegistration.d.ts +1 -9
  447. package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
  448. package/src/tools/queue/QueueRuntimeRegistration.js +75 -4
  449. package/src/tools/queue/QueueTracing.d.ts +32 -0
  450. package/src/tools/queue/QueueTracing.d.ts.map +1 -0
  451. package/src/tools/queue/QueueTracing.js +151 -0
  452. package/src/tools/queue/StalledJobMonitor.d.ts +5 -0
  453. package/src/tools/queue/StalledJobMonitor.d.ts.map +1 -0
  454. package/src/tools/queue/StalledJobMonitor.js +21 -0
  455. package/src/tools/queue/TimeoutManager.d.ts +14 -0
  456. package/src/tools/queue/TimeoutManager.d.ts.map +1 -0
  457. package/src/tools/queue/TimeoutManager.js +77 -0
  458. package/src/tools/queue/drivers/Redis.d.ts +1 -0
  459. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  460. package/src/tools/queue/drivers/Redis.js +1 -0
  461. package/src/tools/queue/index.d.ts +10 -0
  462. package/src/tools/queue/index.d.ts.map +1 -1
  463. package/src/tools/queue/index.js +10 -0
  464. package/src/tools/redis/RedisKeyManager.d.ts +3 -0
  465. package/src/tools/redis/RedisKeyManager.d.ts.map +1 -1
  466. package/src/tools/redis/RedisKeyManager.js +15 -0
  467. package/src/tools/storage/drivers/R2.d.ts +13 -0
  468. package/src/tools/storage/drivers/R2.d.ts.map +1 -1
  469. package/src/tools/storage/drivers/R2.js +29 -0
  470. package/src/zintrust.plugins.d.ts +9 -0
  471. package/src/zintrust.plugins.d.ts.map +1 -0
  472. package/src/zintrust.plugins.js +7 -0
  473. package/src/zintrust.plugins.wg.d.ts +9 -0
  474. package/src/zintrust.plugins.wg.d.ts.map +1 -0
  475. package/src/zintrust.plugins.wg.js +7 -0
@@ -0,0 +1,229 @@
1
+ export default `<!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Worker Alert</title>
7
+ <style>
8
+ body {
9
+ margin: 0;
10
+ padding: 0;
11
+ background-color: #0b1220;
12
+ font-family:
13
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
14
+ }
15
+
16
+ .email-container {
17
+ max-width: 600px;
18
+ margin: 40px auto;
19
+ background-color: #0f172a;
20
+ border: 1px solid #334155;
21
+ border-radius: 12px;
22
+ overflow: hidden;
23
+ }
24
+
25
+ .header {
26
+ padding: 40px 40px 30px;
27
+ text-align: center;
28
+ background: linear-gradient(180deg, rgba(239, 68, 68, 0.15), rgba(220, 38, 38, 0.08));
29
+ border-bottom: 1px solid #334155;
30
+ }
31
+
32
+ .icon {
33
+ width: 48px;
34
+ height: 48px;
35
+ margin: 0 auto 20px;
36
+ border-radius: 12px;
37
+ border: 1px solid rgba(239, 68, 68, 0.35);
38
+ background: linear-gradient(180deg, rgba(239, 68, 68, 0.2), rgba(220, 38, 38, 0.1));
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ }
43
+
44
+ .title {
45
+ margin: 0 0 8px;
46
+ font-size: 28px;
47
+ font-weight: 700;
48
+ color: #e2e8f0;
49
+ line-height: 1.2;
50
+ }
51
+
52
+ .subtitle {
53
+ margin: 0;
54
+ font-size: 16px;
55
+ color: #e2e8f0;
56
+ line-height: 1.5;
57
+ }
58
+
59
+ .content {
60
+ padding: 40px;
61
+ }
62
+
63
+ .greeting {
64
+ margin: 0 0 24px;
65
+ font-size: 15px;
66
+ color: #e2e8f0;
67
+ line-height: 1.6;
68
+ }
69
+
70
+ .alert-box {
71
+ margin-bottom: 30px;
72
+ padding: 20px;
73
+ background: rgba(239, 68, 68, 0.1);
74
+ border: 1px solid rgba(239, 68, 68, 0.3);
75
+ border-radius: 8px;
76
+ }
77
+
78
+ .alert-level {
79
+ margin: 0 0 12px;
80
+ font-size: 14px;
81
+ font-weight: 700;
82
+ color: #fca5a5;
83
+ text-transform: uppercase;
84
+ letter-spacing: 0.05em;
85
+ }
86
+
87
+ .alert-message {
88
+ margin: 0;
89
+ font-size: 16px;
90
+ color: #e2e8f0;
91
+ line-height: 1.6;
92
+ }
93
+
94
+ .details-table {
95
+ margin-bottom: 30px;
96
+ border-radius: 8px;
97
+ overflow: hidden;
98
+ background: rgba(15, 23, 42, 0.65);
99
+ border: 1px solid #334155;
100
+ }
101
+
102
+ .details-table table {
103
+ width: 100%;
104
+ border-collapse: collapse;
105
+ }
106
+
107
+ .details-table th {
108
+ padding: 8px 0;
109
+ color: #94a3b8;
110
+ font-size: 14px;
111
+ border-bottom: 1px solid #334155;
112
+ text-align: left;
113
+ }
114
+
115
+ .details-table td {
116
+ padding: 8px 0;
117
+ font-size: 14px;
118
+ border-bottom: 1px solid rgba(51, 65, 85, 0.5);
119
+ }
120
+
121
+ .details-table .label {
122
+ color: #94a3b8;
123
+ width: 140px;
124
+ }
125
+
126
+ .details-table .value {
127
+ color: #e2e8f0;
128
+ font-weight: 500;
129
+ }
130
+
131
+ .details-table .value.error {
132
+ color: #fca5a5;
133
+ font-family: 'Courier New', monospace;
134
+ }
135
+
136
+ .details-table .value.monospace {
137
+ font-family: 'Courier New', monospace;
138
+ }
139
+
140
+ .button-container {
141
+ margin-bottom: 30px;
142
+ text-align: center;
143
+ }
144
+
145
+ .view-details-button {
146
+ display: inline-block;
147
+ padding: 14px 32px;
148
+ background: linear-gradient(135deg, #dc2626, #b91c1c);
149
+ color: #ffffff;
150
+ text-decoration: none;
151
+ border-radius: 8px;
152
+ font-weight: 600;
153
+ font-size: 15px;
154
+ border: 1px solid rgba(220, 38, 38, 0.5);
155
+ }
156
+
157
+ .footer {
158
+ padding: 30px 40px;
159
+ background: rgba(15, 23, 42, 0.65);
160
+ border-top: 1px solid #334155;
161
+ text-align: center;
162
+ }
163
+
164
+ .footer p {
165
+ margin: 0;
166
+ font-size: 12px;
167
+ color: #64748b;
168
+ }
169
+ </style>
170
+ </head>
171
+ <body>
172
+ <div class="email-container">
173
+ <!-- Header -->
174
+ <div class="header">
175
+ <div class="icon">
176
+ <span style="font-size: 24px">⚠️</span>
177
+ </div>
178
+ <h1 class="title">Worker Alert</h1>
179
+ <p class="subtitle">Action required for worker issue</p>
180
+ </div>
181
+
182
+ <!-- Main Content -->
183
+ <div class="content">
184
+ <p class="greeting">Hi <strong style="color: #e2e8f0">{{name}}</strong>,</p>
185
+
186
+ <div class="alert-box">
187
+ <p class="alert-level">{{alert_level}}</p>
188
+ <p class="alert-message">{{alert_message}}</p>
189
+ </div>
190
+
191
+ <!-- Worker Details -->
192
+ <div class="details-table">
193
+ <table>
194
+ <tr>
195
+ <th class="label">Worker:</th>
196
+ <td class="value">{{worker_name}}</td>
197
+ </tr>
198
+ <tr>
199
+ <th class="label">Queue:</th>
200
+ <td class="value">{{queue_name}}</td>
201
+ </tr>
202
+ <tr>
203
+ <th class="label">Job ID:</th>
204
+ <td class="value monospace">{{job_id}}</td>
205
+ </tr>
206
+ <tr>
207
+ <th class="label">Timestamp:</th>
208
+ <td class="value">{{timestamp}}</td>
209
+ </tr>
210
+ <tr>
211
+ <th class="label">Error:</th>
212
+ <td class="value error">{{error_message}}</td>
213
+ </tr>
214
+ </table>
215
+ </div>
216
+
217
+ <!-- CTA Button -->
218
+ <div class="button-container">
219
+ <a href="{{dashboard_url}}" class="view-details-button">View Details</a>
220
+ </div>
221
+ </div>
222
+
223
+ <!-- Footer -->
224
+ <div class="footer">
225
+ <p>&copy; {{year}} {{APP_NAME}}. All rights reserved.</p>
226
+ </div>
227
+ </div>
228
+ </body>
229
+ </html>`;
@@ -20,7 +20,7 @@ export const Notification = Object.freeze({
20
20
  timestamp,
21
21
  attempts: 0,
22
22
  });
23
- return messageId;
23
+ return messageId ?? '';
24
24
  },
25
25
  queue(queueName) {
26
26
  return Object.freeze({
@@ -1,3 +1,4 @@
1
+ import { Env } from '../../config/env.js';
1
2
  import { NotificationRegistry } from './Registry.js';
2
3
  import NotificationFake from './testing.js';
3
4
  export const useFakeDriver = (name = 'notification-fake', fake = NotificationFake) => {
@@ -10,8 +11,8 @@ export const useFakeDriver = (name = 'notification-fake', fake = NotificationFak
10
11
  }
11
12
  const fakeDriver = fake;
12
13
  NotificationRegistry.register(name, fakeDriver);
13
- const prevEnv = process.env['NOTIFICATION_DRIVER'];
14
- process.env['NOTIFICATION_DRIVER'] = name;
14
+ const prevEnv = Env.get('NOTIFICATION_DRIVER', '');
15
+ Env.set('NOTIFICATION_DRIVER', name);
15
16
  return {
16
17
  driverName: name,
17
18
  restore() {
@@ -22,10 +23,10 @@ export const useFakeDriver = (name = 'notification-fake', fake = NotificationFak
22
23
  else {
23
24
  NotificationRegistry.register(name, previous);
24
25
  }
25
- if (prevEnv === undefined)
26
- delete process.env['NOTIFICATION_DRIVER'];
26
+ if (prevEnv === '')
27
+ Env.unset('NOTIFICATION_DRIVER');
27
28
  else
28
- process.env['NOTIFICATION_DRIVER'] = prevEnv;
29
+ Env.set('NOTIFICATION_DRIVER', prevEnv);
29
30
  },
30
31
  };
31
32
  };
@@ -8,7 +8,7 @@ import { queueConfig } from '../../config/queue.js';
8
8
  import { createValidationError } from '../../exceptions/ZintrustError.js';
9
9
  import { ZintrustLang } from '../../lang/lang.js';
10
10
  import { createLockProvider, getLockProvider, registerLockProvider } from './LockProvider.js';
11
- import { Queue } from './Queue.js';
11
+ import { Queue, resolveLockPrefix } from './Queue.js';
12
12
  /**
13
13
  * Creates an advanced queue instance with deduplication capabilities
14
14
  * @param config - Queue configuration
@@ -57,10 +57,6 @@ function resolveLockProviderName(config) {
57
57
  return envProvider;
58
58
  return ZintrustLang.MEMORY;
59
59
  }
60
- function resolveLockPrefix() {
61
- const fromEnv = Env.get('QUEUE_LOCK_PREFIX', '').trim();
62
- return fromEnv.length > 0 ? fromEnv : ZintrustLang.ZINTRUST_LOCKS_PREFIX;
63
- }
64
60
  function resolveDefaultLockTtl(config) {
65
61
  return Env.getInt('QUEUE_DEFAULT_DEDUP_TTL', config.defaultDedupTtl ?? ZintrustLang.ZINTRUST_LOCKS_TTL);
66
62
  }
@@ -217,7 +213,7 @@ async function enqueueWithDeduplication(name, payload, options, defaultLockProvi
217
213
  uniqueId: options.uniqueId,
218
214
  duration: Date.now() - startTime,
219
215
  });
220
- return jobId;
216
+ return jobId ?? '';
221
217
  }
222
218
  catch (error) {
223
219
  Logger.error('Failed to enqueue job', {
@@ -0,0 +1,6 @@
1
+ import { type BullMQPayload } from './Queue';
2
+ export declare const IdempotencyManager: Readonly<{
3
+ enqueueIdempotent(queueName: string, payload: BullMQPayload, idempotencyKey: string, ttlMs?: number): Promise<string>;
4
+ }>;
5
+ export default IdempotencyManager;
6
+ //# sourceMappingURL=IdempotencyManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdempotencyManager.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/IdempotencyManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAOzD,eAAO,MAAM,kBAAkB;iCAEhB,MAAM,WACR,aAAa,kBACN,MAAM,mBAErB,OAAO,CAAC,MAAM,CAAC;EA8BlB,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { useDatabase } from '../../orm/Database.js';
3
+ import { Queue } from './Queue.js';
4
+ const getDb = () => useDatabase(undefined, Env.get('JOB_TRACKING_DB_CONNECTION', 'default'));
5
+ const toSqlDateTime = (value) => value.toISOString().slice(0, 19).replace('T', ' ');
6
+ export const IdempotencyManager = Object.freeze({
7
+ async enqueueIdempotent(queueName, payload, idempotencyKey, ttlMs = Env.getInt('IDEMPOTENCY_DEFAULT_TTL_MS', 86400000)) {
8
+ const key = idempotencyKey.trim();
9
+ if (key === '') {
10
+ return Queue.enqueue(queueName, payload);
11
+ }
12
+ if (Env.getBool('JOB_TRACKING_PERSISTENCE_ENABLED', false)) {
13
+ const db = getDb();
14
+ const cutoff = new Date(Date.now() - Math.max(1000, ttlMs));
15
+ const row = await db
16
+ .table(Env.get('JOB_TRACKING_DB_TABLE', 'zintrust_jobs'))
17
+ .select('job_id', 'status')
18
+ .where('idempotency_key', '=', key)
19
+ .where('created_at', '>=', toSqlDateTime(cutoff))
20
+ .whereIn('status', ['pending', 'active', 'completed'])
21
+ .first();
22
+ if (row?.job_id !== undefined)
23
+ return row.job_id;
24
+ }
25
+ return Queue.enqueue(queueName, {
26
+ ...payload,
27
+ uniqueId: key,
28
+ deduplication: {
29
+ id: key,
30
+ ttl: ttlMs,
31
+ },
32
+ __zintrustIdempotencyKey: key,
33
+ });
34
+ },
35
+ });
36
+ export default IdempotencyManager;
@@ -0,0 +1,16 @@
1
+ export declare const JobHeartbeatStore: Readonly<{
2
+ getIntervalMs(): number;
3
+ heartbeat(input: {
4
+ queueName: string;
5
+ jobId: string;
6
+ workerInstanceId?: string;
7
+ intervalMs?: number;
8
+ }): Promise<void>;
9
+ remove(queueName: string, jobId: string): Promise<void>;
10
+ listExpired(limit?: number): Promise<Array<{
11
+ queueName: string;
12
+ jobId: string;
13
+ }>>;
14
+ }>;
15
+ export default JobHeartbeatStore;
16
+ //# sourceMappingURL=JobHeartbeatStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobHeartbeatStore.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobHeartbeatStore.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,iBAAiB;qBACX,MAAM;qBAIA;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;sBAmCO,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;iCAU7B,OAAO,CAAC,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;EAgBpF,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { useDatabase } from '../../orm/Database.js';
3
+ const HEARTBEAT_TABLE = 'zintrust_job_heartbeats';
4
+ const getConnection = () => useDatabase(undefined, Env.get('JOB_TRACKING_DB_CONNECTION', 'default'));
5
+ const now = () => new Date();
6
+ const toSqlDateTime = (value) => value.toISOString().slice(0, 19).replace('T', ' ');
7
+ export const JobHeartbeatStore = Object.freeze({
8
+ getIntervalMs() {
9
+ return Math.max(1000, Env.getInt('JOB_HEARTBEAT_INTERVAL_MS', 10000));
10
+ },
11
+ async heartbeat(input) {
12
+ if (!Env.getBool('JOB_TRACKING_PERSISTENCE_ENABLED', false))
13
+ return;
14
+ const db = getConnection();
15
+ const intervalMs = input.intervalMs ?? this.getIntervalMs();
16
+ const current = now();
17
+ const expected = new Date(current.getTime() + intervalMs * 2);
18
+ const payload = {
19
+ queue_name: input.queueName,
20
+ job_id: input.jobId,
21
+ worker_instance_id: input.workerInstanceId ?? null,
22
+ heartbeat_interval_ms: intervalMs,
23
+ last_heartbeat_at: toSqlDateTime(current),
24
+ expected_next_heartbeat_at: toSqlDateTime(expected),
25
+ updated_at: toSqlDateTime(current),
26
+ };
27
+ const existing = await db
28
+ .table(HEARTBEAT_TABLE)
29
+ .where('queue_name', '=', input.queueName)
30
+ .where('job_id', '=', input.jobId)
31
+ .first();
32
+ if (existing !== null && existing !== undefined) {
33
+ await db.table(HEARTBEAT_TABLE).where('id', '=', existing.id).update(payload);
34
+ return;
35
+ }
36
+ await db.table(HEARTBEAT_TABLE).insert({
37
+ ...payload,
38
+ created_at: toSqlDateTime(current),
39
+ });
40
+ },
41
+ async remove(queueName, jobId) {
42
+ if (!Env.getBool('JOB_TRACKING_PERSISTENCE_ENABLED', false))
43
+ return;
44
+ const db = getConnection();
45
+ await db
46
+ .table(HEARTBEAT_TABLE)
47
+ .where('queue_name', '=', queueName)
48
+ .where('job_id', '=', jobId)
49
+ .delete();
50
+ },
51
+ async listExpired(limit = 500) {
52
+ if (!Env.getBool('JOB_TRACKING_PERSISTENCE_ENABLED', false))
53
+ return [];
54
+ const db = getConnection();
55
+ const rows = await db
56
+ .table(HEARTBEAT_TABLE)
57
+ .select('queue_name', 'job_id')
58
+ .where('expected_next_heartbeat_at', '<=', toSqlDateTime(now()))
59
+ .limit(Math.max(1, limit))
60
+ .get();
61
+ return (rows ?? []).map((row) => ({
62
+ queueName: row.queue_name,
63
+ jobId: row.job_id,
64
+ }));
65
+ },
66
+ });
67
+ export default JobHeartbeatStore;
@@ -0,0 +1,16 @@
1
+ export declare const JobReconciliationRunner: Readonly<{
2
+ reconcileInMemory(): Promise<{
3
+ stalled: number;
4
+ timeout: number;
5
+ }>;
6
+ reconcileFromPersistence(limit?: number): Promise<number>;
7
+ runOnce(): Promise<{
8
+ inMemory: {
9
+ stalled: number;
10
+ timeout: number;
11
+ };
12
+ persisted: number;
13
+ }>;
14
+ }>;
15
+ export default JobReconciliationRunner;
16
+ //# sourceMappingURL=JobReconciliationRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobReconciliationRunner.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobReconciliationRunner.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,uBAAuB;yBACP,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;8CA6B3B,OAAO,CAAC,MAAM,CAAC;eAwC3C,OAAO,CAAC;QAAE,QAAQ,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;EAc/F,CAAC;AAEH,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { Logger } from '../../config/logger.js';
3
+ import { useDatabase } from '../../orm/Database.js';
4
+ import { JobStateTracker } from './JobStateTracker.js';
5
+ const getDb = () => useDatabase(undefined, Env.get('JOB_TRACKING_DB_CONNECTION', 'default'));
6
+ const toSqlDateTime = (value) => value.toISOString().slice(0, 19).replace('T', ' ');
7
+ const mapPersistedStatus = (raw) => {
8
+ if (typeof raw !== 'string')
9
+ return null;
10
+ const value = raw.trim().toLowerCase();
11
+ const allowed = [
12
+ 'pending',
13
+ 'active',
14
+ 'completed',
15
+ 'failed',
16
+ 'stalled',
17
+ 'timeout',
18
+ 'pending_recovery',
19
+ 'dead_letter',
20
+ 'manual_review',
21
+ 'delayed',
22
+ ];
23
+ return (allowed.find((entry) => entry === value) ?? null);
24
+ };
25
+ export const JobReconciliationRunner = Object.freeze({
26
+ async reconcileInMemory() {
27
+ const timeoutMs = Math.max(1000, Env.getInt('QUEUE_JOB_TIMEOUT', 60) * 1000);
28
+ const heartbeatGraceMs = Math.max(1000, Env.getInt('JOB_HEARTBEAT_GRACE_MS', 20000));
29
+ const staleHeartbeats = JobStateTracker.listHeartbeatExpired(heartbeatGraceMs);
30
+ await Promise.all(staleHeartbeats.map(async (row) => JobStateTracker.stalled({
31
+ queueName: row.queueName,
32
+ jobId: row.jobId,
33
+ reason: 'Missing heartbeat during reconciliation',
34
+ })));
35
+ const timedOut = JobStateTracker.listActiveOlderThan(timeoutMs);
36
+ await Promise.all(timedOut.map(async (row) => JobStateTracker.timedOut({
37
+ queueName: row.queueName,
38
+ jobId: row.jobId,
39
+ reason: 'Exceeded queue timeout during reconciliation',
40
+ })));
41
+ return { stalled: staleHeartbeats.length, timeout: timedOut.length };
42
+ },
43
+ async reconcileFromPersistence(limit = 500) {
44
+ if (!Env.getBool('JOB_TRACKING_PERSISTENCE_ENABLED', false))
45
+ return 0;
46
+ const db = getDb();
47
+ const staleAfterMs = Math.max(1000, Env.getInt('JOB_RECONCILIATION_STALE_MS', 120000));
48
+ const cutoff = new Date(Date.now() - staleAfterMs);
49
+ const rows = await db
50
+ .table(Env.get('JOB_TRACKING_DB_TABLE', 'zintrust_jobs'))
51
+ .select('queue_name', 'job_id', 'status', 'updated_at')
52
+ .whereIn('status', ['active', 'pending'])
53
+ .where('updated_at', '<=', toSqlDateTime(cutoff))
54
+ .limit(Math.max(1, limit))
55
+ .get();
56
+ const actionableRows = (rows ?? []).filter((row) => mapPersistedStatus(row.status) !== null);
57
+ await Promise.all(actionableRows.map(async (row) => {
58
+ const status = mapPersistedStatus(row.status);
59
+ if (status === 'active') {
60
+ await JobStateTracker.stalled({
61
+ queueName: row.queue_name,
62
+ jobId: row.job_id,
63
+ reason: 'Persisted active job stale during reconciliation',
64
+ });
65
+ return;
66
+ }
67
+ await JobStateTracker.pendingRecovery({
68
+ queueName: row.queue_name,
69
+ jobId: row.job_id,
70
+ reason: 'Persisted pending job stale during reconciliation',
71
+ });
72
+ }));
73
+ return actionableRows.length;
74
+ },
75
+ async runOnce() {
76
+ const inMemory = await this.reconcileInMemory();
77
+ const persisted = await this.reconcileFromPersistence();
78
+ if (inMemory.stalled > 0 || inMemory.timeout > 0 || persisted > 0) {
79
+ Logger.warn('Queue reconciliation updated jobs', {
80
+ stalled: inMemory.stalled,
81
+ timeout: inMemory.timeout,
82
+ persisted,
83
+ });
84
+ }
85
+ return { inMemory, persisted };
86
+ },
87
+ });
88
+ export default JobReconciliationRunner;
@@ -0,0 +1,27 @@
1
+ import { type JobTrackingRecord } from './JobStateTracker';
2
+ export type DlqReplayReasonCode = 'bug_fixed' | 'transient_dependency' | 'operator_override';
3
+ type DlqReplayRequest = {
4
+ reasonCode: DlqReplayReasonCode;
5
+ replayedBy: string;
6
+ queueName?: string;
7
+ limit?: number;
8
+ maxPerSecond?: number;
9
+ minAgeMs?: number;
10
+ };
11
+ type DlqReplayResult = {
12
+ scanned: number;
13
+ replayed: number;
14
+ skipped: number;
15
+ };
16
+ export declare const JobRecoveryDaemon: Readonly<{
17
+ recoverOne(record: JobTrackingRecord): Promise<"requeued" | "dead_letter" | "manual_review">;
18
+ runOnce(): Promise<{
19
+ scanned: number;
20
+ requeued: number;
21
+ deadLetter: number;
22
+ manualReview: number;
23
+ }>;
24
+ replayDeadLetter(input: DlqReplayRequest): Promise<DlqReplayResult>;
25
+ }>;
26
+ export default JobRecoveryDaemon;
27
+ //# sourceMappingURL=JobRecoveryDaemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobRecoveryDaemon.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/JobRecoveryDaemon.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAejF,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;AAE7F,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAuFF,eAAO,MAAM,iBAAiB;uBAElB,iBAAiB,GACxB,OAAO,CAAC,UAAU,GAAG,aAAa,GAAG,eAAe,CAAC;eAyCvC,OAAO,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;4BAkC4B,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;EA2DzE,CAAC;AAEH,eAAe,iBAAiB,CAAC"}