@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
@@ -0,0 +1,289 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { Logger } from '../../config/logger.js';
3
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
4
+ import { SmtpDriver, } from '../../tools/mail/drivers/Smtp.js';
5
+ import { ErrorHandler } from '../ErrorHandler.js';
6
+ import { createProxyServer } from '../ProxyServer.js';
7
+ import { resolveProxySigningConfig } from '../ProxySigningConfigResolver.js';
8
+ import { extractSigningHeaders, verifyProxySignatureIfNeeded } from '../ProxySigningRequest.js';
9
+ import { RequestValidator } from '../RequestValidator.js';
10
+ import { SigningService } from '../SigningService.js';
11
+ const normalizeSecure = (value) => {
12
+ if (value === true || value === false)
13
+ return value;
14
+ if (typeof value === 'string') {
15
+ const raw = value.trim().toLowerCase();
16
+ if (raw === '')
17
+ return undefined;
18
+ if (raw === 'starttls')
19
+ return 'starttls';
20
+ if (['tls', 'ssl', 'smtps', 'implicit', 'true', '1', 'yes', 'y'].includes(raw))
21
+ return true;
22
+ if (['false', '0', 'no', 'n'].includes(raw))
23
+ return false;
24
+ }
25
+ return undefined;
26
+ };
27
+ const resolveProxyConfig = (overrides = {}) => {
28
+ const host = overrides.host ?? Env.get('SMTP_PROXY_HOST', Env.HOST ?? '127.0.0.1');
29
+ const port = overrides.port ?? Env.getInt('SMTP_PROXY_PORT', Env.PORT ?? 8794);
30
+ const maxBodyBytes = overrides.maxBodyBytes ?? Env.getInt('SMTP_PROXY_MAX_BODY_BYTES', Env.MAX_BODY_SIZE ?? 131072);
31
+ return { host, port, maxBodyBytes };
32
+ };
33
+ const resolveSmtpConfig = (overrides = {}) => {
34
+ const host = overrides.smtpHost ?? Env.get('MAIL_HOST', '');
35
+ const port = overrides.smtpPort ?? Env.getInt('MAIL_PORT', 587);
36
+ const username = overrides.smtpUsername ?? Env.get('MAIL_USERNAME', '');
37
+ const password = overrides.smtpPassword ?? Env.get('MAIL_PASSWORD', '');
38
+ const secureRaw = overrides.smtpSecure ?? Env.get('MAIL_SECURE', '');
39
+ const secure = normalizeSecure(secureRaw) ?? false;
40
+ return { host, port, username, password, secure };
41
+ };
42
+ const resolveSigningConfig = (overrides = {}) => resolveProxySigningConfig(overrides, {
43
+ keyIdEnvVar: 'SMTP_PROXY_KEY_ID',
44
+ secretEnvVar: 'SMTP_PROXY_SECRET',
45
+ requireEnvVar: 'SMTP_PROXY_REQUIRE_SIGNING',
46
+ windowEnvVar: 'SMTP_PROXY_SIGNING_WINDOW_MS',
47
+ });
48
+ const resolveConfig = (overrides = {}) => {
49
+ const proxyConfig = resolveProxyConfig(overrides);
50
+ const smtpConfig = resolveSmtpConfig(overrides);
51
+ const signingConfig = resolveSigningConfig(overrides);
52
+ return {
53
+ host: proxyConfig.host,
54
+ port: proxyConfig.port,
55
+ maxBodyBytes: proxyConfig.maxBodyBytes,
56
+ smtp: smtpConfig,
57
+ signing: {
58
+ keyId: signingConfig.keyId,
59
+ secret: signingConfig.secret,
60
+ require: signingConfig.requireSigning,
61
+ windowMs: signingConfig.signingWindowMs,
62
+ },
63
+ };
64
+ };
65
+ const validateSmtpConfig = (config) => {
66
+ if (config.host.trim() === '') {
67
+ throw ErrorFactory.createConfigError('SMTP proxy missing MAIL_HOST');
68
+ }
69
+ if (!Number.isFinite(config.port) || config.port <= 0) {
70
+ throw ErrorFactory.createConfigError('SMTP proxy MAIL_PORT must be a positive integer');
71
+ }
72
+ const username = config.username ?? '';
73
+ const password = config.password ?? '';
74
+ if ((username.trim() !== '' && password.trim() === '') ||
75
+ (username.trim() === '' && password.trim() !== '')) {
76
+ throw ErrorFactory.createConfigError('SMTP proxy requires both MAIL_USERNAME and MAIL_PASSWORD');
77
+ }
78
+ };
79
+ const verifySignatureIfNeeded = async (req, body, config) => {
80
+ const headers = extractSigningHeaders(req);
81
+ if (SigningService.shouldVerify(config.signing, headers)) {
82
+ const verified = await verifyProxySignatureIfNeeded(req, body, config.signing);
83
+ if (!verified.ok) {
84
+ const normalizedSigning = typeof SigningService['normalizeConfig'] === 'function'
85
+ ? SigningService['normalizeConfig'](config.signing)
86
+ : config.signing;
87
+ Logger.warn('[SmtpProxy] Signing verification failed', {
88
+ code: 'INVALID_SIGNATURE',
89
+ message: verified.error?.message ?? 'Invalid signature',
90
+ keyId: headers['x-zt-key-id'],
91
+ expectedKeyId: normalizedSigning.keyId,
92
+ requireSigning: normalizedSigning.require,
93
+ });
94
+ return {
95
+ ok: false,
96
+ error: {
97
+ status: verified.error?.status ?? 401,
98
+ message: verified.error?.message ?? 'Unauthorized',
99
+ },
100
+ };
101
+ }
102
+ }
103
+ return { ok: true };
104
+ };
105
+ const isRecord = (value) => typeof value === 'object' && value !== null;
106
+ const parseAttachment = (value) => {
107
+ if (!isRecord(value)) {
108
+ return {
109
+ ok: false,
110
+ error: { code: 'VALIDATION_ERROR', message: 'attachments must be objects' },
111
+ };
112
+ }
113
+ const filename = value['filename'];
114
+ const contentBase64 = value['contentBase64'];
115
+ if (typeof filename !== 'string' || filename.trim() === '') {
116
+ return {
117
+ ok: false,
118
+ error: { code: 'VALIDATION_ERROR', message: 'attachment filename is required' },
119
+ };
120
+ }
121
+ if (typeof contentBase64 !== 'string' || contentBase64.trim() === '') {
122
+ return {
123
+ ok: false,
124
+ error: { code: 'VALIDATION_ERROR', message: 'attachment contentBase64 is required' },
125
+ };
126
+ }
127
+ const content = Buffer.from(contentBase64, 'base64');
128
+ return { ok: true, value: { filename, content } };
129
+ };
130
+ const parseTo = (value) => {
131
+ if (typeof value === 'string' || Array.isArray(value)) {
132
+ return { ok: true, value: value };
133
+ }
134
+ return {
135
+ ok: false,
136
+ error: { code: 'VALIDATION_ERROR', message: 'to must be a string or array' },
137
+ };
138
+ };
139
+ const parseFrom = (value) => {
140
+ if (!isRecord(value)) {
141
+ return { ok: false, error: { code: 'VALIDATION_ERROR', message: 'from is required' } };
142
+ }
143
+ const email = value['email'];
144
+ const name = value['name'];
145
+ if (typeof email !== 'string' || email.trim() === '') {
146
+ return { ok: false, error: { code: 'VALIDATION_ERROR', message: 'from.email is required' } };
147
+ }
148
+ return {
149
+ ok: true,
150
+ value: {
151
+ email,
152
+ name: typeof name === 'string' && name.trim() !== '' ? name : undefined,
153
+ },
154
+ };
155
+ };
156
+ const parseHtml = (value) => {
157
+ if (value === undefined)
158
+ return { ok: true, value: undefined };
159
+ if (typeof value === 'string')
160
+ return { ok: true, value };
161
+ return { ok: false, error: { code: 'VALIDATION_ERROR', message: 'html must be a string' } };
162
+ };
163
+ const parseAttachments = (value) => {
164
+ if (value === undefined)
165
+ return { ok: true, value: undefined };
166
+ if (!Array.isArray(value)) {
167
+ return {
168
+ ok: false,
169
+ error: { code: 'VALIDATION_ERROR', message: 'attachments must be an array' },
170
+ };
171
+ }
172
+ const attachments = [];
173
+ for (const entry of value) {
174
+ const parsed = parseAttachment(entry);
175
+ if (!parsed.ok)
176
+ return parsed;
177
+ attachments.push(parsed.value);
178
+ }
179
+ return { ok: true, value: attachments };
180
+ };
181
+ const parseMessagePayload = (payload) => {
182
+ const messageRaw = payload['message'];
183
+ if (!isRecord(messageRaw)) {
184
+ return { ok: false, error: { code: 'VALIDATION_ERROR', message: 'message is required' } };
185
+ }
186
+ const toParsed = parseTo(messageRaw['to']);
187
+ if (!toParsed.ok)
188
+ return toParsed;
189
+ const fromParsed = parseFrom(messageRaw['from']);
190
+ if (!fromParsed.ok)
191
+ return fromParsed;
192
+ const subject = messageRaw['subject'];
193
+ if (typeof subject !== 'string' || subject.trim() === '') {
194
+ return { ok: false, error: { code: 'VALIDATION_ERROR', message: 'subject is required' } };
195
+ }
196
+ const text = messageRaw['text'];
197
+ if (typeof text !== 'string' || text.trim() === '') {
198
+ return { ok: false, error: { code: 'VALIDATION_ERROR', message: 'text is required' } };
199
+ }
200
+ const htmlParsed = parseHtml(messageRaw['html']);
201
+ if (!htmlParsed.ok)
202
+ return htmlParsed;
203
+ const attachmentsParsed = parseAttachments(messageRaw['attachments']);
204
+ if (!attachmentsParsed.ok)
205
+ return attachmentsParsed;
206
+ return {
207
+ ok: true,
208
+ value: {
209
+ to: toParsed.value,
210
+ from: fromParsed.value,
211
+ subject,
212
+ text,
213
+ html: htmlParsed.value,
214
+ attachments: attachmentsParsed.value,
215
+ },
216
+ };
217
+ };
218
+ const createBackend = (config) => ({
219
+ name: 'smtp',
220
+ handle: async (request) => {
221
+ const methodError = RequestValidator.requirePost(request.method);
222
+ Logger.info('[SmtpProxy] Received request', { path: request.path, method: request.method });
223
+ if (methodError) {
224
+ return ErrorHandler.toProxyError(405, methodError.code, methodError.message);
225
+ }
226
+ if (request.path !== '/zin/smtp/send') {
227
+ Logger.warn('[SmtpProxy] 404 Not Found', { path: request.path });
228
+ return ErrorHandler.toProxyError(404, 'NOT_FOUND', 'Unknown endpoint');
229
+ }
230
+ const parsed = RequestValidator.parseJson(request.body);
231
+ if (!parsed.ok) {
232
+ return ErrorHandler.toProxyError(400, parsed.error.code, parsed.error.message);
233
+ }
234
+ const messageValidation = parseMessagePayload(parsed.value);
235
+ if (!messageValidation.ok) {
236
+ return ErrorHandler.toProxyError(400, messageValidation.error.code, messageValidation.error.message);
237
+ }
238
+ try {
239
+ Logger.info('[SmtpProxy] Sending email via SmtpDriver', { to: messageValidation.value.to });
240
+ await SmtpDriver.send(config.smtp, messageValidation.value);
241
+ Logger.info('[SmtpProxy] Email sent successfully');
242
+ return { status: 200, body: { ok: true } };
243
+ }
244
+ catch (error) {
245
+ Logger.error('[SmtpProxy] Failed to send email', error);
246
+ return ErrorHandler.toProxyError(500, 'SMTP_PROXY_ERROR', String(error));
247
+ }
248
+ },
249
+ async health() {
250
+ try {
251
+ validateSmtpConfig(config.smtp);
252
+ await Promise.resolve();
253
+ return { status: 200, body: { status: 'healthy' } };
254
+ }
255
+ catch (error) {
256
+ return ErrorHandler.toProxyError(503, 'UNHEALTHY', String(error));
257
+ }
258
+ },
259
+ });
260
+ const createVerifier = (config) => async (req, body) => {
261
+ const verified = await verifySignatureIfNeeded(req, body, config);
262
+ if (!verified.ok && verified.error) {
263
+ return { ok: false, status: verified.error.status, message: verified.error.message };
264
+ }
265
+ return { ok: true };
266
+ };
267
+ export const SmtpProxyServer = Object.freeze({
268
+ async start(overrides = {}) {
269
+ const config = resolveConfig(overrides);
270
+ validateSmtpConfig(config.smtp);
271
+ try {
272
+ Logger.info(`SMTP proxy config: proxyHost=${config.host} proxyPort=${config.port} smtpHost=${String(config.smtp.host)} smtpPort=${String(config.smtp.port)} smtpUser=${String(config.smtp.username ?? '')}`);
273
+ }
274
+ catch {
275
+ // noop
276
+ }
277
+ const backend = createBackend(config);
278
+ const server = createProxyServer({
279
+ host: config.host,
280
+ port: config.port,
281
+ maxBodyBytes: config.maxBodyBytes,
282
+ backend,
283
+ verify: createVerifier(config),
284
+ });
285
+ await server.start();
286
+ Logger.info(`SMTP proxy listening on http://${config.host}:${config.port}`);
287
+ },
288
+ });
289
+ export default SmtpProxyServer;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/proxy/smtp/register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { ProxyRegistry } from '../ProxyRegistry.js';
2
+ ProxyRegistry.register({
3
+ name: 'smtp',
4
+ description: 'SMTP HTTP proxy server',
5
+ });
@@ -0,0 +1,14 @@
1
+ import { type BaseProxyOverrides } from '../ProxyServerUtils';
2
+ type ProxyOverrides = BaseProxyOverrides & Partial<{
3
+ dbHost: string;
4
+ dbPort: number;
5
+ dbName: string;
6
+ dbUser: string;
7
+ dbPass: string;
8
+ connectionLimit: number;
9
+ }>;
10
+ export declare const SqlServerProxyServer: Readonly<{
11
+ start(overrides?: ProxyOverrides): Promise<void>;
12
+ }>;
13
+ export {};
14
+ //# sourceMappingURL=SqlServerProxyServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlServerProxyServer.d.ts","sourceRoot":"","sources":["../../../../src/proxy/sqlserver/SqlServerProxyServer.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAejC,KAAK,cAAc,GAAG,kBAAkB,GACtC,OAAO,CAAC;IACN,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AA+KL,eAAO,MAAM,oBAAoB;sBACR,cAAc,GAAQ,OAAO,CAAC,IAAI,CAAC;EAmC1D,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { Env } from '../../config/env.js';
2
+ import { Logger } from '../../config/logger.js';
3
+ import { ErrorHandler } from '../ErrorHandler.js';
4
+ import { createProxyServer } from '../ProxyServer.js';
5
+ import { resolveBaseConfig, resolveBaseSigningConfig, verifyRequestSignature, } from '../ProxyServerUtils.js';
6
+ import { RequestValidator } from '../RequestValidator.js';
7
+ import { validateSqlPayload } from '../SqlPayloadValidator.js';
8
+ const resolveDatabaseConfig = (overrides = {}) => {
9
+ const dbHost = overrides.dbHost ?? Env.get('DB_HOST_MSSQL', Env.get('DB_HOST', '127.0.0.1'));
10
+ const dbPort = overrides.dbPort ?? Env.getInt('DB_PORT_MSSQL', 1433);
11
+ const dbName = overrides.dbName ?? Env.get('DB_DATABASE_MSSQL', 'zintrust');
12
+ const dbUser = overrides.dbUser ?? Env.get('DB_USERNAME_MSSQL', 'sa');
13
+ const dbPass = overrides.dbPass ?? Env.get('DB_PASSWORD_MSSQL', '');
14
+ const connectionLimit = overrides.connectionLimit ?? Env.getInt('SQLSERVER_PROXY_POOL_LIMIT', 10);
15
+ return { dbHost, dbPort, dbName, dbUser, dbPass, connectionLimit };
16
+ };
17
+ const resolveConfig = (overrides = {}) => {
18
+ const proxyConfig = resolveBaseConfig(overrides, 'SQLSERVER');
19
+ const dbConfig = resolveDatabaseConfig(overrides);
20
+ const signingConfig = resolveBaseSigningConfig(overrides, 'SQLSERVER');
21
+ const poolConfig = {
22
+ server: dbConfig.dbHost,
23
+ port: dbConfig.dbPort,
24
+ database: dbConfig.dbName,
25
+ user: dbConfig.dbUser,
26
+ password: dbConfig.dbPass,
27
+ pool: {
28
+ max: dbConfig.connectionLimit,
29
+ min: 0,
30
+ idleTimeoutMillis: 30000,
31
+ },
32
+ options: {
33
+ encrypt: false,
34
+ trustServerCertificate: true,
35
+ },
36
+ };
37
+ return {
38
+ host: proxyConfig.host,
39
+ port: proxyConfig.port,
40
+ maxBodyBytes: proxyConfig.maxBodyBytes,
41
+ poolConfig,
42
+ signing: {
43
+ keyId: signingConfig.keyId,
44
+ secret: signingConfig.secret,
45
+ require: signingConfig.requireSigning,
46
+ windowMs: signingConfig.signingWindowMs,
47
+ },
48
+ };
49
+ };
50
+ const validateQueryPayload = (payload) => {
51
+ const base = validateSqlPayload(payload);
52
+ if (!base.valid) {
53
+ return { valid: false, error: base.error };
54
+ }
55
+ if (base.sql.trim() === '') {
56
+ return { valid: false, error: { code: 'VALIDATION_ERROR', message: 'sql is required' } };
57
+ }
58
+ return { valid: true, sql: base.sql, params: base.params };
59
+ };
60
+ const getSqlModule = async () => {
61
+ const mod = await import('mssql');
62
+ return mod;
63
+ };
64
+ const createPool = async (config) => {
65
+ const mod = await getSqlModule();
66
+ const connect = mod['connect'];
67
+ return connect(config);
68
+ };
69
+ const executeQuery = async (pool, sqlQuery, params) => {
70
+ const requestFunc = pool['request'];
71
+ const request = requestFunc();
72
+ params.forEach((param, index) => {
73
+ const inputFunc = request['input'];
74
+ inputFunc(`param${index}`, param);
75
+ });
76
+ const queryFunc = request['query'];
77
+ return queryFunc(sqlQuery);
78
+ };
79
+ const handleEndpoint = (path, result) => {
80
+ const rows = result['recordset'];
81
+ const rowsAffected = result['rowsAffected'];
82
+ if (path === '/zin/sqlserver/query') {
83
+ return { status: 200, body: { rows, rowCount: rowsAffected[0] ?? 0 } };
84
+ }
85
+ if (path === '/zin/sqlserver/queryOne') {
86
+ const firstRow = Array.isArray(rows) ? rows[0] : null;
87
+ return { status: 200, body: { row: firstRow ?? null } };
88
+ }
89
+ if (path === '/zin/sqlserver/exec') {
90
+ return {
91
+ status: 200,
92
+ body: {
93
+ ok: true,
94
+ meta: { changes: rowsAffected[0] ?? 0 },
95
+ },
96
+ };
97
+ }
98
+ return ErrorHandler.toProxyError(404, 'NOT_FOUND', 'Unknown endpoint');
99
+ };
100
+ const createBackend = (pool) => ({
101
+ name: 'sqlserver',
102
+ handle: async (request) => {
103
+ const methodError = RequestValidator.requirePost(request.method);
104
+ if (methodError) {
105
+ return ErrorHandler.toProxyError(405, methodError.code, methodError.message);
106
+ }
107
+ const parsed = RequestValidator.parseJson(request.body);
108
+ if (!parsed.ok) {
109
+ return ErrorHandler.toProxyError(400, parsed.error.code, parsed.error.message);
110
+ }
111
+ const sqlValidation = validateQueryPayload(parsed.value);
112
+ if (!sqlValidation.valid) {
113
+ const error = sqlValidation.error ?? {
114
+ code: 'VALIDATION_ERROR',
115
+ message: 'Invalid SQL payload',
116
+ };
117
+ return ErrorHandler.toProxyError(400, error.code, error.message);
118
+ }
119
+ try {
120
+ const result = await executeQuery(pool, sqlValidation.sql ?? '', sqlValidation.params ?? []);
121
+ return handleEndpoint(request.path, result);
122
+ }
123
+ catch (error) {
124
+ return ErrorHandler.toProxyError(500, 'SQLSERVER_ERROR', String(error));
125
+ }
126
+ },
127
+ health: async () => {
128
+ try {
129
+ await executeQuery(pool, 'SELECT 1', []);
130
+ return { status: 200, body: { status: 'healthy' } };
131
+ }
132
+ catch (error) {
133
+ return ErrorHandler.toProxyError(503, 'UNHEALTHY', String(error));
134
+ }
135
+ },
136
+ shutdown: async () => {
137
+ const closeFunc = pool['close'];
138
+ await closeFunc();
139
+ },
140
+ });
141
+ export const SqlServerProxyServer = Object.freeze({
142
+ async start(overrides = {}) {
143
+ const config = resolveConfig(overrides);
144
+ try {
145
+ Logger.info(`SQL Server proxy config: proxyHost=${config.host} proxyPort=${config.port} dbHost=${String(config.poolConfig['server'])} dbPort=${String(config.poolConfig['port'])} dbName=${String(config.poolConfig['database'])} dbUser=${String(config.poolConfig['user'])}`);
146
+ }
147
+ catch {
148
+ // noop - logging must not block startup
149
+ }
150
+ const pool = await createPool(config.poolConfig);
151
+ const backend = createBackend(pool);
152
+ const proxy = createProxyServer({
153
+ host: config.host,
154
+ port: config.port,
155
+ maxBodyBytes: config.maxBodyBytes,
156
+ backend,
157
+ verify: async (req, body) => {
158
+ const verified = await verifyRequestSignature(req, body, config, 'SqlServerProxyServer');
159
+ if (!verified.ok && verified.error) {
160
+ return { ok: false, status: verified.error.status, message: verified.error.message };
161
+ }
162
+ return { ok: true };
163
+ },
164
+ });
165
+ await proxy.start();
166
+ Logger.info(`✓ SQL Server proxy listening on ${config.host}:${config.port}`);
167
+ },
168
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/proxy/sqlserver/register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { ProxyRegistry } from '../ProxyRegistry.js';
2
+ ProxyRegistry.register({
3
+ name: 'sqlserver',
4
+ description: 'SQL Server HTTP proxy',
5
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/routes/doc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,aAAa,EACb,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAiBjC;;GAEG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,SAAS,KAAG,IAWhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,EACf,UAAU,SAAS,KAClB,OAAO,CAAC,OAAO,CAgDjB,CAAC;AASF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,OAAO,KAAG,IAMnD,CAAC;;gCANwC,OAAO,KAAG,IAAI;2CA5EH,SAAS,KAAG,IAAI;2CAiB1D,MAAM,YACL,SAAS,KAClB,OAAO,CAAC,OAAO,CAAC;;AAiEnB,wBAIE"}
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/routes/doc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,4BAA4B,EAC5B,aAAa,EACb,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAkCjC;;GAEG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,SAAS,KAAG,IAWhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,EACf,UAAU,SAAS,KAClB,OAAO,CAAC,OAAO,CAgDjB,CAAC;AASF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,OAAO,KAAG,IAMnD,CAAC;;gCANwC,OAAO,KAAG,IAAI;2CA5EH,SAAS,KAAG,IAAI;2CAiB1D,MAAM,YACL,SAAS,KAClB,OAAO,CAAC,OAAO,CAAC;;AAiEnB,wBAIE"}
package/src/routes/doc.js CHANGED
@@ -16,8 +16,22 @@ export { MIME_TYPES_MAP } from './common.js';
16
16
  */
17
17
  // Backward-compatible re-exports
18
18
  export { findPackageRoot, findPackageRootAsync, getFrameworkPublicRoots, getFrameworkPublicRootsAsync, getPublicRoot, getPublicRootAsync, } from './publicRoot.js';
19
+ const PUBLIC_ROOT_CACHE_TTL_MS = 3000000000; //50 minutes, effectively caching for the duration of typical dev sessions
20
+ let cachedPublicRoot = null;
21
+ const getCachedPublicRootAsync = async () => {
22
+ const now = Date.now();
23
+ if (cachedPublicRoot !== null && cachedPublicRoot.expiresAt > now) {
24
+ return cachedPublicRoot.value;
25
+ }
26
+ const resolved = await getPublicRootAsync();
27
+ cachedPublicRoot = {
28
+ value: resolved,
29
+ expiresAt: now + PUBLIC_ROOT_CACHE_TTL_MS,
30
+ };
31
+ return resolved;
32
+ };
19
33
  const mapStaticPathAsync = async (urlPath) => {
20
- const publicRoot = await getPublicRootAsync();
34
+ const publicRoot = await getCachedPublicRootAsync();
21
35
  const normalize = (p) => (p.startsWith('/') ? p.slice(1) : p);
22
36
  if (urlPath === '/doc' || urlPath === '/doc/')
23
37
  return publicRoot;
@@ -94,7 +108,7 @@ const handleDocRequest = async (req, res) => {
94
108
  const urlPath = req.getPath();
95
109
  if (await serveDocumentationFileAsync(urlPath, res))
96
110
  return;
97
- ErrorRouting.handleNotFound(req, res);
111
+ await ErrorRouting.handleNotFound(req, res);
98
112
  };
99
113
  export const registerDocRoutes = (router) => {
100
114
  // Root docs entrypoints.
@@ -10,12 +10,13 @@ import type * as http from '../node-singletons/http';
10
10
  * Debug routes to always render 404/500 responses.
11
11
  */
12
12
  export declare const registerErrorRoutes: (router: IRouter) => void;
13
- export declare const ErrorRouting: Readonly<{
13
+ type ErrorRoutingApi = {
14
14
  getPublicRoot: () => string;
15
15
  registerErrorRoutes: (router: IRouter) => void;
16
- handleNotFound: (request: IRequest, response: IResponse, requestId?: string) => void;
17
- handleInternalServerErrorWithWrappers: (request: IRequest, response: IResponse, error: unknown, requestId?: string) => void;
16
+ handleNotFound: (request: IRequest, response: IResponse, requestId?: string) => Promise<void>;
17
+ handleInternalServerErrorWithWrappers: (request: IRequest, response: IResponse, error: unknown, requestId?: string) => Promise<void>;
18
18
  handleInternalServerErrorRaw: (res: http.ServerResponse) => void;
19
- }>;
19
+ };
20
+ export declare const ErrorRouting: ErrorRoutingApi;
20
21
  export default ErrorRouting;
21
22
  //# sourceMappingURL=error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/routes/error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAoKnD;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,OAAO,KAAG,IAGrD,CAAC;AAEF,eAAO,MAAM,YAAY;;kCALmB,OAAO,KAAG,IAAI;8BA7GzB,QAAQ,YAAY,SAAS,cAAc,MAAM,KAAG,IAAI;qDA4B9E,QAAQ,YACP,SAAS,SACZ,OAAO,cACF,MAAM,KACjB,IAAI;wCA0DoC,IAAI,CAAC,cAAc,KAAG,IAAI;EA8BnE,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/routes/error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC;AA0KnD;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,OAAO,KAAG,IAGrD,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,mBAAmB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,qCAAqC,EAAE,CACrC,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,4BAA4B,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;CAClE,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAMzB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { appConfig } from '../config/app.js';
6
6
  import { HTTP_HEADERS, MIME_TYPES } from '../config/constants.js';
7
- import { serveErrorPagesFile, serveZintrustSvgFile } from './errorPages.js';
7
+ import { serveErrorPagesFileAsync, serveZintrustSvgFile, serveZintrustSvgFileAsync, } from './errorPages.js';
8
8
  import { getPublicRoot } from './publicRoot.js';
9
9
  import { Router } from './Router.js';
10
10
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
@@ -31,11 +31,11 @@ const safeJsonStringify = (value) => {
31
31
  return '';
32
32
  }
33
33
  };
34
- const trySendHtmlErrorPage = (request, response, input) => {
34
+ const trySendHtmlErrorPage = async (request, response, input) => {
35
35
  if (!ErrorPageRenderer.shouldSendHtml(request))
36
36
  return false;
37
37
  const publicRoot = getPublicRoot();
38
- const html = ErrorPageRenderer.renderHtml(publicRoot, {
38
+ const html = await ErrorPageRenderer.renderHtmlAsync(publicRoot, {
39
39
  statusCode: input.statusCode,
40
40
  errorName: input.errorName,
41
41
  errorMessage: input.errorMessage,
@@ -50,18 +50,20 @@ const trySendHtmlErrorPage = (request, response, input) => {
50
50
  response.html(html);
51
51
  return true;
52
52
  };
53
- const handleNotFound = (request, response, requestId) => {
53
+ const handleNotFound = async (request, response, requestId) => {
54
54
  const path = request.getPath();
55
55
  if (path.startsWith('/error-pages/')) {
56
- serveErrorPagesFile(path, response);
56
+ await serveErrorPagesFileAsync(path, response);
57
57
  return;
58
58
  }
59
59
  if (path === '/zintrust.svg') {
60
- serveZintrustSvgFile(response);
60
+ if (!(await serveZintrustSvgFileAsync(response))) {
61
+ serveZintrustSvgFile(response);
62
+ }
61
63
  return;
62
64
  }
63
65
  response.setStatus(404);
64
- if (trySendHtmlErrorPage(request, response, {
66
+ if (await trySendHtmlErrorPage(request, response, {
65
67
  statusCode: 404,
66
68
  errorName: 'Not Found',
67
69
  errorMessage: 'The page you requested could not be found.',
@@ -70,7 +72,7 @@ const handleNotFound = (request, response, requestId) => {
70
72
  }
71
73
  response.json(ErrorResponse.notFound('Route', requestId));
72
74
  };
73
- const handleInternalServerErrorWithWrappers = (request, response, error, requestId) => {
75
+ const handleInternalServerErrorWithWrappers = async (request, response, error, requestId) => {
74
76
  response.setStatus(500);
75
77
  const isDev = appConfig.isDevelopment();
76
78
  const err = error instanceof Error ? error : ErrorFactory.createGeneralError('Unknown error', error);
@@ -94,7 +96,7 @@ const handleInternalServerErrorWithWrappers = (request, response, error, request
94
96
  const stackRaw = isDev
95
97
  ? safeJsonStringify({ name: err.name, message: err.message, stack: err.stack })
96
98
  : undefined;
97
- if (trySendHtmlErrorPage(request, response, {
99
+ if (await trySendHtmlErrorPage(request, response, {
98
100
  statusCode: 500,
99
101
  errorName,
100
102
  errorMessage,
@@ -111,14 +113,14 @@ const handleInternalServerErrorRaw = (res) => {
111
113
  res.writeHead(500, { [HTTP_HEADERS.CONTENT_TYPE]: MIME_TYPES.JSON });
112
114
  res.end(JSON.stringify(ErrorResponse.internalServerError('Internal server error')));
113
115
  };
114
- const handleForced404 = (req, res) => {
115
- handleNotFound(req, res);
116
+ const handleForced404 = async (req, res) => {
117
+ await handleNotFound(req, res);
116
118
  };
117
- const handleForced500 = (req, res) => {
119
+ const handleForced500 = async (req, res) => {
118
120
  const forced = ErrorFactory.createGeneralError('Forced 500 route', {
119
121
  route: '/500',
120
122
  });
121
- handleInternalServerErrorWithWrappers(req, res, forced);
123
+ await handleInternalServerErrorWithWrappers(req, res, forced);
122
124
  };
123
125
  /**
124
126
  * Debug routes to always render 404/500 responses.
@@ -5,7 +5,9 @@
5
5
  import type { IRouter } from './Router';
6
6
  import type { IResponse } from '../http/Response';
7
7
  export declare const serveErrorPagesFile: (urlPath: string, response: IResponse) => boolean;
8
+ export declare const serveErrorPagesFileAsync: (urlPath: string, response: IResponse) => Promise<boolean>;
8
9
  export declare const serveZintrustSvgFile: (response: IResponse) => boolean;
10
+ export declare const serveZintrustSvgFileAsync: (response: IResponse) => Promise<boolean>;
9
11
  export declare const registerErrorPagesRoutes: (router: IRouter) => void;
10
12
  declare const _default: {
11
13
  registerErrorPagesRoutes: (router: IRouter) => void;