@zintrust/core 0.1.40 → 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 (460) 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 -290
  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 -5
  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 +132 -17
  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.js +16 -15
  110. package/src/cli/workers/QueueWorkRunner.js +1 -1
  111. package/src/common/HealthRoutes.d.ts.map +1 -1
  112. package/src/common/HealthRoutes.js +50 -2
  113. package/src/common/RemoteSignedJson.d.ts +1 -0
  114. package/src/common/RemoteSignedJson.d.ts.map +1 -1
  115. package/src/common/RemoteSignedJson.js +39 -13
  116. package/src/common/index.d.ts +1 -0
  117. package/src/common/index.d.ts.map +1 -1
  118. package/src/common/index.js +12 -1
  119. package/src/config/FileLogWriter.d.ts.map +1 -1
  120. package/src/config/FileLogWriter.js +21 -6
  121. package/src/config/app.d.ts +4 -0
  122. package/src/config/app.d.ts.map +1 -1
  123. package/src/config/app.js +4 -0
  124. package/src/config/cache.d.ts.map +1 -1
  125. package/src/config/cache.js +22 -2
  126. package/src/config/cloudflare.d.ts +5 -1
  127. package/src/config/cloudflare.d.ts.map +1 -1
  128. package/src/config/cloudflare.js +48 -0
  129. package/src/config/database.d.ts.map +1 -1
  130. package/src/config/database.js +48 -13
  131. package/src/config/env.d.ts +87 -2
  132. package/src/config/env.d.ts.map +1 -1
  133. package/src/config/env.js +156 -17
  134. package/src/config/index.d.ts +1 -0
  135. package/src/config/index.d.ts.map +1 -1
  136. package/src/config/mail.d.ts.map +1 -1
  137. package/src/config/mail.js +16 -10
  138. package/src/config/middleware.d.ts +5 -0
  139. package/src/config/middleware.d.ts.map +1 -1
  140. package/src/config/middleware.js +19 -1
  141. package/src/config/queue.d.ts.map +1 -1
  142. package/src/config/queue.js +70 -9
  143. package/src/config/redis.d.ts.map +1 -1
  144. package/src/config/redis.js +48 -13
  145. package/src/config/storage.d.ts.map +1 -1
  146. package/src/config/storage.js +1 -0
  147. package/src/config/type.d.ts +18 -0
  148. package/src/config/type.d.ts.map +1 -1
  149. package/src/config/workers.d.ts.map +1 -1
  150. package/src/config/workers.js +122 -16
  151. package/src/functions/cloudflare.d.ts.map +1 -1
  152. package/src/functions/cloudflare.js +55 -1
  153. package/src/health/StartupHealthChecks.js +1 -1
  154. package/src/http/FileUpload.d.ts +3 -2
  155. package/src/http/FileUpload.d.ts.map +1 -1
  156. package/src/http/Kernel.d.ts.map +1 -1
  157. package/src/http/Kernel.js +2 -1
  158. package/src/http/error-pages/ErrorPageRenderer.d.ts +4 -0
  159. package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -1
  160. package/src/http/error-pages/ErrorPageRenderer.js +141 -1
  161. package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
  162. package/src/http/middleware/BodyParsingMiddleware.js +33 -6
  163. package/src/index.d.ts +25 -53
  164. package/src/index.d.ts.map +1 -1
  165. package/src/index.js +30 -14
  166. package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
  167. package/src/microservices/ServiceAuthMiddleware.js +12 -4
  168. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  169. package/src/middleware/CsrfMiddleware.js +30 -16
  170. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
  171. package/src/middleware/ErrorHandlerMiddleware.js +2 -1
  172. package/src/migrations/MigrationLoader.js +1 -1
  173. package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
  174. package/src/migrations/schema/SchemaCompiler.js +6 -3
  175. package/src/node-singletons/crypto.d.ts +1 -1
  176. package/src/node-singletons/crypto.d.ts.map +1 -1
  177. package/src/node-singletons/crypto.js +1 -1
  178. package/src/node-singletons/fs.d.ts +1 -1
  179. package/src/node-singletons/fs.d.ts.map +1 -1
  180. package/src/node-singletons/path.d.ts +1 -1
  181. package/src/node-singletons/path.d.ts.map +1 -1
  182. package/src/node-singletons/path.js +1 -1
  183. package/src/node-singletons/stream.d.ts +11 -0
  184. package/src/node-singletons/stream.d.ts.map +1 -0
  185. package/src/node-singletons/stream.js +8 -0
  186. package/src/observability/OpenTelemetry.d.ts +7 -0
  187. package/src/observability/OpenTelemetry.d.ts.map +1 -1
  188. package/src/observability/OpenTelemetry.js +49 -2
  189. package/src/orm/Database.d.ts +4 -0
  190. package/src/orm/Database.d.ts.map +1 -1
  191. package/src/orm/Database.js +80 -9
  192. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  193. package/src/orm/DatabaseRuntimeRegistration.js +2 -0
  194. package/src/orm/QueryBuilder.d.ts +1 -0
  195. package/src/orm/QueryBuilder.d.ts.map +1 -1
  196. package/src/orm/QueryBuilder.js +33 -3
  197. package/src/orm/SchemaCompiler.d.ts.map +1 -1
  198. package/src/orm/SchemaCompiler.js +6 -3
  199. package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
  200. package/src/orm/adapters/D1RemoteAdapter.js +14 -1
  201. package/src/orm/adapters/MongoDBProxyAdapter.d.ts +3 -0
  202. package/src/orm/adapters/MongoDBProxyAdapter.d.ts.map +1 -0
  203. package/src/orm/adapters/MongoDBProxyAdapter.js +128 -0
  204. package/src/orm/adapters/MySQLProxyAdapter.d.ts +11 -0
  205. package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -0
  206. package/src/orm/adapters/MySQLProxyAdapter.js +143 -0
  207. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts +11 -0
  208. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -0
  209. package/src/orm/adapters/PostgreSQLProxyAdapter.js +147 -0
  210. package/src/orm/adapters/ProxyCache.d.ts +9 -0
  211. package/src/orm/adapters/ProxyCache.d.ts.map +1 -0
  212. package/src/orm/adapters/ProxyCache.js +24 -0
  213. package/src/orm/adapters/ProxySignedRequest.d.ts +11 -0
  214. package/src/orm/adapters/ProxySignedRequest.d.ts.map +1 -0
  215. package/src/orm/adapters/ProxySignedRequest.js +30 -0
  216. package/src/orm/adapters/ProxySigningPath.d.ts +3 -0
  217. package/src/orm/adapters/ProxySigningPath.d.ts.map +1 -0
  218. package/src/orm/adapters/ProxySigningPath.js +25 -0
  219. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts +19 -0
  220. package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -0
  221. package/src/orm/adapters/SqlProxyAdapterUtils.js +35 -0
  222. package/src/orm/adapters/SqlServerProxyAdapter.d.ts +3 -0
  223. package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -0
  224. package/src/orm/adapters/SqlServerProxyAdapter.js +146 -0
  225. package/src/performance/Optimizer.d.ts +1 -0
  226. package/src/performance/Optimizer.d.ts.map +1 -1
  227. package/src/performance/Optimizer.js +21 -8
  228. package/src/proxy/ErrorHandler.d.ts +11 -0
  229. package/src/proxy/ErrorHandler.d.ts.map +1 -0
  230. package/src/proxy/ErrorHandler.js +7 -0
  231. package/src/proxy/PoolManager.d.ts +8 -0
  232. package/src/proxy/PoolManager.d.ts.map +1 -0
  233. package/src/proxy/PoolManager.js +18 -0
  234. package/src/proxy/ProxyBackend.d.ts +18 -0
  235. package/src/proxy/ProxyBackend.d.ts.map +1 -0
  236. package/src/proxy/ProxyBackend.js +1 -0
  237. package/src/proxy/ProxyConfig.d.ts +12 -0
  238. package/src/proxy/ProxyConfig.d.ts.map +1 -0
  239. package/src/proxy/ProxyConfig.js +1 -0
  240. package/src/proxy/ProxyRegistry.d.ts +10 -0
  241. package/src/proxy/ProxyRegistry.d.ts.map +1 -0
  242. package/src/proxy/ProxyRegistry.js +11 -0
  243. package/src/proxy/ProxyServer.d.ts +21 -0
  244. package/src/proxy/ProxyServer.d.ts.map +1 -0
  245. package/src/proxy/ProxyServer.js +84 -0
  246. package/src/proxy/ProxyServerUtils.d.ts +37 -0
  247. package/src/proxy/ProxyServerUtils.d.ts.map +1 -0
  248. package/src/proxy/ProxyServerUtils.js +42 -0
  249. package/src/proxy/ProxySigningConfigResolver.d.ts +22 -0
  250. package/src/proxy/ProxySigningConfigResolver.d.ts.map +1 -0
  251. package/src/proxy/ProxySigningConfigResolver.js +24 -0
  252. package/src/proxy/ProxySigningRequest.d.ts +12 -0
  253. package/src/proxy/ProxySigningRequest.d.ts.map +1 -0
  254. package/src/proxy/ProxySigningRequest.js +31 -0
  255. package/src/proxy/RequestValidator.d.ts +15 -0
  256. package/src/proxy/RequestValidator.d.ts.map +1 -0
  257. package/src/proxy/RequestValidator.js +25 -0
  258. package/src/proxy/SigningService.d.ts +39 -0
  259. package/src/proxy/SigningService.d.ts.map +1 -0
  260. package/src/proxy/SigningService.js +107 -0
  261. package/src/proxy/SqlPayloadValidator.d.ts +13 -0
  262. package/src/proxy/SqlPayloadValidator.d.ts.map +1 -0
  263. package/src/proxy/SqlPayloadValidator.js +14 -0
  264. package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -0
  265. package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -0
  266. package/src/proxy/d1/ZintrustD1Proxy.js +1 -0
  267. package/src/proxy/d1/register.d.ts +2 -0
  268. package/src/proxy/d1/register.d.ts.map +1 -0
  269. package/src/proxy/d1/register.js +5 -0
  270. package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -0
  271. package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -0
  272. package/src/proxy/kv/ZintrustKvProxy.js +1 -0
  273. package/src/proxy/kv/register.d.ts +2 -0
  274. package/src/proxy/kv/register.d.ts.map +1 -0
  275. package/src/proxy/kv/register.js +5 -0
  276. package/src/proxy/mongodb/MongoDBProxyServer.d.ts +33 -0
  277. package/src/proxy/mongodb/MongoDBProxyServer.d.ts.map +1 -0
  278. package/src/proxy/mongodb/MongoDBProxyServer.js +202 -0
  279. package/src/proxy/mongodb/register.d.ts +2 -0
  280. package/src/proxy/mongodb/register.d.ts.map +1 -0
  281. package/src/proxy/mongodb/register.js +5 -0
  282. package/src/proxy/mysql/MySqlProxyServer.d.ts +14 -0
  283. package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -0
  284. package/src/proxy/mysql/MySqlProxyServer.js +169 -0
  285. package/src/proxy/mysql/register.d.ts +2 -0
  286. package/src/proxy/mysql/register.d.ts.map +1 -0
  287. package/src/proxy/mysql/register.js +5 -0
  288. package/src/proxy/postgres/PostgresProxyServer.d.ts +14 -0
  289. package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -0
  290. package/src/proxy/postgres/PostgresProxyServer.js +140 -0
  291. package/src/proxy/postgres/register.d.ts +2 -0
  292. package/src/proxy/postgres/register.d.ts.map +1 -0
  293. package/src/proxy/postgres/register.js +5 -0
  294. package/src/proxy/redis/RedisProxyServer.d.ts +12 -0
  295. package/src/proxy/redis/RedisProxyServer.d.ts.map +1 -0
  296. package/src/proxy/redis/RedisProxyServer.js +192 -0
  297. package/src/proxy/redis/register.d.ts +2 -0
  298. package/src/proxy/redis/register.d.ts.map +1 -0
  299. package/src/proxy/redis/register.js +5 -0
  300. package/src/proxy/smtp/SmtpProxyServer.d.ts +19 -0
  301. package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -0
  302. package/src/proxy/smtp/SmtpProxyServer.js +289 -0
  303. package/src/proxy/smtp/register.d.ts +2 -0
  304. package/src/proxy/smtp/register.d.ts.map +1 -0
  305. package/src/proxy/smtp/register.js +5 -0
  306. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +14 -0
  307. package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -0
  308. package/src/proxy/sqlserver/SqlServerProxyServer.js +168 -0
  309. package/src/proxy/sqlserver/register.d.ts +2 -0
  310. package/src/proxy/sqlserver/register.d.ts.map +1 -0
  311. package/src/proxy/sqlserver/register.js +5 -0
  312. package/src/routes/doc.d.ts.map +1 -1
  313. package/src/routes/doc.js +16 -2
  314. package/src/routes/error.d.ts +5 -4
  315. package/src/routes/error.d.ts.map +1 -1
  316. package/src/routes/error.js +15 -13
  317. package/src/routes/errorPages.d.ts +2 -0
  318. package/src/routes/errorPages.d.ts.map +1 -1
  319. package/src/routes/errorPages.js +144 -4
  320. package/src/runtime/PluginAutoImports.d.ts +1 -0
  321. package/src/runtime/PluginAutoImports.d.ts.map +1 -1
  322. package/src/runtime/PluginAutoImports.js +94 -9
  323. package/src/runtime/RuntimeAdapter.d.ts +8 -9
  324. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  325. package/src/runtime/RuntimeAdapter.js +120 -34
  326. package/src/runtime/RuntimeServices.d.ts +47 -0
  327. package/src/runtime/RuntimeServices.d.ts.map +1 -0
  328. package/src/runtime/RuntimeServices.js +164 -0
  329. package/src/runtime/StartupConfigFileRegistry.d.ts +4 -4
  330. package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
  331. package/src/runtime/StartupConfigFileRegistry.js +12 -0
  332. package/src/runtime/WorkerAdapterImports.d.ts +5 -0
  333. package/src/runtime/WorkerAdapterImports.d.ts.map +1 -0
  334. package/src/runtime/WorkerAdapterImports.js +17 -0
  335. package/src/runtime/WorkersModule.d.ts +6 -0
  336. package/src/runtime/WorkersModule.d.ts.map +1 -0
  337. package/src/runtime/WorkersModule.js +278 -0
  338. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  339. package/src/runtime/adapters/CloudflareAdapter.js +19 -2
  340. package/src/runtime/adapters/DenoAdapter.js +1 -0
  341. package/src/runtime/adapters/FargateAdapter.js +1 -1
  342. package/src/runtime/adapters/LambdaAdapter.js +1 -1
  343. package/src/runtime/adapters/NodeServerAdapter.js +1 -1
  344. package/src/runtime/detectRuntime.d.ts +10 -0
  345. package/src/runtime/detectRuntime.d.ts.map +1 -0
  346. package/src/runtime/detectRuntime.js +57 -0
  347. package/src/runtime/useFileLoader.d.ts.map +1 -1
  348. package/src/runtime/useFileLoader.js +16 -0
  349. package/src/scripts/TemplateImportsCheck.js +2 -2
  350. package/src/scripts/TemplateSync.js +3 -4
  351. package/src/security/CsrfTokenManager.d.ts.map +1 -1
  352. package/src/security/CsrfTokenManager.js +12 -0
  353. package/src/security/Hash.d.ts +1 -1
  354. package/src/security/Hash.d.ts.map +1 -1
  355. package/src/security/Hash.js +31 -36
  356. package/src/seeders/SeederLoader.js +1 -1
  357. package/src/session/SessionManager.d.ts +3 -0
  358. package/src/session/SessionManager.d.ts.map +1 -1
  359. package/src/session/SessionManager.js +49 -10
  360. package/src/sockets/CloudflareSocket.d.ts +24 -0
  361. package/src/sockets/CloudflareSocket.d.ts.map +1 -0
  362. package/src/sockets/CloudflareSocket.js +259 -0
  363. package/src/start.d.ts.map +1 -1
  364. package/src/start.js +1 -8
  365. package/src/templates/project/basic/src/zintrust.plugins.wg.ts.tpl +8 -0
  366. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
  367. package/src/tools/mail/drivers/Smtp.js +223 -18
  368. package/src/tools/mail/index.d.ts.map +1 -1
  369. package/src/tools/mail/index.js +5 -4
  370. package/src/tools/mail/template-loader.d.ts.map +1 -1
  371. package/src/tools/mail/template-loader.js +197 -29
  372. package/src/tools/mail/templates/auth-password-reset.d.ts +3 -0
  373. package/src/tools/mail/templates/auth-password-reset.d.ts.map +1 -0
  374. package/src/tools/mail/templates/auth-password-reset.js +231 -0
  375. package/src/tools/mail/templates/auth-welcome.d.ts +3 -0
  376. package/src/tools/mail/templates/auth-welcome.d.ts.map +1 -0
  377. package/src/tools/mail/templates/auth-welcome.js +236 -0
  378. package/src/tools/mail/templates/general.d.ts +3 -0
  379. package/src/tools/mail/templates/general.d.ts.map +1 -0
  380. package/src/tools/mail/templates/general.js +109 -0
  381. package/src/tools/mail/templates/index.js +2 -2
  382. package/src/tools/mail/templates/job-completed.d.ts +3 -0
  383. package/src/tools/mail/templates/job-completed.d.ts.map +1 -0
  384. package/src/tools/mail/templates/job-completed.js +188 -0
  385. package/src/tools/mail/templates/notifications-new-comment.d.ts +3 -0
  386. package/src/tools/mail/templates/notifications-new-comment.d.ts.map +1 -0
  387. package/src/tools/mail/templates/notifications-new-comment.js +228 -0
  388. package/src/tools/mail/templates/password-reset.d.ts +3 -0
  389. package/src/tools/mail/templates/password-reset.d.ts.map +1 -0
  390. package/src/tools/mail/templates/password-reset.js +221 -0
  391. package/src/tools/mail/templates/performance-report.d.ts +3 -0
  392. package/src/tools/mail/templates/performance-report.d.ts.map +1 -0
  393. package/src/tools/mail/templates/performance-report.js +258 -0
  394. package/src/tools/mail/templates/welcome.d.ts +3 -0
  395. package/src/tools/mail/templates/welcome.d.ts.map +1 -0
  396. package/src/tools/mail/templates/welcome.js +187 -0
  397. package/src/tools/mail/templates/worker-alert.d.ts +3 -0
  398. package/src/tools/mail/templates/worker-alert.d.ts.map +1 -0
  399. package/src/tools/mail/templates/worker-alert.js +229 -0
  400. package/src/tools/notification/Notification.js +1 -1
  401. package/src/tools/notification/testingHelpers.js +6 -5
  402. package/src/tools/queue/AdvancedQueue.js +2 -6
  403. package/src/tools/queue/IdempotencyManager.d.ts +6 -0
  404. package/src/tools/queue/IdempotencyManager.d.ts.map +1 -0
  405. package/src/tools/queue/IdempotencyManager.js +36 -0
  406. package/src/tools/queue/JobHeartbeatStore.d.ts +16 -0
  407. package/src/tools/queue/JobHeartbeatStore.d.ts.map +1 -0
  408. package/src/tools/queue/JobHeartbeatStore.js +67 -0
  409. package/src/tools/queue/JobReconciliationRunner.d.ts +16 -0
  410. package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -0
  411. package/src/tools/queue/JobReconciliationRunner.js +88 -0
  412. package/src/tools/queue/JobRecoveryDaemon.d.ts +27 -0
  413. package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -0
  414. package/src/tools/queue/JobRecoveryDaemon.js +205 -0
  415. package/src/tools/queue/JobStateTracker.d.ts +131 -0
  416. package/src/tools/queue/JobStateTracker.d.ts.map +1 -0
  417. package/src/tools/queue/JobStateTracker.js +387 -0
  418. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts +12 -0
  419. package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -0
  420. package/src/tools/queue/JobStateTrackerDbPersistence.js +148 -0
  421. package/src/tools/queue/Queue.d.ts.map +1 -1
  422. package/src/tools/queue/Queue.js +160 -16
  423. package/src/tools/queue/QueueDataRedactor.d.ts +6 -0
  424. package/src/tools/queue/QueueDataRedactor.d.ts.map +1 -0
  425. package/src/tools/queue/QueueDataRedactor.js +45 -0
  426. package/src/tools/queue/QueueExtensions.d.ts.map +1 -1
  427. package/src/tools/queue/QueueExtensions.js +2 -1
  428. package/src/tools/queue/QueueReliabilityMetrics.d.ts +38 -0
  429. package/src/tools/queue/QueueReliabilityMetrics.d.ts.map +1 -0
  430. package/src/tools/queue/QueueReliabilityMetrics.js +131 -0
  431. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts +7 -0
  432. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts.map +1 -0
  433. package/src/tools/queue/QueueReliabilityOrchestrator.js +59 -0
  434. package/src/tools/queue/QueueRuntimeRegistration.d.ts +1 -9
  435. package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
  436. package/src/tools/queue/QueueRuntimeRegistration.js +75 -4
  437. package/src/tools/queue/QueueTracing.d.ts +32 -0
  438. package/src/tools/queue/QueueTracing.d.ts.map +1 -0
  439. package/src/tools/queue/QueueTracing.js +151 -0
  440. package/src/tools/queue/StalledJobMonitor.d.ts +5 -0
  441. package/src/tools/queue/StalledJobMonitor.d.ts.map +1 -0
  442. package/src/tools/queue/StalledJobMonitor.js +21 -0
  443. package/src/tools/queue/TimeoutManager.d.ts +14 -0
  444. package/src/tools/queue/TimeoutManager.d.ts.map +1 -0
  445. package/src/tools/queue/TimeoutManager.js +77 -0
  446. package/src/tools/queue/drivers/Redis.d.ts +1 -0
  447. package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
  448. package/src/tools/queue/drivers/Redis.js +1 -0
  449. package/src/tools/queue/index.d.ts +10 -0
  450. package/src/tools/queue/index.d.ts.map +1 -1
  451. package/src/tools/queue/index.js +10 -0
  452. package/src/tools/storage/drivers/R2.d.ts +13 -0
  453. package/src/tools/storage/drivers/R2.d.ts.map +1 -1
  454. package/src/tools/storage/drivers/R2.js +29 -0
  455. package/src/zintrust.plugins.d.ts +9 -0
  456. package/src/zintrust.plugins.d.ts.map +1 -0
  457. package/src/zintrust.plugins.js +7 -0
  458. package/src/zintrust.plugins.wg.d.ts +9 -0
  459. package/src/zintrust.plugins.wg.d.ts.map +1 -0
  460. package/src/zintrust.plugins.wg.js +7 -0
