@bgord/bun 1.20.5 → 1.21.1

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 (666) hide show
  1. package/dist/ab-assignment-composite.strategy.d.ts +4 -2
  2. package/dist/ab-assignment-composite.strategy.d.ts.map +1 -1
  3. package/dist/ab-assignment-composite.strategy.js +5 -2
  4. package/dist/ab-assignment-composite.strategy.js.map +1 -1
  5. package/dist/ab-assignment-cookie.strategy.d.ts +3 -2
  6. package/dist/ab-assignment-cookie.strategy.d.ts.map +1 -1
  7. package/dist/ab-assignment-cookie.strategy.js +5 -3
  8. package/dist/ab-assignment-cookie.strategy.js.map +1 -1
  9. package/dist/ab-assignment-fixed.strategy.d.ts +1 -2
  10. package/dist/ab-assignment-fixed.strategy.d.ts.map +1 -1
  11. package/dist/ab-assignment-fixed.strategy.js +1 -1
  12. package/dist/ab-assignment-fixed.strategy.js.map +1 -1
  13. package/dist/ab-assignment-hash.strategy.d.ts +1 -1
  14. package/dist/ab-assignment-hash.strategy.d.ts.map +1 -1
  15. package/dist/ab-assignment-hash.strategy.js +1 -1
  16. package/dist/ab-assignment-hash.strategy.js.map +1 -1
  17. package/dist/ab-assignment-header.strategy.d.ts +3 -2
  18. package/dist/ab-assignment-header.strategy.d.ts.map +1 -1
  19. package/dist/ab-assignment-header.strategy.js +5 -3
  20. package/dist/ab-assignment-header.strategy.js.map +1 -1
  21. package/dist/ab-assignment-query.strategy.d.ts +3 -2
  22. package/dist/ab-assignment-query.strategy.d.ts.map +1 -1
  23. package/dist/ab-assignment-query.strategy.js +5 -3
  24. package/dist/ab-assignment-query.strategy.js.map +1 -1
  25. package/dist/ab-assignment.strategy.d.ts +1 -2
  26. package/dist/ab-assignment.strategy.d.ts.map +1 -1
  27. package/dist/ab-hono-noop.middleware.d.ts +4 -1
  28. package/dist/ab-hono-noop.middleware.d.ts.map +1 -1
  29. package/dist/ab-hono-noop.middleware.js.map +1 -1
  30. package/dist/ab-hono.middleware.d.ts +4 -3
  31. package/dist/ab-hono.middleware.d.ts.map +1 -1
  32. package/dist/ab-hono.middleware.js +7 -4
  33. package/dist/ab-hono.middleware.js.map +1 -1
  34. package/dist/ab.middleware.d.ts +1 -3
  35. package/dist/ab.middleware.d.ts.map +1 -1
  36. package/dist/ab.middleware.js +2 -4
  37. package/dist/ab.middleware.js.map +1 -1
  38. package/dist/alert-channel-composite.adapter.d.ts +1 -0
  39. package/dist/alert-channel-composite.adapter.d.ts.map +1 -1
  40. package/dist/alert-channel-composite.adapter.js +6 -1
  41. package/dist/alert-channel-composite.adapter.js.map +1 -1
  42. package/dist/alert-channel-with-logger.adapter.js +1 -1
  43. package/dist/alert-channel-with-logger.adapter.js.map +1 -1
  44. package/dist/antivirus-clamav.adapter.d.ts.map +1 -1
  45. package/dist/antivirus-clamav.adapter.js +3 -4
  46. package/dist/antivirus-clamav.adapter.js.map +1 -1
  47. package/dist/antivirus-with-logger.adapter.js +2 -2
  48. package/dist/antivirus-with-logger.adapter.js.map +1 -1
  49. package/dist/api-version-hono.middleware.d.ts +2 -11
  50. package/dist/api-version-hono.middleware.d.ts.map +1 -1
  51. package/dist/api-version-hono.middleware.js +6 -3
  52. package/dist/api-version-hono.middleware.js.map +1 -1
  53. package/dist/api-version.middleware.d.ts +2 -3
  54. package/dist/api-version.middleware.d.ts.map +1 -1
  55. package/dist/api-version.middleware.js.map +1 -1
  56. package/dist/auth-session-reader-noop.adapter.d.ts +2 -2
  57. package/dist/auth-session-reader-noop.adapter.d.ts.map +1 -1
  58. package/dist/better-auth-logger.service.d.ts.map +1 -1
  59. package/dist/better-auth-logger.service.js +6 -0
  60. package/dist/better-auth-logger.service.js.map +1 -1
  61. package/dist/cache-file.service.d.ts.map +1 -1
  62. package/dist/cache-file.service.js +4 -2
  63. package/dist/cache-file.service.js.map +1 -1
  64. package/dist/cache-repository-node-cache.adapter.d.ts.map +1 -1
  65. package/dist/cache-repository-node-cache.adapter.js +4 -1
  66. package/dist/cache-repository-node-cache.adapter.js.map +1 -1
  67. package/dist/cache-response-hono.middleware.d.ts +2 -7
  68. package/dist/cache-response-hono.middleware.d.ts.map +1 -1
  69. package/dist/cache-response-hono.middleware.js +1 -1
  70. package/dist/cache-response-hono.middleware.js.map +1 -1
  71. package/dist/cache-response.middleware.d.ts +3 -4
  72. package/dist/cache-response.middleware.d.ts.map +1 -1
  73. package/dist/cache-response.middleware.js.map +1 -1
  74. package/dist/certificate-inspector-tls.adapter.d.ts.map +1 -1
  75. package/dist/certificate-inspector-tls.adapter.js +19 -16
  76. package/dist/certificate-inspector-tls.adapter.js.map +1 -1
  77. package/dist/correlation-hono.middleware.d.ts +5 -7
  78. package/dist/correlation-hono.middleware.d.ts.map +1 -1
  79. package/dist/correlation-hono.middleware.js +4 -2
  80. package/dist/correlation-hono.middleware.js.map +1 -1
  81. package/dist/correlation.middleware.d.ts +2 -3
  82. package/dist/correlation.middleware.d.ts.map +1 -1
  83. package/dist/correlation.middleware.js.map +1 -1
  84. package/dist/cron-scheduler.adapter.d.ts +1 -0
  85. package/dist/cron-scheduler.adapter.d.ts.map +1 -1
  86. package/dist/cron-scheduler.adapter.js +3 -2
  87. package/dist/cron-scheduler.adapter.js.map +1 -1
  88. package/dist/cron-task-handler-with-logger.strategy.js +7 -7
  89. package/dist/cron-task-handler-with-logger.strategy.js.map +1 -1
  90. package/dist/csv-stringifier.adapter.d.ts +1 -1
  91. package/dist/csv-stringifier.adapter.d.ts.map +1 -1
  92. package/dist/csv-stringifier.adapter.js +1 -1
  93. package/dist/csv-stringifier.adapter.js.map +1 -1
  94. package/dist/{disk-space-checker-shell.adapter.d.ts → disk-space-checker-fs.adapter.d.ts} +2 -2
  95. package/dist/disk-space-checker-fs.adapter.d.ts.map +1 -0
  96. package/dist/disk-space-checker-fs.adapter.js +10 -0
  97. package/dist/disk-space-checker-fs.adapter.js.map +1 -0
  98. package/dist/dynamic-import.service.js +2 -2
  99. package/dist/dynamic-import.service.js.map +1 -1
  100. package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
  101. package/dist/environment-loader-process-safe.adapter.js +3 -1
  102. package/dist/environment-loader-process-safe.adapter.js.map +1 -1
  103. package/dist/environment-loader.port.d.ts +1 -1
  104. package/dist/environment-loader.port.d.ts.map +1 -1
  105. package/dist/etag-extractor-header.strategy.d.ts.map +1 -1
  106. package/dist/etag-extractor-header.strategy.js +2 -0
  107. package/dist/etag-extractor-header.strategy.js.map +1 -1
  108. package/dist/etag-extractor-hono.middleware.d.ts +3 -1
  109. package/dist/etag-extractor-hono.middleware.d.ts.map +1 -1
  110. package/dist/etag-extractor-param.strategy.d.ts.map +1 -1
  111. package/dist/etag-extractor-param.strategy.js +2 -0
  112. package/dist/etag-extractor-param.strategy.js.map +1 -1
  113. package/dist/etag-extractor.strategy.d.ts +2 -2
  114. package/dist/etag-extractor.strategy.d.ts.map +1 -1
  115. package/dist/file-inspection.adapter.js +4 -4
  116. package/dist/file-inspection.adapter.js.map +1 -1
  117. package/dist/file-reader-json-forgiving.adapter.js +1 -1
  118. package/dist/file-reader-json-forgiving.adapter.js.map +1 -1
  119. package/dist/graceful-shutdown.service.d.ts.map +1 -1
  120. package/dist/graceful-shutdown.service.js +3 -3
  121. package/dist/graceful-shutdown.service.js.map +1 -1
  122. package/dist/hash.vo.js +1 -1
  123. package/dist/hash.vo.js.map +1 -1
  124. package/dist/hcaptcha.service.d.ts +1 -2
  125. package/dist/hcaptcha.service.d.ts.map +1 -1
  126. package/dist/hcaptcha.service.js +1 -1
  127. package/dist/hcaptcha.service.js.map +1 -1
  128. package/dist/http-logger-hono.middleware.d.ts +2 -9
  129. package/dist/http-logger-hono.middleware.d.ts.map +1 -1
  130. package/dist/http-logger-hono.middleware.js +1 -1
  131. package/dist/http-logger-hono.middleware.js.map +1 -1
  132. package/dist/http-logger.middleware.d.ts +2 -3
  133. package/dist/http-logger.middleware.d.ts.map +1 -1
  134. package/dist/http-logger.middleware.js.map +1 -1
  135. package/dist/image-blur-noop.adapter.js +1 -1
  136. package/dist/image-blur-noop.adapter.js.map +1 -1
  137. package/dist/image-blur.adapter.d.ts.map +1 -1
  138. package/dist/image-blur.adapter.js +2 -4
  139. package/dist/image-blur.adapter.js.map +1 -1
  140. package/dist/image-blur.port.d.ts +1 -8
  141. package/dist/image-blur.port.d.ts.map +1 -1
  142. package/dist/in-flight-requests-hono.middleware.d.ts.map +1 -1
  143. package/dist/in-flight-requests-hono.middleware.js +1 -0
  144. package/dist/in-flight-requests-hono.middleware.js.map +1 -1
  145. package/dist/in-flight-requests-tracker.service.js +2 -2
  146. package/dist/in-flight-requests-tracker.service.js.map +1 -1
  147. package/dist/index.d.ts +4 -3
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +4 -3
  150. package/dist/index.js.map +1 -1
  151. package/dist/instrumentation.service.d.ts.map +1 -1
  152. package/dist/instrumentation.service.js +5 -2
  153. package/dist/instrumentation.service.js.map +1 -1
  154. package/dist/job-queue-sqlite-store.service.d.ts.map +1 -1
  155. package/dist/job-queue-sqlite-store.service.js +1 -0
  156. package/dist/job-queue-sqlite-store.service.js.map +1 -1
  157. package/dist/job-queue-with-logger.adapter.d.ts +1 -1
  158. package/dist/job-queue-with-logger.adapter.d.ts.map +1 -1
  159. package/dist/job-queue-with-logger.adapter.js +2 -2
  160. package/dist/job-queue-with-logger.adapter.js.map +1 -1
  161. package/dist/language-detector-cookie.strategy.js +1 -1
  162. package/dist/language-detector-cookie.strategy.js.map +1 -1
  163. package/dist/language-detector-header.strategy.d.ts.map +1 -1
  164. package/dist/language-detector-header.strategy.js +12 -1
  165. package/dist/language-detector-header.strategy.js.map +1 -1
  166. package/dist/language-detector-hono.middleware.d.ts +3 -1
  167. package/dist/language-detector-hono.middleware.d.ts.map +1 -1
  168. package/dist/language-detector-query.strategy.js +1 -1
  169. package/dist/language-detector-query.strategy.js.map +1 -1
  170. package/dist/language-detector.middleware.d.ts +2 -2
  171. package/dist/language-detector.middleware.d.ts.map +1 -1
  172. package/dist/language-detector.middleware.js.map +1 -1
  173. package/dist/language-detector.strategy.d.ts +2 -2
  174. package/dist/language-detector.strategy.d.ts.map +1 -1
  175. package/dist/liveness-hono.handler.d.ts.map +1 -1
  176. package/dist/liveness-hono.handler.js +4 -1
  177. package/dist/liveness-hono.handler.js.map +1 -1
  178. package/dist/liveness.handler.d.ts +1 -0
  179. package/dist/liveness.handler.d.ts.map +1 -1
  180. package/dist/liveness.handler.js +1 -1
  181. package/dist/liveness.handler.js.map +1 -1
  182. package/dist/mailer-content-html.vo.d.ts +1 -5
  183. package/dist/mailer-content-html.vo.d.ts.map +1 -1
  184. package/dist/mailer-content-html.vo.js +1 -1
  185. package/dist/mailer-content-html.vo.js.map +1 -1
  186. package/dist/mailer-smtp.adapter.d.ts.map +1 -1
  187. package/dist/mailer-smtp.adapter.js +1 -0
  188. package/dist/mailer-smtp.adapter.js.map +1 -1
  189. package/dist/mailer-with-logger.adapter.js +2 -2
  190. package/dist/mailer-with-logger.adapter.js.map +1 -1
  191. package/dist/markdown-generator.adapter.js +1 -1
  192. package/dist/markdown-generator.adapter.js.map +1 -1
  193. package/dist/memory-consumption.service.d.ts +0 -1
  194. package/dist/memory-consumption.service.d.ts.map +1 -1
  195. package/dist/memory-consumption.service.js +0 -3
  196. package/dist/memory-consumption.service.js.map +1 -1
  197. package/dist/modules/system/jobs/SEND_EMAIL_JOB.d.ts +1 -1
  198. package/dist/nonce-provider-crypto.adapter.js +1 -1
  199. package/dist/nonce-provider-crypto.adapter.js.map +1 -1
  200. package/dist/nonce-provider-noop.adapter.js +1 -1
  201. package/dist/nonce-provider-noop.adapter.js.map +1 -1
  202. package/dist/nonce-value.vo.js +2 -2
  203. package/dist/pdf-generator-with-logger.adapter.js +1 -1
  204. package/dist/pdf-generator-with-logger.adapter.js.map +1 -1
  205. package/dist/prerequisite-verifier-memory.adapter.js +1 -1
  206. package/dist/prerequisite-verifier-memory.adapter.js.map +1 -1
  207. package/dist/prerequisite-verifier-translations.adapter.d.ts.map +1 -1
  208. package/dist/prerequisite-verifier-translations.adapter.js +7 -11
  209. package/dist/prerequisite-verifier-translations.adapter.js.map +1 -1
  210. package/dist/prerequisite-verifier-with-logger.adapter.js +1 -1
  211. package/dist/prerequisite-verifier-with-logger.adapter.js.map +1 -1
  212. package/dist/randomness.strategy.d.ts.map +1 -1
  213. package/dist/reactive-config-noop.adapter.d.ts +0 -1
  214. package/dist/reactive-config-noop.adapter.d.ts.map +1 -1
  215. package/dist/reactive-config-noop.adapter.js +2 -4
  216. package/dist/reactive-config-noop.adapter.js.map +1 -1
  217. package/dist/reactive-config-with-cache.adapter.js +1 -1
  218. package/dist/reactive-config-with-cache.adapter.js.map +1 -1
  219. package/dist/reactive-config-with-fallback.adapter.d.ts +0 -1
  220. package/dist/reactive-config-with-fallback.adapter.d.ts.map +1 -1
  221. package/dist/reactive-config-with-fallback.adapter.js +2 -4
  222. package/dist/reactive-config-with-fallback.adapter.js.map +1 -1
  223. package/dist/reactive-config-with-logger.adapter.d.ts +15 -0
  224. package/dist/reactive-config-with-logger.adapter.d.ts.map +1 -0
  225. package/dist/reactive-config-with-logger.adapter.js +38 -0
  226. package/dist/reactive-config-with-logger.adapter.js.map +1 -0
  227. package/dist/readiness-hono.handler.d.ts +4 -7
  228. package/dist/readiness-hono.handler.d.ts.map +1 -1
  229. package/dist/readiness-hono.handler.js +2 -3
  230. package/dist/readiness-hono.handler.js.map +1 -1
  231. package/dist/readiness.handler.d.ts +6 -1
  232. package/dist/readiness.handler.d.ts.map +1 -1
  233. package/dist/readiness.handler.js +11 -1
  234. package/dist/readiness.handler.js.map +1 -1
  235. package/dist/redactor-metadata-compact-array.strategy.d.ts.map +1 -1
  236. package/dist/redactor-metadata-compact-array.strategy.js +2 -0
  237. package/dist/redactor-metadata-compact-array.strategy.js.map +1 -1
  238. package/dist/redactor-metadata-compact-object.strategy.d.ts.map +1 -1
  239. package/dist/redactor-metadata-compact-object.strategy.js +2 -0
  240. package/dist/redactor-metadata-compact-object.strategy.js.map +1 -1
  241. package/dist/redactor-url-query.strategy.d.ts +8 -0
  242. package/dist/redactor-url-query.strategy.d.ts.map +1 -0
  243. package/dist/redactor-url-query.strategy.js +26 -0
  244. package/dist/redactor-url-query.strategy.js.map +1 -0
  245. package/dist/remote-file-storage-disk.adapter.d.ts +2 -0
  246. package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
  247. package/dist/remote-file-storage-disk.adapter.js +2 -5
  248. package/dist/remote-file-storage-disk.adapter.js.map +1 -1
  249. package/dist/request-context-hono.adapter.d.ts.map +1 -1
  250. package/dist/request-context-hono.adapter.js +2 -0
  251. package/dist/request-context-hono.adapter.js.map +1 -1
  252. package/dist/request-context.port.d.ts +13 -1
  253. package/dist/request-context.port.d.ts.map +1 -1
  254. package/dist/sealer-aes-gcm.adapter.d.ts +1 -0
  255. package/dist/sealer-aes-gcm.adapter.d.ts.map +1 -1
  256. package/dist/sealer-aes-gcm.adapter.js +6 -1
  257. package/dist/sealer-aes-gcm.adapter.js.map +1 -1
  258. package/dist/secure-key-generator-crypto.adapter.d.ts +1 -0
  259. package/dist/secure-key-generator-crypto.adapter.d.ts.map +1 -1
  260. package/dist/secure-key-generator-crypto.adapter.js +6 -1
  261. package/dist/secure-key-generator-crypto.adapter.js.map +1 -1
  262. package/dist/security-rule-bait-routes.strategy.js +1 -1
  263. package/dist/security-rule-bait-routes.strategy.js.map +1 -1
  264. package/dist/security-rule-honey-pot-field.strategy.d.ts +2 -2
  265. package/dist/security-rule-honey-pot-field.strategy.d.ts.map +1 -1
  266. package/dist/security-rule-honey-pot-field.strategy.js +3 -2
  267. package/dist/security-rule-honey-pot-field.strategy.js.map +1 -1
  268. package/dist/security-rule.strategy.d.ts +2 -4
  269. package/dist/security-rule.strategy.d.ts.map +1 -1
  270. package/dist/semaphore.service.d.ts +3 -1
  271. package/dist/semaphore.service.d.ts.map +1 -1
  272. package/dist/semaphore.service.js +13 -7
  273. package/dist/semaphore.service.js.map +1 -1
  274. package/dist/setup-hono.service.js +1 -1
  275. package/dist/setup-hono.service.js.map +1 -1
  276. package/dist/shield-api-key-hono.strategy.js +1 -1
  277. package/dist/shield-api-key.strategy.d.ts +1 -1
  278. package/dist/shield-api-key.strategy.d.ts.map +1 -1
  279. package/dist/shield-api-key.strategy.js +5 -4
  280. package/dist/shield-api-key.strategy.js.map +1 -1
  281. package/dist/shield-auth.strategy.d.ts +3 -2
  282. package/dist/shield-auth.strategy.d.ts.map +1 -1
  283. package/dist/shield-auth.strategy.js +10 -3
  284. package/dist/shield-auth.strategy.js.map +1 -1
  285. package/dist/shield-basic-auth-hono.strategy.d.ts +1 -0
  286. package/dist/shield-basic-auth-hono.strategy.d.ts.map +1 -1
  287. package/dist/shield-basic-auth-hono.strategy.js +8 -1
  288. package/dist/shield-basic-auth-hono.strategy.js.map +1 -1
  289. package/dist/shield-basic-auth.strategy.d.ts +1 -0
  290. package/dist/shield-basic-auth.strategy.d.ts.map +1 -1
  291. package/dist/shield-basic-auth.strategy.js +11 -3
  292. package/dist/shield-basic-auth.strategy.js.map +1 -1
  293. package/dist/shield-csrf.strategy.js +2 -2
  294. package/dist/shield-csrf.strategy.js.map +1 -1
  295. package/dist/shield-hcaptcha-hono-local.strategy.d.ts.map +1 -1
  296. package/dist/shield-hcaptcha-hono-local.strategy.js +3 -1
  297. package/dist/shield-hcaptcha-hono-local.strategy.js.map +1 -1
  298. package/dist/shield-hcaptcha.strategy.d.ts +2 -2
  299. package/dist/shield-hcaptcha.strategy.d.ts.map +1 -1
  300. package/dist/shield-hcaptcha.strategy.js +7 -2
  301. package/dist/shield-hcaptcha.strategy.js.map +1 -1
  302. package/dist/shield-ip-blacklist.strategy.d.ts +2 -2
  303. package/dist/shield-ip-blacklist.strategy.d.ts.map +1 -1
  304. package/dist/shield-ip-blacklist.strategy.js +2 -2
  305. package/dist/shield-ip-blacklist.strategy.js.map +1 -1
  306. package/dist/shield-ip-whitelist.strategy.d.ts +2 -2
  307. package/dist/shield-ip-whitelist.strategy.d.ts.map +1 -1
  308. package/dist/shield-ip-whitelist.strategy.js +1 -1
  309. package/dist/shield-ip-whitelist.strategy.js.map +1 -1
  310. package/dist/shield-maintenance-hono.strategy.d.ts.map +1 -1
  311. package/dist/shield-maintenance-hono.strategy.js +6 -4
  312. package/dist/shield-maintenance-hono.strategy.js.map +1 -1
  313. package/dist/shield-maintenance.strategy.d.ts +23 -7
  314. package/dist/shield-maintenance.strategy.d.ts.map +1 -1
  315. package/dist/shield-maintenance.strategy.js +23 -4
  316. package/dist/shield-maintenance.strategy.js.map +1 -1
  317. package/dist/shield-rate-limit.strategy.d.ts +1 -1
  318. package/dist/shield-rate-limit.strategy.d.ts.map +1 -1
  319. package/dist/shield-rate-limit.strategy.js +1 -1
  320. package/dist/shield-rate-limit.strategy.js.map +1 -1
  321. package/dist/shield-recaptcha.strategy.d.ts +2 -2
  322. package/dist/shield-recaptcha.strategy.d.ts.map +1 -1
  323. package/dist/shield-recaptcha.strategy.js +11 -7
  324. package/dist/shield-recaptcha.strategy.js.map +1 -1
  325. package/dist/shield-timeout-hono.strategy.js +1 -1
  326. package/dist/shield-webhook-hono.strategy.js +1 -1
  327. package/dist/shield-webhook.strategy.d.ts +2 -2
  328. package/dist/shield-webhook.strategy.d.ts.map +1 -1
  329. package/dist/shield-webhook.strategy.js.map +1 -1
  330. package/dist/simulated-error.middleware.d.ts +3 -0
  331. package/dist/simulated-error.middleware.d.ts.map +1 -1
  332. package/dist/simulated-error.middleware.js +2 -1
  333. package/dist/simulated-error.middleware.js.map +1 -1
  334. package/dist/sitemap-entry.vo.js +1 -1
  335. package/dist/sitemap-priority.vo.d.ts +1 -1
  336. package/dist/sitemap-priority.vo.d.ts.map +1 -1
  337. package/dist/sitemap-priority.vo.js +1 -1
  338. package/dist/sitemap-priority.vo.js.map +1 -1
  339. package/dist/slower-hono.middleware.d.ts +2 -6
  340. package/dist/slower-hono.middleware.d.ts.map +1 -1
  341. package/dist/slower-hono.middleware.js.map +1 -1
  342. package/dist/slower.middleware.d.ts +2 -3
  343. package/dist/slower.middleware.d.ts.map +1 -1
  344. package/dist/slower.middleware.js.map +1 -1
  345. package/dist/sms-with-logger.adapter.js +1 -1
  346. package/dist/sms-with-logger.adapter.js.map +1 -1
  347. package/dist/sse-hono.handler.d.ts.map +1 -1
  348. package/dist/sse-hono.handler.js +4 -2
  349. package/dist/sse-hono.handler.js.map +1 -1
  350. package/dist/sse-registry-collecting.adapter.d.ts +1 -1
  351. package/dist/sse-registry-collecting.adapter.d.ts.map +1 -1
  352. package/dist/sse-registry-collecting.adapter.js +3 -1
  353. package/dist/sse-registry-collecting.adapter.js.map +1 -1
  354. package/dist/sse-registry-noop.adapter.d.ts +1 -1
  355. package/dist/sse-registry-noop.adapter.d.ts.map +1 -1
  356. package/dist/sse-registry-noop.adapter.js +3 -1
  357. package/dist/sse-registry-noop.adapter.js.map +1 -1
  358. package/dist/sse-registry-with-limit.adapter.d.ts +1 -1
  359. package/dist/sse-registry-with-limit.adapter.d.ts.map +1 -1
  360. package/dist/sse-registry-with-limit.adapter.js +2 -2
  361. package/dist/sse-registry-with-limit.adapter.js.map +1 -1
  362. package/dist/sse-registry-with-logger.adapter.d.ts +1 -1
  363. package/dist/sse-registry-with-logger.adapter.d.ts.map +1 -1
  364. package/dist/sse-registry-with-logger.adapter.js +4 -3
  365. package/dist/sse-registry-with-logger.adapter.js.map +1 -1
  366. package/dist/sse-registry.adapter.d.ts +1 -1
  367. package/dist/sse-registry.adapter.d.ts.map +1 -1
  368. package/dist/sse-registry.adapter.js +7 -1
  369. package/dist/sse-registry.adapter.js.map +1 -1
  370. package/dist/sse-registry.port.d.ts +1 -1
  371. package/dist/sse-registry.port.d.ts.map +1 -1
  372. package/dist/ssr-bun.service.js +1 -1
  373. package/dist/ssr-bun.service.js.map +1 -1
  374. package/dist/ssr.service.d.ts +1 -1
  375. package/dist/ssr.service.d.ts.map +1 -1
  376. package/dist/ssr.service.js +1 -1
  377. package/dist/ssr.service.js.map +1 -1
  378. package/dist/standard-schema-validator.service.js +1 -1
  379. package/dist/standard-schema-validator.service.js.map +1 -1
  380. package/dist/static-config.adapter.js +1 -1
  381. package/dist/static-config.adapter.js.map +1 -1
  382. package/dist/static-files-hono.service.d.ts +1 -1
  383. package/dist/static-files-hono.service.js +2 -2
  384. package/dist/static-files-hono.service.js.map +1 -1
  385. package/dist/subject-application-resolver.vo.d.ts +2 -2
  386. package/dist/subject-application-resolver.vo.d.ts.map +1 -1
  387. package/dist/subject-application-resolver.vo.js +1 -1
  388. package/dist/subject-application-resolver.vo.js.map +1 -1
  389. package/dist/subject-request-resolver.vo.d.ts +2 -2
  390. package/dist/subject-request-resolver.vo.d.ts.map +1 -1
  391. package/dist/subject-request-resolver.vo.js +1 -1
  392. package/dist/subject-request-resolver.vo.js.map +1 -1
  393. package/dist/subject-segment-application.strategy.d.ts +1 -0
  394. package/dist/subject-segment-application.strategy.d.ts.map +1 -1
  395. package/dist/subject-segment-application.strategy.js +1 -1
  396. package/dist/subject-segment-application.strategy.js.map +1 -1
  397. package/dist/subject-segment-build.strategy.d.ts +1 -0
  398. package/dist/subject-segment-build.strategy.d.ts.map +1 -1
  399. package/dist/subject-segment-build.strategy.js +1 -0
  400. package/dist/subject-segment-build.strategy.js.map +1 -1
  401. package/dist/subject-segment-cookie.strategy.d.ts +1 -0
  402. package/dist/subject-segment-cookie.strategy.d.ts.map +1 -1
  403. package/dist/subject-segment-cookie.strategy.js +3 -0
  404. package/dist/subject-segment-cookie.strategy.js.map +1 -1
  405. package/dist/subject-segment-env.strategy.d.ts +1 -0
  406. package/dist/subject-segment-env.strategy.d.ts.map +1 -1
  407. package/dist/subject-segment-env.strategy.js +1 -0
  408. package/dist/subject-segment-env.strategy.js.map +1 -1
  409. package/dist/subject-segment-fixed.strategy.d.ts +1 -0
  410. package/dist/subject-segment-fixed.strategy.d.ts.map +1 -1
  411. package/dist/subject-segment-fixed.strategy.js +1 -0
  412. package/dist/subject-segment-fixed.strategy.js.map +1 -1
  413. package/dist/subject-segment-header.strategy.d.ts +1 -0
  414. package/dist/subject-segment-header.strategy.d.ts.map +1 -1
  415. package/dist/subject-segment-header.strategy.js +3 -0
  416. package/dist/subject-segment-header.strategy.js.map +1 -1
  417. package/dist/subject-segment-ip.strategy.d.ts +1 -0
  418. package/dist/subject-segment-ip.strategy.d.ts.map +1 -1
  419. package/dist/subject-segment-ip.strategy.js +1 -0
  420. package/dist/subject-segment-ip.strategy.js.map +1 -1
  421. package/dist/subject-segment-method.strategy.d.ts +7 -0
  422. package/dist/subject-segment-method.strategy.d.ts.map +1 -0
  423. package/dist/subject-segment-method.strategy.js +7 -0
  424. package/dist/subject-segment-method.strategy.js.map +1 -0
  425. package/dist/subject-segment-param.strategy.d.ts +1 -0
  426. package/dist/subject-segment-param.strategy.d.ts.map +1 -1
  427. package/dist/subject-segment-param.strategy.js +3 -0
  428. package/dist/subject-segment-param.strategy.js.map +1 -1
  429. package/dist/subject-segment-path.strategy.d.ts +1 -0
  430. package/dist/subject-segment-path.strategy.d.ts.map +1 -1
  431. package/dist/subject-segment-path.strategy.js +1 -0
  432. package/dist/subject-segment-path.strategy.js.map +1 -1
  433. package/dist/subject-segment-query.strategy.d.ts +3 -2
  434. package/dist/subject-segment-query.strategy.d.ts.map +1 -1
  435. package/dist/subject-segment-query.strategy.js +5 -5
  436. package/dist/subject-segment-query.strategy.js.map +1 -1
  437. package/dist/subject-segment-request.strategy.d.ts +5 -3
  438. package/dist/subject-segment-request.strategy.d.ts.map +1 -1
  439. package/dist/subject-segment-request.strategy.js +1 -1
  440. package/dist/subject-segment-request.strategy.js.map +1 -1
  441. package/dist/subject-segment-user.strategy.d.ts +1 -0
  442. package/dist/subject-segment-user.strategy.d.ts.map +1 -1
  443. package/dist/subject-segment-user.strategy.js +1 -0
  444. package/dist/subject-segment-user.strategy.js.map +1 -1
  445. package/dist/time-zone-offset-hono.middleware.d.ts +3 -1
  446. package/dist/time-zone-offset-hono.middleware.d.ts.map +1 -1
  447. package/dist/time-zone-offset.middleware.d.ts +2 -2
  448. package/dist/time-zone-offset.middleware.d.ts.map +1 -1
  449. package/dist/time-zone-offset.middleware.js +2 -0
  450. package/dist/time-zone-offset.middleware.js.map +1 -1
  451. package/dist/timekeeper-google.adapter.d.ts +1 -1
  452. package/dist/timekeeper-google.adapter.d.ts.map +1 -1
  453. package/dist/timekeeper-google.adapter.js.map +1 -1
  454. package/dist/timing-hono.middleware.d.ts +2 -6
  455. package/dist/timing-hono.middleware.d.ts.map +1 -1
  456. package/dist/timing-hono.middleware.js +1 -1
  457. package/dist/timing-hono.middleware.js.map +1 -1
  458. package/dist/timing.middleware.d.ts +5 -5
  459. package/dist/timing.middleware.d.ts.map +1 -1
  460. package/dist/timing.middleware.js +10 -2
  461. package/dist/timing.middleware.js.map +1 -1
  462. package/dist/trailing-slash-hono.middleware.d.ts +1 -1
  463. package/dist/trailing-slash-hono.middleware.js +2 -2
  464. package/dist/trailing-slash-hono.middleware.js.map +1 -1
  465. package/dist/trailing-slash.middleware.d.ts +2 -0
  466. package/dist/trailing-slash.middleware.d.ts.map +1 -1
  467. package/dist/trailing-slash.middleware.js +6 -1
  468. package/dist/trailing-slash.middleware.js.map +1 -1
  469. package/dist/translations-provider-json.adapter.d.ts +1 -1
  470. package/dist/translations-provider-json.adapter.d.ts.map +1 -1
  471. package/dist/translations-provider-json.adapter.js +2 -6
  472. package/dist/translations-provider-json.adapter.js.map +1 -1
  473. package/dist/translations-provider.port.d.ts +5 -0
  474. package/dist/translations-provider.port.d.ts.map +1 -1
  475. package/dist/translations-provider.port.js +3 -1
  476. package/dist/translations-provider.port.js.map +1 -1
  477. package/dist/weak-etag-extractor-header.strategy.d.ts +1 -0
  478. package/dist/weak-etag-extractor-header.strategy.d.ts.map +1 -1
  479. package/dist/weak-etag-extractor-header.strategy.js +3 -0
  480. package/dist/weak-etag-extractor-header.strategy.js.map +1 -1
  481. package/dist/weak-etag-extractor-hono.middleware.d.ts +3 -1
  482. package/dist/weak-etag-extractor-hono.middleware.d.ts.map +1 -1
  483. package/dist/weak-etag-extractor-param.strategy.d.ts.map +1 -1
  484. package/dist/weak-etag-extractor-param.strategy.js +2 -0
  485. package/dist/weak-etag-extractor-param.strategy.js.map +1 -1
  486. package/dist/weak-etag-extractor.strategy.d.ts +2 -2
  487. package/dist/weak-etag-extractor.strategy.d.ts.map +1 -1
  488. package/dist/webhook-signature-extractor.strategy.d.ts +2 -2
  489. package/dist/webhook-signature-extractor.strategy.d.ts.map +1 -1
  490. package/dist/woodchopper-dispatcher-async.strategy.d.ts +0 -3
  491. package/dist/woodchopper-dispatcher-async.strategy.d.ts.map +1 -1
  492. package/dist/woodchopper-dispatcher-async.strategy.js +7 -6
  493. package/dist/woodchopper-dispatcher-async.strategy.js.map +1 -1
  494. package/package.json +12 -17
  495. package/readme.md +4 -3
  496. package/src/ab-assignment-composite.strategy.ts +7 -4
  497. package/src/ab-assignment-cookie.strategy.ts +6 -3
  498. package/src/ab-assignment-fixed.strategy.ts +1 -2
  499. package/src/ab-assignment-hash.strategy.ts +1 -1
  500. package/src/ab-assignment-header.strategy.ts +6 -3
  501. package/src/ab-assignment-query.strategy.ts +6 -3
  502. package/src/ab-assignment.strategy.ts +1 -2
  503. package/src/ab-hono-noop.middleware.ts +2 -1
  504. package/src/ab-hono.middleware.ts +7 -6
  505. package/src/ab.middleware.ts +2 -6
  506. package/src/alert-channel-composite.adapter.ts +8 -1
  507. package/src/alert-channel-with-logger.adapter.ts +1 -1
  508. package/src/antivirus-clamav.adapter.ts +5 -4
  509. package/src/antivirus-with-logger.adapter.ts +2 -2
  510. package/src/api-version-hono.middleware.ts +7 -15
  511. package/src/api-version.middleware.ts +2 -2
  512. package/src/auth-session-reader-noop.adapter.ts +2 -2
  513. package/src/better-auth-logger.service.ts +5 -0
  514. package/src/cache-file.service.ts +4 -2
  515. package/src/cache-repository-node-cache.adapter.ts +3 -1
  516. package/src/cache-response-hono.middleware.ts +6 -6
  517. package/src/cache-response.middleware.ts +4 -4
  518. package/src/certificate-inspector-tls.adapter.ts +21 -19
  519. package/src/correlation-hono.middleware.ts +8 -8
  520. package/src/correlation.middleware.ts +2 -2
  521. package/src/cron-scheduler.adapter.ts +4 -2
  522. package/src/cron-task-handler-with-logger.strategy.ts +8 -8
  523. package/src/csv-stringifier.adapter.ts +2 -2
  524. package/src/disk-space-checker-fs.adapter.ts +12 -0
  525. package/src/dynamic-import.service.ts +2 -2
  526. package/src/environment-loader-process-safe.adapter.ts +4 -1
  527. package/src/environment-loader.port.ts +1 -1
  528. package/src/etag-extractor-header.strategy.ts +2 -0
  529. package/src/etag-extractor-hono.middleware.ts +1 -1
  530. package/src/etag-extractor-param.strategy.ts +2 -0
  531. package/src/etag-extractor.strategy.ts +2 -2
  532. package/src/file-inspection.adapter.ts +4 -4
  533. package/src/file-reader-json-forgiving.adapter.ts +1 -1
  534. package/src/graceful-shutdown.service.ts +3 -3
  535. package/src/hash.vo.ts +1 -1
  536. package/src/hcaptcha.service.ts +3 -3
  537. package/src/http-logger-hono.middleware.ts +6 -6
  538. package/src/http-logger.middleware.ts +2 -2
  539. package/src/image-blur-noop.adapter.ts +1 -1
  540. package/src/image-blur.adapter.ts +2 -6
  541. package/src/image-blur.port.ts +1 -7
  542. package/src/in-flight-requests-hono.middleware.ts +1 -0
  543. package/src/in-flight-requests-tracker.service.ts +2 -2
  544. package/src/index.ts +4 -3
  545. package/src/instrumentation.service.ts +5 -2
  546. package/src/job-queue-sqlite-store.service.ts +1 -0
  547. package/src/job-queue-with-logger.adapter.ts +2 -2
  548. package/src/language-detector-cookie.strategy.ts +1 -1
  549. package/src/language-detector-header.strategy.ts +13 -1
  550. package/src/language-detector-hono.middleware.ts +1 -1
  551. package/src/language-detector-query.strategy.ts +1 -1
  552. package/src/language-detector.middleware.ts +2 -2
  553. package/src/language-detector.strategy.ts +2 -2
  554. package/src/liveness-hono.handler.ts +5 -1
  555. package/src/liveness.handler.ts +2 -2
  556. package/src/mailer-content-html.vo.ts +1 -2
  557. package/src/mailer-smtp.adapter.ts +1 -0
  558. package/src/mailer-with-logger.adapter.ts +2 -2
  559. package/src/markdown-generator.adapter.ts +1 -1
  560. package/src/memory-consumption.service.ts +0 -4
  561. package/src/nonce-provider-crypto.adapter.ts +1 -1
  562. package/src/nonce-provider-noop.adapter.ts +1 -1
  563. package/src/nonce-value.vo.ts +2 -2
  564. package/src/pdf-generator-with-logger.adapter.ts +1 -1
  565. package/src/prerequisite-verifier-memory.adapter.ts +1 -1
  566. package/src/prerequisite-verifier-translations.adapter.ts +7 -13
  567. package/src/prerequisite-verifier-with-logger.adapter.ts +1 -1
  568. package/src/randomness.strategy.ts +1 -0
  569. package/src/reactive-config-noop.adapter.ts +6 -5
  570. package/src/reactive-config-with-cache.adapter.ts +1 -1
  571. package/src/reactive-config-with-fallback.adapter.ts +8 -4
  572. package/src/reactive-config-with-logger.adapter.ts +50 -0
  573. package/src/readiness-hono.handler.ts +2 -3
  574. package/src/readiness.handler.ts +13 -2
  575. package/src/redactor-metadata-compact-array.strategy.ts +1 -0
  576. package/src/redactor-metadata-compact-object.strategy.ts +1 -0
  577. package/src/redactor-url-query.strategy.ts +33 -0
  578. package/src/remote-file-storage-disk.adapter.ts +5 -5
  579. package/src/request-context-hono.adapter.ts +2 -0
  580. package/src/request-context.port.ts +11 -1
  581. package/src/sealer-aes-gcm.adapter.ts +6 -1
  582. package/src/secure-key-generator-crypto.adapter.ts +9 -1
  583. package/src/security-rule-bait-routes.strategy.ts +1 -1
  584. package/src/security-rule-honey-pot-field.strategy.ts +5 -4
  585. package/src/security-rule.strategy.ts +2 -4
  586. package/src/semaphore.service.ts +12 -9
  587. package/src/setup-hono.service.ts +1 -1
  588. package/src/shield-api-key-hono.strategy.ts +1 -1
  589. package/src/shield-api-key.strategy.ts +5 -5
  590. package/src/shield-auth.strategy.ts +10 -5
  591. package/src/shield-basic-auth-hono.strategy.ts +8 -2
  592. package/src/shield-basic-auth.strategy.ts +17 -4
  593. package/src/shield-csrf.strategy.ts +2 -2
  594. package/src/shield-hcaptcha-hono-local.strategy.ts +4 -2
  595. package/src/shield-hcaptcha.strategy.ts +11 -4
  596. package/src/shield-ip-blacklist.strategy.ts +4 -4
  597. package/src/shield-ip-whitelist.strategy.ts +3 -3
  598. package/src/shield-maintenance-hono.strategy.ts +7 -4
  599. package/src/shield-maintenance.strategy.ts +42 -6
  600. package/src/shield-rate-limit.strategy.ts +2 -2
  601. package/src/shield-recaptcha.strategy.ts +15 -9
  602. package/src/shield-timeout-hono.strategy.ts +1 -1
  603. package/src/shield-webhook-hono.strategy.ts +1 -1
  604. package/src/shield-webhook.strategy.ts +2 -2
  605. package/src/simulated-error.middleware.ts +3 -1
  606. package/src/sitemap-entry.vo.ts +1 -1
  607. package/src/sitemap-priority.vo.ts +1 -0
  608. package/src/slower-hono.middleware.ts +2 -5
  609. package/src/slower.middleware.ts +2 -2
  610. package/src/sms-with-logger.adapter.ts +1 -1
  611. package/src/sse-hono.handler.ts +4 -2
  612. package/src/sse-registry-collecting.adapter.ts +3 -1
  613. package/src/sse-registry-noop.adapter.ts +3 -1
  614. package/src/sse-registry-with-limit.adapter.ts +3 -3
  615. package/src/sse-registry-with-logger.adapter.ts +6 -4
  616. package/src/sse-registry.adapter.ts +10 -2
  617. package/src/sse-registry.port.ts +1 -1
  618. package/src/ssr-bun.service.ts +1 -1
  619. package/src/ssr.service.ts +1 -1
  620. package/src/standard-schema-validator.service.ts +1 -1
  621. package/src/static-config.adapter.ts +1 -1
  622. package/src/static-files-hono.service.ts +2 -2
  623. package/src/subject-application-resolver.vo.ts +3 -3
  624. package/src/subject-request-resolver.vo.ts +6 -3
  625. package/src/subject-segment-application.strategy.ts +2 -1
  626. package/src/subject-segment-build.strategy.ts +2 -0
  627. package/src/subject-segment-cookie.strategy.ts +4 -0
  628. package/src/subject-segment-env.strategy.ts +2 -0
  629. package/src/subject-segment-fixed.strategy.ts +2 -0
  630. package/src/subject-segment-header.strategy.ts +4 -0
  631. package/src/subject-segment-ip.strategy.ts +2 -0
  632. package/src/subject-segment-method.strategy.ts +10 -0
  633. package/src/subject-segment-param.strategy.ts +4 -0
  634. package/src/subject-segment-path.strategy.ts +2 -0
  635. package/src/subject-segment-query.strategy.ts +7 -7
  636. package/src/subject-segment-request.strategy.ts +8 -4
  637. package/src/subject-segment-user.strategy.ts +2 -0
  638. package/src/time-zone-offset-hono.middleware.ts +1 -1
  639. package/src/time-zone-offset.middleware.ts +4 -2
  640. package/src/timekeeper-google.adapter.ts +1 -1
  641. package/src/timing-hono.middleware.ts +3 -6
  642. package/src/timing.middleware.ts +15 -6
  643. package/src/trailing-slash-hono.middleware.ts +2 -2
  644. package/src/trailing-slash.middleware.ts +14 -2
  645. package/src/translations-provider-json.adapter.ts +6 -6
  646. package/src/translations-provider.port.ts +5 -0
  647. package/src/weak-etag-extractor-header.strategy.ts +4 -0
  648. package/src/weak-etag-extractor-hono.middleware.ts +1 -1
  649. package/src/weak-etag-extractor-param.strategy.ts +2 -0
  650. package/src/weak-etag-extractor.strategy.ts +2 -2
  651. package/src/webhook-signature-extractor.strategy.ts +2 -2
  652. package/src/woodchopper-dispatcher-async.strategy.ts +6 -11
  653. package/dist/cron-scheduler-croner.adapter.d.ts +0 -15
  654. package/dist/cron-scheduler-croner.adapter.d.ts.map +0 -1
  655. package/dist/cron-scheduler-croner.adapter.js +0 -23
  656. package/dist/cron-scheduler-croner.adapter.js.map +0 -1
  657. package/dist/disk-space-checker-shell.adapter.d.ts.map +0 -1
  658. package/dist/disk-space-checker-shell.adapter.js +0 -14
  659. package/dist/disk-space-checker-shell.adapter.js.map +0 -1
  660. package/dist/file-reader-raw-with-cache.adapter.d.ts +0 -20
  661. package/dist/file-reader-raw-with-cache.adapter.d.ts.map +0 -1
  662. package/dist/file-reader-raw-with-cache.adapter.js +0 -20
  663. package/dist/file-reader-raw-with-cache.adapter.js.map +0 -1
  664. package/src/cron-scheduler-croner.adapter.ts +0 -34
  665. package/src/disk-space-checker-shell.adapter.ts +0 -18
  666. package/src/file-reader-raw-with-cache.adapter.ts +0 -31
