@zintrust/core 0.1.48 → 0.1.50

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 (403) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -9
  3. package/src/cli/CLI.d.ts.map +1 -1
  4. package/src/cli/CLI.js +2 -0
  5. package/src/cli/commands/AddCommand.js +2 -2
  6. package/src/cli/commands/BulletproofKeyGenerateCommand.d.ts +10 -0
  7. package/src/cli/commands/BulletproofKeyGenerateCommand.d.ts.map +1 -0
  8. package/src/cli/commands/BulletproofKeyGenerateCommand.js +139 -0
  9. package/src/cli/commands/JwtDevCommand.d.ts.map +1 -1
  10. package/src/cli/commands/JwtDevCommand.js +51 -32
  11. package/src/cli/scaffolding/ControllerGenerator.d.ts +1 -1
  12. package/src/cli/scaffolding/ControllerGenerator.d.ts.map +1 -1
  13. package/src/cli/scaffolding/ControllerGenerator.js +8 -79
  14. package/src/config/SecretsManager.d.ts +0 -1
  15. package/src/config/SecretsManager.d.ts.map +1 -1
  16. package/src/config/SecretsManager.js +0 -1
  17. package/src/config/index.d.ts +1 -1
  18. package/src/config/index.d.ts.map +1 -1
  19. package/src/config/index.js +30 -10
  20. package/src/config/middleware.d.ts +1 -0
  21. package/src/config/middleware.d.ts.map +1 -1
  22. package/src/config/middleware.js +3 -0
  23. package/src/http/error-pages/ErrorPageRenderer.js +7 -1
  24. package/src/index.d.ts +1 -2
  25. package/src/index.d.ts.map +1 -1
  26. package/src/index.js +4 -5
  27. package/src/middleware/BulletproofAuthMiddleware.d.ts +92 -0
  28. package/src/middleware/BulletproofAuthMiddleware.d.ts.map +1 -0
  29. package/src/middleware/BulletproofAuthMiddleware.js +421 -0
  30. package/src/middleware/CsrfMiddleware.d.ts +0 -1
  31. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  32. package/src/middleware/CsrfMiddleware.js +8 -1
  33. package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -1
  34. package/src/middleware/JwtAuthMiddleware.js +11 -5
  35. package/src/orm/Database.d.ts.map +1 -1
  36. package/src/orm/Database.js +48 -39
  37. package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -1
  38. package/src/orm/adapters/MySQLProxyAdapter.js +54 -35
  39. package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -1
  40. package/src/orm/adapters/PostgreSQLProxyAdapter.js +126 -103
  41. package/src/orm/adapters/SqlProxyHttpAdapterShared.d.ts +30 -0
  42. package/src/orm/adapters/SqlProxyHttpAdapterShared.d.ts.map +1 -0
  43. package/src/orm/adapters/SqlProxyHttpAdapterShared.js +64 -0
  44. package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -1
  45. package/src/orm/adapters/SqlServerProxyAdapter.js +54 -37
  46. package/src/orm/migrations/MigrationStore.d.ts.map +1 -1
  47. package/src/orm/migrations/MigrationStore.js +22 -1
  48. package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -2
  49. package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -1
  50. package/src/proxy/d1/ZintrustD1Proxy.js +39 -2
  51. package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -2
  52. package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -1
  53. package/src/proxy/kv/ZintrustKvProxy.js +38 -2
  54. package/src/routes/doc.js +1 -1
  55. package/src/routes/errorPages.d.ts.map +1 -1
  56. package/src/routes/errorPages.js +9 -2
  57. package/src/security/CsrfTokenManager.d.ts.map +1 -1
  58. package/src/security/CsrfTokenManager.js +57 -23
  59. package/src/security/JwtManager.d.ts +4 -1
  60. package/src/security/JwtManager.d.ts.map +1 -1
  61. package/src/security/JwtManager.js +25 -11
  62. package/src/security/JwtSessions.d.ts +12 -0
  63. package/src/security/JwtSessions.d.ts.map +1 -0
  64. package/src/security/JwtSessions.js +556 -0
  65. package/src/security/NonceReplay.d.ts +24 -0
  66. package/src/security/NonceReplay.d.ts.map +1 -0
  67. package/src/security/NonceReplay.js +42 -0
  68. package/src/security/TokenRevocation.d.ts.map +1 -1
  69. package/src/security/TokenRevocation.js +1 -0
  70. package/src/tools/http/Http.d.ts +5 -0
  71. package/src/tools/http/Http.d.ts.map +1 -1
  72. package/src/tools/http/Http.js +25 -9
  73. package/src/tools/queue/QueueReliabilityOrchestrator.d.ts.map +1 -1
  74. package/src/tools/queue/QueueReliabilityOrchestrator.js +18 -6
  75. package/src/validation/Validator.d.ts.map +1 -1
  76. package/src/validation/Validator.js +4 -2
  77. package/src/zintrust.comon.d.ts +9 -0
  78. package/src/zintrust.comon.d.ts.map +1 -0
  79. package/src/zintrust.comon.js +15 -0
  80. package/src/zintrust.plugins.d.ts +9 -3
  81. package/src/zintrust.plugins.d.ts.map +1 -1
  82. package/src/zintrust.plugins.js +10 -3
  83. package/src/zintrust.plugins.wg.d.ts +1 -0
  84. package/src/zintrust.plugins.wg.d.ts.map +1 -1
  85. package/src/zintrust.plugins.wg.js +1 -0
  86. package/app/Controllers/AuthController.d.ts +0 -10
  87. package/app/Controllers/AuthController.d.ts.map +0 -1
  88. package/app/Controllers/AuthController.js +0 -201
  89. package/app/Controllers/UserController.d.ts +0 -9
  90. package/app/Controllers/UserController.d.ts.map +0 -1
  91. package/app/Controllers/UserController.js +0 -8
  92. package/app/Controllers/UserQueryBuilderController.d.ts +0 -16
  93. package/app/Controllers/UserQueryBuilderController.d.ts.map +0 -1
  94. package/app/Controllers/UserQueryBuilderController.js +0 -404
  95. package/app/Middleware/ProfilerMiddleware.d.ts +0 -12
  96. package/app/Middleware/ProfilerMiddleware.d.ts.map +0 -1
  97. package/app/Middleware/ProfilerMiddleware.js +0 -47
  98. package/app/Middleware/index.d.ts +0 -59
  99. package/app/Middleware/index.d.ts.map +0 -1
  100. package/app/Middleware/index.js +0 -215
  101. package/app/Models/Post.d.ts +0 -14
  102. package/app/Models/Post.d.ts.map +0 -1
  103. package/app/Models/Post.js +0 -27
  104. package/app/Models/User.d.ts +0 -14
  105. package/app/Models/User.d.ts.map +0 -1
  106. package/app/Models/User.js +0 -44
  107. package/app/Schedules/JobTracking.d.ts +0 -3
  108. package/app/Schedules/JobTracking.d.ts.map +0 -1
  109. package/app/Schedules/JobTracking.js +0 -13
  110. package/app/Schedules/index.d.ts +0 -2
  111. package/app/Schedules/index.d.ts.map +0 -1
  112. package/app/Schedules/index.js +0 -1
  113. package/app/Toolkit/Broadcast/sendBroadcast.d.ts +0 -6
  114. package/app/Toolkit/Broadcast/sendBroadcast.d.ts.map +0 -1
  115. package/app/Toolkit/Broadcast/sendBroadcast.js +0 -5
  116. package/app/Toolkit/Mail/sendWelcomeEmail.d.ts +0 -6
  117. package/app/Toolkit/Mail/sendWelcomeEmail.d.ts.map +0 -1
  118. package/app/Toolkit/Mail/sendWelcomeEmail.js +0 -20
  119. package/app/Toolkit/Notification/sendSlackNotification.d.ts +0 -8
  120. package/app/Toolkit/Notification/sendSlackNotification.d.ts.map +0 -1
  121. package/app/Toolkit/Notification/sendSlackNotification.js +0 -5
  122. package/app/Toolkit/Notification/sendSms.d.ts +0 -6
  123. package/app/Toolkit/Notification/sendSms.d.ts.map +0 -1
  124. package/app/Toolkit/Notification/sendSms.js +0 -5
  125. package/app/Types/controller.d.ts +0 -42
  126. package/app/Types/controller.d.ts.map +0 -1
  127. package/app/Types/controller.js +0 -1
  128. package/config/broadcast.d.ts +0 -38
  129. package/config/broadcast.d.ts.map +0 -1
  130. package/config/broadcast.js +0 -37
  131. package/config/cache.d.ts +0 -40
  132. package/config/cache.d.ts.map +0 -1
  133. package/config/cache.js +0 -39
  134. package/config/database.d.ts +0 -58
  135. package/config/database.d.ts.map +0 -1
  136. package/config/database.js +0 -65
  137. package/config/mail.d.ts +0 -51
  138. package/config/mail.d.ts.map +0 -1
  139. package/config/mail.js +0 -69
  140. package/config/middleware.d.ts +0 -11
  141. package/config/middleware.d.ts.map +0 -1
  142. package/config/middleware.js +0 -30
  143. package/config/notification.d.ts +0 -33
  144. package/config/notification.d.ts.map +0 -1
  145. package/config/notification.js +0 -33
  146. package/config/queue.d.ts +0 -55
  147. package/config/queue.d.ts.map +0 -1
  148. package/config/queue.js +0 -87
  149. package/config/storage.d.ts +0 -59
  150. package/config/storage.d.ts.map +0 -1
  151. package/config/storage.js +0 -59
  152. package/config/workers.d.ts +0 -54
  153. package/config/workers.d.ts.map +0 -1
  154. package/config/workers.js +0 -83
  155. package/packages/cloudflare-d1-proxy/src/index.d.ts +0 -48
  156. package/packages/cloudflare-d1-proxy/src/index.d.ts.map +0 -1
  157. package/packages/cloudflare-d1-proxy/src/index.js +0 -387
  158. package/packages/cloudflare-kv-proxy/src/index.d.ts +0 -44
  159. package/packages/cloudflare-kv-proxy/src/index.d.ts.map +0 -1
  160. package/packages/cloudflare-kv-proxy/src/index.js +0 -325
  161. package/packages/queue-monitor/src/QueueMonitoringService.d.ts +0 -35
  162. package/packages/queue-monitor/src/QueueMonitoringService.d.ts.map +0 -1
  163. package/packages/queue-monitor/src/QueueMonitoringService.js +0 -194
  164. package/packages/queue-monitor/src/connection.d.ts +0 -3
  165. package/packages/queue-monitor/src/connection.d.ts.map +0 -1
  166. package/packages/queue-monitor/src/connection.js +0 -1
  167. package/packages/queue-monitor/src/dashboard-ui.d.ts +0 -7
  168. package/packages/queue-monitor/src/dashboard-ui.d.ts.map +0 -1
  169. package/packages/queue-monitor/src/dashboard-ui.js +0 -997
  170. package/packages/queue-monitor/src/driver.d.ts +0 -15
  171. package/packages/queue-monitor/src/driver.d.ts.map +0 -1
  172. package/packages/queue-monitor/src/driver.js +0 -115
  173. package/packages/queue-monitor/src/index.d.ts +0 -71
  174. package/packages/queue-monitor/src/index.d.ts.map +0 -1
  175. package/packages/queue-monitor/src/index.js +0 -296
  176. package/packages/queue-monitor/src/metrics.d.ts +0 -27
  177. package/packages/queue-monitor/src/metrics.d.ts.map +0 -1
  178. package/packages/queue-monitor/src/metrics.js +0 -92
  179. package/packages/queue-monitor/src/worker.d.ts +0 -8
  180. package/packages/queue-monitor/src/worker.d.ts.map +0 -1
  181. package/packages/queue-monitor/src/worker.js +0 -35
  182. package/packages/queue-redis/src/BullMQRedisQueue.d.ts +0 -26
  183. package/packages/queue-redis/src/BullMQRedisQueue.d.ts.map +0 -1
  184. package/packages/queue-redis/src/BullMQRedisQueue.js +0 -463
  185. package/packages/queue-redis/src/HttpQueueDriver.d.ts +0 -18
  186. package/packages/queue-redis/src/HttpQueueDriver.d.ts.map +0 -1
  187. package/packages/queue-redis/src/HttpQueueDriver.js +0 -249
  188. package/packages/queue-redis/src/QueueHttpGateway.d.ts +0 -16
  189. package/packages/queue-redis/src/QueueHttpGateway.d.ts.map +0 -1
  190. package/packages/queue-redis/src/QueueHttpGateway.js +0 -217
  191. package/packages/queue-redis/src/RedisPublishClient.d.ts +0 -14
  192. package/packages/queue-redis/src/RedisPublishClient.d.ts.map +0 -1
  193. package/packages/queue-redis/src/RedisPublishClient.js +0 -251
  194. package/packages/queue-redis/src/index.d.ts +0 -12
  195. package/packages/queue-redis/src/index.d.ts.map +0 -1
  196. package/packages/queue-redis/src/index.js +0 -10
  197. package/packages/queue-redis/src/register.d.ts +0 -6
  198. package/packages/queue-redis/src/register.d.ts.map +0 -1
  199. package/packages/queue-redis/src/register.js +0 -21
  200. package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.d.ts +0 -11
  201. package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.d.ts.map +0 -1
  202. package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.js +0 -32
  203. package/packages/workers/migrations/20260123180000_create_queue_jobs_table.d.ts +0 -11
  204. package/packages/workers/migrations/20260123180000_create_queue_jobs_table.d.ts.map +0 -1
  205. package/packages/workers/migrations/20260123180000_create_queue_jobs_table.js +0 -46
  206. package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.d.ts +0 -7
  207. package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.d.ts.map +0 -1
  208. package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.js +0 -44
  209. package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.d.ts +0 -7
  210. package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.d.ts.map +0 -1
  211. package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.js +0 -104
  212. package/packages/workers/src/AnomalyDetection.d.ts +0 -107
  213. package/packages/workers/src/AnomalyDetection.d.ts.map +0 -1
  214. package/packages/workers/src/AnomalyDetection.js +0 -329
  215. package/packages/workers/src/AutoScaler.d.ts +0 -128
  216. package/packages/workers/src/AutoScaler.d.ts.map +0 -1
  217. package/packages/workers/src/AutoScaler.js +0 -425
  218. package/packages/workers/src/BroadcastWorker.d.ts +0 -24
  219. package/packages/workers/src/BroadcastWorker.d.ts.map +0 -1
  220. package/packages/workers/src/BroadcastWorker.js +0 -24
  221. package/packages/workers/src/CanaryController.d.ts +0 -104
  222. package/packages/workers/src/CanaryController.d.ts.map +0 -1
  223. package/packages/workers/src/CanaryController.js +0 -424
  224. package/packages/workers/src/ChaosEngineering.d.ts +0 -80
  225. package/packages/workers/src/ChaosEngineering.d.ts.map +0 -1
  226. package/packages/workers/src/ChaosEngineering.js +0 -229
  227. package/packages/workers/src/CircuitBreaker.d.ts +0 -107
  228. package/packages/workers/src/CircuitBreaker.d.ts.map +0 -1
  229. package/packages/workers/src/CircuitBreaker.js +0 -374
  230. package/packages/workers/src/ClusterLock.d.ts +0 -91
  231. package/packages/workers/src/ClusterLock.d.ts.map +0 -1
  232. package/packages/workers/src/ClusterLock.js +0 -397
  233. package/packages/workers/src/ComplianceManager.d.ts +0 -178
  234. package/packages/workers/src/ComplianceManager.d.ts.map +0 -1
  235. package/packages/workers/src/ComplianceManager.js +0 -556
  236. package/packages/workers/src/DatacenterOrchestrator.d.ts +0 -134
  237. package/packages/workers/src/DatacenterOrchestrator.d.ts.map +0 -1
  238. package/packages/workers/src/DatacenterOrchestrator.js +0 -404
  239. package/packages/workers/src/DeadLetterQueue.d.ts +0 -123
  240. package/packages/workers/src/DeadLetterQueue.d.ts.map +0 -1
  241. package/packages/workers/src/DeadLetterQueue.js +0 -544
  242. package/packages/workers/src/HealthMonitor.d.ts +0 -43
  243. package/packages/workers/src/HealthMonitor.d.ts.map +0 -1
  244. package/packages/workers/src/HealthMonitor.js +0 -312
  245. package/packages/workers/src/MultiQueueWorker.d.ts +0 -90
  246. package/packages/workers/src/MultiQueueWorker.d.ts.map +0 -1
  247. package/packages/workers/src/MultiQueueWorker.js +0 -282
  248. package/packages/workers/src/NotificationWorker.d.ts +0 -24
  249. package/packages/workers/src/NotificationWorker.d.ts.map +0 -1
  250. package/packages/workers/src/NotificationWorker.js +0 -23
  251. package/packages/workers/src/Observability.d.ts +0 -154
  252. package/packages/workers/src/Observability.d.ts.map +0 -1
  253. package/packages/workers/src/Observability.js +0 -538
  254. package/packages/workers/src/PluginManager.d.ts +0 -124
  255. package/packages/workers/src/PluginManager.d.ts.map +0 -1
  256. package/packages/workers/src/PluginManager.js +0 -392
  257. package/packages/workers/src/PriorityQueue.d.ts +0 -118
  258. package/packages/workers/src/PriorityQueue.d.ts.map +0 -1
  259. package/packages/workers/src/PriorityQueue.js +0 -276
  260. package/packages/workers/src/ResourceMonitor.d.ts +0 -165
  261. package/packages/workers/src/ResourceMonitor.d.ts.map +0 -1
  262. package/packages/workers/src/ResourceMonitor.js +0 -632
  263. package/packages/workers/src/SLAMonitor.d.ts +0 -111
  264. package/packages/workers/src/SLAMonitor.d.ts.map +0 -1
  265. package/packages/workers/src/SLAMonitor.js +0 -274
  266. package/packages/workers/src/WorkerFactory.d.ts +0 -218
  267. package/packages/workers/src/WorkerFactory.d.ts.map +0 -1
  268. package/packages/workers/src/WorkerFactory.js +0 -2253
  269. package/packages/workers/src/WorkerInit.d.ts +0 -86
  270. package/packages/workers/src/WorkerInit.d.ts.map +0 -1
  271. package/packages/workers/src/WorkerInit.js +0 -307
  272. package/packages/workers/src/WorkerMetrics.d.ts +0 -116
  273. package/packages/workers/src/WorkerMetrics.d.ts.map +0 -1
  274. package/packages/workers/src/WorkerMetrics.js +0 -570
  275. package/packages/workers/src/WorkerRegistry.d.ts +0 -152
  276. package/packages/workers/src/WorkerRegistry.d.ts.map +0 -1
  277. package/packages/workers/src/WorkerRegistry.js +0 -396
  278. package/packages/workers/src/WorkerShutdown.d.ts +0 -70
  279. package/packages/workers/src/WorkerShutdown.d.ts.map +0 -1
  280. package/packages/workers/src/WorkerShutdown.js +0 -185
  281. package/packages/workers/src/WorkerVersioning.d.ts +0 -108
  282. package/packages/workers/src/WorkerVersioning.d.ts.map +0 -1
  283. package/packages/workers/src/WorkerVersioning.js +0 -300
  284. package/packages/workers/src/config/workerConfig.d.ts +0 -5
  285. package/packages/workers/src/config/workerConfig.d.ts.map +0 -1
  286. package/packages/workers/src/config/workerConfig.js +0 -25
  287. package/packages/workers/src/createQueueWorker.d.ts +0 -26
  288. package/packages/workers/src/createQueueWorker.d.ts.map +0 -1
  289. package/packages/workers/src/createQueueWorker.js +0 -367
  290. package/packages/workers/src/dashboard/index.d.ts +0 -2
  291. package/packages/workers/src/dashboard/index.d.ts.map +0 -1
  292. package/packages/workers/src/dashboard/index.js +0 -1
  293. package/packages/workers/src/dashboard/types.d.ts +0 -123
  294. package/packages/workers/src/dashboard/types.d.ts.map +0 -1
  295. package/packages/workers/src/dashboard/types.js +0 -1
  296. package/packages/workers/src/dashboard/workers-api.d.ts +0 -5
  297. package/packages/workers/src/dashboard/workers-api.d.ts.map +0 -1
  298. package/packages/workers/src/dashboard/workers-api.js +0 -738
  299. package/packages/workers/src/helper/index.d.ts +0 -6
  300. package/packages/workers/src/helper/index.d.ts.map +0 -1
  301. package/packages/workers/src/helper/index.js +0 -10
  302. package/packages/workers/src/http/WorkerApiController.d.ts +0 -39
  303. package/packages/workers/src/http/WorkerApiController.d.ts.map +0 -1
  304. package/packages/workers/src/http/WorkerApiController.js +0 -313
  305. package/packages/workers/src/http/WorkerController.d.ts +0 -375
  306. package/packages/workers/src/http/WorkerController.d.ts.map +0 -1
  307. package/packages/workers/src/http/WorkerController.js +0 -1454
  308. package/packages/workers/src/http/WorkerMonitoringService.d.ts +0 -12
  309. package/packages/workers/src/http/WorkerMonitoringService.d.ts.map +0 -1
  310. package/packages/workers/src/http/WorkerMonitoringService.js +0 -89
  311. package/packages/workers/src/http/middleware/CustomValidation.d.ts +0 -93
  312. package/packages/workers/src/http/middleware/CustomValidation.d.ts.map +0 -1
  313. package/packages/workers/src/http/middleware/CustomValidation.js +0 -270
  314. package/packages/workers/src/http/middleware/DatacenterValidator.d.ts +0 -4
  315. package/packages/workers/src/http/middleware/DatacenterValidator.d.ts.map +0 -1
  316. package/packages/workers/src/http/middleware/DatacenterValidator.js +0 -94
  317. package/packages/workers/src/http/middleware/EditWorkerValidation.d.ts +0 -8
  318. package/packages/workers/src/http/middleware/EditWorkerValidation.d.ts.map +0 -1
  319. package/packages/workers/src/http/middleware/EditWorkerValidation.js +0 -56
  320. package/packages/workers/src/http/middleware/FeaturesValidator.d.ts +0 -4
  321. package/packages/workers/src/http/middleware/FeaturesValidator.d.ts.map +0 -1
  322. package/packages/workers/src/http/middleware/FeaturesValidator.js +0 -61
  323. package/packages/workers/src/http/middleware/InfrastructureValidator.d.ts +0 -32
  324. package/packages/workers/src/http/middleware/InfrastructureValidator.d.ts.map +0 -1
  325. package/packages/workers/src/http/middleware/InfrastructureValidator.js +0 -226
  326. package/packages/workers/src/http/middleware/OptionsValidator.d.ts +0 -4
  327. package/packages/workers/src/http/middleware/OptionsValidator.d.ts.map +0 -1
  328. package/packages/workers/src/http/middleware/OptionsValidator.js +0 -112
  329. package/packages/workers/src/http/middleware/PayloadSanitizer.d.ts +0 -8
  330. package/packages/workers/src/http/middleware/PayloadSanitizer.d.ts.map +0 -1
  331. package/packages/workers/src/http/middleware/PayloadSanitizer.js +0 -42
  332. package/packages/workers/src/http/middleware/ProcessorPathSanitizer.d.ts +0 -4
  333. package/packages/workers/src/http/middleware/ProcessorPathSanitizer.d.ts.map +0 -1
  334. package/packages/workers/src/http/middleware/ProcessorPathSanitizer.js +0 -140
  335. package/packages/workers/src/http/middleware/QueueNameSanitizer.d.ts +0 -4
  336. package/packages/workers/src/http/middleware/QueueNameSanitizer.d.ts.map +0 -1
  337. package/packages/workers/src/http/middleware/QueueNameSanitizer.js +0 -45
  338. package/packages/workers/src/http/middleware/ValidateDriver.d.ts +0 -8
  339. package/packages/workers/src/http/middleware/ValidateDriver.d.ts.map +0 -1
  340. package/packages/workers/src/http/middleware/ValidateDriver.js +0 -20
  341. package/packages/workers/src/http/middleware/VersionSanitizer.d.ts +0 -4
  342. package/packages/workers/src/http/middleware/VersionSanitizer.d.ts.map +0 -1
  343. package/packages/workers/src/http/middleware/VersionSanitizer.js +0 -25
  344. package/packages/workers/src/http/middleware/WorkerNameSanitizer.d.ts +0 -4
  345. package/packages/workers/src/http/middleware/WorkerNameSanitizer.d.ts.map +0 -1
  346. package/packages/workers/src/http/middleware/WorkerNameSanitizer.js +0 -46
  347. package/packages/workers/src/http/middleware/WorkerValidationChain.d.ts +0 -28
  348. package/packages/workers/src/http/middleware/WorkerValidationChain.d.ts.map +0 -1
  349. package/packages/workers/src/http/middleware/WorkerValidationChain.js +0 -186
  350. package/packages/workers/src/index.d.ts +0 -47
  351. package/packages/workers/src/index.d.ts.map +0 -1
  352. package/packages/workers/src/index.js +0 -48
  353. package/packages/workers/src/routes/workers.d.ts +0 -13
  354. package/packages/workers/src/routes/workers.d.ts.map +0 -1
  355. package/packages/workers/src/routes/workers.js +0 -126
  356. package/packages/workers/src/storage/WorkerStore.d.ts +0 -52
  357. package/packages/workers/src/storage/WorkerStore.d.ts.map +0 -1
  358. package/packages/workers/src/storage/WorkerStore.js +0 -259
  359. package/packages/workers/src/telemetry/api/TelemetryAPI.d.ts +0 -47
  360. package/packages/workers/src/telemetry/api/TelemetryAPI.d.ts.map +0 -1
  361. package/packages/workers/src/telemetry/api/TelemetryAPI.js +0 -219
  362. package/packages/workers/src/telemetry/api/TelemetryMonitoringService.d.ts +0 -18
  363. package/packages/workers/src/telemetry/api/TelemetryMonitoringService.d.ts.map +0 -1
  364. package/packages/workers/src/telemetry/api/TelemetryMonitoringService.js +0 -140
  365. package/packages/workers/src/telemetry/components/AlertPanel.d.ts +0 -2
  366. package/packages/workers/src/telemetry/components/AlertPanel.d.ts.map +0 -1
  367. package/packages/workers/src/telemetry/components/AlertPanel.js +0 -13
  368. package/packages/workers/src/telemetry/components/CostTracking.d.ts +0 -2
  369. package/packages/workers/src/telemetry/components/CostTracking.d.ts.map +0 -1
  370. package/packages/workers/src/telemetry/components/CostTracking.js +0 -14
  371. package/packages/workers/src/telemetry/components/ResourceUsageChart.d.ts +0 -2
  372. package/packages/workers/src/telemetry/components/ResourceUsageChart.d.ts.map +0 -1
  373. package/packages/workers/src/telemetry/components/ResourceUsageChart.js +0 -11
  374. package/packages/workers/src/telemetry/components/WorkerHealthChart.d.ts +0 -2
  375. package/packages/workers/src/telemetry/components/WorkerHealthChart.d.ts.map +0 -1
  376. package/packages/workers/src/telemetry/components/WorkerHealthChart.js +0 -11
  377. package/packages/workers/src/telemetry/index.d.ts +0 -16
  378. package/packages/workers/src/telemetry/index.d.ts.map +0 -1
  379. package/packages/workers/src/telemetry/index.js +0 -60
  380. package/packages/workers/src/telemetry/routes/dashboard.d.ts +0 -7
  381. package/packages/workers/src/telemetry/routes/dashboard.d.ts.map +0 -1
  382. package/packages/workers/src/telemetry/routes/dashboard.js +0 -608
  383. package/packages/workers/src/type.d.ts +0 -77
  384. package/packages/workers/src/type.d.ts.map +0 -1
  385. package/packages/workers/src/type.js +0 -1
  386. package/packages/workers/src/ui/router/EmbeddedAssets.d.ts +0 -5
  387. package/packages/workers/src/ui/router/EmbeddedAssets.d.ts.map +0 -1
  388. package/packages/workers/src/ui/router/EmbeddedAssets.js +0 -13
  389. package/packages/workers/src/ui/router/ui.d.ts +0 -4
  390. package/packages/workers/src/ui/router/ui.d.ts.map +0 -1
  391. package/packages/workers/src/ui/router/ui.js +0 -208
  392. package/packages/workers/src/ui/types/worker-ui.d.ts +0 -230
  393. package/packages/workers/src/ui/types/worker-ui.d.ts.map +0 -1
  394. package/packages/workers/src/ui/types/worker-ui.js +0 -5
  395. package/routes/api.d.ts +0 -7
  396. package/routes/api.d.ts.map +0 -1
  397. package/routes/api.js +0 -129
  398. package/routes/broadcast.d.ts +0 -9
  399. package/routes/broadcast.d.ts.map +0 -1
  400. package/routes/broadcast.js +0 -27
  401. package/routes/storage.d.ts +0 -4
  402. package/routes/storage.d.ts.map +0 -1
  403. package/routes/storage.js +0 -35