@@ -1,6 +1,10 @@
1
+ import { generateUuid } from '../../common/utility.js';
1
2
  import { ZintrustLang } from '../../lang/lang.js';
2
3
  import { Env } from '../../config/env.js';
4
+ import { Logger } from '../../config/logger.js';
3
5
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
6
+ import { JobStateTracker } from './JobStateTracker.js';
7
+ import { QueueTracing } from './QueueTracing.js';
4
8
  import { RedisKeys } from '../redis/RedisKeyManager.js';
5
9
  let redis_key_prefix;
6
10
  /**
@@ -15,6 +19,61 @@ export const resolveLockPrefix = () => {
15
19
  return redis_key_prefix;
16
20
  };
17
21
  const drivers = new Map();
22
+ const resolveDriverName = (name) => {
23
+ const resolved = (name ?? Env.QUEUE_CONNECTION) || Env.QUEUE_DRIVER || ZintrustLang.INMEMORY;
24
+ return (resolved !== null && resolved !== undefined ? String(resolved) : ZintrustLang.INMEMORY)
25
+ .trim()
26
+ .toLowerCase();
27
+ };
28
+ const shouldPreserveExistingStatus = (queueName, jobId) => {
29
+ const existing = JobStateTracker.get(queueName, jobId);
30
+ return existing?.status === 'pending_recovery';
31
+ };
32
+ const resolveRequestedUniqueId = (payload) => {
33
+ if (typeof payload?.uniqueId !== 'string')
34
+ return undefined;
35
+ const normalized = payload.uniqueId.trim();
36
+ return normalized.length > 0 ? normalized : undefined;
37
+ };
38
+ const resolveMaxAttempts = (payload) => {
39
+ if (typeof payload?.attempts !== 'number' || !Number.isFinite(payload.attempts))
40
+ return undefined;
41
+ return payload.attempts > 0 ? Math.floor(payload.attempts) : undefined;
42
+ };
43
+ const resolveExpectedCompletionAt = () => {
44
+ return new Date(Date.now() + Math.max(1000, Env.getInt('QUEUE_JOB_TIMEOUT', 60) * 1000)).toISOString();
45
+ };
46
+ const markEnqueued = async (input) => {
47
+ await JobStateTracker.enqueued({
48
+ queueName: input.queueName,
49
+ jobId: input.jobId,
50
+ payload: input.payload,
51
+ maxAttempts: resolveMaxAttempts(input.payload),
52
+ expectedCompletionAt: resolveExpectedCompletionAt(),
53
+ idempotencyKey: input.requestedUniqueId,
54
+ });
55
+ };
56
+ const createFallbackJobId = (requestedUniqueId) => {
57
+ if (requestedUniqueId !== undefined)
58
+ return requestedUniqueId;
59
+ return `fallback-${generateUuid()}`;
60
+ };
61
+ const markFailedEnqueue = async (input) => {
62
+ const fallbackJobId = createFallbackJobId(input.requestedUniqueId);
63
+ await markEnqueued({
64
+ queueName: input.queueName,
65
+ jobId: fallbackJobId,
66
+ payload: input.payload,
67
+ requestedUniqueId: input.requestedUniqueId,
68
+ });
69
+ await JobStateTracker.pendingRecovery({
70
+ queueName: input.queueName,
71
+ jobId: fallbackJobId,
72
+ reason: 'Queue enqueue failed; marked pending recovery by core queue layer',
73
+ error: input.error,
74
+ });
75
+ return fallbackJobId;
76
+ };
18
77
  export const Queue = Object.freeze({
19
78
  register(name, driver) {
20
79
  drivers.set(name.toLowerCase(), driver);
@@ -23,35 +82,120 @@ export const Queue = Object.freeze({
23
82
  drivers.clear();
24
83
  },
25
84
  get(name) {
26
- const resolved = (name ?? Env.QUEUE_CONNECTION) || Env.QUEUE_DRIVER || ZintrustLang.INMEMORY;
27
- const driverName = (resolved !== null && resolved !== undefined ? String(resolved) : ZintrustLang.INMEMORY)
28
- .trim()
29
- .toLowerCase();
85
+ const driverName = resolveDriverName(name);
30
86
  const driver = drivers.get(driverName);
31
- if (!driver)
87
+ if (!driver) {
32
88
  throw ErrorFactory.createConfigError(`Queue driver not registered: ${driverName}`);
89
+ }
33
90
  return driver;
34
91
  },
35
92
  async enqueue(queue, payload, driverName) {
36
- const driver = Queue.get(driverName);
37
- const jobId = await driver.enqueue(queue, payload);
38
- return jobId;
93
+ const resolvedDriver = resolveDriverName(driverName);
94
+ const requestedUniqueId = resolveRequestedUniqueId(payload);
95
+ try {
96
+ const jobId = await QueueTracing.traceOperation({
97
+ queueName: queue,
98
+ operation: 'enqueue',
99
+ attributes: {
100
+ driverName: resolvedDriver,
101
+ hasUniqueId: requestedUniqueId !== undefined,
102
+ },
103
+ execute: async () => {
104
+ const driver = Queue.get(driverName);
105
+ return driver.enqueue(queue, payload);
106
+ },
107
+ });
108
+ Logger.info('Queue enqueue succeeded', {
109
+ queue,
110
+ driver: resolvedDriver,
111
+ jobId,
112
+ requestedUniqueId,
113
+ });
114
+ if (shouldPreserveExistingStatus(queue, jobId)) {
115
+ Logger.warn('Queue enqueue returned job already marked pending recovery; preserving status', {
116
+ queue,
117
+ driver: resolvedDriver,
118
+ jobId,
119
+ requestedUniqueId,
120
+ });
121
+ return jobId;
122
+ }
123
+ await markEnqueued({
124
+ queueName: queue,
125
+ jobId,
126
+ payload,
127
+ requestedUniqueId,
128
+ });
129
+ return jobId;
130
+ }
131
+ catch (error) {
132
+ const fallbackJobId = await markFailedEnqueue({
133
+ queueName: queue,
134
+ payload,
135
+ requestedUniqueId,
136
+ error,
137
+ });
138
+ Logger.warn('Queue enqueue failed', {
139
+ queue,
140
+ driver: resolvedDriver,
141
+ fallbackJobId,
142
+ requestedUniqueId,
143
+ error: error instanceof Error ? error.message : String(error),
144
+ });
145
+ throw error;
146
+ }
39
147
  },
40
148
  async dequeue(queue, driverName) {
41
- const driver = Queue.get(driverName);
42
- return driver.dequeue(queue);
149
+ return QueueTracing.traceOperation({
150
+ queueName: queue,
151
+ operation: 'dequeue',
152
+ attributes: {
153
+ driverName: driverName ?? null,
154
+ },
155
+ execute: async () => {
156
+ const driver = Queue.get(driverName);
157
+ return driver.dequeue(queue);
158
+ },
159
+ });
43
160
  },
44
161
  async ack(queue, id, driverName) {
45
- const driver = Queue.get(driverName);
46
- return driver.ack(queue, id);
162
+ return QueueTracing.traceOperation({
163
+ queueName: queue,
164
+ operation: 'ack',
165
+ attributes: {
166
+ driverName: driverName ?? null,
167
+ },
168
+ execute: async () => {
169
+ const driver = Queue.get(driverName);
170
+ await driver.ack(queue, id);
171
+ },
172
+ });
47
173
  },
48
174
  async length(queue, driverName) {
49
- const driver = Queue.get(driverName);
50
- return driver.length(queue);
175
+ return QueueTracing.traceOperation({
176
+ queueName: queue,
177
+ operation: 'length',
178
+ attributes: {
179
+ driverName: driverName ?? null,
180
+ },
181
+ execute: async () => {
182
+ const driver = Queue.get(driverName);
183
+ return driver.length(queue);
184
+ },
185
+ });
51
186
  },
52
187
  async drain(queue, driverName) {
53
- const driver = Queue.get(driverName);
54
- return driver.drain(queue);
188
+ return QueueTracing.traceOperation({
189
+ queueName: queue,
190
+ operation: 'drain',
191
+ attributes: {
192
+ driverName: driverName ?? null,
193
+ },
194
+ execute: async () => {
195
+ const driver = Queue.get(driverName);
196
+ await driver.drain(queue);
197
+ },
198
+ });
55
199
  },
56
200
  });
57
201
  export default Queue;
@@ -0,0 +1,6 @@
1
+ export declare const QueueDataRedactor: Readonly<{
2
+ sanitizePayload<T>(payload: T): T;
3
+ redactText(value: string): string;
4
+ }>;
5
+ export default QueueDataRedactor;
6
+ //# sourceMappingURL=QueueDataRedactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueueDataRedactor.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueDataRedactor.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,iBAAiB;oBACZ,CAAC,WAAW,CAAC,GAAG,CAAC;sBAIf,MAAM,GAAG,MAAM;EAGjC,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,45 @@
1
+ const SENSITIVE_KEY_PATTERN = /pass(word)?|token|secret|api[_-]?key|auth|authorization|cookie|session|credential|private[_-]?key/i;
2
+ const SECRET_VALUE_PATTERN = /(bearer\s+[a-z0-9._-]+|sk_[a-z0-9]{8,}|pk_[a-z0-9]{8,}|[a-f0-9]{32,})/gi;
3
+ const redactString = (value) => {
4
+ if (value.trim() === '')
5
+ return value;
6
+ return value.replace(SECRET_VALUE_PATTERN, '[REDACTED]');
7
+ };
8
+ const sanitizeValue = (value) => {
9
+ if (value === null || value === undefined)
10
+ return value;
11
+ if (typeof value === 'string') {
12
+ return redactString(value);
13
+ }
14
+ if (typeof value === 'number' || typeof value === 'boolean') {
15
+ return value;
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return value.map((item) => sanitizeValue(item));
19
+ }
20
+ if (value instanceof Date) {
21
+ return value.toISOString();
22
+ }
23
+ if (typeof value === 'object') {
24
+ const source = value;
25
+ const result = {};
26
+ for (const [key, val] of Object.entries(source)) {
27
+ if (SENSITIVE_KEY_PATTERN.test(key)) {
28
+ result[key] = '[REDACTED]';
29
+ continue;
30
+ }
31
+ result[key] = sanitizeValue(val);
32
+ }
33
+ return result;
34
+ }
35
+ return String(value);
36
+ };
37
+ export const QueueDataRedactor = Object.freeze({
38
+ sanitizePayload(payload) {
39
+ return sanitizeValue(payload);
40
+ },
41
+ redactText(value) {
42
+ return redactString(value);
43
+ },
44
+ });
45
+ export default QueueDataRedactor;
@@ -1 +1 @@
1
- {"version":3,"file":"QueueExtensions.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueExtensions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAsB,WAAW,EAAE,MAAM,eAAe,CAAC;AAKzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAWrD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAuBrD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAEvF;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE;IACvB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAkC3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;uCAEgB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAC7B,MAAM,GAChB,kBAAkB;IAOrB;;OAEG;uCAEgB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBACvB,MAAM,QACjB,MAAM,GACX,kBAAkB;CAStB,CAAC"}
1
+ {"version":3,"file":"QueueExtensions.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueExtensions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAsB,WAAW,EAAE,MAAM,eAAe,CAAC;AAKzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAWrD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAuBrD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAEvF;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE;IACvB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAkC3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;uCAEgB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAC7B,MAAM,GAChB,kBAAkB;IAOrB;;OAEG;uCAEgB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,mBACvB,MAAM,QACjB,MAAM,GACX,kBAAkB;CAStB,CAAC"}
@@ -32,7 +32,8 @@ export function extendQueue(config) {
32
32
  export async function enqueueAdvanced(name, payload, options = {}) {
33
33
  if (advancedQueueRef === null) {
34
34
  Logger.warn(`Advanced queue not initialized, falling back to standard enqueue`);
35
- return Queue.enqueue(name, payload);
35
+ const getQueue = await Queue?.enqueue(name, payload);
36
+ return getQueue ?? '';
36
37
  }
37
38
  return advancedQueueRef.enqueue(name, payload, options);
38
39
  }
@@ -0,0 +1,38 @@
1
+ export type QueueReliabilitySnapshot = {
2
+ pending: number;
3
+ active: number;
4
+ completed: number;
5
+ failed: number;
6
+ stalled: number;
7
+ timeout: number;
8
+ pendingRecovery: number;
9
+ deadLetter: number;
10
+ manualReview: number;
11
+ };
12
+ export type QueueReliabilityAlertId = 'HighJobFailureRate' | 'StalledJobsAccumulating' | 'QueueDepthGrowing' | 'ManualReviewBacklog';
13
+ export type QueueReliabilityAlert = {
14
+ id: QueueReliabilityAlertId;
15
+ severity: 'warning' | 'critical';
16
+ message: string;
17
+ value: number;
18
+ threshold: number;
19
+ runbook: string;
20
+ };
21
+ export type QueueReliabilityDashboardSnapshot = {
22
+ queueName: string;
23
+ generatedAt: string;
24
+ metrics: QueueReliabilitySnapshot & {
25
+ totalTracked: number;
26
+ queueDepth: number;
27
+ failureRate: number;
28
+ };
29
+ alerts: QueueReliabilityAlert[];
30
+ runbooks: Record<QueueReliabilityAlertId, string>;
31
+ };
32
+ export declare const QueueReliabilityMetrics: Readonly<{
33
+ snapshot(queueName?: string): QueueReliabilitySnapshot;
34
+ runbookMap(): Record<QueueReliabilityAlertId, string>;
35
+ dashboardSnapshot(queueName?: string): Promise<QueueReliabilityDashboardSnapshot>;
36
+ }>;
37
+ export default QueueReliabilityMetrics;
38
+ //# sourceMappingURL=QueueReliabilityMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueueReliabilityMetrics.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueReliabilityMetrics.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAC/B,oBAAoB,GACpB,yBAAyB,GACzB,mBAAmB,GACnB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,uBAAuB,CAAC;IAC5B,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,wBAAwB,GAAG;QAClC,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;CACnD,CAAC;AAwFF,eAAO,MAAM,uBAAuB;yBACb,MAAM,GAAG,wBAAwB;kBAexC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC;kCAIjB,MAAM,GAAG,OAAO,CAAC,iCAAiC,CAAC;EA0CvF,CAAC;AAEH,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { JobStateTracker } from './JobStateTracker.js';
3
+ import { Queue } from './Queue.js';
4
+ const toNumber = (input, key) => input[key] ?? 0;
5
+ const toRate = (failed, completed) => {
6
+ const denominator = failed + completed;
7
+ if (denominator <= 0)
8
+ return 0;
9
+ return failed / denominator;
10
+ };
11
+ const resolveRunbookBase = () => {
12
+ const base = Env.get('JOB_RUNBOOK_BASE_URL', '/docs/runbooks').trim();
13
+ if (base === '')
14
+ return '/docs/runbooks';
15
+ return base.endsWith('/') ? base.slice(0, -1) : base;
16
+ };
17
+ const getRunbookMap = () => {
18
+ const base = resolveRunbookBase();
19
+ return {
20
+ HighJobFailureRate: `${base}/high-job-failure-rate`,
21
+ StalledJobsAccumulating: `${base}/stalled-jobs-accumulating`,
22
+ QueueDepthGrowing: `${base}/queue-depth-growing`,
23
+ ManualReviewBacklog: `${base}/manual-review-backlog`,
24
+ };
25
+ };
26
+ const evaluateAlerts = (queueName, metrics) => {
27
+ const runbooks = getRunbookMap();
28
+ const alerts = [];
29
+ const failureThreshold = Math.max(0, Env.getFloat('JOB_ALERT_FAILURE_RATE_THRESHOLD', 0.1));
30
+ const stalledThreshold = Math.max(1, Env.getInt('JOB_ALERT_STALLED_THRESHOLD', 50));
31
+ const queueDepthThreshold = Math.max(1, Env.getInt('JOB_ALERT_QUEUE_DEPTH_THRESHOLD', 1000));
32
+ const manualReviewThreshold = Math.max(1, Env.getInt('JOB_ALERT_MANUAL_REVIEW_THRESHOLD', 10));
33
+ if (metrics.failureRate > failureThreshold) {
34
+ alerts.push({
35
+ id: 'HighJobFailureRate',
36
+ severity: 'critical',
37
+ message: `Queue ${queueName} failure rate is above threshold`,
38
+ value: Number(metrics.failureRate.toFixed(6)),
39
+ threshold: failureThreshold,
40
+ runbook: runbooks.HighJobFailureRate,
41
+ });
42
+ }
43
+ if (metrics.stalled > stalledThreshold) {
44
+ alerts.push({
45
+ id: 'StalledJobsAccumulating',
46
+ severity: 'critical',
47
+ message: `Queue ${queueName} stalled jobs exceed threshold`,
48
+ value: metrics.stalled,
49
+ threshold: stalledThreshold,
50
+ runbook: runbooks.StalledJobsAccumulating,
51
+ });
52
+ }
53
+ if (metrics.queueDepth > queueDepthThreshold) {
54
+ alerts.push({
55
+ id: 'QueueDepthGrowing',
56
+ severity: 'warning',
57
+ message: `Queue ${queueName} depth is above threshold`,
58
+ value: metrics.queueDepth,
59
+ threshold: queueDepthThreshold,
60
+ runbook: runbooks.QueueDepthGrowing,
61
+ });
62
+ }
63
+ if (metrics.manualReview > manualReviewThreshold) {
64
+ alerts.push({
65
+ id: 'ManualReviewBacklog',
66
+ severity: 'warning',
67
+ message: `Queue ${queueName} manual-review backlog is above threshold`,
68
+ value: metrics.manualReview,
69
+ threshold: manualReviewThreshold,
70
+ runbook: runbooks.ManualReviewBacklog,
71
+ });
72
+ }
73
+ return alerts;
74
+ };
75
+ export const QueueReliabilityMetrics = Object.freeze({
76
+ snapshot(queueName) {
77
+ const summary = JobStateTracker.getSummary(queueName);
78
+ return {
79
+ pending: toNumber(summary, 'pending'),
80
+ active: toNumber(summary, 'active'),
81
+ completed: toNumber(summary, 'completed'),
82
+ failed: toNumber(summary, 'failed'),
83
+ stalled: toNumber(summary, 'stalled'),
84
+ timeout: toNumber(summary, 'timeout'),
85
+ pendingRecovery: toNumber(summary, 'pending_recovery'),
86
+ deadLetter: toNumber(summary, 'dead_letter'),
87
+ manualReview: toNumber(summary, 'manual_review'),
88
+ };
89
+ },
90
+ runbookMap() {
91
+ return getRunbookMap();
92
+ },
93
+ async dashboardSnapshot(queueName) {
94
+ const normalizedQueueName = typeof queueName === 'string' ? queueName.trim() : '';
95
+ const resolvedQueueName = normalizedQueueName === ''
96
+ ? Env.get('JOB_DASHBOARD_DEFAULT_QUEUE', 'default')
97
+ : normalizedQueueName;
98
+ const metrics = this.snapshot(resolvedQueueName);
99
+ let queueDepth = 0;
100
+ try {
101
+ queueDepth = await Queue.length(resolvedQueueName);
102
+ }
103
+ catch {
104
+ queueDepth = 0;
105
+ }
106
+ const totalTracked = metrics.pending +
107
+ metrics.active +
108
+ metrics.completed +
109
+ metrics.failed +
110
+ metrics.stalled +
111
+ metrics.timeout +
112
+ metrics.pendingRecovery +
113
+ metrics.deadLetter +
114
+ metrics.manualReview;
115
+ const failureRate = toRate(metrics.failed + metrics.deadLetter, metrics.completed);
116
+ const derivedMetrics = {
117
+ ...metrics,
118
+ totalTracked,
119
+ queueDepth,
120
+ failureRate,
121
+ };
122
+ return {
123
+ queueName: resolvedQueueName,
124
+ generatedAt: new Date().toISOString(),
125
+ metrics: derivedMetrics,
126
+ alerts: evaluateAlerts(resolvedQueueName, derivedMetrics),
127
+ runbooks: getRunbookMap(),
128
+ };
129
+ },
130
+ });
131
+ export default QueueReliabilityMetrics;
@@ -0,0 +1,7 @@
1
+ export declare const QueueReliabilityOrchestrator: Readonly<{
2
+ isEnabled(): boolean;
3
+ start(): void;
4
+ stop(): void;
5
+ }>;
6
+ export default QueueReliabilityOrchestrator;
7
+ //# sourceMappingURL=QueueReliabilityOrchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueueReliabilityOrchestrator.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueReliabilityOrchestrator.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,4BAA4B;iBAC1B,OAAO;aAIX,IAAI;YA4BL,IAAI;EAUZ,CAAC;AAEH,eAAe,4BAA4B,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { Logger } from '../../config/logger.js';
3
+ import { JobReconciliationRunner } from './JobReconciliationRunner.js';
4
+ import { JobRecoveryDaemon } from './JobRecoveryDaemon.js';
5
+ import { StalledJobMonitor } from './StalledJobMonitor.js';
6
+ const state = {
7
+ started: false,
8
+ };
9
+ const clearTimer = (timer) => {
10
+ if (timer === undefined)
11
+ return;
12
+ clearInterval(timer);
13
+ };
14
+ const startInterval = (handler, intervalMs) => setInterval(() => {
15
+ handler().catch((error) => {
16
+ Logger.warn('Queue reliability interval failed', {
17
+ error: error instanceof Error ? error : String(error),
18
+ });
19
+ });
20
+ }, intervalMs);
21
+ export const QueueReliabilityOrchestrator = Object.freeze({
22
+ isEnabled() {
23
+ return Env.getBool('JOB_RELIABILITY_ENABLED', true);
24
+ },
25
+ start() {
26
+ if (!this.isEnabled())
27
+ return;
28
+ if (state.started)
29
+ return;
30
+ const reconciliationMs = Math.max(5000, Env.getInt('JOB_RECONCILIATION_INTERVAL_MS', 60000));
31
+ const recoveryMs = Math.max(5000, Env.getInt('JOB_RECOVERY_INTERVAL_MS', 30000));
32
+ const stalledMs = Math.max(5000, Env.getInt('STALLED_JOB_CHECK_INTERVAL_MS', 30000));
33
+ state.reconciliationTimer = startInterval(async () => {
34
+ await JobReconciliationRunner.runOnce();
35
+ }, reconciliationMs);
36
+ state.recoveryTimer = startInterval(async () => {
37
+ await JobRecoveryDaemon.runOnce();
38
+ }, recoveryMs);
39
+ state.stalledTimer = startInterval(async () => {
40
+ await StalledJobMonitor.scanOnce();
41
+ }, stalledMs);
42
+ state.started = true;
43
+ Logger.info('Queue reliability orchestrator started', {
44
+ reconciliationMs,
45
+ recoveryMs,
46
+ stalledMs,
47
+ });
48
+ },
49
+ stop() {
50
+ clearTimer(state.reconciliationTimer);
51
+ clearTimer(state.recoveryTimer);
52
+ clearTimer(state.stalledTimer);
53
+ state.reconciliationTimer = undefined;
54
+ state.recoveryTimer = undefined;
55
+ state.stalledTimer = undefined;
56
+ state.started = false;
57
+ },
58
+ });
59
+ export default QueueReliabilityOrchestrator;
@@ -1,11 +1,3 @@
1
1
  import type { QueueConfig } from '../../config/queue';
2
- /**
3
- * Register queue drivers from runtime config.
4
- *
5
- * This follows the framework's config-driven availability pattern:
6
- * - Built-in drivers are registered so `QUEUE_DRIVER=sync|inmemory|redis` works out of the box.
7
- * - If the configured default is registered, it is ALSO registered as 'default'.
8
- * - Unknown/unregistered driver names still throw when selected.
9
- */
10
- export declare function registerQueuesFromRuntimeConfig(config: QueueConfig): void;
2
+ export declare function registerQueuesFromRuntimeConfig(config: QueueConfig): Promise<void>;
11
3
  //# sourceMappingURL=QueueRuntimeRegistration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueueRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOjD;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAazE"}
