@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
@@ -9,7 +9,7 @@ export class LanguageDetectorCookieStrategy<T extends tools.LanguageType>
9
9
  constructor(private readonly name: string) {}
10
10
 
11
11
  detect(context: HasRequestCookie, languages: Languages<T>): T | null {
12
- const detected = context.request.cookie(this.name);
12
+ const detected = context.request.cookie(this.name)?.toLowerCase();
13
13
 
14
14
  return languages.isSupported(detected) ? detected : null;
15
15
  }
@@ -14,7 +14,19 @@ export class LanguageDetectorHeaderStrategy<T extends tools.LanguageType>
14
14
  // Example Accept-Language header: en-US,en;q=0.9,pl;q=0.8
15
15
  const incoming = header
16
16
  .split(",")
17
- .map((language) => language.split(";")[0]?.trim().toLowerCase().split("-")[0]);
17
+ .map((part) => {
18
+ // Stryker disable next-line StringLiteral
19
+ const [tag = "", quality = "q=1"] = part.split(";");
20
+
21
+ return {
22
+ language: tag.trim().toLowerCase().split("-")[0],
23
+ quality: Number(quality.replace("q=", "")),
24
+ };
25
+ })
26
+ // Quality of 0 means the language is explicitly not acceptable
27
+ .filter((candidate) => candidate.quality > 0)
28
+ .sort((first, second) => second.quality - first.quality)
29
+ .map((candidate) => candidate.language);
18
30
 
19
31
  return incoming.find((language) => languages.isSupported(language)) ?? null;
20
32
  }
@@ -16,7 +16,7 @@ export class LanguageDetectorHonoMiddleware<T extends tools.LanguageType> implem
16
16
  this.middleware = new LanguageDetectorMiddleware(config);
17
17
  }
18
18
 