@@ -1,10 +1,8 @@
1
- import type { HasRequestJSON, HasRequestPath } from "./request-context.port";
1
+ import type { HasRequestForm, HasRequestJson, HasRequestPath } from "./request-context.port";
2
2
  import type { SecurityRuleNameType } from "./security-rule-name.vo";
3
3
 
4
- type RequestContextCapabilities = HasRequestPath & HasRequestJSON;
5
-
6
4
  export interface SecurityRuleStrategy {
7
- isViolated(context: RequestContextCapabilities): Promise<boolean>;
5
+ isViolated(context: HasRequestPath & HasRequestJson & HasRequestForm): Promise<boolean>;
8
6
 
9
7
  get name(): SecurityRuleNameType;
10
8
  }
@@ -3,24 +3,27 @@ import type * as tools from "@bgord/tools";
3
3
  export type SemaphoreConfig = { limit: tools.IntegerPositiveType };
4
4
 
5
5
  export class Semaphore {
6
- private readonly slots: Array<Promise<void>>;
6
+ private readonly limit: tools.IntegerPositiveType;
7
+
8
+ private active = 0;
9
+
10
+ private readonly waiting: Array<() => void> = [];
7
11
 
8
12
  constructor(config: SemaphoreConfig) {
9
- this.slots = Array.from({ length: config.limit }, () => Promise.resolve());
13
+ this.limit = config.limit;
10
14
  }
11
15
 
12
16
  async run<T>(action: () => Promise<T>): Promise<T> {
13
- const slot = this.slots.shift();
14
- const { promise, resolve } = Promise.withResolvers<void>();
15
-
16
- this.slots.push(promise);
17
-
18
- await slot;
17
+ if (this.active >= this.limit) await new Promise<void>((resolve) => this.waiting.push(resolve));
18
+ else this.active++;
19
19
 
20
20
  try {
21
21
  return await action();
22
22
  } finally {
23
- resolve();
23
+ const next = this.waiting.shift();
24
+
25
+ if (next) next();
26
+ else this.active--;
24
27
  }
25
28
  }
26
29
  }