1
+ {"version":3,"file":"QueueRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueRuntimeRegistration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAoFjD,wBAAsB,+BAA+B,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCxF"}
@@ -1,5 +1,14 @@
1
+ import { Logger } from '../../config/logger.js';
2
+ import { Env } from '../../config/env.js';
1
3
  import { ErrorFactory } from '../../exceptions/ZintrustError.js';
4
+ import { ZintrustLang } from '../../lang/lang.js';
5
+ import { existsSync } from '../../node-singletons/fs.js';
6
+ import * as path from '../../node-singletons/path.js';
7
+ import { pathToFileURL } from '../../node-singletons/url.js';
8
+ import { detectRuntime } from '../../runtime/detectRuntime.js';
2
9
  import { DatabaseQueue } from '../queue/drivers/Database.js';
10
+ import { autoRegisterJobStateTrackerPersistenceFromEnv } from '../queue/JobStateTrackerDbPersistence.js';
11
+ import { QueueReliabilityOrchestrator } from '../queue/QueueReliabilityOrchestrator.js';
3
12
  import { InMemoryQueue } from '../queue/drivers/InMemory.js';
4
13
  import { Queue } from '../queue/Queue.js';
5
14
  /**
@@ -10,16 +19,78 @@ import { Queue } from '../queue/Queue.js';
10
19
  * - If the configured default is registered, it is ALSO registered as 'default'.
11
20
  * - Unknown/unregistered driver names still throw when selected.
12
21
  */