19
- handle(): MiddlewareHandler {
19
+ handle(): MiddlewareHandler<{ Variables: LanguageDetectorVariables }> {
20
20
  return async (c, next) => {
21
21
  const context = new RequestContextHonoAdapter(c);
22
22
 
@@ -9,7 +9,7 @@ export class LanguageDetectorQueryStrategy<T extends tools.LanguageType>
9
9
  constructor(private readonly name: string) {}
10
10
 
11
11
  detect(context: HasRequestQuery, languages: Languages<T>): T | null {
12
- const detected = context.request.query()[this.name];
12
+ const detected = context.request.query()[this.name]?.toLowerCase();
13
13
 
14
14
  return languages.isSupported(detected) ? detected : null;
15
15
  }
@@ -1,7 +1,7 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import type { LanguageDetectorStrategy } from "./language-detector.strategy";
3
3
  import type { Languages } from "./languages.vo";
4
- import type { RequestContext } from "./request-context.port";
4
+ import type { HasRequestCookie, HasRequestHeaders, HasRequestQuery } from "./request-context.port";
5
5
 
6
6
  export const LanguageDetectorMiddlewareError = {
7
7
  MaxStrategies: "language.detector.middleware.max.strategies",
@@ -17,7 +17,7 @@ export class LanguageDetectorMiddleware<T extends tools.LanguageType> {
17
17
  if (config.strategies.length > 5) throw new Error(LanguageDetectorMiddlewareError.MaxStrategies);
18
18
  }
19
19
 
20
- evaluate(context: RequestContext): T {
20
+ evaluate(context: HasRequestCookie & HasRequestHeaders & HasRequestQuery): T {
21
21
  for (const strategy of this.config.strategies) {
22
22
  const detected = strategy.detect(context, this.config.languages);
23
23
  if (detected !== null) return detected;
@@ -1,7 +1,7 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import type { Languages } from "./languages.vo";
3
- import type { RequestContext } from "./request-context.port";
3
+ import type { HasRequestCookie, HasRequestHeaders, HasRequestQuery } from "./request-context.port";
4
4
 
5
5
  export interface LanguageDetectorStrategy<T extends tools.LanguageType> {
6
- detect(context: RequestContext, languages: Languages<T>): T | null;
6
+ detect(context: HasRequestCookie & HasRequestHeaders & HasRequestQuery, languages: Languages<T>): T | null;
7
7
  }
@@ -8,6 +8,10 @@ export class LivenessHonoHandler implements HandlerHonoPort {
8
8
  private readonly handler = new LivenessHandler();
9
9
 
10
10
  handle() {
11
- return factory.createHandlers(async (c) => c.json(this.handler.execute(), 200));
11
+ return factory.createHandlers(async (c) => {
12
+ const { headers, ...body } = this.handler.execute();
13
+
14
+ return c.json(body, 200, headers);
15
+ });
12
16
  }
13
17
  }
@@ -1,5 +1,5 @@
1
1
  export class LivenessHandler {
2
- execute(): { ok: true } {
3
- return { ok: true };
2
+ execute(): { ok: true; headers: Record<string, string> } {
3
+ return { ok: true, headers: { "Cache-Control": "no-store" } };
4
4
  }
5
5
  }
@@ -5,10 +5,9 @@ export const MailerContentHtmlError = { Invalid: "mailer.content.html.invalid" }
5
5
  export const MailerContentHtml = v.pipe(
6
6
  v.string(MailerContentHtmlError.Invalid),
7
7
  v.minLength(1, MailerContentHtmlError.Invalid),
8
- v.maxLength(10_000, MailerContentHtmlError.Invalid),
8
+ v.maxLength(100_000, MailerContentHtmlError.Invalid),
9
9
  // Stryker disable next-line StringLiteral
10
10
  v.brand("MailerContentHtml"),
11
11
  );
12
12
 
13
13
  export type MailerContentHtmlType = v.InferOutput<typeof MailerContentHtml>;
14
- export type EmailAttachmentType = { filename: string; path: string };
@@ -36,6 +36,7 @@ export class MailerSmtpAdapter implements MailerPort {
36
36
  host: config.SMTP_HOST,
37
37
  port: config.SMTP_PORT,
38
38
  auth: { user: config.SMTP_USER, pass: config.SMTP_PASS },
39
+ requireTLS: true,
39
40
  }),
40
41
  );
41
42
  }
@@ -19,7 +19,7 @@ export class MailerWithLoggerAdapter implements MailerPort {
19
19
  this.deps.Logger.info({
20
20
  message: "Mailer attempt",
21
21
  correlationId: CorrelationStorage.get(),
22
- metadata: template.toJSON(),
22
+ metadata: { template: template.toJSON() },
23
23
  ...this.base,
24
24
  });
25
25
 
@@ -36,7 +36,7 @@ export class MailerWithLoggerAdapter implements MailerPort {
36
36
  message: "Mailer error",
37
37
  correlationId: CorrelationStorage.get(),
38
38
  error,
39
- metadata: duration.stop(),
39
+ metadata: { duration: duration.stop() },
40
40
  ...this.base,
41
41
  });
42
42
 
@@ -2,6 +2,6 @@ import type { MarkdownGeneratorPort } from "./markdown-generator.port";
2
2
 
3
3
  export class MarkdownGeneratorAdapter implements MarkdownGeneratorPort {
4
4
  generate(template: string): string {
5
- return Bun.markdown.html(template);
5
+ return Bun.markdown.html(template, { tagFilter: true, noHtmlBlocks: true, noHtmlSpans: true });
6
6
  }
7
7
  }
@@ -7,10 +7,6 @@ type MemoryConsumptionSnapshotType = { total: tools.Size; heap: { used: tools.Si
7
7
  // Heap used - how much of the reserved memory is actually used for the JS heap
8
8
 
9
9
  export class MemoryConsumption {
10
- static get(): tools.Size {
11
- return tools.Size.fromBytes(process.memoryUsage().rss);
12
- }
13
-
14
10
  static snapshot(): MemoryConsumptionSnapshotType {
15
11
  const { rss, heapUsed, heapTotal } = process.memoryUsage();
16
12
 
@@ -4,7 +4,7 @@ import { NonceValue, type NonceValueType } from "./nonce-value.vo";
4
4
 
5
5
  export class NonceProviderCryptoAdapter implements NonceProviderPort {
6
6
  generate(): NonceValueType {
7
- const buffer = new Uint8Array(8);
7
+ const buffer = new Uint8Array(16);
8
8
  crypto.getRandomValues(buffer);
9
9
 
10
10
  return v.parse(NonceValue, buffer.toHex());
@@ -4,6 +4,6 @@ import { NonceValue, type NonceValueType } from "./nonce-value.vo";
4
4
 
5
5
  export class NonceProviderNoopAdapter implements NonceProviderPort {
6
6
  generate(): NonceValueType {
7
- return v.parse(NonceValue, "0000000000000000");
7
+ return v.parse(NonceValue, "00000000000000000000000000000000");
8
8
  }
9
9
  }
@@ -5,8 +5,8 @@ export const NonceValueError = {
5
5
  InvalidHex: "nonce.value.invalid.hex",
6
6
  };
7
7
 
8
- // 16 hex chars allowed
9
- const CHARS_WHITELIST = /^[a-fA-F0-9]{16}$/;
8
+ // 32 hex chars allowed
9
+ const CHARS_WHITELIST = /^[a-fA-F0-9]{32}$/;
10
10
 
11
11
  export const NonceValue = v.pipe(
12
12
  v.string(NonceValueError.Type),
@@ -39,7 +39,7 @@ export class PdfGeneratorWithLoggerAdapter implements PdfGeneratorPort {
39
39
  message: "PDF generator error",
40
40
  correlationId: CorrelationStorage.get(),
41
41
  error,
42
- metadata: duration.stop(),
42
+ metadata: { duration: duration.stop() },
43
43
  ...this.base,
44
44
  });
45
45
 
@@ -12,7 +12,7 @@ export class PrerequisiteVerifierMemoryAdapter implements PrerequisiteVerifierPo
12
12
  constructor(private readonly config: Config) {}
13
13
 
14
14
  async verify(): Promise<PrerequisiteVerificationResult> {
15
- const memoryConsumption = MemoryConsumption.get();
15
+ const memoryConsumption = MemoryConsumption.snapshot().total;
16
16
 
17
17
  if (memoryConsumption.isSmallerThan(this.config.maximum)) return PrerequisiteVerification.success;
18
18
  return PrerequisiteVerification.failure(
@@ -26,12 +26,12 @@ export class PrerequisiteVerifierTranslationsAdapter<T extends tools.LanguageTyp
26
26
  async verify(): Promise<PrerequisiteVerificationResult> {
27
27
  const languages = this.config.values;
28
28
 
29
- const dictionary: Partial<Record<T, ReadonlyArray<TranslationsKeyType>>> = {};
29
+ const translations = new Map<T, Set<TranslationsKeyType>>();
30
30
 
31
31
  for (const language of languages) {
32
32
  try {
33
- const translations = await this.deps.TranslationsProvider.getTranslationsFor(language);
34
- dictionary[language] = Object.keys(translations);
33
+ const dictionary = await this.deps.TranslationsProvider.getTranslationsFor(language);
34
+ translations.set(language, new Set(Object.keys(dictionary)));
35
35
  } catch {
36
36
  return PrerequisiteVerification.failure(`${language} translations not available`);
37
37
  }
@@ -39,16 +39,10 @@ export class PrerequisiteVerifierTranslationsAdapter<T extends tools.LanguageTyp
39
39
 
40
40
  const problems: Array<PrerequisiteTranslationsProblemType> = [];
41
41
 
42
- for (const language in dictionary) {
43
- // Stryker disable all
44
- const translations = dictionary[language] ?? [];
45
- // Stryker restore all
46
-
47
- for (const key of translations) {
48
- for (const supportedLanguage of languages) {
49
- const exists = new Set(dictionary[supportedLanguage]).has(key);
50
-
51
- if (!exists) problems.push({ key, existsIn: language, missingIn: supportedLanguage });
42
+ for (const [language, keys] of translations) {
43
+ for (const key of keys) {
44
+ for (const [supportedLanguage, supported] of translations) {
45
+ if (!supported.has(key)) problems.push({ key, existsIn: language, missingIn: supportedLanguage });
52
46
  }
53
47
  }
54
48
  }
@@ -16,7 +16,7 @@ export class PrerequisiteVerifierWithLoggerAdapter implements PrerequisiteVerifi
16
16
  private readonly base = (duration: tools.Duration) => ({
17
17
  component: "infra",
18
18
  operation: "prerequisite_verify",
19
- metadata: duration,
19
+ metadata: { duration },
20
20
  });
21
21
 
22
22
  constructor(
@@ -1,3 +1,4 @@
1
1
  export interface RandomnessStrategy {
2
+ // Returns a number in the [0, 1) range
2
3
  next(): number;
3
4
  }
@@ -2,12 +2,13 @@ import type { ReactiveConfigPort, ReactiveConfigSchema } from "./reactive-config
2
2
  import { StandardSchemaValidator } from "./standard-schema-validator.service";
3
3
 
4
4
  export class ReactiveConfigNoopAdapter<T extends object> implements ReactiveConfigPort<T> {
5
- constructor(
6
- private readonly schema: ReactiveConfigSchema<T>,
7
- private readonly value: T,
8
- ) {}
5
+ private readonly value: Readonly<T>;
6
+
7
+ constructor(schema: ReactiveConfigSchema<T>, value: T) {
8
+ this.value = Object.freeze(StandardSchemaValidator.validate(schema, value));
9
+ }
9
10
 
10
11
  async get(): Promise<Readonly<T>> {
11
- return Object.freeze(StandardSchemaValidator.validate(this.schema, this.value));
12
+ return this.value;
12
13
  }
13
14
  }
@@ -14,6 +14,6 @@ export class ReactiveConfigWithCacheAdapter<T extends object> implements Reactiv
14
14
  async get(): Promise<Readonly<T>> {
15
15
  const key = await this.deps.HashContent.hash(this.subject);
16
16
 
17
- return this.deps.CacheResolver.resolve(key, () => this.inner.get());
17
+ return Object.freeze(await this.deps.CacheResolver.resolve(key, () => this.inner.get()));
18
18
  }
19
19
  }
@@ -2,17 +2,21 @@ import type { ReactiveConfigPort, ReactiveConfigSchema } from "./reactive-config
2
2
  import { StandardSchemaValidator } from "./standard-schema-validator.service";
3
3
 
4
4
  export class ReactiveConfigWithFallbackAdapter<T extends object> implements ReactiveConfigPort<T> {
5
+ private readonly fallback: Readonly<T>;
6
+
5
7
  constructor(
6
8
  private readonly inner: ReactiveConfigPort<T>,
7
- private readonly schema: ReactiveConfigSchema<T>,
8
- private readonly fallback: T,
9
- ) {}
9
+ schema: ReactiveConfigSchema<T>,
10
+ fallback: T,
11
+ ) {
12
+ this.fallback = Object.freeze(StandardSchemaValidator.validate(schema, fallback));
13
+ }
10
14
 
11
15
  async get(): Promise<Readonly<T>> {
12
16
  try {
13
17
  return await this.inner.get();
14
18
  } catch {
15
- return Object.freeze(StandardSchemaValidator.validate(this.schema, this.fallback));
19
+ return this.fallback;
16
20
  }
17
21
  }
18
22
  }
@@ -0,0 +1,50 @@
1
+ import type { ClockPort } from "./clock.port";
2
+ import { CorrelationStorage } from "./correlation-storage.service";
3
+ import type { LoggerPort } from "./logger.port";
4
+ import type { ReactiveConfigPort } from "./reactive-config.port";
5
+ import { Stopwatch } from "./stopwatch.service";
6
+
7
+ export type ReactiveConfigWithLoggerAdapterDependencies<T extends object> = {
8
+ inner: ReactiveConfigPort<T>;
9
+ Logger: LoggerPort;
10
+ Clock: ClockPort;
11
+ };
12
+
13
+ export class ReactiveConfigWithLoggerAdapter<T extends object> implements ReactiveConfigPort<T> {
14
+ private readonly base = { component: "infra", operation: "reactive_config" };
15
+
16
+ constructor(private readonly deps: ReactiveConfigWithLoggerAdapterDependencies<T>) {}
17
+
18
+ async get(): Promise<Readonly<T>> {
19
+ const duration = new Stopwatch(this.deps);
20
+
21
+ try {
22
+ this.deps.Logger.info({
23
+ message: "Reactive config read attempt",
24
+ correlationId: CorrelationStorage.get(),
25
+ ...this.base,
26
+ });
27
+
28
+ const result = await this.deps.inner.get();
29
+
30
+ this.deps.Logger.info({
31
+ message: "Reactive config read success",
32
+ correlationId: CorrelationStorage.get(),
33
+ metadata: { duration: duration.stop() },
34
+ ...this.base,
35
+ });
36
+
37
+ return result;
38
+ } catch (error) {
39
+ this.deps.Logger.error({
40
+ message: "Reactive config read error",
41
+ correlationId: CorrelationStorage.get(),
42
+ error,
43
+ metadata: { duration: duration.stop() },
44
+ ...this.base,
45
+ });
46
+
47
+ throw error;
48
+ }
49
+ }
50
+ }
@@ -13,10 +13,9 @@ export class ReadinessHonoHandler implements HandlerHonoPort {
13
13
 
14
14
  handle() {
15
15
  return factory.createHandlers(async (c) => {
16
- const readiness = await this.handler.check();
17
- const code = readiness.ok ? 200 : 503;
16
+ const result = await this.handler.check();
18
17
 
19
- return c.json(readiness, code);
18
+ return c.json(result.details, result.code, result.headers);
20
19
  });
21
20
  }
22
21
  }
@@ -6,9 +6,15 @@ import {
6
6
 
7
7
  export type ReadinessConfig = { prerequisites: ReadonlyArray<Prerequisite> };
8
8
 
9
+ export enum ReadinessStatusCode {
10
+ Ready = 200,
11
+ NotReady = 503,
12
+ }
13
+
9
14
  type ReadinessResult = {
10
- ok: boolean;
15
+ code: ReadinessStatusCode;
11
16
  details: ReadonlyArray<{ label: PrerequisiteLabelType; outcome: PrerequisiteVerificationResult }>;
17
+ headers: Record<string, string>;
12
18
  };
13
19
 
14
20
  export class ReadinessHandler {
@@ -26,8 +32,13 @@ export class ReadinessHandler {
26
32
  })),
27
33
  );
28
34
 
35
+ // Undetermined keeps traffic flowing here, unlike healthcheck where it degrades to 207
29
36
  const ok = details.every((detail) => detail.outcome.outcome !== PrerequisiteVerificationOutcome.failure);
30
37
 
31
- return { ok, details };
38
+ return {
39
+ code: ok ? ReadinessStatusCode.Ready : ReadinessStatusCode.NotReady,
40
+ details,
41
+ headers: { "Cache-Control": "no-store" },
42
+ };
32
43
  }
33
44
  }
@@ -14,6 +14,7 @@ export class RedactorMetadataCompactArray implements RedactorStrategy {
14
14
 
15
15
  redact<T>(input: T): T {
16
16
  if (!tools.isPlainObject(input)) return input;
17
+ if (!("metadata" in input)) return input;
17
18
 
18
19
  return {
19
20
  ...input,
@@ -14,6 +14,7 @@ export class RedactorMetadataCompactObject implements RedactorStrategy {
14
14
 
15
15
  redact<T>(input: T): T {
16
16
  if (!tools.isPlainObject(input)) return input;
17
+ if (!("metadata" in input)) return input;
17
18
 
18
19
  return {
19
20
  ...input,
@@ -0,0 +1,33 @@
1
+ import * as tools from "@bgord/tools";
2
+ import type { RedactorStrategy } from "./redactor.strategy";
3
+ import { RedactorMask } from "./redactor-mask.strategy";
4
+
5
+ export class RedactorUrlQuery implements RedactorStrategy {
6
+ private readonly keys: Set<string>;
7
+
8
+ constructor(keys?: ReadonlyArray<string>) {
9
+ this.keys = new Set((keys?.length ? keys : RedactorMask.DEFAULT_KEYS).map((key) => key.toLowerCase()));
10
+ }
11
+
12
+ redact<T>(input: T): T {
13
+ if (!tools.isPlainObject(input)) return input;
14
+ if (typeof input["url"] !== "string") return input;
15
+
16
+ return { ...input, url: this.mask(input["url"]) };
17
+ }
18
+
19
+ private mask(url: string): string {
20
+ const [base, query] = url.split("?");
21
+
22
+ if (!query) return url;
23
+
24
+ const masked = new URLSearchParams(
25
+ Array.from(new URLSearchParams(query), ([key, value]) => [
26
+ key,
27
+ this.keys.has(key.toLowerCase()) ? "***" : value,
28
+ ]),
29
+ );
30
+
31
+ return `${base}?${masked.toString()}`;
32
+ }
33
+ }
@@ -3,6 +3,7 @@ import * as v from "valibot";
3
3
  import type { DirectoryEnsurerPort } from "./directory-ensurer.port";
4
4
  import type { FileCleanerPort } from "./file-cleaner.port";
5
5
  import type { FileCopierPort } from "./file-copier.port";
6
+ import type { FileInspectionPort } from "./file-inspection.port";
6
7
  import type { FileRenamerPort } from "./file-renamer.port";
7
8
  import type { HashFilePort } from "./hash-file.port";
8
9
  import type { NonceProviderPort } from "./nonce-provider.port";
@@ -15,6 +16,7 @@ import type {
15
16
 
16
17
  type Dependencies = {
17
18
  HashFile: HashFilePort;
19
+ FileInspection: FileInspectionPort;
18
20
  FileCleaner: FileCleanerPort;
19
21
  FileRenamer: FileRenamerPort;
20
22
  FileCopier: FileCopierPort;
@@ -71,11 +73,9 @@ export class RemoteFileStorageDiskAdapter implements RemoteFileStoragePort {
71
73
  async getStream(key: tools.ObjectKeyType): Promise<ReadableStream | null> {
72
74
  const path = this.resolveKeyToAbsoluteFilePath(key);
73
75
 
74
- try {
75
- return Bun.file(path.get()).stream();
76
- } catch {
77
- return null;
78
- }
76
+ if (!(await this.deps.FileInspection.exists(path))) return null;
77
+
78
+ return Bun.file(path.get()).stream();
79
79
  }
80
80
 
81
81
  async delete(key: tools.ObjectKeyType): Promise<tools.ObjectKeyType> {
@@ -26,6 +26,7 @@ export class RequestContextHonoAdapter implements RequestContext {
26
26
  return headers;
27
27
  },
28
28
  query: () => context.req.query(),
29
+ queries: () => context.req.queries(),
29
30
  params: () => context.req.param(),
30
31
  param: (name: string) => context.req.param(name),
31
32
  cookie: (name) => getCookie(context)[name],
@@ -65,6 +66,7 @@ export class RequestContextHonoAdapter implements RequestContext {
65
66
  context.req.header("x-real-ip") ||
66
67
  context.req.header("x-forwarded-for")?.split(",")[0]?.trim() ||
67
68
  getConnInfo(context).remote.address,
69
+ remoteIp: () => getConnInfo(context).remote.address,
68
70
  ua: () => context.req.header("user-agent"),
69
71
  };
70
72
 
@@ -8,6 +8,7 @@ export interface RequestContext {
8
8
  url(): string;
9
9
  header(name: string): string | undefined;
10
10
  query(): Record<string, string>;
11
+ queries(): Record<string, ReadonlyArray<string>>;
11
12
  params(): Record<string, string>;
12
13
  param(name: string): string | undefined;
13
14
  cookie(name: string): string | undefined;
@@ -21,6 +22,7 @@ export interface RequestContext {
21
22
  readonly identity: {
22
23
  userId(): UUIDType | undefined;
23
24
  ip(): string | undefined;
25
+ remoteIp(): string | undefined;
24
26
  ua(): string | undefined;
25
27
  };
26
28
 
@@ -59,6 +61,10 @@ export interface HasRequestQuery {
59
61
  readonly request: { query(): Record<string, string> };
60
62
  }
61
63
 
64
+ export interface HasRequestQueries {
65
+ readonly request: { queries(): Record<string, ReadonlyArray<string>> };
66
+ }
67
+
62
68
  export interface HasRequestParams {
63
69
  readonly request: { params(): Record<string, string> };
64
70
  }
@@ -71,7 +77,7 @@ export interface HasRequestCookie {
71
77
  readonly request: { cookie(name: string): string | undefined };
72
78
  }
73
79
 
74
- export interface HasRequestJSON {
80
+ export interface HasRequestJson {
75
81
  readonly request: { json(): Promise<Record<string, unknown>> };
76
82
  }
77
83
 
@@ -91,6 +97,10 @@ export interface HasIdentityIp {
91
97
  readonly identity: { ip(): string | undefined };
92
98
  }
93
99
 
100
+ export interface HasIdentityRemoteIp {
101
+ readonly identity: { remoteIp(): string | undefined };
102
+ }
103
+
94
104
  export interface HasIdentityUa {
95
105
  readonly identity: { ua(): string | undefined };
96
106
  }
@@ -5,7 +5,10 @@ import type { SealerPort } from "./sealer.port";
5
5
 
6
6
  type Dependencies = { CryptoKeyProvider: CryptoKeyProviderPort };
7
7
 
8
- export const SealerAesGcmAdapterError = { InvalidPayload: "sealer.aes.gcm.adapter.invalid.payload" };
8
+ export const SealerAesGcmAdapterError = {
9
+ InvalidPayload: "sealer.aes.gcm.adapter.invalid.payload",
10
+ Undefined: "sealer.aes.gcm.adapter.undefined.value",
11
+ };
9
12
 
10
13
  export class SealerAesGcmAdapter implements SealerPort {
11
14
  private static readonly PREFIX = "sealed:gcm:";
@@ -13,6 +16,8 @@ export class SealerAesGcmAdapter implements SealerPort {
13
16
  constructor(private readonly deps: Dependencies) {}
14
17
 
15
18
  async seal(value: unknown): Promise<string> {
19
+ if (value === undefined) throw new Error(SealerAesGcmAdapterError.Undefined);
20
+
16
21
  const key = await this.deps.CryptoKeyProvider.get();
17
22
  const iv = EncryptionIV.generate();
18
23
 
@@ -2,9 +2,17 @@ import type * as tools from "@bgord/tools";
2
2
  import type { SecureKeyGeneratorPort } from "./secure-key-generator.port";
3
3
 
4
4
  export class SecureKeyGeneratorCryptoAdapter implements SecureKeyGeneratorPort {
5
+ // crypto.getRandomValues is spec-limited to a 65536-byte view
6
+ static readonly MAX_BYTES = 65_536;
7
+
5
8
  generate(bytes: tools.IntegerPositiveType): Uint8Array {
6
9
  const buffer = new Uint8Array(bytes);
7
- crypto.getRandomValues(buffer);
10
+
11
+ // Stryker disable next-line EqualityOperator
12
+ for (let offset = 0; offset < bytes; offset += SecureKeyGeneratorCryptoAdapter.MAX_BYTES) {
13
+ crypto.getRandomValues(buffer.subarray(offset, offset + SecureKeyGeneratorCryptoAdapter.MAX_BYTES));
14
+ }
15
+
8
16
  return buffer;
9
17
  }
10
18
  }
@@ -7,7 +7,7 @@ export class SecurityRuleBaitRoutesStrategy implements SecurityRuleStrategy {
7
7
  constructor(private readonly routes: ReadonlyArray<string>) {}
8
8
 
9
9
  async isViolated(context: HasRequestPath): Promise<boolean> {
10
- return this.routes.includes(context.request.path);
10
+ return this.routes.includes(context.request.path.toLowerCase().replace(/\/+$/, ""));
11
11
  }
12
12
 
13
13
  get name(): SecurityRuleNameType {
@@ -1,17 +1,18 @@
1
1
  import * as v from "valibot";
2
- import type { HasRequestJSON } from "./request-context.port";
2
+ import type { HasRequestForm, HasRequestJson } from "./request-context.port";
3
3
  import type { SecurityRuleStrategy } from "./security-rule.strategy";
4
4
  import { SecurityRuleName, type SecurityRuleNameType } from "./security-rule-name.vo";
5
5
 
6
6
  export class SecurityRuleHoneyPotFieldStrategy implements SecurityRuleStrategy {
7
7
  constructor(private readonly field: string) {}
8
8
 
9
- async isViolated(context: HasRequestJSON): Promise<boolean> {
9
+ async isViolated(context: HasRequestJson & HasRequestForm): Promise<boolean> {
10
10
  const body = await context.request.json();
11
+ const form = await context.request.form();
11
12
 
12
- const value = body[this.field];
13
+ const value = body[this.field] ?? form.get(this.field);
13
14
 
14
- return value !== undefined && value !== null && value !== "";
15
+ return value !== null && value !== "";
15
16
  }
16
17
 
17
18
  get name(): SecurityRuleNameType {