@zintrust/core 0.1.1 → 0.1.3

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 (487) hide show
  1. package/README.md +3 -3
  2. package/bin/zintrust.d.ts.map +1 -1
  3. package/bin/zintrust.js +18 -1
  4. package/package.json +15 -1
  5. package/src/boot/Application.d.ts.map +1 -1
  6. package/src/boot/Application.js +46 -3
  7. package/src/boot/Server.d.ts.map +1 -1
  8. package/src/boot/Server.js +3 -4
  9. package/src/boot/bootstrap.js +77 -6
  10. package/src/builder/BundleOptimizer.d.ts.map +1 -1
  11. package/src/builder/BundleOptimizer.js +6 -4
  12. package/src/cache/drivers/KVDriver.d.ts.map +1 -1
  13. package/src/cache/drivers/KVDriver.js +6 -6
  14. package/src/cache/drivers/RedisDriver.js +1 -1
  15. package/src/cli/BaseCommand.d.ts +2 -2
  16. package/src/cli/BaseCommand.d.ts.map +1 -1
  17. package/src/cli/BaseCommand.js +2 -1
  18. package/src/cli/CLI.d.ts.map +1 -1
  19. package/src/cli/CLI.js +11 -4
  20. package/src/cli/commands/AddCommand.js +1 -1
  21. package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
  22. package/src/cli/commands/ConfigCommand.js +34 -4
  23. package/src/cli/commands/D1MigrateCommand.d.ts +4 -0
  24. package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
  25. package/src/cli/commands/D1MigrateCommand.js +4 -3
  26. package/src/cli/commands/FixCommand.d.ts.map +1 -1
  27. package/src/cli/commands/FixCommand.js +3 -16
  28. package/src/cli/commands/LogsCleanupCommand.d.ts +6 -0
  29. package/src/cli/commands/LogsCleanupCommand.d.ts.map +1 -0
  30. package/src/cli/commands/LogsCleanupCommand.js +20 -0
  31. package/src/cli/commands/LogsCommand.d.ts.map +1 -1
  32. package/src/cli/commands/LogsCommand.js +1 -1
  33. package/src/cli/commands/MakeMailTemplateCommand.d.ts +10 -0
  34. package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -0
  35. package/src/cli/commands/MakeMailTemplateCommand.js +74 -0
  36. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +10 -0
  37. package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -0
  38. package/src/cli/commands/MakeNotificationTemplateCommand.js +113 -0
  39. package/src/cli/commands/NewCommand.d.ts +4 -0
  40. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  41. package/src/cli/commands/NewCommand.js +33 -20
  42. package/src/cli/commands/PluginCommand.d.ts.map +1 -1
  43. package/src/cli/commands/PluginCommand.js +8 -4
  44. package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
  45. package/src/cli/commands/PrepareCommand.js +1 -1
  46. package/src/cli/commands/QACommand.d.ts.map +1 -1
  47. package/src/cli/commands/QACommand.js +11 -20
  48. package/src/cli/commands/SecretsCommand.d.ts +16 -0
  49. package/src/cli/commands/SecretsCommand.d.ts.map +1 -0
  50. package/src/cli/commands/SecretsCommand.js +91 -0
  51. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  52. package/src/cli/commands/StartCommand.js +2 -2
  53. package/src/cli/commands/TemplatesCommand.d.ts +3 -0
  54. package/src/cli/commands/TemplatesCommand.d.ts.map +1 -0
  55. package/src/cli/commands/TemplatesCommand.js +65 -0
  56. package/src/cli/commands/index.d.ts +5 -0
  57. package/src/cli/commands/index.d.ts.map +1 -1
  58. package/src/cli/commands/index.js +5 -0
  59. package/src/cli/config/ConfigManager.js +1 -1
  60. package/src/cli/index.d.ts +2 -1
  61. package/src/cli/index.d.ts.map +1 -1
  62. package/src/cli/index.js +2 -1
  63. package/src/cli/scaffolding/ControllerGenerator.js +1 -1
  64. package/src/cli/scaffolding/FeatureScaffolder.js +4 -4
  65. package/src/cli/scaffolding/FileGenerator.js +1 -1
  66. package/src/cli/scaffolding/ModelGenerator.js +1 -1
  67. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  68. package/src/cli/scaffolding/ProjectScaffolder.js +61 -11
  69. package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -1
  70. package/src/cli/scaffolding/ResponseFactoryGenerator.js +3 -2
  71. package/src/cli/scaffolding/RouteGenerator.js +1 -1
  72. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +1 -1
  73. package/src/cli/scaffolding/ServiceScaffolder.js +2 -2
  74. package/src/cli/scaffolding/TemplateGenerator.d.ts +40 -0
  75. package/src/cli/scaffolding/TemplateGenerator.d.ts.map +1 -0
  76. package/src/cli/scaffolding/TemplateGenerator.js +172 -0
  77. package/src/cli/scaffolding/index.d.ts +1 -0
  78. package/src/cli/scaffolding/index.d.ts.map +1 -1
  79. package/src/cli/scaffolding/index.js +1 -0
  80. package/src/cli/utils/spawn.js +1 -1
  81. package/src/common/AwsSigV4.d.ts +41 -0
  82. package/src/common/AwsSigV4.d.ts.map +1 -0
  83. package/src/common/AwsSigV4.js +69 -0
  84. package/src/common/index.d.ts +39 -0
  85. package/src/common/index.d.ts.map +1 -1
  86. package/src/common/index.js +101 -8
  87. package/src/common/uuid.d.ts +3 -0
  88. package/src/common/uuid.d.ts.map +1 -0
  89. package/src/common/uuid.js +30 -0
  90. package/src/config/FileLogWriter.d.ts +22 -0
  91. package/src/config/FileLogWriter.d.ts.map +1 -0
  92. package/src/config/FileLogWriter.js +192 -0
  93. package/src/config/SecretsManager.d.ts.map +1 -1
  94. package/src/config/SecretsManager.js +37 -11
  95. package/src/config/StartupConfigValidator.d.ts +15 -0
  96. package/src/config/StartupConfigValidator.d.ts.map +1 -0
  97. package/src/config/StartupConfigValidator.js +86 -0
  98. package/src/config/app.d.ts +2 -1
  99. package/src/config/app.d.ts.map +1 -1
  100. package/src/config/app.js +65 -15
  101. package/src/config/broadcast.d.ts +47 -0
  102. package/src/config/broadcast.d.ts.map +1 -0
  103. package/src/config/broadcast.js +54 -0
  104. package/src/config/cache.d.ts +13 -17
  105. package/src/config/cache.d.ts.map +1 -1
  106. package/src/config/cache.js +9 -11
  107. package/src/config/cloudflare.d.ts +26 -0
  108. package/src/config/cloudflare.d.ts.map +1 -0
  109. package/src/config/cloudflare.js +38 -0
  110. package/src/config/env.d.ts +6 -0
  111. package/src/config/env.d.ts.map +1 -1
  112. package/src/config/env.js +6 -0
  113. package/src/config/index.d.ts +52 -28
  114. package/src/config/index.d.ts.map +1 -1
  115. package/src/config/index.js +3 -0
  116. package/src/config/logger.d.ts +2 -0
  117. package/src/config/logger.d.ts.map +1 -1
  118. package/src/config/logger.js +270 -11
  119. package/src/config/logging/HttpLogger.d.ts +23 -0
  120. package/src/config/logging/HttpLogger.d.ts.map +1 -0
  121. package/src/config/logging/HttpLogger.js +93 -0
  122. package/src/config/logging/KvLogger.d.ts +22 -0
  123. package/src/config/logging/KvLogger.d.ts.map +1 -0
  124. package/src/config/logging/KvLogger.js +143 -0
  125. package/src/config/logging/SlackLogger.d.ts +23 -0
  126. package/src/config/logging/SlackLogger.d.ts.map +1 -0
  127. package/src/config/logging/SlackLogger.js +119 -0
  128. package/src/config/mail.d.ts +81 -0
  129. package/src/config/mail.d.ts.map +1 -0
  130. package/src/config/mail.js +73 -0
  131. package/src/config/middleware.d.ts +8 -0
  132. package/src/config/middleware.d.ts.map +1 -0
  133. package/src/config/middleware.js +18 -0
  134. package/src/config/notification.d.ts +62 -0
  135. package/src/config/notification.d.ts.map +1 -0
  136. package/src/config/notification.js +43 -0
  137. package/src/config/security.d.ts.map +1 -1
  138. package/src/config/security.js +2 -2
  139. package/src/config/startup.d.ts +23 -0
  140. package/src/config/startup.d.ts.map +1 -0
  141. package/src/config/startup.js +15 -0
  142. package/src/config/storage.d.ts +21 -35
  143. package/src/config/storage.d.ts.map +1 -1
  144. package/src/config/storage.js +57 -37
  145. package/src/database/migrations/index.d.ts +1 -1
  146. package/src/database/migrations/index.d.ts.map +1 -1
  147. package/src/database/migrations/index.js +2 -1
  148. package/src/features/Queue.js +1 -25
  149. package/src/health/RuntimeHealthProbes.d.ts +13 -0
  150. package/src/health/RuntimeHealthProbes.d.ts.map +1 -0
  151. package/src/health/RuntimeHealthProbes.js +62 -0
  152. package/src/health/StartupHealthChecks.d.ts +26 -0
  153. package/src/health/StartupHealthChecks.d.ts.map +1 -0
  154. package/src/health/StartupHealthChecks.js +124 -0
  155. package/src/http/ErrorResponse.d.ts +28 -0
  156. package/src/http/ErrorResponse.d.ts.map +1 -0
  157. package/src/http/ErrorResponse.js +42 -0
  158. package/src/http/Kernel.d.ts +5 -0
  159. package/src/http/Kernel.d.ts.map +1 -1
  160. package/src/http/Kernel.js +96 -30
  161. package/src/http/RequestContext.d.ts +20 -0
  162. package/src/http/RequestContext.d.ts.map +1 -0
  163. package/src/http/RequestContext.js +77 -0
  164. package/src/index.d.ts +9 -1
  165. package/src/index.d.ts.map +1 -1
  166. package/src/index.js +8 -2
  167. package/src/microservices/MicroserviceManager.d.ts.map +1 -1
  168. package/src/microservices/MicroserviceManager.js +9 -6
  169. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  170. package/src/microservices/PostgresAdapter.js +3 -1
  171. package/src/microservices/ServiceBundler.d.ts.map +1 -1
  172. package/src/microservices/ServiceBundler.js +6 -4
  173. package/src/microservices/ServiceHealthMonitor.js +2 -2
  174. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  175. package/src/middleware/CsrfMiddleware.js +2 -19
  176. package/src/middleware/ErrorHandlerMiddleware.d.ts +6 -0
  177. package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -0
  178. package/src/middleware/ErrorHandlerMiddleware.js +33 -0
  179. package/src/middleware/LoggingMiddleware.d.ts +9 -0
  180. package/src/middleware/LoggingMiddleware.d.ts.map +1 -0
  181. package/src/middleware/LoggingMiddleware.js +36 -0
  182. package/src/middleware/index.d.ts +2 -0
  183. package/src/middleware/index.d.ts.map +1 -1
  184. package/src/middleware/index.js +2 -0
  185. package/src/node-singletons/async_hooks.d.ts +9 -0
  186. package/src/node-singletons/async_hooks.d.ts.map +1 -0
  187. package/src/node-singletons/async_hooks.js +8 -0
  188. package/src/node-singletons/fs.d.ts +2 -2
  189. package/src/node-singletons/fs.d.ts.map +1 -1
  190. package/src/node-singletons/fs.js +2 -2
  191. package/src/node-singletons/http.d.ts +1 -1
  192. package/src/node-singletons/http.d.ts.map +1 -1
  193. package/src/node-singletons/http.js +1 -1
  194. package/src/node-singletons/index.d.ts +4 -0
  195. package/src/node-singletons/index.d.ts.map +1 -1
  196. package/src/node-singletons/index.js +4 -0
  197. package/src/node-singletons/net.d.ts +9 -0
  198. package/src/node-singletons/net.d.ts.map +1 -0
  199. package/src/node-singletons/net.js +8 -0
  200. package/src/node-singletons/os.d.ts +3 -3
  201. package/src/node-singletons/os.d.ts.map +1 -1
  202. package/src/node-singletons/os.js +3 -4
  203. package/src/node-singletons/path.d.ts +3 -1
  204. package/src/node-singletons/path.d.ts.map +1 -1
  205. package/src/node-singletons/path.js +3 -1
  206. package/src/node-singletons/perf-hooks.d.ts +3 -1
  207. package/src/node-singletons/perf-hooks.d.ts.map +1 -1
  208. package/src/node-singletons/perf-hooks.js +3 -1
  209. package/src/node-singletons/process.d.ts +23 -0
  210. package/src/node-singletons/process.d.ts.map +1 -0
  211. package/src/node-singletons/process.js +8 -0
  212. package/src/node-singletons/readline.d.ts +3 -3
  213. package/src/node-singletons/readline.d.ts.map +1 -1
  214. package/src/node-singletons/readline.js +3 -4
  215. package/src/node-singletons/tls.d.ts +9 -0
  216. package/src/node-singletons/tls.d.ts.map +1 -0
  217. package/src/node-singletons/tls.js +8 -0
  218. package/src/node-singletons/url.d.ts +3 -1
  219. package/src/node-singletons/url.d.ts.map +1 -1
  220. package/src/node-singletons/url.js +3 -1
  221. package/src/orm/ConnectionManager.d.ts +6 -1
  222. package/src/orm/ConnectionManager.d.ts.map +1 -1
  223. package/src/orm/ConnectionManager.js +14 -0
  224. package/src/orm/DatabaseAdapter.d.ts +6 -0
  225. package/src/orm/DatabaseAdapter.d.ts.map +1 -1
  226. package/src/orm/QueryBuilder.d.ts +8 -1
  227. package/src/orm/QueryBuilder.d.ts.map +1 -1
  228. package/src/orm/QueryBuilder.js +188 -28
  229. package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
  230. package/src/orm/adapters/D1Adapter.js +18 -12
  231. package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
  232. package/src/orm/adapters/MySQLAdapter.js +4 -0
  233. package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  234. package/src/orm/adapters/PostgreSQLAdapter.js +4 -0
  235. package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
  236. package/src/orm/adapters/SQLServerAdapter.js +4 -0
  237. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  238. package/src/orm/adapters/SQLiteAdapter.js +4 -0
  239. package/src/performance/CodeGenerationBenchmark.js +3 -3
  240. package/src/performance/Optimizer.d.ts +1 -1
  241. package/src/performance/Optimizer.d.ts.map +1 -1
  242. package/src/performance/Optimizer.js +150 -75
  243. package/src/performance/establish-baseline.js +3 -3
  244. package/src/runtime/PluginManager.d.ts +3 -1
  245. package/src/runtime/PluginManager.d.ts.map +1 -1
  246. package/src/runtime/PluginManager.js +124 -28
  247. package/src/runtime/RuntimeDetector.d.ts.map +1 -1
  248. package/src/runtime/RuntimeDetector.js +47 -6
  249. package/src/runtime/adapters/CloudflareAdapter.js +2 -2
  250. package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
  251. package/src/runtime/adapters/FargateAdapter.js +2 -1
  252. package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
  253. package/src/runtime/adapters/LambdaAdapter.js +4 -2
  254. package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
  255. package/src/runtime/adapters/NodeServerAdapter.js +2 -1
  256. package/src/scheduler/ScheduleRunner.d.ts +18 -0
  257. package/src/scheduler/ScheduleRunner.d.ts.map +1 -0
  258. package/src/scheduler/ScheduleRunner.js +155 -0
  259. package/src/scheduler/index.d.ts +3 -0
  260. package/src/scheduler/index.d.ts.map +1 -0
  261. package/src/scheduler/index.js +1 -0
  262. package/src/scheduler/types.d.ts +16 -0
  263. package/src/scheduler/types.d.ts.map +1 -0
  264. package/src/scheduler/types.js +4 -0
  265. package/src/schedules/index.d.ts +2 -0
  266. package/src/schedules/index.d.ts.map +1 -0
  267. package/src/schedules/index.js +1 -0
  268. package/src/schedules/log-cleanup.d.ts +4 -0
  269. package/src/schedules/log-cleanup.d.ts.map +1 -0
  270. package/src/schedules/log-cleanup.js +18 -0
  271. package/src/scripts/GenerateEnvArtifacts.d.ts +13 -0
  272. package/src/scripts/GenerateEnvArtifacts.d.ts.map +1 -0
  273. package/src/scripts/GenerateEnvArtifacts.js +171 -0
  274. package/src/scripts/TemplateSync.js +109 -70
  275. package/src/security/CsrfTokenManager.js +1 -1
  276. package/src/security/Encryptor.js +1 -1
  277. package/src/security/Hash.d.ts +14 -0
  278. package/src/security/Hash.d.ts.map +1 -0
  279. package/src/security/Hash.js +81 -0
  280. package/src/security/StartupSecretValidation.d.ts +20 -0
  281. package/src/security/StartupSecretValidation.d.ts.map +1 -0
  282. package/src/security/StartupSecretValidation.js +61 -0
  283. package/src/security/UrlValidator.d.ts +0 -1
  284. package/src/security/UrlValidator.d.ts.map +1 -1
  285. package/src/security/UrlValidator.js +1 -2
  286. package/src/security/Xss.d.ts +14 -0
  287. package/src/security/Xss.d.ts.map +1 -0
  288. package/src/security/Xss.js +57 -0
  289. package/src/security/XssProtection.d.ts.map +1 -1
  290. package/src/security/XssProtection.js +155 -17
  291. package/src/templates/adapters/MySQLAdapter.ts.tpl +5 -0
  292. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +5 -0
  293. package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -0
  294. package/src/templates/adapters/SQLiteAdapter.ts.tpl +5 -0
  295. package/src/templates/features/Queue.ts.tpl +1 -29
  296. package/src/templates/project/basic/.env.example.tpl +48 -0
  297. package/src/templates/project/basic/.env.tpl +89 -94
  298. package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +7 -0
  299. package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +30 -0
  300. package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +10 -0
  301. package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +13 -0
  302. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +240 -0
  303. package/src/templates/project/basic/config/SecretsManager.ts.tpl +44 -21
  304. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +151 -0
  305. package/src/templates/project/basic/config/app.ts.tpl +84 -15
  306. package/src/templates/project/basic/config/broadcast.ts.tpl +97 -0
  307. package/src/templates/project/basic/config/cache.ts.tpl +19 -23
  308. package/src/templates/project/basic/config/cloudflare.ts.tpl +57 -0
  309. package/src/templates/project/basic/config/env.ts.tpl +7 -1
  310. package/src/templates/project/basic/config/index.ts.tpl +3 -0
  311. package/src/templates/project/basic/config/logger.ts.tpl +301 -11
  312. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +121 -0
  313. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +181 -0
  314. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +156 -0
  315. package/src/templates/project/basic/config/mail.ts.tpl +141 -0
  316. package/src/templates/project/basic/config/middleware.ts.tpl +27 -0
  317. package/src/templates/project/basic/config/notification.ts.tpl +86 -0
  318. package/src/templates/project/basic/config/security.ts.tpl +4 -5
  319. package/src/templates/project/basic/config/startup.ts.tpl +27 -0
  320. package/src/templates/project/basic/config/storage.ts.tpl +77 -42
  321. package/src/templates/project/basic/database/migrations/index.ts.tpl +1 -1
  322. package/src/templates/project/basic/package.json.tpl +1 -1
  323. package/src/templates/project/basic/routes/api.ts.tpl +11 -37
  324. package/src/templates/project/basic/routes/broadcast.ts.tpl +32 -0
  325. package/src/templates/project/basic/routes/health.ts.tpl +134 -0
  326. package/src/templates/project/basic/routes/storage.ts.tpl +42 -0
  327. package/src/templates/project/basic/src/index.ts.tpl +38 -11
  328. package/src/templates/project/basic/template.json +3 -0
  329. package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
  330. package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
  331. package/src/toolkit/Secrets/EnvFile.js +63 -0
  332. package/src/toolkit/Secrets/Manifest.d.ts +24 -0
  333. package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
  334. package/src/toolkit/Secrets/Manifest.js +71 -0
  335. package/src/toolkit/Secrets/index.d.ts +42 -0
  336. package/src/toolkit/Secrets/index.d.ts.map +1 -0
  337. package/src/toolkit/Secrets/index.js +119 -0
  338. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
  339. package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
  340. package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
  341. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
  342. package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
  343. package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
  344. package/src/tools/broadcast/Broadcast.d.ts +7 -0
  345. package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
  346. package/src/tools/broadcast/Broadcast.js +37 -0
  347. package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
  348. package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
  349. package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
  350. package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
  351. package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
  352. package/src/tools/broadcast/drivers/InMemory.js +16 -0
  353. package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
  354. package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
  355. package/src/tools/broadcast/drivers/Pusher.js +75 -0
  356. package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
  357. package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
  358. package/src/tools/broadcast/drivers/Redis.js +73 -0
  359. package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
  360. package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
  361. package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
  362. package/src/tools/broadcast/index.d.ts +7 -0
  363. package/src/tools/broadcast/index.d.ts.map +1 -0
  364. package/src/tools/broadcast/index.js +6 -0
  365. package/src/tools/http/Http.d.ts +49 -0
  366. package/src/tools/http/Http.d.ts.map +1 -0
  367. package/src/tools/http/Http.js +169 -0
  368. package/src/tools/http/HttpResponse.d.ts +32 -0
  369. package/src/tools/http/HttpResponse.d.ts.map +1 -0
  370. package/src/tools/http/HttpResponse.js +80 -0
  371. package/src/tools/http/index.d.ts +15 -0
  372. package/src/tools/http/index.d.ts.map +1 -0
  373. package/src/tools/http/index.js +9 -0
  374. package/src/tools/mail/Mail.d.ts +22 -0
  375. package/src/tools/mail/Mail.d.ts.map +1 -0
  376. package/src/tools/mail/Mail.js +105 -0
  377. package/src/tools/mail/attachments.d.ts +23 -0
  378. package/src/tools/mail/attachments.d.ts.map +1 -0
  379. package/src/tools/mail/attachments.js +26 -0
  380. package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
  381. package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
  382. package/src/tools/mail/drivers/BaseDriver.js +8 -0
  383. package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
  384. package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
  385. package/src/tools/mail/drivers/Mailgun.js +81 -0
  386. package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
  387. package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
  388. package/src/tools/mail/drivers/SendGrid.js +57 -0
  389. package/src/tools/mail/drivers/Ses.d.ts +24 -0
  390. package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
  391. package/src/tools/mail/drivers/Ses.js +116 -0
  392. package/src/tools/mail/drivers/Smtp.d.ts +38 -0
  393. package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
  394. package/src/tools/mail/drivers/Smtp.js +327 -0
  395. package/src/tools/mail/templates/index.d.ts +27 -0
  396. package/src/tools/mail/templates/index.d.ts.map +1 -0
  397. package/src/tools/mail/templates/index.js +35 -0
  398. package/src/tools/mail/templates/markdown/index.d.ts +17 -0
  399. package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
  400. package/src/tools/mail/templates/markdown/index.js +49 -0
  401. package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
  402. package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
  403. package/src/tools/mail/templates/markdown/registry.js +34 -0
  404. package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
  405. package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
  406. package/src/tools/mail/templates/markdown/validator.js +24 -0
  407. package/src/tools/mail/testing.d.ts +41 -0
  408. package/src/tools/mail/testing.d.ts.map +1 -0
  409. package/src/tools/mail/testing.js +34 -0
  410. package/src/tools/notification/Driver.d.ts +11 -0
  411. package/src/tools/notification/Driver.d.ts.map +1 -0
  412. package/src/tools/notification/Driver.js +1 -0
  413. package/src/tools/notification/Notification.d.ts +11 -0
  414. package/src/tools/notification/Notification.d.ts.map +1 -0
  415. package/src/tools/notification/Notification.js +11 -0
  416. package/src/tools/notification/Registry.d.ts +10 -0
  417. package/src/tools/notification/Registry.d.ts.map +1 -0
  418. package/src/tools/notification/Registry.js +22 -0
  419. package/src/tools/notification/Service.d.ts +6 -0
  420. package/src/tools/notification/Service.d.ts.map +1 -0
  421. package/src/tools/notification/Service.js +18 -0
  422. package/src/tools/notification/config.d.ts +5 -0
  423. package/src/tools/notification/config.d.ts.map +1 -0
  424. package/src/tools/notification/config.js +5 -0
  425. package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
  426. package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
  427. package/src/tools/notification/drivers/BaseDriver.js +8 -0
  428. package/src/tools/notification/drivers/Console.d.ts +7 -0
  429. package/src/tools/notification/drivers/Console.d.ts.map +1 -0
  430. package/src/tools/notification/drivers/Console.js +13 -0
  431. package/src/tools/notification/drivers/Slack.d.ts +16 -0
  432. package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
  433. package/src/tools/notification/drivers/Slack.js +24 -0
  434. package/src/tools/notification/drivers/Termii.d.ts +10 -0
  435. package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
  436. package/src/tools/notification/drivers/Termii.js +47 -0
  437. package/src/tools/notification/drivers/Twilio.d.ts +21 -0
  438. package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
  439. package/src/tools/notification/drivers/Twilio.js +48 -0
  440. package/src/tools/notification/templates/markdown/index.d.ts +15 -0
  441. package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
  442. package/src/tools/notification/templates/markdown/index.js +38 -0
  443. package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
  444. package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
  445. package/src/tools/notification/templates/markdown/registry.js +36 -0
  446. package/src/tools/notification/testing.d.ts +19 -0
  447. package/src/tools/notification/testing.d.ts.map +1 -0
  448. package/src/tools/notification/testing.js +35 -0
  449. package/src/tools/notification/testingHelpers.d.ts +12 -0
  450. package/src/tools/notification/testingHelpers.d.ts.map +1 -0
  451. package/src/tools/notification/testingHelpers.js +32 -0
  452. package/src/tools/queue/Queue.d.ts +23 -0
  453. package/src/tools/queue/Queue.d.ts.map +1 -0
  454. package/src/tools/queue/Queue.js +38 -0
  455. package/src/tools/queue/drivers/InMemory.d.ts +10 -0
  456. package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
  457. package/src/tools/queue/drivers/InMemory.js +55 -0
  458. package/src/tools/queue/drivers/Redis.d.ts +10 -0
  459. package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
  460. package/src/tools/queue/drivers/Redis.js +91 -0
  461. package/src/tools/storage/LocalSignedUrl.d.ts +12 -0
  462. package/src/tools/storage/LocalSignedUrl.d.ts.map +1 -0
  463. package/src/tools/storage/LocalSignedUrl.js +108 -0
  464. package/src/tools/storage/drivers/Gcs.d.ts +20 -0
  465. package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
  466. package/src/tools/storage/drivers/Gcs.js +152 -0
  467. package/src/tools/storage/drivers/Local.d.ts +18 -0
  468. package/src/tools/storage/drivers/Local.d.ts.map +1 -0
  469. package/src/tools/storage/drivers/Local.js +89 -0
  470. package/src/tools/storage/drivers/R2.d.ts +20 -0
  471. package/src/tools/storage/drivers/R2.d.ts.map +1 -0
  472. package/src/tools/storage/drivers/R2.js +73 -0
  473. package/src/tools/storage/drivers/S3.d.ts +26 -0
  474. package/src/tools/storage/drivers/S3.d.ts.map +1 -0
  475. package/src/tools/storage/drivers/S3.js +258 -0
  476. package/src/tools/storage/index.d.ts +24 -0
  477. package/src/tools/storage/index.d.ts.map +1 -0
  478. package/src/tools/storage/index.js +111 -0
  479. package/src/tools/storage/testing.d.ts +23 -0
  480. package/src/tools/storage/testing.d.ts.map +1 -0
  481. package/src/tools/storage/testing.js +52 -0
  482. package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
  483. package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
  484. package/src/tools/templates/MarkdownRenderer.js +300 -0
  485. package/src/tools/templates/index.d.ts +5 -0
  486. package/src/tools/templates/index.d.ts.map +1 -0
  487. package/src/tools/templates/index.js +4 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Secrets Toolkit (Core)