@@ -53,6 +53,7 @@ export class SetupHono {
53
53
  new ShieldMaintenanceHonoStrategy(config.maintenanceMode).handle(),
54
54
  new TrailingSlashHonoMiddleware().handle(),
55
55
  new CorrelationHonoMiddleware(deps).handle(),
56
+ new TimingHonoMiddleware(deps).handle(),
56
57
  new ApiVersionHonoMiddleware(deps).handle(),
57
58
  new ShieldCsrfHonoStrategy(config.csrf).handle(),
58
59
  secureHeaders({
@@ -76,7 +77,6 @@ export class SetupHono {
76
77
  new LanguageDetectorHonoMiddleware(config.I18n).handle(),
77
78
  new TimeZoneOffsetHonoMiddleware().handle(),
78
79
  new HttpLoggerHonoMiddleware(deps, config.httpLogger).handle(),
79
- new TimingHonoMiddleware(deps).handle(),
80
80
  ];
81
81
  }
82
82
  }
@@ -20,7 +20,7 @@ export class ShieldApiKeyHonoStrategy implements MiddlewareHonoPort {
20
20
  const context = new RequestContextHonoAdapter(c);
21
21
 
22
22
  if (this.strategy.evaluate(context)) return next();
23
- throw new HTTPException(403, { message: ShieldApiKeyStrategyError.Rejected });
23
+ throw new HTTPException(401, { message: ShieldApiKeyStrategyError.Rejected });
24
24
  };
25
25
  }