@@ -3,9 +3,10 @@
3
3
  * JSON Web Token generation, verification, and claims management
4
4
  * Uses native Node.js crypto module (zero external dependencies)
5
5
  */
6
- import { securityConfig } from '../config/index.js';
6
+ import { securityConfig } from '../config/security.js';
7
7
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
8
8
  import { createHmac, createSign, createVerify, randomBytes } from '../node-singletons/crypto.js';
9
+ import { JwtSessions } from './JwtSessions.js';
9
10
  const createJwt = () => {
10
11
  const algorithm = securityConfig.jwt.algorithm;
11
12
  const secret = securityConfig.jwt.secret;
@@ -15,27 +16,38 @@ const createJwt = () => {
15
16
  }
16
17
  return jwt;
17
18
  };
18
- const signAccessToken = (payload, expiresIn) => {
19
+ const logout = async (authHeader) => {
20
+ await JwtSessions.logout(authHeader);
21
+ };
22
+ const logoutAll = async (sub) => {
23
+ await JwtSessions.logoutAll(sub);
24
+ };
25
+ const signAccessToken = async (payload, expiresIn) => {
19
26
  const algorithm = securityConfig.jwt.algorithm;
20
27
  const jwt = createJwt();
28
+ let token;
21
29
  // JwtManager currently supports HMAC secrets directly for HS algorithms.
22
30
  // For other algorithms, verify will still reject mismatched tokens.
23
31
  if (algorithm !== 'HS256' && algorithm !== 'HS512') {
24
- return jwt.sign(payload, {
32
+ token = jwt.sign(payload, {
33
+ algorithm,
34
+ issuer: securityConfig.jwt.issuer,
35
+ audience: securityConfig.jwt.audience,
36
+ jwtId: jwt.generateJwtId(),
37
+ });
38
+ }
39
+ else {
40
+ token = jwt.sign(payload, {
25
41
  algorithm,
42
+ expiresIn: expiresIn ?? securityConfig.jwt.expiresIn,
26
43
  issuer: securityConfig.jwt.issuer,
27
44
  audience: securityConfig.jwt.audience,
45
+ subject: typeof payload.sub === 'string' ? payload.sub : undefined,
28
46
  jwtId: jwt.generateJwtId(),
29
47
  });
30
48
  }
31
- return jwt.sign(payload, {
32
- algorithm,
33
- expiresIn: expiresIn ?? securityConfig.jwt.expiresIn,
34
- issuer: securityConfig.jwt.issuer,
35
- audience: securityConfig.jwt.audience,
36
- subject: typeof payload.sub === 'string' ? payload.sub : undefined,
37
- jwtId: jwt.generateJwtId(),
38
- });
49
+ await JwtSessions.register(token);
50
+ return token;
39
51
  };
40
52
  /**
41
53
  * Create a new JWT manager instance
@@ -77,6 +89,8 @@ const create = () => {
77
89
  export const JwtManager = Object.freeze({
78
90
  create,
79
91
  signAccessToken,
92
+ logout,
93
+ logoutAll,
80
94
  });
81
95
  /**
82
96
  * Sign JWT token
@@ -0,0 +1,12 @@
1
+ export type JwtSessionsDriverName = 'database' | 'memory' | 'redis' | 'kv' | 'kv-remote';
2
+ export type AuthorizationHeader = string | string[] | undefined;
3
+ export declare const JwtSessions: Readonly<{
4
+ register(token: string): Promise<void>;
5
+ isActive(token: string): Promise<boolean>;
6
+ logout(header: AuthorizationHeader): Promise<string | null>;
7
+ logoutAll(sub: string): Promise<void>;
8
+ getDriver(): JwtSessionsDriverName;
9
+ _resetForTests(): void;
10
+ }>;
11
+ export default JwtSessions;
12
+ //# sourceMappingURL=JwtSessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JwtSessions.d.ts","sourceRoot":"","sources":["../../../src/security/JwtSessions.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC;AAEzF,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAqnBhE,eAAO,MAAM,WAAW;oBACA,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;oBAKtB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;mBAM1B,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;mBAU5C,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;iBAQ9B,qBAAqB;sBAIhB,IAAI;EAItB,CAAC;AAEH,eAAe,WAAW,CAAC"}
@@ -0,0 +1,556 @@
1
+ import { RemoteSignedJson } from '../common/RemoteSignedJson.js';
2
+ import { Cloudflare } from '../config/cloudflare.js';
3
+ import { Env } from '../config/env.js';
4
+ import { Logger } from '../config/logger.js';
5
+ import { securityConfig } from '../config/security.js';
6
+ import { createRedisConnection } from '../config/workers.js';
7
+ import { ErrorFactory } from '../exceptions/ZintrustError.js';
8
+ import { useDatabase } from '../orm/Database.js';
9
+ import { JwtManager } from './JwtManager.js';
10
+ const DEFAULTS = {
11
+ driver: 'database',
12
+ dbConnection: 'default',
13
+ dbTable: 'zintrust_jwt_revocations',
14
+ redisPrefix: 'zt:jwt:active:',
15
+ kvBinding: 'CACHE',
16
+ kvPrefix: 'zt:jwt:active:',
17
+ kvRemoteNamespace: '',
18
+ subIndexSuffix: ':sub:',
19
+ };
20
+ const defaultTtlMs = Math.max(securityConfig.jwt.expiresIn * 1000, 60_000);
21
+ const normalizeDriverName = (raw) => {
22
+ const value = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
23
+ if (value === 'db' || value === 'database')
24
+ return 'database';
25
+ if (value === 'redis')
26
+ return 'redis';
27
+ if (value === 'kv')
28
+ return 'kv';
29
+ if (value === 'kv-remote' || value === 'kvremote')
30
+ return 'kv-remote';
31
+ if (value === 'memory' || value === 'mem')
32
+ return 'memory';
33
+ return DEFAULTS.driver;
34
+ };
35
+ const getHeaderValue = (value) => {
36
+ if (Array.isArray(value))
37
+ return typeof value[0] === 'string' ? value[0] : '';
38
+ return typeof value === 'string' ? value : '';
39
+ };
40
+ const getBearerToken = (authorizationHeader) => {
41
+ const header = getHeaderValue(authorizationHeader).trim();
42
+ if (header === '')
43
+ return null;
44
+ const [scheme, ...rest] = header.split(/\s+/);
45
+ if (typeof scheme !== 'string' || scheme.toLowerCase() !== 'bearer')
46
+ return null;
47
+ const token = rest.join(' ').trim();
48
+ if (token === '')
49
+ return null;
50
+ return token;
51
+ };
52
+ const resolveKey = (token) => {
53
+ let decoded = {};
54
+ try {
55
+ decoded = JwtManager.create().decode(token);
56
+ }
57
+ catch {
58
+ decoded = {};
59
+ }
60
+ const expSeconds = typeof decoded['exp'] === 'number' ? decoded['exp'] : undefined;
61
+ const expiresAtMs = expSeconds !== undefined && Number.isFinite(expSeconds) && expSeconds > 0
62
+ ? Math.floor(expSeconds * 1000)
63
+ : Date.now() + defaultTtlMs;
64
+ const jti = typeof decoded['jti'] === 'string' ? decoded['jti'].trim() : '';
65
+ const sub = typeof decoded['sub'] === 'string' ? decoded['sub'].trim() : '';
66
+ return {
67
+ id: jti === '' ? token : jti,
68
+ expiresAtMs,
69
+ sub: sub === '' ? undefined : sub,
70
+ };
71
+ };
72
+ const createMemoryStore = () => {
73
+ const active = new Map();
74
+ const subIndex = new Map();
75
+ const idToSub = new Map();
76
+ const indexDelete = (id) => {
77
+ const sub = idToSub.get(id);
78
+ if (sub === undefined)
79
+ return;
80
+ const set = subIndex.get(sub);
81
+ if (set !== undefined) {
82
+ set.delete(id);
83
+ if (set.size === 0) {
84
+ subIndex.delete(sub);
85
+ }
86
+ }
87
+ idToSub.delete(id);
88
+ };
89
+ const indexAdd = (sub, id) => {
90
+ if (typeof sub !== 'string' || sub.trim() === '') {
91
+ indexDelete(id);
92
+ return;
93
+ }
94
+ const key = sub.trim();
95
+ // If this id was previously indexed under another subject, remove it.
96
+ const previous = idToSub.get(id);
97
+ if (previous !== undefined && previous !== key) {
98
+ indexDelete(id);
99
+ }
100
+ const existing = subIndex.get(key) ?? new Set();
101
+ existing.add(id);
102
+ subIndex.set(key, existing);
103
+ idToSub.set(id, key);
104
+ };
105
+ const cleanupExpired = () => {
106
+ const now = Date.now();
107
+ for (const [id, expiresAtMs] of active.entries()) {
108
+ if (expiresAtMs <= now) {
109
+ active.delete(id);
110
+ indexDelete(id);
111
+ }
112
+ }
113
+ };
114
+ return {
115
+ async upsertActive(key) {
116
+ cleanupExpired();
117
+ active.set(key.id, key.expiresAtMs);
118
+ indexAdd(key.sub, key.id);
119
+ await Promise.resolve();
120
+ },
121
+ async isActive(id) {
122
+ cleanupExpired();
123
+ const expiresAtMs = active.get(id);
124
+ if (expiresAtMs === undefined)
125
+ return false;
126
+ if (expiresAtMs <= Date.now()) {
127
+ active.delete(id);
128
+ indexDelete(id);
129
+ return false;
130
+ }
131
+ await Promise.resolve();
132
+ return true;
133
+ },
134
+ async deleteById(id) {
135
+ active.delete(id);
136
+ indexDelete(id);
137
+ await Promise.resolve();
138
+ },
139
+ async deleteAllForSub(sub) {
140
+ const key = sub.trim();
141
+ const ids = subIndex.get(key);
142
+ if (!ids)
143
+ return;
144
+ for (const id of ids.values()) {
145
+ active.delete(id);
146
+ idToSub.delete(id);
147
+ }
148
+ subIndex.delete(key);
149
+ await Promise.resolve();
150
+ },
151
+ };
152
+ };
153
+ const createDatabaseStore = (params) => {
154
+ let checkCount = 0;
155
+ const maybeCleanup = async () => {
156
+ checkCount += 1;
157
+ if (checkCount % 250 !== 0)
158
+ return;
159
+ try {
160
+ const db = useDatabase(undefined, params.connection);
161
+ await db.table(params.table).where('expires_at_ms', '<=', Date.now()).delete();
162
+ }
163
+ catch (error) {
164
+ Logger.debug('JwtSessions database cleanup failed', {
165
+ error: error instanceof Error ? error.message : String(error),
166
+ });
167
+ }
168
+ };
169
+ return {
170
+ async upsertActive(key) {
171
+ const db = useDatabase(undefined, params.connection);
172
+ // Require the new schema (kind column). Old rows should be kind=revoked.
173
+ const record = {
174
+ jti: key.id,
175
+ sub: key.sub ?? null,
176
+ user_id: key.sub ?? null,
177
+ expires_at_ms: key.expiresAtMs,
178
+ kind: 'active',
179
+ };
180
+ try {
181
+ await db.table(params.table).where('jti', '=', key.id).update(record);
182
+ const existing = await db.table(params.table).where('jti', '=', key.id).first();
183
+ if (existing === null) {
184
+ await db.table(params.table).insert(record);
185
+ }
186
+ }
187
+ catch (error) {
188
+ throw ErrorFactory.createConfigError(`JWT sessions database table '${params.table}' is missing required columns (run migrations)`, {
189
+ table: params.table,
190
+ error: error instanceof Error ? error.message : String(error),
191
+ });
192
+ }
193
+ },
194
+ async isActive(id) {
195
+ await maybeCleanup();
196
+ const db = useDatabase(undefined, params.connection);
197
+ try {
198
+ const row = await db
199
+ .table(params.table)
200
+ .where('jti', '=', id)
201
+ .where('kind', '=', 'active')
202
+ .first();
203
+ if (row === null)
204
+ return false;
205
+ const expiresAtMs = Number(row['expires_at_ms']);
206
+ if (!Number.isFinite(expiresAtMs))
207
+ return true;
208
+ if (expiresAtMs <= Date.now()) {
209
+ await db.table(params.table).where('jti', '=', id).delete();
210
+ return false;
211
+ }
212
+ return true;
213
+ }
214
+ catch (error) {
215
+ throw ErrorFactory.createConfigError(`JWT sessions database table '${params.table}' is missing required columns (run migrations)`, {
216
+ table: params.table,
217
+ error: error instanceof Error ? error.message : String(error),
218
+ });
219
+ }
220
+ },
221
+ async deleteById(id) {
222
+ const db = useDatabase(undefined, params.connection);
223
+ await db.table(params.table).where('jti', '=', id).delete();
224
+ },
225
+ async deleteAllForSub(sub) {
226
+ const db = useDatabase(undefined, params.connection);
227
+ await db.table(params.table).where('sub', '=', sub).where('kind', '=', 'active').delete();
228
+ },
229
+ };
230
+ };
231
+ const encodeSubIndexKey = (prefix, sub) => {
232
+ const trimmed = sub.trim();
233
+ return `${prefix}${DEFAULTS.subIndexSuffix}${encodeURIComponent(trimmed)}`;
234
+ };
235
+ const parseSubIndexValue = (raw) => {
236
+ if (!Array.isArray(raw))
237
+ return [];
238
+ return raw
239
+ .filter((v) => typeof v === 'string')
240
+ .map((s) => s.trim())
241
+ .filter((s) => s !== '');
242
+ };
243
+ const createRedisStore = (params) => {
244
+ const client = createRedisConnection({
245
+ host: Env.REDIS_HOST,
246
+ port: Env.REDIS_PORT,
247
+ password: Env.REDIS_PASSWORD,
248
+ db: Env.getInt('JWT_REVOCATION_REDIS_DB', Env.REDIS_DB),
249
+ });
250
+ const indexGet = async (sub) => {
251
+ const value = await client.get(encodeSubIndexKey(params.keyPrefix, sub));
252
+ if (value === null)
253
+ return [];
254
+ try {
255
+ return parseSubIndexValue(JSON.parse(value));
256
+ }
257
+ catch {
258
+ return [];
259
+ }
260
+ };
261
+ const indexSet = async (sub, ids, ttlMs) => {
262
+ const ttl = Math.max(0, ttlMs);
263
+ if (ttl === 0)
264
+ return;
265
+ await client.set(encodeSubIndexKey(params.keyPrefix, sub), JSON.stringify(ids), 'PX', ttl);
266
+ };
267
+ return {
268
+ async upsertActive(key) {
269
+ const ttlMs = Math.max(0, key.expiresAtMs - Date.now());
270
+ if (ttlMs === 0)
271
+ return;
272
+ await client.set(`${params.keyPrefix}${key.id}`, '1', 'PX', ttlMs);
273
+ if (typeof key.sub === 'string' && key.sub.trim() !== '') {
274
+ const existing = await indexGet(key.sub);
275
+ const next = Array.from(new Set([...existing, key.id]));
276
+ await indexSet(key.sub, next, ttlMs);
277
+ }
278
+ },
279
+ async isActive(id) {
280
+ const value = await client.get(`${params.keyPrefix}${id}`);
281
+ return value !== null;
282
+ },
283
+ async deleteById(id) {
284
+ await client.del(`${params.keyPrefix}${id}`);
285
+ },
286
+ async deleteAllForSub(sub) {
287
+ const ids = await indexGet(sub);
288
+ if (ids.length > 0) {
289
+ await client.del(...ids.map((id) => `${params.keyPrefix}${id}`));
290
+ }
291
+ await client.del(encodeSubIndexKey(params.keyPrefix, sub));
292
+ },
293
+ };
294
+ };
295
+ const createKvStore = (params) => {
296
+ const getKvOrThrow = () => {
297
+ const kv = Cloudflare.getKVBinding(params.bindingName);
298
+ if (kv === null) {
299
+ throw ErrorFactory.createConfigError(`KV binding '${params.bindingName}' not found`, {
300
+ bindingName: params.bindingName,
301
+ });
302
+ }
303
+ return kv;
304
+ };
305
+ const indexGet = async (sub) => {
306
+ const kv = getKvOrThrow();
307
+ const rawValue = await kv.get(encodeSubIndexKey(params.keyPrefix, sub));
308
+ if (typeof rawValue !== 'string')
309
+ return [];
310
+ const trimmed = rawValue.trim();
311
+ if (trimmed === '')
312
+ return [];
313
+ try {
314
+ return parseSubIndexValue(JSON.parse(trimmed));
315
+ }
316
+ catch {
317
+ return [];
318
+ }
319
+ };
320
+ const indexSet = async (sub, ids, ttlMs) => {
321
+ const ttlSeconds = Math.max(60, Math.ceil(ttlMs / 1000));
322
+ const kv = getKvOrThrow();
323
+ await kv.put(encodeSubIndexKey(params.keyPrefix, sub), JSON.stringify(ids), {
324
+ expirationTtl: ttlSeconds,
325
+ });
326
+ };
327
+ return {
328
+ async upsertActive(key) {
329
+ const ttlMs = Math.max(0, key.expiresAtMs - Date.now());
330
+ if (ttlMs === 0)
331
+ return;
332
+ const ttlSeconds = Math.max(60, Math.ceil(ttlMs / 1000));
333
+ const kv = getKvOrThrow();
334
+ await kv.put(`${params.keyPrefix}${key.id}`, '1', { expirationTtl: ttlSeconds });
335
+ if (typeof key.sub === 'string' && key.sub.trim() !== '') {
336
+ const existing = await indexGet(key.sub);
337
+ const next = Array.from(new Set([...existing, key.id]));
338
+ await indexSet(key.sub, next, ttlMs);
339
+ }
340
+ },
341
+ async isActive(id) {
342
+ const kv = getKvOrThrow();
343
+ const value = await kv.get(`${params.keyPrefix}${id}`);
344
+ return value !== null;
345
+ },
346
+ async deleteById(id) {
347
+ const kv = getKvOrThrow();
348
+ await kv.delete(`${params.keyPrefix}${id}`);
349
+ },
350
+ async deleteAllForSub(sub) {
351
+ const kv = getKvOrThrow();
352
+ const ids = await indexGet(sub);
353
+ for (const id of ids) {
354
+ // eslint-disable-next-line no-await-in-loop
355
+ await kv.delete(`${params.keyPrefix}${id}`);
356
+ }
357
+ await kv.delete(encodeSubIndexKey(params.keyPrefix, sub));
358
+ },
359
+ };
360
+ };
361
+ const kvRemoteGetProxySettings = () => ({
362
+ baseUrl: Env.get('KV_REMOTE_URL'),
363
+ keyId: Env.get('KV_REMOTE_KEY_ID'),
364
+ secret: Env.get('KV_REMOTE_SECRET', Env.APP_KEY),
365
+ timeoutMs: Env.getInt('ZT_PROXY_TIMEOUT_MS', Env.REQUEST_TIMEOUT),
366
+ });
367
+ const kvRemoteNormalizeNamespace = (value) => {
368
+ const trimmed = value.trim();
369
+ return trimmed === '' ? undefined : trimmed;
370
+ };
371
+ const kvRemoteCreateRemoteSettings = (proxy) => ({
372
+ baseUrl: proxy.baseUrl,
373
+ keyId: proxy.keyId,
374
+ secret: proxy.secret,
375
+ timeoutMs: proxy.timeoutMs,
376
+ signaturePathPrefixToStrip: undefined,
377
+ missingUrlMessage: 'KV remote proxy URL is missing (KV_REMOTE_URL)',
378
+ missingCredentialsMessage: 'KV remote signing credentials are missing (KV_REMOTE_KEY_ID / KV_REMOTE_SECRET)',
379
+ messages: {
380
+ unauthorized: 'KV remote proxy unauthorized',
381
+ forbidden: 'KV remote proxy forbidden',
382
+ rateLimited: 'KV remote proxy rate limited',
383
+ rejected: 'KV remote proxy rejected request',
384
+ error: 'KV remote proxy error',
385
+ timedOut: 'KV remote proxy request timed out',
386
+ },
387
+ });
388
+ const createKvRemoteOps = (ctx) => {
389
+ const getRemoteOrThrow = () => {
390
+ const proxy = ctx.getProxySettings();
391
+ if (proxy.baseUrl.trim() === '') {
392
+ throw ErrorFactory.createConfigError('KV remote proxy URL is missing (KV_REMOTE_URL)');
393
+ }
394
+ if (proxy.keyId.trim() === '' || proxy.secret.trim() === '') {
395
+ throw ErrorFactory.createConfigError('KV remote signing credentials are missing (KV_REMOTE_KEY_ID / KV_REMOTE_SECRET)');
396
+ }
397
+ return ctx.createRemoteSettings(proxy);
398
+ };
399
+ const remoteGetJson = async (key) => {
400
+ const remote = getRemoteOrThrow();
401
+ const out = await RemoteSignedJson.request(remote, '/zin/kv/get', {
402
+ namespace: ctx.normalizeNamespace(ctx.namespace),
403
+ key,
404
+ type: 'text',
405
+ });
406
+ return out.value;
407
+ };
408
+ const remotePutJson = async (key, value, ttlSeconds) => {
409
+ const remote = getRemoteOrThrow();
410
+ await RemoteSignedJson.request(remote, '/zin/kv/put', {
411
+ namespace: ctx.normalizeNamespace(ctx.namespace),
412
+ key,
413
+ value,
414
+ ttlSeconds,
415
+ });
416
+ };
417
+ const remoteDelete = async (key) => {
418
+ const remote = getRemoteOrThrow();
419
+ await RemoteSignedJson.request(remote, '/zin/kv/delete', {
420
+ namespace: ctx.normalizeNamespace(ctx.namespace),
421
+ key,
422
+ });
423
+ };
424
+ const indexGet = async (sub) => {
425
+ const raw = await remoteGetJson(encodeSubIndexKey(ctx.keyPrefix, sub));
426
+ if (typeof raw !== 'string')
427
+ return [];
428
+ try {
429
+ return parseSubIndexValue(JSON.parse(raw));
430
+ }
431
+ catch {
432
+ return [];
433
+ }
434
+ };
435
+ const indexSet = async (sub, ids, ttlMs) => {
436
+ const ttlSeconds = Math.max(60, Math.ceil(Math.max(0, ttlMs) / 1000));
437
+ await remotePutJson(encodeSubIndexKey(ctx.keyPrefix, sub), JSON.stringify(ids), ttlSeconds);
438
+ };
439
+ return { remoteGetJson, remotePutJson, remoteDelete, indexGet, indexSet };
440
+ };
441
+ const createKvRemoteStore = (params) => {
442
+ const ctx = {
443
+ keyPrefix: params.keyPrefix,
444
+ namespace: params.namespace,
445
+ getProxySettings: kvRemoteGetProxySettings,
446
+ createRemoteSettings: kvRemoteCreateRemoteSettings,
447
+ normalizeNamespace: kvRemoteNormalizeNamespace,
448
+ };
449
+ const ops = createKvRemoteOps(ctx);
450
+ return {
451
+ async upsertActive(key) {
452
+ const ttlMs = Math.max(0, key.expiresAtMs - Date.now());
453
+ if (ttlMs === 0)
454
+ return;
455
+ const ttlSeconds = Math.max(60, Math.ceil(ttlMs / 1000));
456
+ await ops.remotePutJson(`${ctx.keyPrefix}${key.id}`, '1', ttlSeconds);
457
+ if (typeof key.sub === 'string' && key.sub.trim() !== '') {
458
+ const existing = await ops.indexGet(key.sub);
459
+ const next = Array.from(new Set([...existing, key.id]));
460
+ await ops.indexSet(key.sub, next, ttlMs);
461
+ }
462
+ },
463
+ async isActive(id) {
464
+ const raw = await ops.remoteGetJson(`${ctx.keyPrefix}${id}`);
465
+ if (raw === null || raw === undefined)
466
+ return false;
467
+ if (typeof raw === 'string')
468
+ return raw.trim() !== '';
469
+ return true;
470
+ },
471
+ async deleteById(id) {
472
+ await ops.remoteDelete(`${ctx.keyPrefix}${id}`);
473
+ },
474
+ async deleteAllForSub(sub) {
475
+ const ids = await ops.indexGet(sub);
476
+ for (const id of ids) {
477
+ // eslint-disable-next-line no-await-in-loop
478
+ await ops.remoteDelete(`${ctx.keyPrefix}${id}`);
479
+ }
480
+ await ops.remoteDelete(encodeSubIndexKey(ctx.keyPrefix, sub));
481
+ },
482
+ };
483
+ };
484
+ let cachedStore = null;
485
+ let cachedDriver = null;
486
+ const resolveStore = () => {
487
+ const driver = normalizeDriverName(Env.get('JWT_SESSION_DRIVER', Env.get('JWT_REVOCATION_DRIVER', DEFAULTS.driver)));
488
+ if (cachedStore !== null && cachedDriver === driver) {
489
+ return { driver, store: cachedStore };
490
+ }
491
+ if (driver === 'memory') {
492
+ cachedStore = createMemoryStore();
493
+ cachedDriver = driver;
494
+ return { driver, store: cachedStore };
495
+ }
496
+ if (driver === 'database') {
497
+ const connection = Env.get('JWT_SESSION_DB_CONNECTION', Env.get('JWT_REVOCATION_DB_CONNECTION', DEFAULTS.dbConnection));
498
+ const table = Env.get('JWT_SESSION_DB_TABLE', Env.get('JWT_REVOCATION_DB_TABLE', DEFAULTS.dbTable));
499
+ cachedStore = createDatabaseStore({ connection, table });
500
+ cachedDriver = driver;
501
+ return { driver, store: cachedStore };
502
+ }
503
+ if (driver === 'redis') {
504
+ const keyPrefix = Env.get('JWT_SESSION_REDIS_PREFIX', Env.get('JWT_REVOCATION_REDIS_PREFIX', DEFAULTS.redisPrefix));
505
+ cachedStore = createRedisStore({ keyPrefix });
506
+ cachedDriver = driver;
507
+ return { driver, store: cachedStore };
508
+ }
509
+ if (driver === 'kv') {
510
+ const bindingName = Env.get('JWT_SESSION_KV_BINDING', Env.get('JWT_REVOCATION_KV_BINDING', DEFAULTS.kvBinding));
511
+ const keyPrefix = Env.get('JWT_SESSION_KV_PREFIX', DEFAULTS.kvPrefix);
512
+ cachedStore = createKvStore({ bindingName, keyPrefix });
513
+ cachedDriver = driver;
514
+ return { driver, store: cachedStore };
515
+ }
516
+ const namespace = Env.get('JWT_SESSION_KV_REMOTE_NAMESPACE', DEFAULTS.kvRemoteNamespace);
517
+ const keyPrefix = Env.get('JWT_SESSION_KV_REMOTE_PREFIX', DEFAULTS.kvPrefix);
518
+ cachedStore = createKvRemoteStore({ keyPrefix, namespace });
519
+ cachedDriver = driver;
520
+ return { driver, store: cachedStore };
521
+ };
522
+ export const JwtSessions = Object.freeze({
523
+ async register(token) {
524
+ const { store } = resolveStore();
525
+ await store.upsertActive(resolveKey(token));
526
+ },
527
+ async isActive(token) {
528
+ const { store } = resolveStore();
529
+ const key = resolveKey(token);
530
+ return store.isActive(key.id);
531
+ },
532
+ async logout(header) {
533
+ const token = getBearerToken(header);
534
+ if (token === null)
535
+ return null;
536
+ const { store } = resolveStore();
537
+ const key = resolveKey(token);
538
+ await store.deleteById(key.id);
539
+ return token;
540
+ },
541
+ async logoutAll(sub) {
542
+ const normalized = typeof sub === 'string' ? sub.trim() : '';
543
+ if (normalized === '')
544
+ return;
545
+ const { store } = resolveStore();
546
+ await store.deleteAllForSub(normalized);
547
+ },
548
+ getDriver() {
549
+ return resolveStore().driver;
550
+ },
551
+ _resetForTests() {
552
+ cachedStore = null;
553
+ cachedDriver = null;
554
+ },
555
+ });
556
+ export default JwtSessions;
@@ -0,0 +1,24 @@
1
+ export type NonceReplayVerifier = (keyId: string, nonce: string, ttlMs: number) => Promise<boolean>;
2
+ export type MemoryNonceReplayOptions = {
3
+ /**
4
+ * Cleanup interval to prevent unbounded map growth.
5
+ * Default: 500 accepted nonces.
6
+ */
7
+ cleanupEvery?: number;
8
+ /**
9
+ * Maximum nonce entries to keep before forcing a cleanup sweep.
10
+ * Default: 25_000.
11
+ */
12
+ maxEntries?: number;
13
+ };
14
+ export declare const NonceReplay: Readonly<{
15
+ /**
16
+ * In-memory, best-effort replay protection.
17
+ *
18
+ * Works in both Node and Workers, but does not provide cross-instance guarantees.
19
+ * For strict production replay protection, supply your own verifier backed by Redis/KV.
20
+ */
21
+ createMemoryVerifier(options?: MemoryNonceReplayOptions): NonceReplayVerifier;
22
+ }>;
23
+ export default NonceReplay;
24
+ //# sourceMappingURL=NonceReplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonceReplay.d.ts","sourceRoot":"","sources":["../../../src/security/NonceReplay.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpG,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAWF,eAAO,MAAM,WAAW;IACtB;;;;;OAKG;mCAC2B,wBAAwB,GAAQ,mBAAmB;EAmCjF,CAAC;AAEH,eAAe,WAAW,CAAC"}