3
+ *
4
+ * Internal framework module intended for CLI usage.
5
+ * It may use Node APIs (via node-singletons) and should not be used by runtime apps.
6
+ */
7
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
8
+ import { EnvFile } from '../Secrets/EnvFile';
9
+ import { Manifest } from '../Secrets/Manifest';
10
+ import { AwsSecretsManager } from '../Secrets/providers/AwsSecretsManager';
11
+ import { CloudflareKv } from '../Secrets/providers/CloudflareKv';
12
+ const resolveProvider = (provider) => {
13
+ if (provider === 'aws' || provider === 'cloudflare')
14
+ return provider;
15
+ throw ErrorFactory.createCliError('Missing/invalid provider. Use --provider aws|cloudflare or set ZINTRUST_SECRETS_PROVIDER.');
16
+ };
17
+ const resolveOutFile = (outFile) => outFile ?? process.env['ZINTRUST_ENV_FILE'] ?? '.env.pull';
18
+ const resolveManifestPath = (manifestPath) => manifestPath ?? process.env['ZINTRUST_SECRETS_MANIFEST'] ?? 'secrets.manifest.json';
19
+ const resolveInFile = (inFile) => inFile ?? process.env['ZINTRUST_ENV_IN_FILE'] ?? '.env';
20
+ const pullAws = async (manifest) => {
21
+ const client = AwsSecretsManager.createFromEnv();
22
+ const entries = Object.entries(manifest.keys).filter(([, spec]) => spec.aws !== undefined);
23
+ const pairs = await Promise.all(entries.map(async ([envKey, spec]) => {
24
+ const aws = spec.aws;
25
+ if (aws === undefined)
26
+ return null;
27
+ const value = await client.getValue(aws.secretId, aws.jsonKey);
28
+ return value === null ? null : [envKey, value];
29
+ }));
30
+ const resolved = {};
31
+ for (const pair of pairs) {
32
+ if (pair)
33
+ resolved[pair[0]] = pair[1];
34
+ }
35
+ return resolved;
36
+ };
37
+ const pullCloudflare = async (manifest) => {
38
+ const client = CloudflareKv.createFromEnv();
39
+ const entries = Object.entries(manifest.keys).filter(([, spec]) => spec.cloudflare !== undefined);
40
+ const pairs = await Promise.all(entries.map(async ([envKey, spec]) => {
41
+ const cf = spec.cloudflare;
42
+ if (cf === undefined)
43
+ return null;
44
+ const value = await client.getValue(cf.key, cf.namespaceId);
45
+ return value === null ? null : [envKey, value];
46
+ }));
47
+ const resolved = {};
48
+ for (const pair of pairs) {
49
+ if (pair)
50
+ resolved[pair[0]] = pair[1];
51
+ }
52
+ return resolved;
53
+ };
54
+ const pushAws = async (manifest, env, dryRun) => {
55
+ const client = AwsSecretsManager.createFromEnv();
56
+ const entries = Object.entries(manifest.keys).filter(([, spec]) => spec.aws !== undefined);
57
+ const pushed = await Promise.all(entries.map(async ([envKey, spec]) => {
58
+ const aws = spec.aws;
59
+ if (aws === undefined)
60
+ return null;
61
+ const value = env[envKey];
62
+ if (typeof value !== 'string')
63
+ return null;
64
+ if (!dryRun)
65
+ await client.putValue(aws.secretId, value);
66
+ return envKey;
67
+ }));
68
+ return pushed.filter((k) => typeof k === 'string');
69
+ };
70
+ const pushCloudflare = async (manifest, env, dryRun) => {
71
+ const client = CloudflareKv.createFromEnv();
72
+ const entries = Object.entries(manifest.keys).filter(([, spec]) => spec.cloudflare !== undefined);
73
+ const pushed = await Promise.all(entries.map(async ([envKey, spec]) => {
74
+ const cf = spec.cloudflare;
75
+ if (cf === undefined)
76
+ return null;
77
+ const value = env[envKey];
78
+ if (typeof value !== 'string')
79
+ return null;
80
+ if (!dryRun)
81
+ await client.putValue(cf.key, value, cf.namespaceId);
82
+ return envKey;
83
+ }));
84
+ return pushed.filter((k) => typeof k === 'string');
85
+ };
86
+ export const SecretsToolkit = Object.freeze({
87
+ async pull(options) {
88
+ const provider = resolveProvider(options.provider ??
89
+ process.env['ZINTRUST_SECRETS_PROVIDER']);
90
+ const outFile = resolveOutFile(options.outFile);
91
+ const manifestPath = resolveManifestPath(options.manifestPath);
92
+ const manifest = await Manifest.load({ cwd: options.cwd, path: manifestPath, provider });
93
+ const resolved = provider === 'aws' ? await pullAws(manifest) : await pullCloudflare(manifest);
94
+ if (options.dryRun === true)
95
+ return { outFile, keys: Object.keys(resolved) };
96
+ await EnvFile.write({ cwd: options.cwd, path: outFile, values: resolved, mode: 'overwrite' });
97
+ return { outFile, keys: Object.keys(resolved) };
98
+ },
99
+ async push(options) {
100
+ const provider = resolveProvider(options.provider ??
101
+ process.env['ZINTRUST_SECRETS_PROVIDER']);
102
+ const inFile = resolveInFile(options.inFile);
103
+ const manifestPath = resolveManifestPath(options.manifestPath);
104
+ const manifest = await Manifest.load({ cwd: options.cwd, path: manifestPath, provider });
105
+ const env = await EnvFile.read({ cwd: options.cwd, path: inFile });
106
+ const dryRun = options.dryRun === true;
107
+ const keys = provider === 'aws'
108
+ ? await pushAws(manifest, env, dryRun)
109
+ : await pushCloudflare(manifest, env, dryRun);
110
+ return { inFile, keys };
111
+ },
112
+ doctor(options) {
113
+ const provider = resolveProvider(options.provider ??
114
+ process.env['ZINTRUST_SECRETS_PROVIDER']);
115
+ const missing = provider === 'aws' ? AwsSecretsManager.doctorEnv() : CloudflareKv.doctorEnv();
116
+ return { provider, ok: missing.length === 0, missing };
117
+ },
118
+ });
119
+ export default SecretsToolkit;
@@ -0,0 +1,14 @@
1
+ export type AwsCredentials = {
2
+ accessKeyId: string;
3
+ secretAccessKey: string;
4
+ sessionToken?: string;
5
+ };
6
+ export declare const AwsSecretsManager: Readonly<{
7
+ createFromEnv(): {
8
+ getValue: (secretId: string, jsonKey?: string) => Promise<string | null>;
9
+ putValue: (secretId: string, value: string) => Promise<void>;
10
+ };
11
+ doctorEnv(): string[];
12
+ }>;
13
+ export default AwsSecretsManager;
14
+ //# sourceMappingURL=AwsSecretsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwsSecretsManager.d.ts","sourceRoot":"","sources":["../../../../../src/toolkit/Secrets/providers/AwsSecretsManager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AA0GF,eAAO,MAAM,iBAAiB;qBACX;QACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACzE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9D;iBAsDY,MAAM,EAAE;EAcrB,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { AwsSigV4 } from '../../../common/index';
2
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
3
+ const sha256Hex = (data) => AwsSigV4.sha256Hex(data);
4
+ const buildAuthorization = (params) => {
5
+ const canonicalUri = '/';
6
+ const canonicalQueryString = '';
7
+ const headers = {
8
+ 'content-type': 'application/x-amz-json-1.1',
9
+ host: params.host,
10
+ 'x-amz-date': params.amzDate,
11
+ 'x-amz-target': params.target,
12
+ };
13
+ const sessionToken = params.credentials.sessionToken;
14
+ if (typeof sessionToken === 'string' && sessionToken.trim() !== '') {
15
+ headers['x-amz-security-token'] = sessionToken;
16
+ }
17
+ const payloadHash = sha256Hex(params.body);
18
+ return AwsSigV4.buildAuthorization({
19
+ method: params.method,
20
+ canonicalUri,
21
+ canonicalQueryString,
22
+ headers,
23
+ payloadHash,
24
+ region: params.region,
25
+ service: 'secretsmanager',
26
+ amzDate: params.amzDate,
27
+ dateStamp: params.dateStamp,
28
+ credentials: params.credentials,
29
+ });
30
+ };
31
+ const parseMaybeJson = (value) => {
32
+ try {
33
+ return JSON.parse(value);
34
+ }
35
+ catch {
36
+ return value;
37
+ }
38
+ };
39
+ const requestAwsSecretsManager = async (region, credentials, target, body) => {
40
+ const host = `secretsmanager.${region}.amazonaws.com`;
41
+ const url = `https://${host}/`;
42
+ const now = new Date();
43
+ const { amzDate, dateStamp } = AwsSigV4.toAmzDate(now);
44
+ const bodyJson = JSON.stringify(body);
45
+ const { authorization } = buildAuthorization({
46
+ method: 'POST',
47
+ host,
48
+ region,
49
+ amzDate,
50
+ dateStamp,
51
+ credentials,
52
+ target,
53
+ body: bodyJson,
54
+ });
55
+ const headers = {
56
+ 'content-type': 'application/x-amz-json-1.1',
57
+ 'x-amz-date': amzDate,
58
+ 'x-amz-target': target,
59
+ Authorization: authorization,
60
+ };
61
+ const sessionToken = credentials.sessionToken;
62
+ if (typeof sessionToken === 'string' && sessionToken.trim() !== '') {
63
+ headers['x-amz-security-token'] = sessionToken;
64
+ }
65
+ const res = await fetch(url, {
66
+ method: 'POST',
67
+ headers,
68
+ body: bodyJson,
69
+ });
70
+ const text = await res.text();
71
+ if (!res.ok) {
72
+ throw ErrorFactory.createCliError(`AWS SecretsManager request failed (${res.status})`, {
73
+ status: res.status,
74
+ body: text,
75
+ });
76
+ }
77
+ return JSON.parse(text);
78
+ };
79
+ export const AwsSecretsManager = Object.freeze({
80
+ createFromEnv() {
81
+ const region = process.env['AWS_REGION'] ?? process.env['AWS_DEFAULT_REGION'] ?? '';
82
+ const accessKeyId = process.env['AWS_ACCESS_KEY_ID'] ?? '';
83
+ const secretAccessKey = process.env['AWS_SECRET_ACCESS_KEY'] ?? '';
84
+ const sessionToken = process.env['AWS_SESSION_TOKEN'] ?? undefined;
85
+ if (region.trim() === '' || accessKeyId.trim() === '' || secretAccessKey.trim() === '') {
86
+ throw ErrorFactory.createCliError('AWS credentials missing: set AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY');
87
+ }
88
+ const credentials = { accessKeyId, secretAccessKey, sessionToken };
89
+ const getValue = async (secretId, jsonKey) => {
90
+ const data = await requestAwsSecretsManager(region, credentials, 'secretsmanager.GetSecretValue', {
91
+ SecretId: secretId,
92
+ });
93
+ if (typeof data.SecretString !== 'string')
94
+ return null;
95
+ if (jsonKey === undefined)
96
+ return data.SecretString;
97
+ const parsed = parseMaybeJson(data.SecretString);
98
+ if (typeof parsed === 'object' && parsed !== null) {
99
+ const obj = parsed;
100
+ if (!(jsonKey in obj))
101
+ return null;
102
+ const v = obj[jsonKey];
103
+ if (typeof v === 'string')
104
+ return v;
105
+ return JSON.stringify(v);
106
+ }
107
+ return null;
108
+ };
109
+ const putValue = async (secretId, value) => {
110
+ await requestAwsSecretsManager(region, credentials, 'secretsmanager.PutSecretValue', {
111
+ SecretId: secretId,
112
+ SecretString: value,
113
+ });
114
+ };
115
+ return { getValue, putValue };
116
+ },
117
+ doctorEnv() {
118
+ const missing = [];
119
+ const region = (process.env['AWS_REGION'] ?? process.env['AWS_DEFAULT_REGION'] ?? '').trim();
120
+ if (region === '')
121
+ missing.push('AWS_REGION');
122
+ const accessKeyId = (process.env['AWS_ACCESS_KEY_ID'] ?? '').trim();
123
+ if (accessKeyId === '')
124
+ missing.push('AWS_ACCESS_KEY_ID');
125
+ const secretAccessKey = (process.env['AWS_SECRET_ACCESS_KEY'] ?? '').trim();
126
+ if (secretAccessKey === '')
127
+ missing.push('AWS_SECRET_ACCESS_KEY');
128
+ return missing;
129
+ },
130
+ });
131
+ export default AwsSecretsManager;
@@ -0,0 +1,9 @@
1
+ export declare const CloudflareKv: Readonly<{
2
+ createFromEnv(): {
3
+ getValue: (key: string, namespaceId?: string) => Promise<string | null>;
4
+ putValue: (key: string, value: string, namespaceId?: string) => Promise<void>;
5
+ };
6
+ doctorEnv(): string[];
7
+ }>;
8
+ export default CloudflareKv;
9
+ //# sourceMappingURL=CloudflareKv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareKv.d.ts","sourceRoot":"","sources":["../../../../../src/toolkit/Secrets/providers/CloudflareKv.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;qBACN;QACf,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACxE,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC/E;iBAsEY,MAAM,EAAE;EAcrB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ export const CloudflareKv = Object.freeze({
3
+ createFromEnv() {
4
+ const accountId = process.env['CLOUDFLARE_ACCOUNT_ID'] ?? '';
5
+ const apiToken = process.env['CLOUDFLARE_API_TOKEN'] ?? '';
6
+ const defaultNamespaceId = process.env['CLOUDFLARE_KV_NAMESPACE_ID'] ?? '';
7
+ if (accountId.trim() === '' || apiToken.trim() === '') {
8
+ throw ErrorFactory.createCliError('Cloudflare credentials missing: set CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN');
9
+ }
10
+ const getNs = (namespaceId) => {
11
+ const resolved = namespaceId ?? defaultNamespaceId;
12
+ if (resolved.trim() === '') {
13
+ throw ErrorFactory.createCliError('Cloudflare KV namespace missing: set CLOUDFLARE_KV_NAMESPACE_ID or set namespaceId in manifest');
14
+ }
15
+ return resolved;
16
+ };
17
+ const base = `https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces`;
18
+ const getValue = async (key, namespaceId) => {
19
+ const ns = getNs(namespaceId);
20
+ const url = `${base}/${encodeURIComponent(ns)}/values/${encodeURIComponent(key)}`;
21
+ const res = await fetch(url, {
22
+ method: 'GET',
23
+ headers: {
24
+ Authorization: `Bearer ${apiToken}`,
25
+ },
26
+ });
27
+ if (res.status === 404)
28
+ return null;
29
+ const text = await res.text();
30
+ if (!res.ok) {
31
+ throw ErrorFactory.createCliError(`Cloudflare KV GET failed (${res.status})`, {
32
+ status: res.status,
33
+ body: text,
34
+ });
35
+ }
36
+ return text;
37
+ };
38
+ const putValue = async (key, value, namespaceId) => {
39
+ const ns = getNs(namespaceId);
40
+ const url = `${base}/${encodeURIComponent(ns)}/values/${encodeURIComponent(key)}`;
41
+ const res = await fetch(url, {
42
+ method: 'PUT',
43
+ headers: {
44
+ Authorization: `Bearer ${apiToken}`,
45
+ 'content-type': 'text/plain',
46
+ },
47
+ body: value,
48
+ });
49
+ const text = await res.text();
50
+ if (!res.ok) {
51
+ throw ErrorFactory.createCliError(`Cloudflare KV PUT failed (${res.status})`, {
52
+ status: res.status,
53
+ body: text,
54
+ });
55
+ }
56
+ };
57
+ return { getValue, putValue };
58
+ },
59
+ doctorEnv() {
60
+ const missing = [];
61
+ const accountId = (process.env['CLOUDFLARE_ACCOUNT_ID'] ?? '').trim();
62
+ if (accountId === '')
63
+ missing.push('CLOUDFLARE_ACCOUNT_ID');
64
+ const apiToken = (process.env['CLOUDFLARE_API_TOKEN'] ?? '').trim();
65
+ if (apiToken === '')
66
+ missing.push('CLOUDFLARE_API_TOKEN');
67
+ const namespaceId = (process.env['CLOUDFLARE_KV_NAMESPACE_ID'] ?? '').trim();
68
+ if (namespaceId === '')
69
+ missing.push('CLOUDFLARE_KV_NAMESPACE_ID');
70
+ return missing;
71
+ },
72
+ });
73
+ export default CloudflareKv;
@@ -0,0 +1,7 @@
1
+ export declare const Broadcast: Readonly<{
2
+ send(channel: string, event: string, data: unknown): Promise<{
3
+ ok: boolean;
4
+ }>;
5
+ }>;
6
+ export default Broadcast;
7
+ //# sourceMappingURL=Broadcast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Broadcast.d.ts","sourceRoot":"","sources":["../../../../src/tools/broadcast/Broadcast.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS;kBACA,MAAM,SAAS,MAAM,QAAQ,OAAO;;;EAmCxD,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { InMemoryDriver } from './drivers/InMemory';
2
+ import { PusherDriver } from './drivers/Pusher';
3
+ import { RedisDriver } from './drivers/Redis';
4
+ import { RedisHttpsDriver } from './drivers/RedisHttps';
5
+ import broadcastConfig from '../../config/broadcast';
6
+ import { ErrorFactory } from '../../exceptions/ZintrustError';
7
+ export const Broadcast = Object.freeze({
8
+ async send(channel, event, data) {
9
+ const driver = broadcastConfig.getDriverName();
10
+ const config = broadcastConfig.getDriverConfig();
11
+ if (driver === 'inmemory') {
12
+ const result = await InMemoryDriver.send(undefined, channel, event, data);
13
+ return result;
14
+ }
15
+ if (driver === 'pusher') {
16
+ if (config.driver !== 'pusher') {
17
+ throw ErrorFactory.createConfigError('Broadcast driver config mismatch: expected pusher');
18
+ }
19
+ return PusherDriver.send(config, channel, event, data);
20
+ }
21
+ if (driver === 'redis') {
22
+ if (config.driver !== 'redis') {
23
+ throw ErrorFactory.createConfigError('Broadcast driver config mismatch: expected redis');
24
+ }
25
+ return RedisDriver.send(config, channel, event, data);
26
+ }
27
+ if (driver === 'redishttps') {
28
+ if (config.driver !== 'redishttps') {
29
+ throw ErrorFactory.createConfigError('Broadcast driver config mismatch: expected redishttps');
30
+ }
31
+ return RedisHttpsDriver.send(config, channel, event, data);
32
+ }
33
+ const err = ErrorFactory.createConfigError(`Broadcast driver not implemented: ${driver}`);
34
+ throw err;
35
+ },
36
+ });
37
+ export default Broadcast;
@@ -0,0 +1,5 @@
1
+ export declare const BaseDriver: Readonly<{
2
+ send(): Promise<unknown>;
3
+ }>;
4
+ export default BaseDriver;
5
+ //# sourceMappingURL=BaseDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseDriver.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/BaseDriver.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU;YACP,OAAO,CAAC,OAAO,CAAC;EAI9B,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ export const BaseDriver = Object.freeze({
3
+ async send() {
4
+ await Promise.resolve();
5
+ throw ErrorFactory.createConfigError('Broadcast driver must implement send()');
6
+ },
7
+ });
8
+ export default BaseDriver;
@@ -0,0 +1,18 @@
1
+ export declare const InMemoryDriver: Readonly<{
2
+ _events: Array<{
3
+ channel: string;
4
+ event: string;
5
+ data: unknown;
6
+ }>;
7
+ send(_config: unknown, channel: string, event: string, data: unknown): Promise<{
8
+ ok: boolean;
9
+ }>;
10
+ getEvents(): {
11
+ channel: string;
12
+ event: string;
13
+ data: unknown;
14
+ }[];
15
+ reset(): void;
16
+ }>;
17
+ export default InMemoryDriver;
18
+ //# sourceMappingURL=InMemory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemory.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/InMemory.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;aACV,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;kBAEnD,OAAO,WAAW,MAAM,SAAS,MAAM,QAAQ,OAAO;;;;iBAF1C,MAAM;eAAS,MAAM;cAAQ,OAAO;;;EAgBpE,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ export const InMemoryDriver = Object.freeze({
2
+ _events: [],
3
+ async send(_config, channel, event, data) {
4
+ // ensure function is async and returns a resolved promise
5
+ await Promise.resolve();
6
+ this._events.push({ channel, event, data });
7
+ return { ok: true };
8
+ },
9
+ getEvents() {
10
+ return this._events.slice();
11
+ },
12
+ reset() {
13
+ this._events.length = 0;
14
+ },
15
+ });
16
+ export default InMemoryDriver;
@@ -0,0 +1,8 @@
1
+ import type { PusherBroadcastDriverConfig } from '../../../config/broadcast';
2
+ export declare const PusherDriver: Readonly<{
3
+ send(config: PusherBroadcastDriverConfig, channel: string, event: string, data: unknown): Promise<{
4
+ ok: boolean;
5
+ }>;
6
+ }>;
7
+ export default PusherDriver;
8
+ //# sourceMappingURL=Pusher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pusher.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/Pusher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAqDrE,eAAO,MAAM,YAAY;iBACJ,2BAA2B,WAAW,MAAM,SAAS,MAAM,QAAQ,OAAO;;;EAkD7F,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ import { createHash, createHmac } from '../../../node-singletons/crypto';
3
+ const md5Hex = (data) => createHash('md5').update(data).digest('hex');
4
+ const buildQueryString = (params) => {
5
+ const keys = Object.keys(params).sort((a, b) => a.localeCompare(b));
6
+ return keys
7
+ .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key] ?? '')}`)
8
+ .join('&');
9
+ };
10
+ const buildBaseUrl = (cluster) => {
11
+ const normalized = cluster.trim();
12
+ if (normalized === '')
13
+ return 'https://api.pusherapp.com';
14
+ return `https://api-${normalized}.pusher.com`;
15
+ };
16
+ const ensureConfig = (config) => {
17
+ if (config.appId.trim() === '') {
18
+ throw ErrorFactory.createConfigError('Pusher broadcast misconfigured: PUSHER_APP_ID is required');
19
+ }
20
+ if (config.key.trim() === '') {
21
+ throw ErrorFactory.createConfigError('Pusher broadcast misconfigured: PUSHER_APP_KEY is required');
22
+ }
23
+ if (config.secret.trim() === '') {
24
+ throw ErrorFactory.createConfigError('Pusher broadcast misconfigured: PUSHER_APP_SECRET is required');
25
+ }
26
+ };
27
+ const signRequest = (params) => {
28
+ const stringToSign = `${params.method}\n${params.path}\n${params.queryString}`;
29
+ return createHmac('sha256', params.secret).update(stringToSign).digest('hex');
30
+ };
31
+ export const PusherDriver = Object.freeze({
32
+ async send(config, channel, event, data) {
33
+ ensureConfig(config);
34
+ const payload = {
35
+ name: event,
36
+ channels: [channel],
37
+ data: JSON.stringify(data ?? null),
38
+ };
39
+ const body = JSON.stringify(payload);
40
+ const path = `/apps/${config.appId}/events`;
41
+ const authTimestamp = String(Math.floor(Date.now() / 1000));
42
+ const queryParams = {
43
+ auth_key: config.key,
44
+ auth_timestamp: authTimestamp,
45
+ auth_version: '1.0',
46
+ body_md5: md5Hex(body),
47
+ };
48
+ const queryString = buildQueryString(queryParams);
49
+ const authSignature = signRequest({ method: 'POST', path, secret: config.secret, queryString });
50
+ const baseUrl = buildBaseUrl(config.cluster);
51
+ const url = `${baseUrl}${path}?${queryString}&auth_signature=${authSignature}`;
52
+ const res = await fetch(url, {
53
+ method: 'POST',
54
+ headers: {
55
+ 'content-type': 'application/json',
56
+ },
57
+ body,
58
+ });
59
+ if (!res.ok) {
60
+ let responseBody;
61
+ try {
62
+ responseBody = await res.text();
63
+ }
64
+ catch {
65
+ responseBody = undefined;
66
+ }
67
+ throw ErrorFactory.createTryCatchError(`Pusher broadcast request failed (${res.status})`, {
68
+ status: res.status,
69
+ body: responseBody,
70
+ });
71
+ }
72
+ return { ok: true };
73
+ },
74
+ });
75
+ export default PusherDriver;
@@ -0,0 +1,19 @@
1
+ export type IRedisPublishClient = {
2
+ connect?: () => Promise<void>;
3
+ publish(channel: string, message: string): Promise<number>;
4
+ };
5
+ export type RedisBroadcastDriverConfig = {
6
+ driver: 'redis';
7
+ host: string;
8
+ port: number;
9
+ password: string;
10
+ channelPrefix: string;
11
+ };
12
+ export declare const RedisDriver: {
13
+ readonly send: (config: RedisBroadcastDriverConfig, channel: string, event: string, data: unknown) => Promise<{
14
+ ok: boolean;
15
+ published: number;
16
+ }>;
17
+ };
18
+ export default RedisDriver;
19
+ //# sourceMappingURL=Redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Redis.d.ts","sourceRoot":"","sources":["../../../../../src/tools/broadcast/drivers/Redis.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,WAAW;4BAsDD,0BAA0B,WAAW,MAAM,SAAS,MAAM,QAAQ,OAAO;;;;CAmB5F,CAAC;AAEL,eAAe,WAAW,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { ErrorFactory } from '../../../exceptions/ZintrustError';
2
+ const buildRedisUrl = (config) => {
3
+ const host = (config.host ?? '').trim();
4
+ const port = Number(config.port);
5
+ if (!host)
6
+ throw ErrorFactory.createConfigError('Redis broadcast driver requires host');
7
+ if (!Number.isFinite(port) || port <= 0) {
8
+ throw ErrorFactory.createConfigError('Redis broadcast driver requires a valid port');
9
+ }
10
+ const password = (config.password ?? '').trim();
11
+ const authPart = password ? `:${encodeURIComponent(password)}@` : '';
12
+ return `redis://${authPart}${host}:${port}`;
13
+ };
14
+ export const RedisDriver = (() => {
15
+ let client = null;
16
+ let connected = false;
17
+ const ensureClient = async (config) => {
18
+ // Always validate config even if a client is already cached
19
+ const url = buildRedisUrl(config);
20
+ if (connected && client !== null)
21
+ return client;
22
+ // Import lazily so package is optional for environments that don't use Redis
23
+ try {
24
+ const mod = (await import('redis'));
25
+ client = mod.createClient({ url });
26
+ if (typeof client.connect === 'function') {
27
+ try {
28
+ await client.connect();
29
+ connected = true;
30
+ }
31
+ catch (err) {
32
+ connected = false;
33
+ throw ErrorFactory.createTryCatchError('Redis broadcast driver failed to connect', err);
34
+ }
35
+ }
36
+ else {
37
+ connected = true;
38
+ }
39
+ }
40
+ catch {
41
+ const globalFake = globalThis
42
+ .__fakeRedisClient;
43
+ if (globalFake === undefined) {
44
+ throw ErrorFactory.createConfigError("Redis broadcast driver requires the 'redis' package or a test fake client set in globalThis.__fakeRedisClient");
45
+ }
46
+ client = globalFake;
47
+ connected = true;
48
+ }
49
+ if (client === null)
50
+ throw ErrorFactory.createConfigError('Redis client could not be initialized');
51
+ return client;
52
+ };
53
+ const normalizePrefix = (value) => {
54
+ const prefix = (value ?? '').trim();
55
+ return prefix || 'broadcast:';
56
+ };
57
+ return {
58
+ async send(config, channel, event, data) {
59
+ const cli = await ensureClient(config);
60
+ const fullChannel = `${normalizePrefix(config.channelPrefix)}${channel}`;
61
+ let message;
62
+ try {
63
+ message = JSON.stringify({ event, data });
64
+ }
65
+ catch (err) {
66
+ throw ErrorFactory.createTryCatchError('Failed to serialize broadcast payload', err);
67
+ }
68
+ const published = await cli.publish(fullChannel, message);
69
+ return { ok: true, published };
70
+ },
71
+ };
72
+ })();
73
+ export default RedisDriver;