26
26
  }
@@ -1,5 +1,6 @@
1
1
  import { timingSafeEqual } from "node:crypto";
2
- import type * as tools from "@bgord/tools";
2
+ import * as tools from "@bgord/tools";
3
+ import * as v from "valibot";
3
4
  import type { HasRequestHeader } from "./request-context.port";
4
5
 
5
6
  export type ApiKeyShieldConfig = { API_KEY: tools.ApiKeyType };
@@ -12,11 +13,10 @@ export class ShieldApiKeyStrategy {
12
13
  constructor(private readonly config: ApiKeyShieldConfig) {}
13
14
 
14
15
  evaluate(context: HasRequestHeader): boolean {
15
- const header = context.request.header(ShieldApiKeyStrategy.HEADER_NAME);
16
- const config = this.config.API_KEY;
16
+ const header = v.safeParse(tools.ApiKey, context.request.header(ShieldApiKeyStrategy.HEADER_NAME));
17
17
 
18
- if (header?.length !== config.length) return false;
18
+ if (!header.success) return false;
19
19
 
20
- return timingSafeEqual(Buffer.from(header), Buffer.from(config));
20
+ return timingSafeEqual(Buffer.from(header.output), Buffer.from(this.config.API_KEY));
21
21
  }
22
22
  }