13
- export function registerQueuesFromRuntimeConfig(config) {
22
+ const registerRedisDriverIfAvailable = async () => {
23
+ try {
24
+ const mod = (await import('@zintrust/queue-redis'));
25
+ if (mod.RedisQueue !== undefined) {
26
+ Queue.register('redis', mod.RedisQueue);
27
+ return true;
28
+ }
29
+ if (mod.BullMQRedisQueue !== undefined) {
30
+ Queue.register('redis', mod.BullMQRedisQueue);
31
+ return true;
32
+ }
33
+ }
34
+ catch {
35
+ // Fall back to local dist build output when running inside the core repo Docker image.
36
+ // In that environment, `@zintrust/queue-redis` is not installed in node_modules,
37
+ // but the compiled package is available at `dist/packages/queue-redis`.
38
+ try {
39
+ const cwd = typeof process !== 'undefined' && typeof process.cwd === 'function' ? process.cwd() : '';
40
+ if (cwd.trim() === '')
41
+ return false;
42
+ const localEntry = path.join(cwd, 'dist', 'packages', 'queue-redis', 'src', 'index.js');
43
+ if (!existsSync(localEntry))
44
+ return false;
45
+ const url = pathToFileURL(localEntry).href;
46
+ const localMod = (await import(url));
47
+ if (localMod.RedisQueue !== undefined) {
48
+ Queue.register('redis', localMod.RedisQueue);
49
+ return true;
50
+ }
51
+ if (localMod.BullMQRedisQueue !== undefined) {
52
+ Queue.register('redis', localMod.BullMQRedisQueue);
53
+ return true;
54
+ }
55
+ }
56
+ catch {
57
+ // ignore
58
+ }
59
+ return false;
60
+ }
61
+ return false;
62
+ };
63
+ export async function registerQueuesFromRuntimeConfig(config) {
64
+ autoRegisterJobStateTrackerPersistenceFromEnv();
14
65
  // Built-in drivers (core)
15
66
  Queue.register('inmemory', InMemoryQueue);
16
- Queue.register('db', DatabaseQueue);
67
+ Queue.register(ZintrustLang.DATABASE, DatabaseQueue);
17
68
  // Project templates use QUEUE_DRIVER=sync; treat this as an alias of in-memory.
18
69
  Queue.register('sync', InMemoryQueue);
19
70
  const defaultName = (config.default ?? '').toString().trim().toLowerCase();
20
71
  if (defaultName.length === 0) {
21
72
  throw ErrorFactory.createConfigError('Queue default driver is not configured');
22
73
  }
23
- const drv = Queue.get(defaultName);
24
- Queue.register('default', drv);
74
+ if (defaultName === 'redis') {
75
+ const registered = await registerRedisDriverIfAvailable();
76
+ if (!registered) {
77
+ throw ErrorFactory.createConfigError('Redis queue driver is not registered. Install queue:redis via zin plugin install.');
78
+ }
79
+ }
80
+ try {
81
+ const drv = Queue.get(defaultName);
82
+ Queue.register('default', drv);
83
+ if (Env.getBool('JOB_RELIABILITY_AUTOSTART', false)) {
84
+ QueueReliabilityOrchestrator.start();
85
+ }
86
+ }
87
+ catch (error) {
88
+ const { isCloudflare } = detectRuntime();
89
+ if (isCloudflare) {
90
+ Logger.warn(`[queue] Default driver '${defaultName}' is unavailable in Cloudflare runtime; falling back to 'sync'.`);
91
+ Queue.register('default', Queue.get('sync'));
92
+ return;
93
+ }
94
+ throw ErrorFactory.createConfigError('Queue default driver is not available', error);
95
+ }
25
96
  }