@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
@@ -1,18 +1,52 @@
1
+ /* eslint-disable @typescript-eslint/require-await */
1
2
  /**
2
3
  * CSRF Token Manager
3
4
  * Generate, validate, and bind CSRF tokens to sessions
4
5
  */
5
6
  import { Env } from '../config/env.js';
7
+ import { Logger } from '../config/logger.js';
8
+ import { createRedisConnection } from '../config/workers.js';
9
+ import { ZintrustLang } from '../lang/lang.js';
6
10
  import { randomBytes } from '../node-singletons/crypto.js';
11
+ import { RedisKeys } from '../tools/redis/RedisKeyManager.js';
7
12
  /**
8
13
  * Create a new CSRF token manager instance
9
14
  */
10
- const create = () => {
15
+ const normalizeStoreName = (name) => {
16
+ const raw = String(name ?? '')
17
+ .trim()
18
+ .toLowerCase();
19
+ if (raw === 'redis')
20
+ return 'redis';
21
+ return 'memory';
22
+ };
23
+ const isWorkersRuntime = () => {
24
+ const globalAny = globalThis;
25
+ if (globalAny.CF !== undefined)
26
+ return true;
27
+ if (typeof globalAny.WebSocketPair === 'function')
28
+ return true;
29
+ if (globalAny.caches !== undefined)
30
+ return true;
31
+ return false;
32
+ };
33
+ const resolveStoreName = (options) => {
34
+ if (isWorkersRuntime())
35
+ return 'memory';
36
+ return normalizeStoreName(options?.store ?? Env.CSRF_STORE ?? Env.CSRF_DRIVER ?? Env.get('CSRF_STORE', 'memory'));
37
+ };
38
+ const toTokenData = (stored) => {
39
+ return {
40
+ token: stored.token,
41
+ sessionId: stored.sessionId,
42
+ createdAt: new Date(stored.createdAt),
43
+ expiresAt: new Date(stored.expiresAt),
44
+ };
45
+ };
46
+ const createMemoryManager = (tokenLength, tokenTtl) => {
11
47
  const tokens = new Map();
12
- const tokenLength = Env.TOKEN_LENGTH; // 256 bits
13
- const tokenTtl = Env.TOKEN_TTL; // 1 hour in milliseconds
14
48
  return {
15
- generateToken(sessionId) {
49
+ async generateToken(sessionId) {
16
50
  tokens.delete(sessionId);
17
51
  const token = randomBytes(tokenLength).toString('hex');
18
52
  const now = new Date();
@@ -21,7 +55,7 @@ const create = () => {
21
55
  tokens.set(sessionId, tokenData);
22
56
  return token;
23
57
  },
24
- validateToken(sessionId, token) {
58
+ async validateToken(sessionId, token) {
25
59
  const tokenData = tokens.get(sessionId);
26
60
  if (!tokenData)
27
61
  return false;
@@ -33,13 +67,13 @@ const create = () => {
33
67
  }
34
68
  return isValid;
35
69
  },
36
- invalidateToken(sessionId) {
70
+ async invalidateToken(sessionId) {
37
71
  tokens.delete(sessionId);
38
72
  },
39
- getTokenData(sessionId) {
73
+ async getTokenData(sessionId) {
40
74
  return tokens.get(sessionId) ?? null;
41
75
  },
42
- refreshToken(sessionId) {
76
+ async refreshToken(sessionId) {
43
77
  const tokenData = tokens.get(sessionId);
44
78
  if (!tokenData)
45
79
  return null;
@@ -51,7 +85,7 @@ const create = () => {
51
85
  tokenData.expiresAt = new Date(Date.now() + tokenTtl);
52
86
  return tokenData.token;
53
87
  },
54
- cleanup() {
88
+ async cleanup() {
55
89
  let removed = 0;
56
90
  const now = new Date();
57
91
  for (const [sessionId, tokenData] of tokens.entries()) {
@@ -62,14 +96,173 @@ const create = () => {
62
96
  }
63
97
  return removed;
64
98
  },
65
- clear() {
99
+ async clear() {
66
100
  tokens.clear();
67
101
  },
68
- getTokenCount() {
102
+ async getTokenCount() {
69
103
  return tokens.size;
70
104
  },
71
105
  };
72
106
  };
107
+ // Helper functions for Redis CSRF manager
108
+ const createRedisClientFactory = (options) => {
109
+ let redisClient = options?.redis ?? null;
110
+ return () => {
111
+ if (redisClient)
112
+ return redisClient;
113
+ const dbFromEnv = Env.CSRF_REDIS_DB;
114
+ const database = dbFromEnv >= 0 ? dbFromEnv : Env.getInt('REDIS_QUEUE_DB', ZintrustLang.REDIS_DEFAULT_DB);
115
+ redisClient = createRedisConnection({
116
+ host: Env.get('REDIS_HOST', 'localhost'),
117
+ port: Env.getInt('REDIS_PORT', ZintrustLang.REDIS_DEFAULT_PORT),
118
+ password: Env.get('REDIS_PASSWORD'),
119
+ db: database,
120
+ });
121
+ return redisClient;
122
+ };
123
+ };
124
+ const createRedisTokenOperations = (keyPrefix, tokenTtl, getRedisClient) => {
125
+ const buildKey = (sessionId) => `${keyPrefix}${sessionId}`;
126
+ const fetchTokenData = async (sessionId) => {
127
+ try {
128
+ const client = getRedisClient();
129
+ const payload = await client.get(buildKey(sessionId));
130
+ if (payload === null || payload === '')
131
+ return null;
132
+ const parsed = JSON.parse(payload);
133
+ return toTokenData(parsed);
134
+ }
135
+ catch (error) {
136
+ Logger.error('CSRF Redis fetch failed', error);
137
+ return null;
138
+ }
139
+ };
140
+ const saveTokenData = async (data) => {
141
+ try {
142
+ const client = getRedisClient();
143
+ const stored = {
144
+ token: data.token,
145
+ sessionId: data.sessionId,
146
+ createdAt: data.createdAt.getTime(),
147
+ expiresAt: data.expiresAt.getTime(),
148
+ };
149
+ await client.set(buildKey(data.sessionId), JSON.stringify(stored), 'PX', tokenTtl);
150
+ }
151
+ catch (error) {
152
+ Logger.error('CSRF Redis save failed', error);
153
+ }
154
+ };
155
+ const deleteToken = async (sessionId) => {
156
+ try {
157
+ const client = getRedisClient();
158
+ await client.del(buildKey(sessionId));
159
+ }
160
+ catch (error) {
161
+ Logger.error('CSRF Redis delete failed', error);
162
+ }
163
+ };
164
+ const scanKeys = async () => {
165
+ const client = getRedisClient();
166
+ const keys = [];
167
+ const stream = client.scanStream({ match: `${keyPrefix}*`, count: 200 });
168
+ return new Promise((resolve, reject) => {
169
+ stream.on('data', (resultKeys) => {
170
+ if (Array.isArray(resultKeys) && resultKeys.length) {
171
+ keys.push(...resultKeys);
172
+ }
173
+ });
174
+ stream.on('end', () => resolve(keys));
175
+ stream.on('error', (err) => reject(err));
176
+ });
177
+ };
178
+ return {
179
+ fetchTokenData,
180
+ saveTokenData,
181
+ deleteToken,
182
+ scanKeys,
183
+ };
184
+ };
185
+ const createRedisManager = (tokenLength, tokenTtl, options) => {
186
+ const keyPrefix = options?.keyPrefix ?? RedisKeys.getCsrfPrefix();
187
+ const getRedisClient = createRedisClientFactory(options);
188
+ const { fetchTokenData, saveTokenData, deleteToken, scanKeys } = createRedisTokenOperations(keyPrefix, tokenTtl, getRedisClient);
189
+ return {
190
+ async generateToken(sessionId) {
191
+ const token = randomBytes(tokenLength).toString('hex');
192
+ const now = new Date();
193
+ const expiresAt = new Date(now.getTime() + tokenTtl);
194
+ const tokenData = { token, sessionId, createdAt: now, expiresAt };
195
+ await saveTokenData(tokenData);
196
+ return token;
197
+ },
198
+ async validateToken(sessionId, token) {
199
+ const tokenData = await fetchTokenData(sessionId);
200
+ if (!tokenData)
201
+ return false;
202
+ const isValid = tokenData.token === token;
203
+ const isExpired = new Date() > tokenData.expiresAt;
204
+ if (isExpired) {
205
+ await deleteToken(sessionId);
206
+ return false;
207
+ }
208
+ return isValid;
209
+ },
210
+ async invalidateToken(sessionId) {
211
+ await deleteToken(sessionId);
212
+ },
213
+ async getTokenData(sessionId) {
214
+ return fetchTokenData(sessionId);
215
+ },
216
+ async refreshToken(sessionId) {
217
+ const tokenData = await fetchTokenData(sessionId);
218
+ if (!tokenData)
219
+ return null;
220
+ const isExpired = new Date() > tokenData.expiresAt;
221
+ if (isExpired) {
222
+ await deleteToken(sessionId);
223
+ return null;
224
+ }
225
+ tokenData.expiresAt = new Date(Date.now() + tokenTtl);
226
+ await saveTokenData(tokenData);
227
+ return tokenData.token;
228
+ },
229
+ async cleanup() {
230
+ // Redis handles expiry via TTL, so nothing to do here.
231
+ return Promise.resolve(0); // NOSONAR
232
+ },
233
+ async clear() {
234
+ try {
235
+ const keys = await scanKeys();
236
+ if (keys.length === 0)
237
+ return;
238
+ const client = getRedisClient();
239
+ await client.del(...keys);
240
+ }
241
+ catch (error) {
242
+ Logger.error('CSRF Redis clear failed', error);
243
+ }
244
+ },
245
+ async getTokenCount() {
246
+ try {
247
+ const keys = await scanKeys();
248
+ return keys.length;
249
+ }
250
+ catch (error) {
251
+ Logger.error('CSRF Redis count failed', error);
252
+ return 0;
253
+ }
254
+ },
255
+ };
256
+ };
257
+ const create = (options) => {
258
+ const tokenLength = options?.tokenLength ?? Env.TOKEN_LENGTH; // 256 bits
259
+ const tokenTtl = options?.tokenTtlMs ?? Env.TOKEN_TTL; // 1 hour in milliseconds
260
+ const store = resolveStoreName(options);
261
+ if (store === 'redis') {
262
+ return createRedisManager(tokenLength, tokenTtl, options);
263
+ }
264
+ return createMemoryManager(tokenLength, tokenTtl);
265
+ };
73
266
  /**
74
267
  * CsrfTokenManager namespace - sealed for immutability
75
268
  */
@@ -2,7 +2,7 @@
2
2
  * Hash
3
3
  * bcrypt-based password hashing utility.
4
4
  *
5
- * Runtime-aware: uses dynamic import for bcrypt.
5
+ * Uses bcryptjs to avoid native module issues in edge runtimes.
6
6
  */
7
7
  export declare const Hash: Readonly<{
8
8
  isValidHash(hash: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../../../src/security/Hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+CH,eAAO,MAAM,IAAI;sBACG,MAAM,GAAG,OAAO;oBAIZ,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;8BAUd,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;sBAgBhD,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;EAWjE,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../../../src/security/Hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,eAAO,MAAM,IAAI;sBACG,MAAM,GAAG,OAAO;oBAIZ,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;8BAcd,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;sBAmBhD,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;EAWjE,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -2,66 +2,61 @@
2
2
  * Hash
3
3
  * bcrypt-based password hashing utility.
4
4
  *
5
- * Runtime-aware: uses dynamic import for bcrypt.
5
+ * Uses bcryptjs to avoid native module issues in edge runtimes.
6
6
  */
7
7
  import { Logger } from '../config/logger.js';
8
8
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
9
- function isBcryptModule(value) {
10
- if (typeof value !== 'object' || value === null)
11
- return false;
12
- const record = value;
13
- return typeof record['hash'] === 'function' && typeof record['compare'] === 'function';
14
- }
15
- let bcrypt;
16
- let loadingPromise;
17
- async function loadBcrypt() {
18
- const imported = await import('bcrypt');
19
- const module = imported;
20
- const candidate = module.default ?? module;
21
- if (!isBcryptModule(candidate)) {
22
- throw ErrorFactory.createConfigError('Invalid bcrypt module shape');
9
+ const BCRYPT_HASH_RE = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
10
+ let bcryptModule = null;
11
+ const loadBcrypt = async () => {
12
+ if (bcryptModule !== null)
13
+ return bcryptModule;
14
+ try {
15
+ const mod = (await import('bcryptjs'));
16
+ const resolved = (mod.default ?? mod);
17
+ if (typeof resolved?.hash !== 'function' || typeof resolved?.compare !== 'function') {
18
+ throw ErrorFactory.createConfigError('Invalid bcryptjs module shape');
19
+ }
20
+ bcryptModule = resolved;
21
+ return resolved;
23
22
  }
24
- bcrypt = candidate;
25
- }
26
- async function ensureBcrypt() {
27
- if (bcrypt !== undefined)
28
- return bcrypt;
29
- loadingPromise ??= loadBcrypt().catch((error) => {
30
- Logger.error('bcrypt unavailable', error);
31
- throw ErrorFactory.createConfigError('bcrypt unavailable', error);
32
- });
33
- await loadingPromise;
34
- if (bcrypt === undefined) {
35
- throw ErrorFactory.createConfigError('bcrypt unavailable');
23
+ catch (error) {
24
+ throw ErrorFactory.createConfigError('bcryptjs module unavailable', error);
36
25
  }
37
- return bcrypt;
38
- }
39
- const BCRYPT_HASH_RE = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
26
+ };
40
27
  export const Hash = Object.freeze({
41
28
  isValidHash(hash) {
42
29
  return BCRYPT_HASH_RE.test(hash);
43
30
  },
44
31
  async hash(plaintext) {
45
- const bcryptModule = await ensureBcrypt();
46
32
  try {
47
- return await bcryptModule.hash(plaintext, 12);
33
+ const bcrypt = await loadBcrypt();
34
+ return await bcrypt.hash(plaintext, 12);
48
35
  }
49
36
  catch (error) {
50
37
  Logger.error('Password hashing failed', error);
38
+ const err = error;
39
+ if (err?.name === 'ConfigError' || err?.code === 'CONFIG_ERROR') {
40
+ throw ErrorFactory.createConfigError('Password hashing failed', error);
41
+ }
51
42
  throw ErrorFactory.createSecurityError('Password hashing failed', error);
52
43
  }
53
44
  },
54
45
  async hashWithRounds(plaintext, rounds) {
55
- const bcryptModule = await ensureBcrypt();
56
46
  const normalizedRounds = Number.isFinite(rounds) ? Math.trunc(rounds) : 0;
57
47
  if (normalizedRounds <= 0) {
58
48
  throw ErrorFactory.createConfigError('Invalid bcrypt rounds', { rounds });
59
49
  }
60
50
  try {
61
- return await bcryptModule.hash(plaintext, normalizedRounds);
51
+ const bcrypt = await loadBcrypt();
52
+ return await bcrypt.hash(plaintext, normalizedRounds);
62
53
  }
63
54
  catch (error) {
64
55
  Logger.error('Password hashing failed', error);
56
+ const err = error;
57
+ if (err?.name === 'ConfigError' || err?.code === 'CONFIG_ERROR') {
58
+ throw ErrorFactory.createConfigError('Password hashing failed', error);
59
+ }
65
60
  throw ErrorFactory.createSecurityError('Password hashing failed', error);
66
61
  }
67
62
  },
@@ -69,8 +64,8 @@ export const Hash = Object.freeze({
69
64
  if (!Hash.isValidHash(hashed))
70
65
  return false;
71
66
  try {
72
- const bcryptModule = await ensureBcrypt();
73
- return await bcryptModule.compare(plaintext, hashed);
67
+ const bcrypt = await loadBcrypt();
68
+ return await bcrypt.compare(plaintext, hashed);
74
69
  }
75
70
  catch (error) {
76
71
  Logger.error('Password verify failed', error);
@@ -1,6 +1,6 @@
1
1
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
2
2
  import * as path from '../node-singletons/path.js';
3
- import { pathToFileURL } from 'node:url';
3
+ import { pathToFileURL } from '../node-singletons/url.js';
4
4
  function isFunction(value) {
5
5
  return typeof value === 'function';
6
6
  }
@@ -26,11 +26,14 @@ export interface ISessionManager {
26
26
  get(sessionId: string): ISession;
27
27
  destroy(sessionId: string): void;
28
28
  cleanup(): number;
29
+ dispose(): void;
29
30
  }
30
31
  export interface SessionManagerOptions {
31
32
  cookieName?: string;
32
33
  headerName?: string;
33
34
  ttlMs?: number;
35
+ maxSessions?: number;
36
+ cleanupIntervalMs?: number;
34
37
  }
35
38
  export declare const SessionManager: Readonly<{
36
39
  create(options?: SessionManagerOptions): ISessionManager;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAC7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,IAAI,WAAW,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5E,gBAAgB,CAAC,GAAG,EAAE;QACpB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,GAAG,MAAM,GAAG,SAAS,CAAC;IACvB,eAAe,CACb,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,EACD,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC;KAChE,GACA,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyHD,eAAO,MAAM,cAAc;qBACT,qBAAqB,GAAQ,eAAe;EA2E5D,CAAC;AAEH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAC7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,IAAI,WAAW,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5E,gBAAgB,CAAC,GAAG,EAAE;QACpB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,GAAG,MAAM,GAAG,SAAS,CAAC;IACvB,eAAe,CACb,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,EACD,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC;KAChE,GACA,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAwKD,eAAO,MAAM,cAAc;qBACT,qBAAqB,GAAQ,eAAe;EAkF5D,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -3,7 +3,39 @@ const DEFAULT_OPTIONS = {
3
3
  cookieName: 'ZIN_SESSION_ID',
4
4
  headerName: 'x-session-id',
5
5
  ttlMs: 7 * 24 * 60 * 60 * 1000,
6
+ maxSessions: 10000,
7
+ cleanupIntervalMs: 60000,
6
8
  };
9
+ function isUnrefableTimer(value) {
10
+ return (typeof value === 'object' &&
11
+ value !== null &&
12
+ 'unref' in value &&
13
+ typeof value.unref === 'function');
14
+ }
15
+ function cleanupExpiredSessions(sessions) {
16
+ const now = Date.now();
17
+ let removed = 0;
18
+ for (const [id, stored] of sessions.entries()) {
19
+ if (stored.expiresAt <= now) {
20
+ sessions.delete(id);
21
+ removed++;
22
+ }
23
+ }
24
+ return removed;
25
+ }
26
+ function enforceSessionCapacity(sessions, maxSessions, preserveId) {
27
+ if (sessions.size < maxSessions)
28
+ return;
29
+ cleanupExpiredSessions(sessions);
30
+ if (sessions.size < maxSessions)
31
+ return;
32
+ for (const id of sessions.keys()) {
33
+ if (id === preserveId)
34
+ continue;
35
+ sessions.delete(id);
36
+ break;
37
+ }
38
+ }
7
39
  function parseCookies(cookieHeader) {
8
40
  const list = {};
9
41
  if (cookieHeader.length === 0)
@@ -39,7 +71,7 @@ function buildSessionCookie(cookieName, sessionId) {
39
71
  // HttpOnly prevents JS access; SameSite=Lax is a reasonable default for app sessions.
40
72
  return `${cookieName}=${encodeURIComponent(sessionId)}; Path=/; HttpOnly; SameSite=Lax`;
41
73
  }
42
- function createSessionApi(sessions, sessionId, ttlMs) {
74
+ function createSessionApi(sessions, sessionId, ttlMs, maxSessions) {
43
75
  const withoutKey = (data, key) => {
44
76
  if (!Object.prototype.hasOwnProperty.call(data, key))
45
77
  return data;
@@ -53,6 +85,7 @@ function createSessionApi(sessions, sessionId, ttlMs) {
53
85
  if (existing !== undefined && existing.expiresAt > now) {
54
86
  return existing;
55
87
  }
88
+ enforceSessionCapacity(sessions, maxSessions, sessionId);
56
89
  const created = { data: {}, expiresAt: now + ttlMs };
57
90
  sessions.set(sessionId, created);
58
91
  return created;
@@ -89,6 +122,14 @@ export const SessionManager = Object.freeze({
89
122
  create(options = {}) {
90
123
  const config = { ...DEFAULT_OPTIONS, ...options };
91
124
  const sessions = new Map();
125
+ const cleanupInterval = config.cleanupIntervalMs > 0
126
+ ? globalThis.setInterval(() => {
127
+ cleanupExpiredSessions(sessions);
128
+ }, config.cleanupIntervalMs)
129
+ : undefined;
130
+ if (cleanupInterval && isUnrefableTimer(cleanupInterval)) {
131
+ cleanupInterval.unref();
132
+ }
92
133
  return {
93
134
  getIdFromCookieHeader(cookieHeader) {
94
135
  if (cookieHeader === undefined || cookieHeader.length === 0)
@@ -127,21 +168,19 @@ export const SessionManager = Object.freeze({
127
168
  return sessionId;
128
169
  },
129
170
  get(sessionId) {
130
- return createSessionApi(sessions, sessionId, config.ttlMs);
171
+ return createSessionApi(sessions, sessionId, config.ttlMs, config.maxSessions);
131
172
  },
132
173
  destroy(sessionId) {
133
174
  sessions.delete(sessionId);
134
175
  },
135
176
  cleanup() {
136
- const now = Date.now();
137
- let removed = 0;
138
- for (const [id, stored] of sessions.entries()) {
139
- if (stored.expiresAt <= now) {
140
- sessions.delete(id);
141
- removed++;
142
- }
177
+ return cleanupExpiredSessions(sessions);
178
+ },
179
+ dispose() {
180
+ if (cleanupInterval !== undefined) {
181
+ clearInterval(cleanupInterval);
143
182
  }
144
- return removed;
183
+ sessions.clear();
145
184
  },
146
185
  };
147
186
  },
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from '../node-singletons/index.js';
2
+ export type CloudflareSocketOptions = {
3
+ tls?: boolean;
4
+ timeoutMs?: number;
5
+ };
6
+ export type CloudflareSocketInstance = EventEmitter & {
7
+ write: (data: Buffer | Uint8Array) => boolean;
8
+ end: () => void;
9
+ destroy: () => void;
10
+ connect: (..._args: unknown[]) => CloudflareSocketInstance;
11
+ startTls: () => Promise<void>;
12
+ pause: () => void;
13
+ resume: () => void;
14
+ setTimeout: (timeoutMs: number, callback?: () => void) => void;
15
+ setNoDelay: (_noDelay?: boolean) => void;
16
+ setKeepAlive: (_enable?: boolean, _initialDelay?: number) => void;
17
+ ref: () => void;
18
+ unref: () => void;
19
+ };
20
+ export type CloudflareSocketFactory = {
21
+ create: (hostname: string, port: number, options?: CloudflareSocketOptions) => CloudflareSocketInstance;
22
+ };
23
+ export declare const CloudflareSocket: CloudflareSocketFactory;
24
+ //# sourceMappingURL=CloudflareSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareSocket.d.ts","sourceRoot":"","sources":["../../../src/sockets/CloudflareSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAehD,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG;IACpD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC;IAC9C,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,wBAAwB,CAAC;IAC3D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC/D,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,CACN,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,uBAAuB,KAC9B,wBAAwB,CAAC;CAC/B,CAAC;AAoSF,eAAO,MAAM,gBAAgB,EAAE,uBAE7B,CAAC"}