@@ -3,7 +3,10 @@ import type { HasRequestHeaders } from "./request-context.port";
3
3
 
4
4
  type Dependencies<User, Session> = { AuthSessionReader: AuthSessionReaderPort<User, Session> };
5
5
 
6
- export const ShieldAuthStrategyError = { Rejected: "shield.auth.rejected" };
6
+ export const ShieldAuthStrategyError = {
7
+ Rejected: "shield.auth.rejected",
8
+ NotAttached: "shield.auth.not.attached",
9
+ };
7
10
 
8
11
  export class ShieldAuthStrategy<User, Session> {
9
12
  constructor(private readonly deps: Dependencies<User, Session>) {}
@@ -12,11 +15,13 @@ export class ShieldAuthStrategy<User, Session> {
12
15
  return await this.deps.AuthSessionReader.getSession(context);
13
16
  }
14
17
 
15
- verify(user: User | null): boolean {
16
- return user !== null && user !== undefined;
18
+ verify(user: User | null | undefined): boolean {
19
+ if (user === undefined) throw new Error(ShieldAuthStrategyError.NotAttached);
20
+ return user !== null;
17
21
  }
18
22
 
19
- reverse(user: User | null): boolean {
20
- return !user;
23
+ reverse(user: User | null | undefined): boolean {
24
+ if (user === undefined) throw new Error(ShieldAuthStrategyError.NotAttached);
25
+ return user === null;
21
26
  }
22
27
  }
@@ -11,7 +11,7 @@ import {
11
11
  export class ShieldBasicAuthHonoStrategy implements MiddlewareHonoPort {
12
12
  private readonly strategy: ShieldBasicAuthStrategy;
13
13
 
14
- constructor(config: ShieldBasicAuthConfig) {
14
+ constructor(private readonly config: ShieldBasicAuthConfig) {
15
15
  this.strategy = new ShieldBasicAuthStrategy(config);
16
16
  }
17
17
 
@@ -20,7 +20,13 @@ export class ShieldBasicAuthHonoStrategy implements MiddlewareHonoPort {
20
20
  const context = new RequestContextHonoAdapter(c);
21
21
 
22
22
  if (this.strategy.evaluate(context)) return next();
23
- throw new HTTPException(401, { message: ShieldBasicAuthStrategyError.Rejected });
23
+
24
+ throw new HTTPException(401, {
25
+ message: ShieldBasicAuthStrategyError.Rejected,
26
+ res: new Response(ShieldBasicAuthStrategyError.Rejected, {
27
+ headers: { "WWW-Authenticate": `Basic realm="${this.config.realm}"` },
28
+ }),
29
+ });
24
30
  };
25
31
  }
26
32
  }
@@ -3,7 +3,11 @@ import type { BasicAuthPasswordType } from "./basic-auth-password.vo";
3
3
  import type { BasicAuthUsernameType } from "./basic-auth-username.vo";
4
4
  import type { HasRequestHeader } from "./request-context.port";
5
5
 
6
- export type ShieldBasicAuthConfig = { username: BasicAuthUsernameType; password: BasicAuthPasswordType };
6
+ export type ShieldBasicAuthConfig = {
7
+ username: BasicAuthUsernameType;
8
+ password: BasicAuthPasswordType;
9
+ realm: string;
10
+ };
7
11
 
8
12
  export const ShieldBasicAuthStrategyError = { Rejected: "shield.basic.auth.rejected" };
9
13
 
@@ -16,11 +20,20 @@ export class ShieldBasicAuthStrategy {
16
20
  try {
17
21
  const credentials = atob(String(header).replace("Basic ", ""));
18
22
 
19
- const [username, password] = credentials.split(":");
23
+ const index = credentials.indexOf(":");
20
24
 
21
- if (username !== this.config.username) return false;
25
+ if (index === -1) return false;
22
26
 
23
- if (password?.length !== this.config.password.length) return false;
27
+ const username = credentials.slice(0, index);
28
+ const password = credentials.slice(index + 1);
29
+
30
+ // Stryker disable next-line ConditionalExpression
31
+ if (username.length !== this.config.username.length) return false;
32
+
33
+ if (!timingSafeEqual(Buffer.from(username), Buffer.from(this.config.username))) return false;
34
+
35
+ // Stryker disable next-line ConditionalExpression
36
+ if (password.length !== this.config.password.length) return false;
24
37
 
25
38
  return timingSafeEqual(Buffer.from(password), Buffer.from(this.config.password));
26
39
  } catch {
@@ -1,6 +1,6 @@
1
1
  import type { HasRequestHeader, HasRequestMethod } from "./request-context.port";
2
2
 
3
- const STATE_CHANGING_METHODS = ["POST", "PUT", "PATCH", "DELETE"];
3
+ const SAFE_METHODS = ["GET", "HEAD", "OPTIONS", "TRACE"];
4
4
 
5
5
  export type ShieldCsrfConfig = { origin: ReadonlyArray<string> };
6
6
 
@@ -10,7 +10,7 @@ export class ShieldCsrfStrategy {
10
10
  constructor(private readonly config: ShieldCsrfConfig) {}
11
11
 
12
12
  evaluate(context: HasRequestMethod & HasRequestHeader): boolean {
13
- if (!STATE_CHANGING_METHODS.includes(context.request.method)) return true;
13
+ if (SAFE_METHODS.includes(context.request.method)) return true;
14
14
 
15
15
  const origin = context.request.header("origin");
16
16
 
@@ -3,7 +3,7 @@ import { HTTPException } from "hono/http-exception";
3
3
  import * as v from "valibot";
4
4
  import { HCaptchaSecretKey } from "./hcaptcha-secret-key.vo";
5
5
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
6
- import type { HasRequestForm } from "./request-context.port";
6
+ import type { HasRequestForm, HasRequestJson } from "./request-context.port";
7
7
  import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyField } from "./shield-hcaptcha.strategy";
8
8
 
9
9
  export const ShieldHcaptchaLocalStrategyError = { Rejected: "shield.hcaptcha.local.rejected" };
@@ -26,7 +26,9 @@ export class ShieldHcaptchaLocalHonoStrategy implements MiddlewareHonoPort {
26
26
  return async (_c, next) => {
27
27
  const form = new FormData();
28
28
  form.set(ShieldHcaptchaStrategyField, ShieldHcaptchaLocalHonoStrategy.TOKEN_LOCAL);
29
- const context: HasRequestForm = { request: { form: async () => form } };
29
+ const context: HasRequestForm & HasRequestJson = {
30
+ request: { form: async () => form, json: async () => ({}) },
31
+ };
30
32
 
31
33
  if (await this.strategy.evaluate(context)) return next();
32
34
  throw new HTTPException(403, { message: ShieldHcaptchaLocalStrategyError.Rejected });
@@ -1,6 +1,6 @@
1
1
  import { HCaptchaService } from "./hcaptcha.service";
2
2
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
3
- import type { HasRequestForm } from "./request-context.port";
3
+ import type { HasRequestForm, HasRequestJson } from "./request-context.port";
4
4
 
5
5
  export const ShieldHcaptchaStrategyError = { Rejected: "shield.hcaptcha.rejected" };
6
6
 
@@ -11,12 +11,19 @@ export class ShieldHcaptchaStrategy {
11
11
 
12
12
  constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
13
13
 
14
- async evaluate(context: HasRequestForm): Promise<boolean> {
14
+ async evaluate(context: HasRequestForm & HasRequestJson): Promise<boolean> {
15
15
  try {
16
16
  const form = await context.request.form();
17
- const token = form.get(ShieldHcaptchaStrategyField);
17
+ const json = await context.request.json();
18
18
 
19
- const result = await this.hcaptcha.verify(this.secretKey, token?.toString());
19
+ const fromForm = form.get(ShieldHcaptchaStrategyField)?.toString();
20
+ const fromJson = json[ShieldHcaptchaStrategyField];
21
+
22
+ const token = fromForm ?? (typeof fromJson === "string" ? fromJson : undefined);
23
+
24
+ if (!token) return false;
25
+
26
+ const result = await this.hcaptcha.verify(this.secretKey, token);
20
27
 
21
28
  return result.success;
22
29
  } catch {
@@ -1,6 +1,6 @@
1
1
  import * as v from "valibot";
2
2
  import { ClientIp, type ClientIpType } from "./client-ip.vo";
3
- import type { HasIdentityIp } from "./request-context.port";
3
+ import type { HasIdentityRemoteIp } from "./request-context.port";
4
4
 
5
5
  export type ShieldIpBlacklistConfig = { blacklist: ReadonlyArray<ClientIpType> };
6
6
 
@@ -9,10 +9,10 @@ export const ShieldIpBlacklistStrategyError = { Rejected: "shield.ip.blacklist.r
9
9
  export class ShieldIpBlacklistStrategy {
10
10
  constructor(private readonly config: ShieldIpBlacklistConfig) {}
11
11
 
12
- evaluate(context: HasIdentityIp): boolean {
13
- const ip = v.safeParse(ClientIp, context.identity.ip());
12
+ evaluate(context: HasIdentityRemoteIp): boolean {
13
+ const ip = v.safeParse(ClientIp, context.identity.remoteIp());
14
14
 
15
- if (!ip.success) return false;
15
+ if (!ip.success) return true;
16
16
  return !this.config.blacklist.includes(ip.output);
17
17
  }
18
18
  }
@@ -1,6 +1,6 @@
1
1
  import * as v from "valibot";
2
2
  import { ClientIp, type ClientIpType } from "./client-ip.vo";
3
- import type { HasIdentityIp } from "./request-context.port";
3
+ import type { HasIdentityRemoteIp } from "./request-context.port";
4
4
 
5
5
  export type ShieldIpWhitelistConfig = { whitelist: ReadonlyArray<ClientIpType> };
6
6
 
@@ -9,8 +9,8 @@ export const ShieldIpWhitelistStrategyError = { Rejected: "shield.ip.whitelist.r
9
9
  export class ShieldIpWhitelistStrategy {
10
10
  constructor(private readonly config: ShieldIpWhitelistConfig) {}
11
11
 
12
- evaluate(context: HasIdentityIp): boolean {
13
- const ip = v.safeParse(ClientIp, context.identity.ip());
12
+ evaluate(context: HasIdentityRemoteIp): boolean {
13
+ const ip = v.safeParse(ClientIp, context.identity.remoteIp());
14
14
 
15
15
  if (!ip.success) return false;
16
16
  return this.config.whitelist.includes(ip.output);
@@ -1,5 +1,6 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
2
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
3
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
3
4
  import { type ShieldMaintenanceConfig, ShieldMaintenanceStrategy } from "./shield-maintenance.strategy";
4
5
 
5
6
  export class ShieldMaintenanceHonoStrategy implements MiddlewareHonoPort {
@@ -11,13 +12,15 @@ export class ShieldMaintenanceHonoStrategy implements MiddlewareHonoPort {
11
12
 
12
13
  handle(): MiddlewareHandler {
13
14
  return async (c, next) => {
14
- const maintenance = this.strategy.evaluate();
15
+ const context = new RequestContextHonoAdapter(c);
16
+
17
+ if (this.strategy.shouldSkip(context)) return next();
18
+
19
+ const maintenance = await this.strategy.evaluate();
15
20
 
16
21
  if (!maintenance.enabled) return next();
17
22
 
18
- return c.json({ reason: "maintenance" }, 503, {
19
- "Retry-After": maintenance.RetryAfter.seconds.toString(),
20
- });
23
+ return c.json(maintenance.body, maintenance.code, maintenance.headers);
21
24
  };
22
25
  }
23
26
  }
@@ -1,17 +1,53 @@
1
1
  import * as tools from "@bgord/tools";
2
+ import * as v from "valibot";
3
+ import type { ReactiveConfigPort } from "./reactive-config.port";
4
+ import type { HasRequestPath } from "./request-context.port";
2
5
 
3
- export type ShieldMaintenanceConfig = { enabled: boolean; RetryAfter?: tools.Duration };
6
+ export const Maintenance = v.object({ enabled: tools.FeatureFlagValue });
7
+
8
+ export type MaintenanceType = v.InferOutput<typeof Maintenance>;
9
+
10
+ export type ShieldMaintenanceConfig = {
11
+ MaintenanceConfig: ReactiveConfigPort<MaintenanceType>;
12
+ RetryAfter?: tools.Duration;
13
+ skip?: ReadonlyArray<string | URLPattern>;
14
+ };
15
+
16
+ export type ShieldMaintenanceResult = {
17
+ enabled: boolean;
18
+ code: 503;
19
+ body: { reason: string };
20
+ headers: Record<string, string>;
21
+ };
4
22
 
5
23
  export class ShieldMaintenanceStrategy {
6
- private readonly enabled: boolean;
24
+ private readonly rounding = new tools.RoundingUpStrategy();
25
+ private readonly MaintenanceConfig?: ReactiveConfigPort<MaintenanceType>;
7
26
  private readonly RetryAfter: tools.Duration;
8
27
 
9
- constructor(config?: ShieldMaintenanceConfig) {
10
- this.enabled = config?.enabled ?? false;
28
+ constructor(private readonly config?: ShieldMaintenanceConfig) {
29
+ this.MaintenanceConfig = config?.MaintenanceConfig;
11
30
  this.RetryAfter = config?.RetryAfter ?? tools.Duration.Hours(1);
12
31
  }
13
32
 
14
- evaluate(): { enabled: boolean; RetryAfter: tools.Duration } {
15
- return { enabled: this.enabled, RetryAfter: this.RetryAfter };
33
+ shouldSkip(context: HasRequestPath): boolean {
34
+ return (
35
+ this.config?.skip?.some((rule) => {
36
+ if (rule instanceof URLPattern) return rule.test({ pathname: context.request.path });
37
+ return context.request.path.startsWith(rule);
38
+ }) ?? false
39
+ );
40
+ }
41
+
42
+ async evaluate(): Promise<ShieldMaintenanceResult> {
43
+ const maintenance = await this.MaintenanceConfig?.get();
44
+ const enabled = maintenance ? tools.FeatureFlag.from(maintenance.enabled).isEnabled() : false;
45
+
46
+ return {
47
+ enabled,
48
+ code: 503,
49
+ body: { reason: "maintenance" },
50
+ headers: { "Retry-After": this.rounding.round(this.RetryAfter.seconds).toString() },
51
+ };
16
52
  }
17
53
  }
@@ -4,7 +4,7 @@ import type { ClockPort } from "./clock.port";
4
4
  import type { RequestContext } from "./request-context.port";
5
5
  import type { SubjectRequestResolver } from "./subject-request-resolver.vo";
6
6
 
7
- export type ShieldRateLimitConfig = { resolver: SubjectRequestResolver; window: tools.Duration };
7
+ export type ShieldRateLimitConfig = { resolver: SubjectRequestResolver; interval: tools.Duration };
8
8
  type ShieldRateLimitResult = { allowed: true } | { allowed: false; retryAfter: tools.Duration };
9
9
 
10
10
  type Dependencies = { Clock: ClockPort; CacheResolver: CacheResolverStrategy };
@@ -24,7 +24,7 @@ export class ShieldRateLimitStrategy {
24
24
 
25
25
  const limiter = await this.deps.CacheResolver.resolve(
26
26
  subject.hex,
27
- async () => new tools.RateLimiter(this.config.window),
27
+ async () => new tools.RateLimiter(this.config.interval),
28
28
  );
29
29
 
30
30
  const decision = limiter.verify(this.deps.Clock.now());
@@ -2,7 +2,7 @@
2
2
  import * as tools from "@bgord/tools";
3
3
  import * as v from "valibot";
4
4
  import type { RecaptchaSecretKeyType } from "./recaptcha-secret-key.vo";
5
- import type { HasRequestForm, HasRequestHeader, HasRequestQuery } from "./request-context.port";
5
+ import type { HasIdentityIp, HasRequestForm, HasRequestJson } from "./request-context.port";
6
6
 
7
7
  export type ShieldRecaptchaConfig = { secretKey: RecaptchaSecretKeyType; threshold?: number };
8
8
  export type RecaptchaResult = { success: boolean; score: number };
@@ -21,21 +21,25 @@ export class ShieldRecaptchaStrategy {
21
21
 
22
22
  constructor(private readonly config: ShieldRecaptchaConfig) {}
23
23
 
24
- async evaluate(context: HasRequestHeader & HasRequestQuery & HasRequestForm): Promise<boolean> {
24
+ async evaluate(context: HasIdentityIp & HasRequestForm & HasRequestJson): Promise<boolean> {
25
25
  const threshold = this.config.threshold ?? ShieldRecaptchaStrategy.DEFAULT_THRESHOLD;
26
26
 
27
27
  try {
28
- const header = context.request.header("x-recaptcha-token");
29
- const query = context.request.query()["recaptchaToken"];
30
- const remoteip = context.request.header("x-forwarded-for")?.split(",")[0] ?? "";
31
28
  const form = await context.request.form();
32
- const formToken = form.get(ShieldRecaptchaStrategyField)?.toString();
29
+ const json = await context.request.json();
33
30
 
34
- const token = header ?? query ?? formToken;
31
+ const fromForm = form.get(ShieldRecaptchaStrategyField)?.toString();
32
+ const fromJson = json[ShieldRecaptchaStrategyField];
33
+
34
+ const token = fromForm ?? (typeof fromJson === "string" ? fromJson : undefined);
35
35
 
36
36
  if (!token) return false;
37
37
 
38
- const params = new URLSearchParams({ secret: this.config.secretKey, response: token, remoteip });
38
+ const remoteip = context.identity.ip();
39
+
40
+ const params = new URLSearchParams({ secret: this.config.secretKey, response: token });
41
+
42
+ if (remoteip) params.set("remoteip", remoteip);
39
43
 
40
44
  const response = await fetch(ShieldRecaptchaStrategy.URL, {
41
45
  method: "POST",
@@ -45,7 +49,9 @@ export class ShieldRecaptchaStrategy {
45
49
 
46
50
  const result: RecaptchaResult = await response.json();
47
51
 
48
- if (!result.success || result.score < threshold) return false;
52
+ if (!result.success) return false;
53
+ if (typeof result.score !== "number" || result.score < threshold) return false;
54
+
49
55
  return true;
50
56
  } catch {
51
57
  return false;
@@ -13,7 +13,7 @@ export class ShieldTimeoutHonoStrategy implements MiddlewareHonoPort {
13
13
 
14
14
  this.timeout = timeout(
15
15
  strategy.config.ms,
16
- new HTTPException(408, { message: ShieldTimeoutStrategyError.Rejected }),
16
+ new HTTPException(504, { message: ShieldTimeoutStrategyError.Rejected }),
17
17
  );
18
18
  }
19
19
 
@@ -20,7 +20,7 @@ export class ShieldWebhookHonoStrategy implements MiddlewareHonoPort {
20
20
  const context = new RequestContextHonoAdapter(c);
21
21
 
22
22
  if (await this.strategy.evaluate(context)) return next();
23
- throw new HTTPException(403, { message: ShieldWebhookStrategyError.Rejected });
23
+ throw new HTTPException(401, { message: ShieldWebhookStrategyError.Rejected });
24
24
  };
25
25
  }
26
26
  }
@@ -1,4 +1,4 @@
1
- import type { RequestContext } from "./request-context.port";
1
+ import type { HasRequestHeader, HasRequestText } from "./request-context.port";
2
2
  import type { WebhookBodyBuilderStrategy } from "./webhook-body-builder.strategy";
3
3
  import type { WebhookSignatureExtractorStrategy } from "./webhook-signature-extractor.strategy";
4
4
  import type { WebhookVerifierStrategy } from "./webhook-verifier.strategy";
@@ -14,7 +14,7 @@ export type ShieldWebhookStrategyConfig = {
14
14
  export class ShieldWebhookStrategy {
15
15
  constructor(private readonly config: ShieldWebhookStrategyConfig) {}
16
16
 
17
- async evaluate(context: RequestContext): Promise<boolean> {
17
+ async evaluate(context: HasRequestHeader & HasRequestText): Promise<boolean> {
18
18
  const signature = this.config.WebhookSignatureExtractor.extract(context);
19
19
 
20
20
  if (!signature) return false;
@@ -1,5 +1,7 @@
1
+ export const SimulatedErrorMiddlewareError = { Simulated: "simulated.error" };
2
+
1
3
  export class SimulatedErrorMiddleware {
2
4
  evaluate(): never {
3
- throw new Error("Simulated error");
5
+ throw new Error(SimulatedErrorMiddlewareError.Simulated);
4
6
  }
5
7
  }
@@ -28,7 +28,7 @@ export class SitemapEntry {
28
28
  const lastmod = this.entry.lastmod ? `<lastmod>${this.entry.lastmod}</lastmod>` : "";
29
29
  const changefreq = this.entry.changefreq ? `<changefreq>${this.entry.changefreq}</changefreq>` : "";
30
30
  const priority =
31
- this.entry.priority !== undefined ? `<priority>${this.entry.priority.toFixed(1)}</priority>` : "";
31
+ this.entry.priority !== undefined ? `<priority>${this.entry.priority.toFixed(2)}</priority>` : "";
32
32
 
33
33
  return ["<url>", loc, lastmod, changefreq, priority, "</url>"].join("");
34
34
  }
@@ -6,6 +6,7 @@ export const SitemapPriority = v.pipe(
6
6
  v.number(SitemapPriorityError.Invalid),
7
7
  v.minValue(0, SitemapPriorityError.Invalid),
8
8
  v.maxValue(1, SitemapPriorityError.Invalid),
9
+ v.check((value) => Number(value.toFixed(2)) === value, SitemapPriorityError.Invalid),
9
10
  // Stryker disable next-line StringLiteral
10
11
  v.brand("SitemapPriority"),
11
12
  );
@@ -1,15 +1,12 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import type { MiddlewareHandler } from "hono";
3
3
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
4
- import type { SleeperPort } from "./sleeper.port";
5
- import { SlowerMiddleware } from "./slower.middleware";
6
-
7
- type Dependencies = { Sleeper: SleeperPort };
4
+ import { SlowerMiddleware, type SlowerMiddlewareDependencies } from "./slower.middleware";
8
5
 
9
6
  export class SlowerHonoMiddleware implements MiddlewareHonoPort {
10
7
  private readonly middleware: SlowerMiddleware;
11
8
 
12
- constructor(offset: tools.Duration, deps: Dependencies) {
9
+ constructor(offset: tools.Duration, deps: SlowerMiddlewareDependencies) {
13
10
  this.middleware = new SlowerMiddleware(offset, deps);
14
11
  }
15
12
 
@@ -1,12 +1,12 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import type { SleeperPort } from "./sleeper.port";
3
3
 
4
- type Dependencies = { Sleeper: SleeperPort };
4
+ export type SlowerMiddlewareDependencies = { Sleeper: SleeperPort };
5
5
 
6
6
  export class SlowerMiddleware {
7
7
  constructor(
8
8
  private readonly offset: tools.Duration,
9
- private readonly deps: Dependencies,
9
+ private readonly deps: SlowerMiddlewareDependencies,
10
10
  ) {}
11
11
 
12
12
  async evaluate(): Promise<void> {
@@ -19,7 +19,7 @@ export class SmsWithLoggerAdapter implements SmsPort {
19
19
  this.deps.Logger.info({
20
20
  message: "SMS attempt",
21
21
  correlationId: CorrelationStorage.get(),
22
- metadata: message.toJSON(),
22
+ metadata: { message: message.toJSON() },
23
23
  ...this.base,
24
24
  });
25
25
 
@@ -34,13 +34,15 @@ export class SseHonoHandler<Messages extends Message> implements HandlerHonoPort
34
34
  await stream.writeSSE({ event: message.name, data: JSON.stringify(message) });
35
35
  };
36
36
 
37
- this.deps.registry.register(subject.hex.get(), send);
37
+ const registered = this.deps.registry.register(subject.hex.get(), send);
38
+
39
+ if (!registered) return;
38
40
 
39
41
  // Stryker disable all
40
42
  stream.onAbort(() => this.deps.registry.unregister(subject.hex.get(), send));
41
43
  // Stryker restore all
42
44
 
43
- while (!stream.closed) {
45
+ while (!(stream.closed || stream.aborted)) {
44
46
  await stream.sleep(this.config.keepalive.ms);
45
47
  await stream.writeSSE({ event: "ping", data: JSON.stringify({ keepalive: true }) });
46
48
  }
@@ -5,7 +5,9 @@ import type { SseRegistryPort, SseSenderType } from "./sse-registry.port";
5
5
  export class SseRegistryCollectingAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
6
6
  public emitted: Array<{ identity: HashValueType; message: Messages }> = [];
7
7
 
8
- register(_identity: HashValueType, _sender: SseSenderType<Messages>): void {}
8
+ register(_identity: HashValueType, _sender: SseSenderType<Messages>): boolean {
9
+ return true;
10
+ }
9
11
 
10
12
  unregister(_identity: HashValueType, _sender: SseSenderType<Messages>): void {}
11
13
 
@@ -3,7 +3,9 @@ import type { Message } from "./message.types";
3
3
  import type { SseRegistryPort, SseSenderType } from "./sse-registry.port";
4
4
 
5
5
  export class SseRegistryNoopAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
6
- register(_identity: HashValueType, _sender: SseSenderType<Messages>): void {}
6
+ register(_identity: HashValueType, _sender: SseSenderType<Messages>): boolean {
7
+ return true;
8
+ }
7
9
 
8
10
  unregister(_identity: HashValueType, _sender: SseSenderType<Messages>): void {}
9
11
 
@@ -11,10 +11,10 @@ type Dependencies<Messages extends Message> = {
11
11
  export class SseRegistryWithLimitAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
12
12
  constructor(private readonly deps: Dependencies<Messages>) {}
13
13
 
14
- register(identity: HashValueType, sender: SseSenderType<Messages>): void {
15
- if (this.deps.inner.count(identity) >= this.deps.limit) return;
14
+ register(identity: HashValueType, sender: SseSenderType<Messages>): boolean {
15
+ if (this.deps.inner.count(identity) >= this.deps.limit) return false;
16
16
 
17
- this.deps.inner.register(identity, sender);
17
+ return this.deps.inner.register(identity, sender);
18
18
  }
19
19
 
20
20
  unregister(identity: HashValueType, sender: SseSenderType<Messages>): void {