@bgord/bun 1.10.23 → 1.11.0

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 (792) hide show
  1. package/dist/ab-assignment-composite.strategy.d.ts +10 -0
  2. package/dist/ab-assignment-composite.strategy.d.ts.map +1 -0
  3. package/dist/ab-assignment-composite.strategy.js +15 -0
  4. package/dist/ab-assignment-composite.strategy.js.map +1 -0
  5. package/dist/ab-assignment-fixed.strategy.d.ts +10 -0
  6. package/dist/ab-assignment-fixed.strategy.d.ts.map +1 -0
  7. package/dist/ab-assignment-fixed.strategy.js +10 -0
  8. package/dist/ab-assignment-fixed.strategy.js.map +1 -0
  9. package/dist/ab-assignment-hash.strategy.d.ts +12 -0
  10. package/dist/ab-assignment-hash.strategy.d.ts.map +1 -0
  11. package/dist/ab-assignment-hash.strategy.js +14 -0
  12. package/dist/ab-assignment-hash.strategy.js.map +1 -0
  13. package/dist/ab-assignment-query.strategy.d.ts +10 -0
  14. package/dist/ab-assignment-query.strategy.d.ts.map +1 -0
  15. package/dist/ab-assignment-query.strategy.js +11 -0
  16. package/dist/ab-assignment-query.strategy.js.map +1 -0
  17. package/dist/ab-assignment.strategy.d.ts +7 -0
  18. package/dist/ab-assignment.strategy.d.ts.map +1 -0
  19. package/dist/ab-assignment.strategy.js +2 -0
  20. package/dist/ab-assignment.strategy.js.map +1 -0
  21. package/dist/ab-hono-noop.middleware.d.ts +10 -0
  22. package/dist/ab-hono-noop.middleware.d.ts.map +1 -0
  23. package/dist/ab-hono-noop.middleware.js +18 -0
  24. package/dist/ab-hono-noop.middleware.js.map +1 -0
  25. package/dist/ab-hono.middleware.d.ts +14 -0
  26. package/dist/ab-hono.middleware.d.ts.map +1 -0
  27. package/dist/ab-hono.middleware.js +17 -0
  28. package/dist/ab-hono.middleware.js.map +1 -0
  29. package/dist/ab-variant-selector.service.d.ts +12 -0
  30. package/dist/ab-variant-selector.service.d.ts.map +1 -0
  31. package/dist/ab-variant-selector.service.js +22 -0
  32. package/dist/ab-variant-selector.service.js.map +1 -0
  33. package/dist/ab-variant-weight.vo.d.ts +7 -0
  34. package/dist/ab-variant-weight.vo.d.ts.map +1 -0
  35. package/dist/ab-variant-weight.vo.js +10 -0
  36. package/dist/ab-variant-weight.vo.js.map +1 -0
  37. package/dist/ab-variant.vo.d.ts +11 -0
  38. package/dist/ab-variant.vo.d.ts.map +1 -0
  39. package/dist/ab-variant.vo.js +7 -0
  40. package/dist/ab-variant.vo.js.map +1 -0
  41. package/dist/ab-variants.vo.d.ts +12 -0
  42. package/dist/ab-variants.vo.d.ts.map +1 -0
  43. package/dist/ab-variants.vo.js +24 -0
  44. package/dist/ab-variants.vo.js.map +1 -0
  45. package/dist/ab.middleware.d.ts +11 -0
  46. package/dist/ab.middleware.d.ts.map +1 -0
  47. package/dist/ab.middleware.js +12 -0
  48. package/dist/ab.middleware.js.map +1 -0
  49. package/dist/api-version-hono.middleware.d.ts +17 -0
  50. package/dist/api-version-hono.middleware.d.ts.map +1 -0
  51. package/dist/api-version-hono.middleware.js +15 -0
  52. package/dist/api-version-hono.middleware.js.map +1 -0
  53. package/dist/api-version.middleware.d.ts +5 -2
  54. package/dist/api-version.middleware.d.ts.map +1 -1
  55. package/dist/api-version.middleware.js +12 -10
  56. package/dist/api-version.middleware.js.map +1 -1
  57. package/dist/auth-session-reader.port.d.ts +8 -7
  58. package/dist/auth-session-reader.port.d.ts.map +1 -1
  59. package/dist/basic-auth.service.d.ts +3 -3
  60. package/dist/basic-auth.service.d.ts.map +1 -1
  61. package/dist/basic-auth.service.js.map +1 -1
  62. package/dist/cache-response-hono.middleware.d.ts +14 -0
  63. package/dist/cache-response-hono.middleware.d.ts.map +1 -0
  64. package/dist/cache-response-hono.middleware.js +34 -0
  65. package/dist/cache-response-hono.middleware.js.map +1 -0
  66. package/dist/cache-response.middleware.d.ts +18 -8
  67. package/dist/cache-response.middleware.d.ts.map +1 -1
  68. package/dist/cache-response.middleware.js +8 -21
  69. package/dist/cache-response.middleware.js.map +1 -1
  70. package/dist/correlation-hono.middleware.d.ts +16 -0
  71. package/dist/correlation-hono.middleware.d.ts.map +1 -0
  72. package/dist/correlation-hono.middleware.js +20 -0
  73. package/dist/correlation-hono.middleware.js.map +1 -0
  74. package/dist/correlation-id.middleware.d.ts +14 -0
  75. package/dist/correlation-id.middleware.d.ts.map +1 -0
  76. package/dist/correlation-id.middleware.js +16 -0
  77. package/dist/correlation-id.middleware.js.map +1 -0
  78. package/dist/correlation-storage.service.d.ts +0 -1
  79. package/dist/correlation-storage.service.d.ts.map +1 -1
  80. package/dist/correlation-storage.service.js +0 -2
  81. package/dist/correlation-storage.service.js.map +1 -1
  82. package/dist/crypto-key-provider-with-cache.adapter.d.ts +5 -4
  83. package/dist/crypto-key-provider-with-cache.adapter.d.ts.map +1 -1
  84. package/dist/crypto-key-provider-with-cache.adapter.js +5 -5
  85. package/dist/crypto-key-provider-with-cache.adapter.js.map +1 -1
  86. package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
  87. package/dist/environment-loader-process-safe.adapter.js +3 -3
  88. package/dist/environment-loader-process-safe.adapter.js.map +1 -1
  89. package/dist/etag-extractor-hono.middleware.d.ts +13 -0
  90. package/dist/etag-extractor-hono.middleware.d.ts.map +1 -0
  91. package/dist/etag-extractor-hono.middleware.js +17 -0
  92. package/dist/etag-extractor-hono.middleware.js.map +1 -0
  93. package/dist/etag-extractor.middleware.d.ts +3 -8
  94. package/dist/etag-extractor.middleware.d.ts.map +1 -1
  95. package/dist/etag-extractor.middleware.js +5 -9
  96. package/dist/etag-extractor.middleware.js.map +1 -1
  97. package/dist/event-store.d.ts +2 -2
  98. package/dist/event-store.d.ts.map +1 -1
  99. package/dist/event-store.js.map +1 -1
  100. package/dist/file-inspection-noop.adapter.d.ts +2 -2
  101. package/dist/file-inspection-noop.adapter.d.ts.map +1 -1
  102. package/dist/file-inspection-noop.adapter.js.map +1 -1
  103. package/dist/file-reader-json-with-cache.adapter.d.ts +5 -4
  104. package/dist/file-reader-json-with-cache.adapter.d.ts.map +1 -1
  105. package/dist/file-reader-json-with-cache.adapter.js +6 -6
  106. package/dist/file-reader-json-with-cache.adapter.js.map +1 -1
  107. package/dist/file-reader-raw-with-cache.adapter.d.ts +5 -4
  108. package/dist/file-reader-raw-with-cache.adapter.d.ts.map +1 -1
  109. package/dist/file-reader-raw-with-cache.adapter.js +6 -6
  110. package/dist/file-reader-raw-with-cache.adapter.js.map +1 -1
  111. package/dist/file-reader-text-with-cache.adapter.d.ts +5 -4
  112. package/dist/file-reader-text-with-cache.adapter.d.ts.map +1 -1
  113. package/dist/file-reader-text-with-cache.adapter.js +6 -6
  114. package/dist/file-reader-text-with-cache.adapter.js.map +1 -1
  115. package/dist/file-uploader-hono.middleware.d.ts +13 -0
  116. package/dist/file-uploader-hono.middleware.d.ts.map +1 -0
  117. package/dist/file-uploader-hono.middleware.js +37 -0
  118. package/dist/file-uploader-hono.middleware.js.map +1 -0
  119. package/dist/file-uploader.middleware.d.ts +19 -8
  120. package/dist/file-uploader.middleware.d.ts.map +1 -1
  121. package/dist/file-uploader.middleware.js +24 -26
  122. package/dist/file-uploader.middleware.js.map +1 -1
  123. package/dist/handler-hono.port.d.ts +5 -0
  124. package/dist/handler-hono.port.d.ts.map +1 -0
  125. package/dist/handler-hono.port.js +2 -0
  126. package/dist/handler-hono.port.js.map +1 -0
  127. package/dist/hash-bucket.vo.d.ts +9 -0
  128. package/dist/hash-bucket.vo.d.ts.map +1 -0
  129. package/dist/hash-bucket.vo.js +17 -0
  130. package/dist/hash-bucket.vo.js.map +1 -0
  131. package/dist/healthcheck-hono.handler.d.ts +87 -0
  132. package/dist/healthcheck-hono.handler.d.ts.map +1 -0
  133. package/dist/healthcheck-hono.handler.js +17 -0
  134. package/dist/healthcheck-hono.handler.js.map +1 -0
  135. package/dist/healthcheck.handler.d.ts +83 -0
  136. package/dist/healthcheck.handler.d.ts.map +1 -0
  137. package/dist/{healthcheck.service.js → healthcheck.handler.js} +21 -19
  138. package/dist/healthcheck.handler.js.map +1 -0
  139. package/dist/http-logger-hono.middleware.d.ts +17 -0
  140. package/dist/http-logger-hono.middleware.d.ts.map +1 -0
  141. package/dist/http-logger-hono.middleware.js +37 -0
  142. package/dist/http-logger-hono.middleware.js.map +1 -0
  143. package/dist/http-logger.middleware.d.ts +19 -4
  144. package/dist/http-logger.middleware.d.ts.map +1 -1
  145. package/dist/http-logger.middleware.js +31 -41
  146. package/dist/http-logger.middleware.js.map +1 -1
  147. package/dist/i18n.service.d.ts +1 -1
  148. package/dist/i18n.service.d.ts.map +1 -1
  149. package/dist/image-info-noop.adapter.d.ts +1 -1
  150. package/dist/image-info-noop.adapter.d.ts.map +1 -1
  151. package/dist/image-info-noop.adapter.js +1 -1
  152. package/dist/image-info-noop.adapter.js.map +1 -1
  153. package/dist/image-info-sharp.adapter.d.ts +1 -1
  154. package/dist/image-info-sharp.adapter.d.ts.map +1 -1
  155. package/dist/image-info-sharp.adapter.js +3 -3
  156. package/dist/image-info-sharp.adapter.js.map +1 -1
  157. package/dist/image-info.port.d.ts +1 -1
  158. package/dist/image-info.port.d.ts.map +1 -1
  159. package/dist/in-flight-requests-hono.middleware.d.ts +7 -0
  160. package/dist/in-flight-requests-hono.middleware.d.ts.map +1 -0
  161. package/dist/in-flight-requests-hono.middleware.js +16 -0
  162. package/dist/in-flight-requests-hono.middleware.js.map +1 -0
  163. package/dist/in-flight-requests-tracker.service.d.ts.map +1 -1
  164. package/dist/in-flight-requests-tracker.service.js +0 -1
  165. package/dist/in-flight-requests-tracker.service.js.map +1 -1
  166. package/dist/in-flight-requests.middleware.d.ts +3 -2
  167. package/dist/in-flight-requests.middleware.d.ts.map +1 -1
  168. package/dist/in-flight-requests.middleware.js +6 -10
  169. package/dist/in-flight-requests.middleware.js.map +1 -1
  170. package/dist/index.d.ts +70 -25
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +70 -25
  173. package/dist/index.js.map +1 -1
  174. package/dist/invariant-error-handler.service.d.ts +1 -2
  175. package/dist/invariant-error-handler.service.d.ts.map +1 -1
  176. package/dist/invariant-error-handler.service.js.map +1 -1
  177. package/dist/invariant.service.d.ts +2 -2
  178. package/dist/invariant.service.d.ts.map +1 -1
  179. package/dist/mailer-resend.adapter.d.ts +2 -2
  180. package/dist/mailer-resend.adapter.d.ts.map +1 -1
  181. package/dist/mailer-resend.adapter.js.map +1 -1
  182. package/dist/mailer-smtp.adapter.d.ts +2 -2
  183. package/dist/mailer-smtp.adapter.d.ts.map +1 -1
  184. package/dist/mailer-smtp.adapter.js.map +1 -1
  185. package/dist/middleware-hono-noop.adapter.d.ts +6 -0
  186. package/dist/middleware-hono-noop.adapter.d.ts.map +1 -0
  187. package/dist/middleware-hono-noop.adapter.js +6 -0
  188. package/dist/middleware-hono-noop.adapter.js.map +1 -0
  189. package/dist/middleware-hono.port.d.ts +5 -0
  190. package/dist/middleware-hono.port.d.ts.map +1 -0
  191. package/dist/middleware-hono.port.js +2 -0
  192. package/dist/middleware-hono.port.js.map +1 -0
  193. package/dist/modules/preferences/invariants/user-language-has-changed.d.ts +6 -6
  194. package/dist/modules/preferences/invariants/user-language-has-changed.d.ts.map +1 -1
  195. package/dist/modules/preferences/invariants/user-language-has-changed.js.map +1 -1
  196. package/dist/ping-hono.handler.d.ts +6 -0
  197. package/dist/ping-hono.handler.d.ts.map +1 -0
  198. package/dist/ping-hono.handler.js +13 -0
  199. package/dist/ping-hono.handler.js.map +1 -0
  200. package/dist/ping.handler.d.ts +4 -0
  201. package/dist/ping.handler.d.ts.map +1 -0
  202. package/dist/ping.handler.js +6 -0
  203. package/dist/ping.handler.js.map +1 -0
  204. package/dist/prerequisite-verifier-binary.adapter.d.ts +5 -3
  205. package/dist/prerequisite-verifier-binary.adapter.d.ts.map +1 -1
  206. package/dist/prerequisite-verifier-binary.adapter.js.map +1 -1
  207. package/dist/prerequisite-verifier-bun.adapter.d.ts +6 -4
  208. package/dist/prerequisite-verifier-bun.adapter.d.ts.map +1 -1
  209. package/dist/prerequisite-verifier-bun.adapter.js.map +1 -1
  210. package/dist/prerequisite-verifier-clock-drift.adapter.d.ts +4 -3
  211. package/dist/prerequisite-verifier-clock-drift.adapter.d.ts.map +1 -1
  212. package/dist/prerequisite-verifier-clock-drift.adapter.js.map +1 -1
  213. package/dist/prerequisite-verifier-directory.adapter.d.ts +5 -4
  214. package/dist/prerequisite-verifier-directory.adapter.d.ts.map +1 -1
  215. package/dist/prerequisite-verifier-directory.adapter.js.map +1 -1
  216. package/dist/prerequisite-verifier-dns.adapter.d.ts +5 -3
  217. package/dist/prerequisite-verifier-dns.adapter.d.ts.map +1 -1
  218. package/dist/prerequisite-verifier-dns.adapter.js.map +1 -1
  219. package/dist/prerequisite-verifier-external-api.adapter.d.ts +5 -3
  220. package/dist/prerequisite-verifier-external-api.adapter.d.ts.map +1 -1
  221. package/dist/prerequisite-verifier-external-api.adapter.js.map +1 -1
  222. package/dist/prerequisite-verifier-file.adapter.d.ts +5 -4
  223. package/dist/prerequisite-verifier-file.adapter.d.ts.map +1 -1
  224. package/dist/prerequisite-verifier-file.adapter.js.map +1 -1
  225. package/dist/prerequisite-verifier-jobs.adapter.d.ts +5 -3
  226. package/dist/prerequisite-verifier-jobs.adapter.d.ts.map +1 -1
  227. package/dist/prerequisite-verifier-jobs.adapter.js.map +1 -1
  228. package/dist/prerequisite-verifier-memory.adapter.d.ts +5 -3
  229. package/dist/prerequisite-verifier-memory.adapter.d.ts.map +1 -1
  230. package/dist/prerequisite-verifier-memory.adapter.js.map +1 -1
  231. package/dist/prerequisite-verifier-node.adapter.d.ts +6 -4
  232. package/dist/prerequisite-verifier-node.adapter.d.ts.map +1 -1
  233. package/dist/prerequisite-verifier-node.adapter.js.map +1 -1
  234. package/dist/prerequisite-verifier-os.adapter.d.ts +5 -3
  235. package/dist/prerequisite-verifier-os.adapter.d.ts.map +1 -1
  236. package/dist/prerequisite-verifier-os.adapter.js.map +1 -1
  237. package/dist/prerequisite-verifier-port.adapter.d.ts +5 -3
  238. package/dist/prerequisite-verifier-port.adapter.d.ts.map +1 -1
  239. package/dist/prerequisite-verifier-port.adapter.js.map +1 -1
  240. package/dist/prerequisite-verifier-ram.adapter.d.ts +5 -3
  241. package/dist/prerequisite-verifier-ram.adapter.d.ts.map +1 -1
  242. package/dist/prerequisite-verifier-ram.adapter.js.map +1 -1
  243. package/dist/prerequisite-verifier-running-user.adapter.d.ts +5 -3
  244. package/dist/prerequisite-verifier-running-user.adapter.d.ts.map +1 -1
  245. package/dist/prerequisite-verifier-running-user.adapter.js.map +1 -1
  246. package/dist/prerequisite-verifier-space.adapter.d.ts +4 -3
  247. package/dist/prerequisite-verifier-space.adapter.d.ts.map +1 -1
  248. package/dist/prerequisite-verifier-space.adapter.js.map +1 -1
  249. package/dist/prerequisite-verifier-sqlite.adapter.d.ts +5 -3
  250. package/dist/prerequisite-verifier-sqlite.adapter.d.ts.map +1 -1
  251. package/dist/prerequisite-verifier-sqlite.adapter.js.map +1 -1
  252. package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.d.ts +5 -4
  253. package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.d.ts.map +1 -1
  254. package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.js.map +1 -1
  255. package/dist/prerequisite-verifier-timezone-utc.adapter.d.ts +5 -3
  256. package/dist/prerequisite-verifier-timezone-utc.adapter.d.ts.map +1 -1
  257. package/dist/prerequisite-verifier-timezone-utc.adapter.js.map +1 -1
  258. package/dist/prerequisite-verifier-translations.adapter.d.ts +1 -1
  259. package/dist/prerequisite-verifier-translations.adapter.d.ts.map +1 -1
  260. package/dist/prerequisite-verifier-translations.adapter.js.map +1 -1
  261. package/dist/prerequisite-verifier-with-cache.adapter.d.ts +5 -4
  262. package/dist/prerequisite-verifier-with-cache.adapter.d.ts.map +1 -1
  263. package/dist/prerequisite-verifier-with-cache.adapter.js +6 -6
  264. package/dist/prerequisite-verifier-with-cache.adapter.js.map +1 -1
  265. package/dist/prerequisite-verifier-with-fail-safe.adapter.d.ts +2 -2
  266. package/dist/prerequisite-verifier-with-fail-safe.adapter.d.ts.map +1 -1
  267. package/dist/prerequisite-verifier-with-fail-safe.adapter.js.map +1 -1
  268. package/dist/prerequisite-verifier-with-logger.adapter.d.ts +4 -3
  269. package/dist/prerequisite-verifier-with-logger.adapter.d.ts.map +1 -1
  270. package/dist/prerequisite-verifier-with-logger.adapter.js.map +1 -1
  271. package/dist/prerequisite-verifier-with-retry.adapter.d.ts +6 -5
  272. package/dist/prerequisite-verifier-with-retry.adapter.d.ts.map +1 -1
  273. package/dist/prerequisite-verifier-with-retry.adapter.js.map +1 -1
  274. package/dist/prerequisite-verifier-with-timeout.adapter.d.ts +5 -4
  275. package/dist/prerequisite-verifier-with-timeout.adapter.d.ts.map +1 -1
  276. package/dist/prerequisite-verifier-with-timeout.adapter.js.map +1 -1
  277. package/dist/prerequisite-verifier.decorator.d.ts +4 -4
  278. package/dist/prerequisite-verifier.decorator.d.ts.map +1 -1
  279. package/dist/prerequisite-verifier.decorator.js.map +1 -1
  280. package/dist/prerequisite.vo.d.ts +2 -2
  281. package/dist/prerequisite.vo.d.ts.map +1 -1
  282. package/dist/prerequisite.vo.js.map +1 -1
  283. package/dist/remote-file-storage-disk.adapter.d.ts +4 -4
  284. package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
  285. package/dist/remote-file-storage-disk.adapter.js.map +1 -1
  286. package/dist/request-context-hono.adapter.d.ts +1 -1
  287. package/dist/request-context-hono.adapter.d.ts.map +1 -1
  288. package/dist/request-context-hono.adapter.js +10 -1
  289. package/dist/request-context-hono.adapter.js.map +1 -1
  290. package/dist/request-context.port.d.ts +18 -0
  291. package/dist/request-context.port.d.ts.map +1 -1
  292. package/dist/retry.service.d.ts +5 -5
  293. package/dist/retry.service.d.ts.map +1 -1
  294. package/dist/retry.service.js.map +1 -1
  295. package/dist/security-countermeasure-ban.strategy.d.ts +8 -7
  296. package/dist/security-countermeasure-ban.strategy.d.ts.map +1 -1
  297. package/dist/security-countermeasure-ban.strategy.js.map +1 -1
  298. package/dist/security-countermeasure-mirage.strategy.d.ts +6 -5
  299. package/dist/security-countermeasure-mirage.strategy.d.ts.map +1 -1
  300. package/dist/security-countermeasure-mirage.strategy.js.map +1 -1
  301. package/dist/security-countermeasure-tarpit.strategy.d.ts +5 -4
  302. package/dist/security-countermeasure-tarpit.strategy.d.ts.map +1 -1
  303. package/dist/security-countermeasure-tarpit.strategy.js.map +1 -1
  304. package/dist/security-rule-violation-threshold.strategy.d.ts +4 -3
  305. package/dist/security-rule-violation-threshold.strategy.d.ts.map +1 -1
  306. package/dist/security-rule-violation-threshold.strategy.js +4 -4
  307. package/dist/security-rule-violation-threshold.strategy.js.map +1 -1
  308. package/dist/setup-hono.service.d.ts +31 -0
  309. package/dist/setup-hono.service.d.ts.map +1 -0
  310. package/dist/{setup.service.js → setup-hono.service.js} +25 -33
  311. package/dist/setup-hono.service.js.map +1 -0
  312. package/dist/shield-api-key-hono.strategy.d.ts +11 -0
  313. package/dist/shield-api-key-hono.strategy.d.ts.map +1 -0
  314. package/dist/shield-api-key-hono.strategy.js +19 -0
  315. package/dist/shield-api-key-hono.strategy.js.map +1 -0
  316. package/dist/shield-api-key.strategy.d.ts +9 -9
  317. package/dist/shield-api-key.strategy.d.ts.map +1 -1
  318. package/dist/shield-api-key.strategy.js +5 -11
  319. package/dist/shield-api-key.strategy.js.map +1 -1
  320. package/dist/shield-auth-hono.strategy.d.ts +16 -0
  321. package/dist/shield-auth-hono.strategy.d.ts.map +1 -0
  322. package/dist/shield-auth-hono.strategy.js +31 -0
  323. package/dist/shield-auth-hono.strategy.js.map +1 -0
  324. package/dist/shield-auth.strategy.d.ts +8 -7
  325. package/dist/shield-auth.strategy.d.ts.map +1 -1
  326. package/dist/shield-auth.strategy.js +10 -23
  327. package/dist/shield-auth.strategy.js.map +1 -1
  328. package/dist/shield-basic-auth-hono.strategy.d.ts +11 -0
  329. package/dist/shield-basic-auth-hono.strategy.d.ts.map +1 -0
  330. package/dist/shield-basic-auth-hono.strategy.js +21 -0
  331. package/dist/shield-basic-auth-hono.strategy.js.map +1 -0
  332. package/dist/shield-basic-auth.strategy.d.ts +9 -7
  333. package/dist/shield-basic-auth.strategy.d.ts.map +1 -1
  334. package/dist/shield-basic-auth.strategy.js +18 -5
  335. package/dist/shield-basic-auth.strategy.js.map +1 -1
  336. package/dist/shield-body-limit-hono.strategy.d.ts +10 -0
  337. package/dist/shield-body-limit-hono.strategy.d.ts.map +1 -0
  338. package/dist/shield-body-limit-hono.strategy.js +21 -0
  339. package/dist/shield-body-limit-hono.strategy.js.map +1 -0
  340. package/dist/shield-body-limit.strategy.d.ts +14 -0
  341. package/dist/shield-body-limit.strategy.d.ts.map +1 -0
  342. package/dist/shield-body-limit.strategy.js +19 -0
  343. package/dist/shield-body-limit.strategy.js.map +1 -0
  344. package/dist/shield-csrf-hono.strategy.d.ts +11 -0
  345. package/dist/shield-csrf-hono.strategy.d.ts.map +1 -0
  346. package/dist/shield-csrf-hono.strategy.js +19 -0
  347. package/dist/shield-csrf-hono.strategy.js.map +1 -0
  348. package/dist/shield-csrf.strategy.d.ts +8 -7
  349. package/dist/shield-csrf.strategy.d.ts.map +1 -1
  350. package/dist/shield-csrf.strategy.js +7 -11
  351. package/dist/shield-csrf.strategy.js.map +1 -1
  352. package/dist/shield-hcaptcha-hono-local.strategy.d.ts +14 -0
  353. package/dist/shield-hcaptcha-hono-local.strategy.d.ts.map +1 -0
  354. package/dist/shield-hcaptcha-hono-local.strategy.js +20 -0
  355. package/dist/shield-hcaptcha-hono-local.strategy.js.map +1 -0
  356. package/dist/shield-hcaptcha-hono.strategy.d.ts +11 -0
  357. package/dist/shield-hcaptcha-hono.strategy.d.ts.map +1 -0
  358. package/dist/shield-hcaptcha-hono.strategy.js +19 -0
  359. package/dist/shield-hcaptcha-hono.strategy.js.map +1 -0
  360. package/dist/shield-hcaptcha.strategy.d.ts +5 -5
  361. package/dist/shield-hcaptcha.strategy.d.ts.map +1 -1
  362. package/dist/shield-hcaptcha.strategy.js +6 -12
  363. package/dist/shield-hcaptcha.strategy.js.map +1 -1
  364. package/dist/shield-maintenance-hono.strategy.d.ts +9 -0
  365. package/dist/shield-maintenance-hono.strategy.d.ts.map +1 -0
  366. package/dist/shield-maintenance-hono.strategy.js +18 -0
  367. package/dist/shield-maintenance-hono.strategy.js.map +1 -0
  368. package/dist/shield-maintenance.strategy.d.ts +15 -0
  369. package/dist/shield-maintenance.strategy.d.ts.map +1 -0
  370. package/dist/shield-maintenance.strategy.js +13 -0
  371. package/dist/shield-maintenance.strategy.js.map +1 -0
  372. package/dist/shield-rate-limit-hono.strategy.d.ts +18 -0
  373. package/dist/shield-rate-limit-hono.strategy.d.ts.map +1 -0
  374. package/dist/shield-rate-limit-hono.strategy.js +21 -0
  375. package/dist/shield-rate-limit-hono.strategy.js.map +1 -0
  376. package/dist/shield-rate-limit.strategy.d.ts +11 -10
  377. package/dist/shield-rate-limit.strategy.d.ts.map +1 -1
  378. package/dist/shield-rate-limit.strategy.js +9 -16
  379. package/dist/shield-rate-limit.strategy.js.map +1 -1
  380. package/dist/shield-recaptcha-hono.strategy.d.ts +11 -0
  381. package/dist/shield-recaptcha-hono.strategy.d.ts.map +1 -0
  382. package/dist/shield-recaptcha-hono.strategy.js +22 -0
  383. package/dist/shield-recaptcha-hono.strategy.js.map +1 -0
  384. package/dist/shield-recaptcha.strategy.d.ts +9 -8
  385. package/dist/shield-recaptcha.strategy.d.ts.map +1 -1
  386. package/dist/shield-recaptcha.strategy.js +8 -13
  387. package/dist/shield-recaptcha.strategy.js.map +1 -1
  388. package/dist/shield-security-hono.strategy.d.ts +18 -0
  389. package/dist/shield-security-hono.strategy.d.ts.map +1 -0
  390. package/dist/shield-security-hono.strategy.js +43 -0
  391. package/dist/shield-security-hono.strategy.js.map +1 -0
  392. package/dist/shield-security.strategy.d.ts +6 -12
  393. package/dist/shield-security.strategy.d.ts.map +1 -1
  394. package/dist/shield-security.strategy.js +12 -43
  395. package/dist/shield-security.strategy.js.map +1 -1
  396. package/dist/shield-timeout-hono.strategy.d.ts +11 -0
  397. package/dist/shield-timeout-hono.strategy.d.ts.map +1 -0
  398. package/dist/shield-timeout-hono.strategy.js +15 -0
  399. package/dist/shield-timeout-hono.strategy.js.map +1 -0
  400. package/dist/shield-timeout.strategy.d.ts +7 -9
  401. package/dist/shield-timeout.strategy.d.ts.map +1 -1
  402. package/dist/shield-timeout.strategy.js +3 -7
  403. package/dist/shield-timeout.strategy.js.map +1 -1
  404. package/dist/simulated-error-hono.middleware.d.ts +8 -0
  405. package/dist/simulated-error-hono.middleware.d.ts.map +1 -0
  406. package/dist/simulated-error-hono.middleware.js +13 -0
  407. package/dist/simulated-error-hono.middleware.js.map +1 -0
  408. package/dist/simulated-error.middleware.d.ts +2 -2
  409. package/dist/simulated-error.middleware.d.ts.map +1 -1
  410. package/dist/simulated-error.middleware.js +3 -4
  411. package/dist/simulated-error.middleware.js.map +1 -1
  412. package/dist/slower-hono.middleware.d.ts +14 -0
  413. package/dist/slower-hono.middleware.d.ts.map +1 -0
  414. package/dist/slower-hono.middleware.js +14 -0
  415. package/dist/slower-hono.middleware.js.map +1 -0
  416. package/dist/slower.middleware.d.ts +5 -2
  417. package/dist/slower.middleware.d.ts.map +1 -1
  418. package/dist/slower.middleware.js +10 -6
  419. package/dist/slower.middleware.js.map +1 -1
  420. package/dist/{ssr.d.ts → ssr-bun.service.d.ts} +2 -2
  421. package/dist/ssr-bun.service.d.ts.map +1 -0
  422. package/dist/ssr-bun.service.js +14 -0
  423. package/dist/ssr-bun.service.js.map +1 -0
  424. package/dist/ssr.service.d.ts +26 -0
  425. package/dist/ssr.service.d.ts.map +1 -0
  426. package/dist/ssr.service.js +49 -0
  427. package/dist/ssr.service.js.map +1 -0
  428. package/dist/{static-files.service.d.ts → static-files-hono.service.d.ts} +2 -2
  429. package/dist/static-files-hono.service.d.ts.map +1 -0
  430. package/dist/{static-files.service.js → static-files-hono.service.js} +2 -2
  431. package/dist/static-files-hono.service.js.map +1 -0
  432. package/dist/subject-application-resolver.vo.d.ts +23 -0
  433. package/dist/subject-application-resolver.vo.d.ts.map +1 -0
  434. package/dist/{cache-subject-application-resolver.vo.js → subject-application-resolver.vo.js} +7 -7
  435. package/dist/subject-application-resolver.vo.js.map +1 -0
  436. package/dist/{cache-subject-request-resolver.vo.d.ts → subject-request-resolver.vo.d.ts} +6 -6
  437. package/dist/subject-request-resolver.vo.d.ts.map +1 -0
  438. package/dist/{cache-subject-request-resolver.vo.js → subject-request-resolver.vo.js} +7 -7
  439. package/dist/subject-request-resolver.vo.js.map +1 -0
  440. package/dist/subject-segment-application.strategy.d.ts +6 -0
  441. package/dist/subject-segment-application.strategy.d.ts.map +1 -0
  442. package/dist/subject-segment-application.strategy.js +2 -0
  443. package/dist/subject-segment-application.strategy.js.map +1 -0
  444. package/dist/subject-segment-build.strategy.d.ts +9 -0
  445. package/dist/subject-segment-build.strategy.d.ts.map +1 -0
  446. package/dist/subject-segment-build.strategy.js +13 -0
  447. package/dist/subject-segment-build.strategy.js.map +1 -0
  448. package/dist/subject-segment-cookie.strategy.d.ts +9 -0
  449. package/dist/subject-segment-cookie.strategy.d.ts.map +1 -0
  450. package/dist/subject-segment-cookie.strategy.js +11 -0
  451. package/dist/subject-segment-cookie.strategy.js.map +1 -0
  452. package/dist/subject-segment-env.strategy.d.ts +9 -0
  453. package/dist/subject-segment-env.strategy.d.ts.map +1 -0
  454. package/dist/{cache-subject-segment-env.strategy.js → subject-segment-env.strategy.js} +2 -2
  455. package/dist/subject-segment-env.strategy.js.map +1 -0
  456. package/dist/subject-segment-fixed.strategy.d.ts +8 -0
  457. package/dist/subject-segment-fixed.strategy.d.ts.map +1 -0
  458. package/dist/{cache-subject-segment-fixed.strategy.js → subject-segment-fixed.strategy.js} +2 -2
  459. package/dist/subject-segment-fixed.strategy.js.map +1 -0
  460. package/dist/subject-segment-header.strategy.d.ts +9 -0
  461. package/dist/subject-segment-header.strategy.d.ts.map +1 -0
  462. package/dist/subject-segment-header.strategy.js +11 -0
  463. package/dist/subject-segment-header.strategy.js.map +1 -0
  464. package/dist/subject-segment-ip.strategy.d.ts +6 -0
  465. package/dist/subject-segment-ip.strategy.d.ts.map +1 -0
  466. package/dist/subject-segment-ip.strategy.js +7 -0
  467. package/dist/subject-segment-ip.strategy.js.map +1 -0
  468. package/dist/subject-segment-path.strategy.d.ts +6 -0
  469. package/dist/subject-segment-path.strategy.d.ts.map +1 -0
  470. package/dist/subject-segment-path.strategy.js +6 -0
  471. package/dist/subject-segment-path.strategy.js.map +1 -0
  472. package/dist/subject-segment-query.strategy.d.ts +7 -0
  473. package/dist/subject-segment-query.strategy.d.ts.map +1 -0
  474. package/dist/subject-segment-query.strategy.js +12 -0
  475. package/dist/subject-segment-query.strategy.js.map +1 -0
  476. package/dist/subject-segment-request.strategy.d.ts +9 -0
  477. package/dist/subject-segment-request.strategy.d.ts.map +1 -0
  478. package/dist/subject-segment-request.strategy.js +2 -0
  479. package/dist/subject-segment-request.strategy.js.map +1 -0
  480. package/dist/subject-segment-user.strategy.d.ts +6 -0
  481. package/dist/subject-segment-user.strategy.d.ts.map +1 -0
  482. package/dist/subject-segment-user.strategy.js +7 -0
  483. package/dist/subject-segment-user.strategy.js.map +1 -0
  484. package/dist/time-zone-offset-hono.middleware.d.ts +12 -0
  485. package/dist/time-zone-offset-hono.middleware.d.ts.map +1 -0
  486. package/dist/time-zone-offset-hono.middleware.js +17 -0
  487. package/dist/time-zone-offset-hono.middleware.js.map +1 -0
  488. package/dist/time-zone-offset.middleware.d.ts +3 -6
  489. package/dist/time-zone-offset.middleware.d.ts.map +1 -1
  490. package/dist/time-zone-offset.middleware.js +5 -13
  491. package/dist/time-zone-offset.middleware.js.map +1 -1
  492. package/dist/timing-hono.middleware.d.ts +12 -0
  493. package/dist/timing-hono.middleware.d.ts.map +1 -0
  494. package/dist/timing-hono.middleware.js +15 -0
  495. package/dist/timing-hono.middleware.js.map +1 -0
  496. package/dist/timing.middleware.d.ts +12 -0
  497. package/dist/timing.middleware.d.ts.map +1 -0
  498. package/dist/timing.middleware.js +14 -0
  499. package/dist/timing.middleware.js.map +1 -0
  500. package/dist/trailing-slash-hono.middleware.d.ts +7 -0
  501. package/dist/trailing-slash-hono.middleware.d.ts.map +1 -0
  502. package/dist/trailing-slash-hono.middleware.js +21 -0
  503. package/dist/trailing-slash-hono.middleware.js.map +1 -0
  504. package/dist/trailing-slash.middleware.d.ts +11 -0
  505. package/dist/trailing-slash.middleware.d.ts.map +1 -0
  506. package/dist/trailing-slash.middleware.js +10 -0
  507. package/dist/trailing-slash.middleware.js.map +1 -0
  508. package/dist/translations-hono.handler.d.ts +23 -0
  509. package/dist/translations-hono.handler.d.ts.map +1 -0
  510. package/dist/translations-hono.handler.js +17 -0
  511. package/dist/translations-hono.handler.js.map +1 -0
  512. package/dist/translations.handler.d.ts +22 -0
  513. package/dist/translations.handler.d.ts.map +1 -0
  514. package/dist/translations.handler.js +18 -0
  515. package/dist/translations.handler.js.map +1 -0
  516. package/dist/tsconfig.tsbuildinfo +1 -1
  517. package/dist/weak-etag-extractor-hono.middleware.d.ts +12 -0
  518. package/dist/weak-etag-extractor-hono.middleware.d.ts.map +1 -0
  519. package/dist/weak-etag-extractor-hono.middleware.js +17 -0
  520. package/dist/weak-etag-extractor-hono.middleware.js.map +1 -0
  521. package/dist/weak-etag-extractor.middleware.d.ts +4 -5
  522. package/dist/weak-etag-extractor.middleware.d.ts.map +1 -1
  523. package/dist/weak-etag-extractor.middleware.js +5 -9
  524. package/dist/weak-etag-extractor.middleware.js.map +1 -1
  525. package/dist/woodchopper-dispatcher-async.strategy.d.ts.map +1 -1
  526. package/dist/woodchopper-dispatcher-async.strategy.js +2 -0
  527. package/dist/woodchopper-dispatcher-async.strategy.js.map +1 -1
  528. package/dist/woodchopper-sampling-correlation-id.strategy.d.ts +2 -2
  529. package/dist/woodchopper-sampling-correlation-id.strategy.d.ts.map +1 -1
  530. package/dist/woodchopper-sampling-correlation-id.strategy.js.map +1 -1
  531. package/dist/woodchopper-sampling-every-nth.strategy.d.ts +3 -2
  532. package/dist/woodchopper-sampling-every-nth.strategy.d.ts.map +1 -1
  533. package/dist/woodchopper-sampling-every-nth.strategy.js.map +1 -1
  534. package/dist/woodchopper.d.ts +2 -2
  535. package/dist/woodchopper.d.ts.map +1 -1
  536. package/dist/woodchopper.js.map +1 -1
  537. package/package.json +9 -9
  538. package/readme.md +69 -24
  539. package/src/ab-assignment-composite.strategy.ts +17 -0
  540. package/src/ab-assignment-fixed.strategy.ts +12 -0
  541. package/src/ab-assignment-hash.strategy.ts +23 -0
  542. package/src/ab-assignment-query.strategy.ts +14 -0
  543. package/src/ab-assignment.strategy.ts +7 -0
  544. package/src/ab-hono-noop.middleware.ts +26 -0
  545. package/src/ab-hono.middleware.ts +28 -0
  546. package/src/ab-variant-selector.service.ts +27 -0
  547. package/src/ab-variant-weight.vo.ts +13 -0
  548. package/src/ab-variant.vo.ts +7 -0
  549. package/src/ab-variants.vo.ts +24 -0
  550. package/src/ab.middleware.ts +15 -0
  551. package/src/api-version-hono.middleware.ts +30 -0
  552. package/src/api-version.middleware.ts +18 -17
  553. package/src/auth-session-reader.port.ts +3 -3
  554. package/src/basic-auth.service.ts +3 -3
  555. package/src/cache-response-hono.middleware.ts +53 -0
  556. package/src/cache-response.middleware.ts +27 -33
  557. package/src/correlation-hono.middleware.ts +32 -0
  558. package/src/correlation-id.middleware.ts +20 -0
  559. package/src/correlation-storage.service.ts +0 -3
  560. package/src/crypto-key-provider-with-cache.adapter.ts +8 -6
  561. package/src/environment-loader-process-safe.adapter.ts +3 -6
  562. package/src/etag-extractor-hono.middleware.ts +27 -0
  563. package/src/etag-extractor.middleware.ts +6 -12
  564. package/src/event-store.ts +2 -2
  565. package/src/file-inspection-noop.adapter.ts +2 -2
  566. package/src/file-reader-json-with-cache.adapter.ts +8 -7
  567. package/src/file-reader-raw-with-cache.adapter.ts +8 -7
  568. package/src/file-reader-text-with-cache.adapter.ts +8 -7
  569. package/src/file-uploader-hono.middleware.ts +47 -0
  570. package/src/file-uploader.middleware.ts +21 -25
  571. package/src/handler-hono.port.ts +5 -0
  572. package/src/hash-bucket.vo.ts +19 -0
  573. package/src/healthcheck-hono.handler.ts +31 -0
  574. package/src/healthcheck.handler.ts +150 -0
  575. package/src/http-logger-hono.middleware.ts +50 -0
  576. package/src/http-logger.middleware.ts +56 -63
  577. package/src/i18n.service.ts +1 -1
  578. package/src/image-info-noop.adapter.ts +1 -1
  579. package/src/image-info-sharp.adapter.ts +3 -3
  580. package/src/image-info.port.ts +1 -1
  581. package/src/in-flight-requests-hono.middleware.ts +19 -0
  582. package/src/in-flight-requests-tracker.service.ts +0 -2
  583. package/src/in-flight-requests.middleware.ts +7 -11
  584. package/src/index.ts +70 -25
  585. package/src/invariant-error-handler.service.ts +2 -3
  586. package/src/invariant.service.ts +2 -2
  587. package/src/mailer-resend.adapter.ts +2 -2
  588. package/src/mailer-smtp.adapter.ts +2 -2
  589. package/src/middleware-hono-noop.adapter.ts +8 -0
  590. package/src/middleware-hono.port.ts +5 -0
  591. package/src/modules/preferences/invariants/user-language-has-changed.ts +4 -7
  592. package/src/ping-hono.handler.ts +17 -0
  593. package/src/ping.handler.ts +5 -0
  594. package/src/prerequisite-verifier-binary.adapter.ts +3 -1
  595. package/src/prerequisite-verifier-bun.adapter.ts +3 -1
  596. package/src/prerequisite-verifier-clock-drift.adapter.ts +2 -1
  597. package/src/prerequisite-verifier-directory.adapter.ts +6 -4
  598. package/src/prerequisite-verifier-dns.adapter.ts +3 -1
  599. package/src/prerequisite-verifier-external-api.adapter.ts +3 -1
  600. package/src/prerequisite-verifier-file.adapter.ts +6 -4
  601. package/src/prerequisite-verifier-jobs.adapter.ts +3 -1
  602. package/src/prerequisite-verifier-memory.adapter.ts +3 -1
  603. package/src/prerequisite-verifier-node.adapter.ts +3 -1
  604. package/src/prerequisite-verifier-os.adapter.ts +3 -1
  605. package/src/prerequisite-verifier-port.adapter.ts +3 -1
  606. package/src/prerequisite-verifier-ram.adapter.ts +3 -1
  607. package/src/prerequisite-verifier-running-user.adapter.ts +3 -1
  608. package/src/prerequisite-verifier-space.adapter.ts +2 -1
  609. package/src/prerequisite-verifier-sqlite.adapter.ts +3 -1
  610. package/src/prerequisite-verifier-ssl-certificate-expiry.adapter.ts +3 -1
  611. package/src/prerequisite-verifier-timezone-utc.adapter.ts +3 -1
  612. package/src/prerequisite-verifier-translations.adapter.ts +1 -2
  613. package/src/prerequisite-verifier-with-cache.adapter.ts +8 -7
  614. package/src/prerequisite-verifier-with-fail-safe.adapter.ts +4 -4
  615. package/src/prerequisite-verifier-with-logger.adapter.ts +3 -1
  616. package/src/prerequisite-verifier-with-retry.adapter.ts +3 -2
  617. package/src/prerequisite-verifier-with-timeout.adapter.ts +2 -1
  618. package/src/prerequisite-verifier.decorator.ts +4 -4
  619. package/src/prerequisite.vo.ts +2 -5
  620. package/src/remote-file-storage-disk.adapter.ts +3 -3
  621. package/src/request-context-hono.adapter.ts +12 -1
  622. package/src/request-context.port.ts +15 -0
  623. package/src/retry.service.ts +4 -4
  624. package/src/security-countermeasure-ban.strategy.ts +6 -4
  625. package/src/security-countermeasure-mirage.strategy.ts +2 -1
  626. package/src/security-countermeasure-tarpit.strategy.ts +2 -1
  627. package/src/security-rule-violation-threshold.strategy.ts +7 -6
  628. package/src/{setup.service.ts → setup-hono.service.ts} +36 -43
  629. package/src/shield-api-key-hono.strategy.ts +28 -0
  630. package/src/shield-api-key.strategy.ts +9 -15
  631. package/src/shield-auth-hono.strategy.ts +41 -0
  632. package/src/shield-auth.strategy.ts +12 -26
  633. package/src/shield-basic-auth-hono.strategy.ts +30 -0
  634. package/src/shield-basic-auth.strategy.ts +21 -10
  635. package/src/shield-body-limit-hono.strategy.ts +30 -0
  636. package/src/shield-body-limit.strategy.ts +23 -0
  637. package/src/shield-csrf-hono.strategy.ts +24 -0
  638. package/src/shield-csrf.strategy.ts +11 -16
  639. package/src/shield-hcaptcha-hono-local.strategy.ts +26 -0
  640. package/src/shield-hcaptcha-hono.strategy.ts +25 -0
  641. package/src/shield-hcaptcha.strategy.ts +7 -13
  642. package/src/shield-maintenance-hono.strategy.ts +23 -0
  643. package/src/shield-maintenance.strategy.ts +17 -0
  644. package/src/shield-rate-limit-hono.strategy.ts +34 -0
  645. package/src/shield-rate-limit.strategy.ts +11 -19
  646. package/src/shield-recaptcha-hono.strategy.ts +31 -0
  647. package/src/shield-recaptcha.strategy.ts +14 -20
  648. package/src/shield-security-hono.strategy.ts +62 -0
  649. package/src/shield-security.strategy.ts +19 -62
  650. package/src/shield-timeout-hono.strategy.ts +25 -0
  651. package/src/shield-timeout.strategy.ts +4 -14
  652. package/src/simulated-error-hono.middleware.ts +17 -0
  653. package/src/simulated-error.middleware.ts +4 -7
  654. package/src/slower-hono.middleware.ts +23 -0
  655. package/src/slower.middleware.ts +8 -7
  656. package/src/ssr-bun.service.ts +25 -0
  657. package/src/ssr.service.ts +66 -0
  658. package/src/{static-files.service.ts → static-files-hono.service.ts} +1 -1
  659. package/src/subject-application-resolver.vo.ts +34 -0
  660. package/src/subject-request-resolver.vo.ts +34 -0
  661. package/src/subject-segment-application.strategy.ts +7 -0
  662. package/src/subject-segment-build.strategy.ts +15 -0
  663. package/src/subject-segment-cookie.strategy.ts +14 -0
  664. package/src/subject-segment-env.strategy.ts +11 -0
  665. package/src/subject-segment-fixed.strategy.ts +12 -0
  666. package/src/subject-segment-header.strategy.ts +14 -0
  667. package/src/subject-segment-ip.strategy.ts +12 -0
  668. package/src/subject-segment-path.strategy.ts +8 -0
  669. package/src/subject-segment-query.strategy.ts +19 -0
  670. package/src/{cache-subject-segment-request.strategy.ts → subject-segment-request.strategy.ts} +4 -4
  671. package/src/subject-segment-user.strategy.ts +12 -0
  672. package/src/time-zone-offset-hono.middleware.ts +26 -0
  673. package/src/time-zone-offset.middleware.ts +6 -18
  674. package/src/timing-hono.middleware.ts +22 -0
  675. package/src/timing.middleware.ts +18 -0
  676. package/src/trailing-slash-hono.middleware.ts +27 -0
  677. package/src/trailing-slash.middleware.ts +11 -0
  678. package/src/translations-hono.handler.ts +26 -0
  679. package/src/translations.handler.ts +31 -0
  680. package/src/weak-etag-extractor-hono.middleware.ts +26 -0
  681. package/src/weak-etag-extractor.middleware.ts +6 -11
  682. package/src/woodchopper-dispatcher-async.strategy.ts +2 -0
  683. package/src/woodchopper-sampling-correlation-id.strategy.ts +2 -2
  684. package/src/woodchopper-sampling-every-nth.strategy.ts +2 -2
  685. package/src/woodchopper.ts +2 -2
  686. package/dist/cache-subject-application-resolver.vo.d.ts +0 -23
  687. package/dist/cache-subject-application-resolver.vo.d.ts.map +0 -1
  688. package/dist/cache-subject-application-resolver.vo.js.map +0 -1
  689. package/dist/cache-subject-request-resolver.vo.d.ts.map +0 -1
  690. package/dist/cache-subject-request-resolver.vo.js.map +0 -1
  691. package/dist/cache-subject-segment-application.strategy.d.ts +0 -6
  692. package/dist/cache-subject-segment-application.strategy.d.ts.map +0 -1
  693. package/dist/cache-subject-segment-application.strategy.js +0 -2
  694. package/dist/cache-subject-segment-application.strategy.js.map +0 -1
  695. package/dist/cache-subject-segment-build.strategy.d.ts +0 -9
  696. package/dist/cache-subject-segment-build.strategy.d.ts.map +0 -1
  697. package/dist/cache-subject-segment-build.strategy.js +0 -13
  698. package/dist/cache-subject-segment-build.strategy.js.map +0 -1
  699. package/dist/cache-subject-segment-cookie.strategy.d.ts +0 -9
  700. package/dist/cache-subject-segment-cookie.strategy.d.ts.map +0 -1
  701. package/dist/cache-subject-segment-cookie.strategy.js +0 -11
  702. package/dist/cache-subject-segment-cookie.strategy.js.map +0 -1
  703. package/dist/cache-subject-segment-env.strategy.d.ts +0 -9
  704. package/dist/cache-subject-segment-env.strategy.d.ts.map +0 -1
  705. package/dist/cache-subject-segment-env.strategy.js.map +0 -1
  706. package/dist/cache-subject-segment-fixed.strategy.d.ts +0 -8
  707. package/dist/cache-subject-segment-fixed.strategy.d.ts.map +0 -1
  708. package/dist/cache-subject-segment-fixed.strategy.js.map +0 -1
  709. package/dist/cache-subject-segment-header.strategy.d.ts +0 -9
  710. package/dist/cache-subject-segment-header.strategy.d.ts.map +0 -1
  711. package/dist/cache-subject-segment-header.strategy.js +0 -11
  712. package/dist/cache-subject-segment-header.strategy.js.map +0 -1
  713. package/dist/cache-subject-segment-ip.strategy.d.ts +0 -6
  714. package/dist/cache-subject-segment-ip.strategy.d.ts.map +0 -1
  715. package/dist/cache-subject-segment-ip.strategy.js +0 -7
  716. package/dist/cache-subject-segment-ip.strategy.js.map +0 -1
  717. package/dist/cache-subject-segment-path.strategy.d.ts +0 -6
  718. package/dist/cache-subject-segment-path.strategy.d.ts.map +0 -1
  719. package/dist/cache-subject-segment-path.strategy.js +0 -6
  720. package/dist/cache-subject-segment-path.strategy.js.map +0 -1
  721. package/dist/cache-subject-segment-query.strategy.d.ts +0 -7
  722. package/dist/cache-subject-segment-query.strategy.d.ts.map +0 -1
  723. package/dist/cache-subject-segment-query.strategy.js +0 -12
  724. package/dist/cache-subject-segment-query.strategy.js.map +0 -1
  725. package/dist/cache-subject-segment-request.strategy.d.ts +0 -9
  726. package/dist/cache-subject-segment-request.strategy.d.ts.map +0 -1
  727. package/dist/cache-subject-segment-request.strategy.js +0 -2
  728. package/dist/cache-subject-segment-request.strategy.js.map +0 -1
  729. package/dist/cache-subject-segment-user.strategy.d.ts +0 -6
  730. package/dist/cache-subject-segment-user.strategy.d.ts.map +0 -1
  731. package/dist/cache-subject-segment-user.strategy.js +0 -7
  732. package/dist/cache-subject-segment-user.strategy.js.map +0 -1
  733. package/dist/context.middleware.d.ts +0 -14
  734. package/dist/context.middleware.d.ts.map +0 -1
  735. package/dist/context.middleware.js +0 -11
  736. package/dist/context.middleware.js.map +0 -1
  737. package/dist/healthcheck.service.d.ts +0 -96
  738. package/dist/healthcheck.service.d.ts.map +0 -1
  739. package/dist/healthcheck.service.js.map +0 -1
  740. package/dist/maintenance-mode.middleware.d.ts +0 -11
  741. package/dist/maintenance-mode.middleware.d.ts.map +0 -1
  742. package/dist/maintenance-mode.middleware.js +0 -12
  743. package/dist/maintenance-mode.middleware.js.map +0 -1
  744. package/dist/ping.service.d.ts +0 -4
  745. package/dist/ping.service.d.ts.map +0 -1
  746. package/dist/ping.service.js +0 -6
  747. package/dist/ping.service.js.map +0 -1
  748. package/dist/setup.service.d.ts +0 -35
  749. package/dist/setup.service.d.ts.map +0 -1
  750. package/dist/setup.service.js.map +0 -1
  751. package/dist/shield-hcaptcha-local.strategy.d.ts +0 -11
  752. package/dist/shield-hcaptcha-local.strategy.d.ts.map +0 -1
  753. package/dist/shield-hcaptcha-local.strategy.js +0 -23
  754. package/dist/shield-hcaptcha-local.strategy.js.map +0 -1
  755. package/dist/shield-noop.strategy.d.ts +0 -5
  756. package/dist/shield-noop.strategy.d.ts.map +0 -1
  757. package/dist/shield-noop.strategy.js +0 -5
  758. package/dist/shield-noop.strategy.js.map +0 -1
  759. package/dist/shield.strategy.d.ts +0 -5
  760. package/dist/shield.strategy.d.ts.map +0 -1
  761. package/dist/shield.strategy.js +0 -2
  762. package/dist/shield.strategy.js.map +0 -1
  763. package/dist/ssr.d.ts.map +0 -1
  764. package/dist/ssr.js +0 -43
  765. package/dist/ssr.js.map +0 -1
  766. package/dist/static-files.service.d.ts.map +0 -1
  767. package/dist/static-files.service.js.map +0 -1
  768. package/dist/translations.service.d.ts +0 -21
  769. package/dist/translations.service.d.ts.map +0 -1
  770. package/dist/translations.service.js +0 -11
  771. package/dist/translations.service.js.map +0 -1
  772. package/src/cache-subject-application-resolver.vo.ts +0 -34
  773. package/src/cache-subject-request-resolver.vo.ts +0 -39
  774. package/src/cache-subject-segment-application.strategy.ts +0 -7
  775. package/src/cache-subject-segment-build.strategy.ts +0 -15
  776. package/src/cache-subject-segment-cookie.strategy.ts +0 -14
  777. package/src/cache-subject-segment-env.strategy.ts +0 -11
  778. package/src/cache-subject-segment-fixed.strategy.ts +0 -15
  779. package/src/cache-subject-segment-header.strategy.ts +0 -14
  780. package/src/cache-subject-segment-ip.strategy.ts +0 -12
  781. package/src/cache-subject-segment-path.strategy.ts +0 -11
  782. package/src/cache-subject-segment-query.strategy.ts +0 -19
  783. package/src/cache-subject-segment-user.strategy.ts +0 -12
  784. package/src/context.middleware.ts +0 -24
  785. package/src/healthcheck.service.ts +0 -154
  786. package/src/maintenance-mode.middleware.ts +0 -15
  787. package/src/ping.service.ts +0 -7
  788. package/src/shield-hcaptcha-local.strategy.ts +0 -24
  789. package/src/shield-noop.strategy.ts +0 -6
  790. package/src/shield.strategy.ts +0 -5
  791. package/src/ssr.ts +0 -57
  792. package/src/translations.service.ts +0 -20
@@ -1,17 +1,28 @@
1
- import { basicAuth } from "hono/basic-auth";
2
- import { createMiddleware } from "hono/factory";
3
1
  import type { BasicAuthPasswordType } from "./basic-auth-password.vo";
4
2
  import type { BasicAuthUsernameType } from "./basic-auth-username.vo";
5
- import type { ShieldStrategy } from "./shield.strategy";
3
+ import type { HasRequestHeader } from "./request-context.port";
6
4
 
7
- type ShieldBasicAuthConfigType = { username: BasicAuthUsernameType; password: BasicAuthPasswordType };
5
+ export type ShieldBasicAuthConfig = { username: BasicAuthUsernameType; password: BasicAuthPasswordType };
8
6
 
9
- export class ShieldBasicAuthStrategy implements ShieldStrategy {
10
- private readonly basicAuth;
7
+ export const ShieldBasicAuthStrategyError = { Rejected: "shield.basic.auth.rejected" };
11
8
 
12
- constructor(config: ShieldBasicAuthConfigType) {
13
- this.basicAuth = basicAuth(config);
14
- }
9
+ export class ShieldBasicAuthStrategy {
10
+ constructor(private readonly config: ShieldBasicAuthConfig) {}
11
+
12
+ evaluate(context: HasRequestHeader): boolean {
13
+ const header = context.request.header("authorization");
14
+
15
+ try {
16
+ const credentials = atob(String(header).replace("Basic ", ""));
15
17
 
16
- verify = createMiddleware(async (context, next) => this.basicAuth(context, next));
18
+ const [username, password] = credentials.split(":");
19
+
20
+ if (username !== this.config.username) return false;
21
+ if (password !== this.config.password) return false;
22
+
23
+ return true;
24
+ } catch {
25
+ return false;
26
+ }
27
+ }
17
28
  }
@@ -0,0 +1,30 @@
1
+ import { createMiddleware } from "hono/factory";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
4
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
5
+ import {
6
+ type ShieldBodyLimitConfig,
7
+ ShieldBodyLimitError,
8
+ ShieldBodyLimitStrategy,
9
+ } from "./shield-body-limit.strategy";
10
+
11
+ export const ShieldBodyLimitTooBigError = new HTTPException(413, { message: ShieldBodyLimitError.TooBig });
12
+
13
+ export class ShieldBodyLimitHonoStrategy implements MiddlewareHonoPort {
14
+ private readonly strategy: ShieldBodyLimitStrategy;
15
+
16
+ constructor(config: ShieldBodyLimitConfig) {
17
+ this.strategy = new ShieldBodyLimitStrategy(config);
18
+ }
19
+
20
+ handle() {
21
+ return createMiddleware(async (c, next) => {
22
+ const context = new RequestContextHonoAdapter(c);
23
+
24
+ const result = this.strategy.evaluate(context);
25
+
26
+ if (!result) throw ShieldBodyLimitTooBigError;
27
+ return next();
28
+ });
29
+ }
30
+ }
@@ -0,0 +1,23 @@
1
+ import * as tools from "@bgord/tools";
2
+ import type { HasRequestHeader } from "./request-context.port";
3
+
4
+ export type ShieldBodyLimitConfig = { maxSize: tools.Size };
5
+
6
+ export const ShieldBodyLimitError = { TooBig: "shield.body.limit.rejected" };
7
+
8
+ export class ShieldBodyLimitStrategy {
9
+ constructor(private readonly config: ShieldBodyLimitConfig) {}
10
+
11
+ evaluate(context: HasRequestHeader): boolean {
12
+ const header = context.request.header("content-length");
13
+
14
+ const contentLength = tools.SizeBytes.safeParse(Number(header));
15
+
16
+ if (!contentLength.success) return true;
17
+
18
+ const size = tools.Size.fromBytes(contentLength.data);
19
+
20
+ if (size.isGreaterThan(this.config.maxSize)) return false;
21
+ return true;
22
+ }
23
+ }
@@ -0,0 +1,24 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
4
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
5
+ import { type ShieldCsrfConfig, ShieldCsrfStrategy, ShieldCsrfStrategyError } from "./shield-csrf.strategy";
6
+
7
+ export const ShieldCsrfError = new HTTPException(403, { message: ShieldCsrfStrategyError.Rejected });
8
+
9
+ export class ShieldCsrfHonoStrategy implements MiddlewareHonoPort {
10
+ private readonly strategy: ShieldCsrfStrategy;
11
+
12
+ constructor(config: ShieldCsrfConfig) {
13
+ this.strategy = new ShieldCsrfStrategy(config);
14
+ }
15
+
16
+ handle(): MiddlewareHandler {
17
+ return async (c, next) => {
18
+ const context = new RequestContextHonoAdapter(c);
19
+
20
+ if (this.strategy.evaluate(context)) return next();
21
+ throw ShieldCsrfError;
22
+ };
23
+ }
24
+ }
@@ -1,26 +1,21 @@
1
- import { createMiddleware } from "hono/factory";
2
- import { HTTPException } from "hono/http-exception";
3
- import { RequestContextAdapterHono } from "./request-context-hono.adapter";
4
- import type { ShieldStrategy } from "./shield.strategy";
1
+ import type { HasRequestHeader, HasRequestMethod } from "./request-context.port";
5
2
 
6
3
  const STATE_CHANGING_METHODS = ["POST", "PUT", "PATCH", "DELETE"];
7
4
 
8
- export type ShieldCsrfConfigType = { origin: ReadonlyArray<string> };
5
+ export type ShieldCsrfConfig = { origin: ReadonlyArray<string> };
9
6
 
10
- export const ShieldCsrfError = new HTTPException(403, { message: "shield.csrf" });
7
+ export const ShieldCsrfStrategyError = { Rejected: "shield.csrf.rejected" };
11
8
 
12
- export class ShieldCsrfStrategy implements ShieldStrategy {
13
- constructor(private readonly config: ShieldCsrfConfigType) {}
9
+ export class ShieldCsrfStrategy {
10
+ constructor(private readonly config: ShieldCsrfConfig) {}
14
11
 
15
- verify = createMiddleware(async (c, next) => {
16
- const context = new RequestContextAdapterHono(c);
17
-
18
- if (!STATE_CHANGING_METHODS.includes(context.request.method)) return next();
12
+ evaluate(context: HasRequestMethod & HasRequestHeader): boolean {
13
+ if (!STATE_CHANGING_METHODS.includes(context.request.method)) return true;
19
14
 
20
15
  const origin = context.request.header("origin");
21
16
 
22
- if (!origin) return next();
23
- if (!this.config.origin.includes(origin)) throw ShieldCsrfError;
24
- return next();
25
- });
17
+ if (!origin) return true;
18
+ if (!this.config.origin.includes(origin)) return false;
19
+ return true;
20
+ }
26
21
  }
@@ -0,0 +1,26 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
4
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
5
+ import { ShieldHcaptchaStrategy } from "./shield-hcaptcha.strategy";
6
+
7
+ export const ShieldHcaptchaLocalStrategyError = { Rejected: "shield.hcaptcha.local.rejected" };
8
+
9
+ export const ShieldHcaptchaLocalError = new HTTPException(403, {
10
+ message: ShieldHcaptchaLocalStrategyError.Rejected,
11
+ });
12
+
13
+ export class ShieldHcaptchaLocalHonoStrategy implements MiddlewareHonoPort {
14
+ private readonly strategy: ShieldHcaptchaStrategy;
15
+
16
+ constructor(secretKey: HCaptchaSecretKeyType) {
17
+ this.strategy = new ShieldHcaptchaStrategy(secretKey);
18
+ }
19
+
20
+ handle(): MiddlewareHandler {
21
+ return async (_c, next) => {
22
+ if (await this.strategy.evaluate("10000000-aaaa-bbbb-cccc-000000000001")) return next();
23
+ throw ShieldHcaptchaLocalError;
24
+ };
25
+ }
26
+ }
@@ -0,0 +1,25 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
4
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
5
+ import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyError } from "./shield-hcaptcha.strategy";
6
+
7
+ export const ShieldHcaptchaError = new HTTPException(403, { message: ShieldHcaptchaStrategyError.Rejected });
8
+
9
+ export class ShieldHcaptchaHonoStrategy implements MiddlewareHonoPort {
10
+ private readonly strategy: ShieldHcaptchaStrategy;
11
+
12
+ constructor(secretKey: HCaptchaSecretKeyType) {
13
+ this.strategy = new ShieldHcaptchaStrategy(secretKey);
14
+ }
15
+
16
+ handle(): MiddlewareHandler {
17
+ return async (c, next) => {
18
+ const form = await c.req.formData();
19
+ const token = form.get("h-captcha-response")?.toString();
20
+
21
+ if (await this.strategy.evaluate(token)) return next();
22
+ throw ShieldHcaptchaError;
23
+ };
24
+ }
25
+ }
@@ -1,26 +1,20 @@
1
- import { createMiddleware } from "hono/factory";
2
- import { HTTPException } from "hono/http-exception";
3
1
  import { HCaptchaService } from "./hcaptcha.service";
4
2
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
5
- import type { ShieldStrategy } from "./shield.strategy";
6
3
 
7
- export const ShieldHcaptchaError = new HTTPException(403, { message: "shield.hcaptcha" });
4
+ export const ShieldHcaptchaStrategyError = { Rejected: "shield.hcaptcha.rejected" };
8
5
 
9
- export class ShieldHcaptchaStrategy implements ShieldStrategy {
6
+ export class ShieldHcaptchaStrategy {
10
7
  private readonly hcaptcha = new HCaptchaService();
11
8
 
12
9
  constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
13
10
 
14
- verify = createMiddleware(async (context, next) => {
11
+ async evaluate(token: string | undefined): Promise<boolean> {
15
12
  try {
16
- const form = await context.req.formData();
17
- const hcaptchaTokenFormData = form.get("h-captcha-response")?.toString();
18
- const result = await this.hcaptcha.verify(this.secretKey, hcaptchaTokenFormData);
13
+ const result = await this.hcaptcha.verify(this.secretKey, token);
19
14
 
20
- if (!result.success) throw ShieldHcaptchaError;
21
- return next();
15
+ return result.success;
22
16
  } catch {
23
- throw ShieldHcaptchaError;
17
+ return false;
24
18
  }
25
- });
19
+ }
26
20
  }
@@ -0,0 +1,23 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
3
+ import { type ShieldMaintenanceConfig, ShieldMaintenanceStrategy } from "./shield-maintenance.strategy";
4
+
5
+ export class ShieldMaintenanceHonoStrategy implements MiddlewareHonoPort {
6
+ private readonly strategy: ShieldMaintenanceStrategy;
7
+
8
+ constructor(config?: ShieldMaintenanceConfig) {
9
+ this.strategy = new ShieldMaintenanceStrategy(config);
10
+ }
11
+
12
+ handle(): MiddlewareHandler {
13
+ return async (c, next) => {
14
+ const maintenance = this.strategy.evaluate();
15
+
16
+ if (!maintenance.enabled) return next();
17
+
18
+ return c.json({ reason: "maintenance" }, 503, {
19
+ "Retry-After": maintenance.RetryAfter.seconds.toString(),
20
+ });
21
+ };
22
+ }
23
+ }
@@ -0,0 +1,17 @@
1
+ import * as tools from "@bgord/tools";
2
+
3
+ export type ShieldMaintenanceConfig = { enabled: boolean; RetryAfter?: tools.Duration };
4
+
5
+ export class ShieldMaintenanceStrategy {
6
+ private readonly enabled: boolean;
7
+ private readonly RetryAfter: tools.Duration;
8
+
9
+ constructor(config?: ShieldMaintenanceConfig) {
10
+ this.enabled = config?.enabled ?? false;
11
+ this.RetryAfter = config?.RetryAfter ?? tools.Duration.Hours(1);
12
+ }
13
+
14
+ evaluate(): { enabled: boolean; RetryAfter: tools.Duration } {
15
+ return { enabled: this.enabled, RetryAfter: this.RetryAfter };
16
+ }
17
+ }
@@ -0,0 +1,34 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import type { CacheResolverStrategy } from "./cache-resolver.strategy";
4
+ import type { ClockPort } from "./clock.port";
5
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
6
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
7
+ import {
8
+ type ShieldRateLimitConfig,
9
+ ShieldRateLimitStrategy,
10
+ ShieldRateLimitStrategyError,
11
+ } from "./shield-rate-limit.strategy";
12
+
13
+ type Dependencies = { Clock: ClockPort; CacheResolver: CacheResolverStrategy };
14
+
15
+ export const ShieldRateLimitError = new HTTPException(429, {
16
+ message: ShieldRateLimitStrategyError.Rejected,
17
+ });
18
+
19
+ export class ShieldRateLimitHonoStrategy implements MiddlewareHonoPort {
20
+ private readonly strategy: ShieldRateLimitStrategy;
21
+
22
+ constructor(config: ShieldRateLimitConfig, deps: Dependencies) {
23
+ this.strategy = new ShieldRateLimitStrategy(config, deps);
24
+ }
25
+
26
+ handle(): MiddlewareHandler {
27
+ return async (c, next) => {
28
+ const context = new RequestContextHonoAdapter(c);
29
+
30
+ if (await this.strategy.evaluate(context)) return next();
31
+ throw ShieldRateLimitError;
32
+ };
33
+ }
34
+ }
@@ -1,37 +1,29 @@
1
1
  import * as tools from "@bgord/tools";
2
- import { createMiddleware } from "hono/factory";
3
- import { HTTPException } from "hono/http-exception";
4
2
  import type { CacheResolverStrategy } from "./cache-resolver.strategy";
5
- import type { CacheSubjectRequestResolver } from "./cache-subject-request-resolver.vo";
6
3
  import type { ClockPort } from "./clock.port";
7
- import { RequestContextAdapterHono } from "./request-context-hono.adapter";
8
- import type { ShieldStrategy } from "./shield.strategy";
4
+ import type { RequestContext } from "./request-context.port";
5
+ import type { SubjectRequestResolver } from "./subject-request-resolver.vo";
9
6
 
10
- type ShieldRateLimitOptionsType = { resolver: CacheSubjectRequestResolver; window: tools.Duration };
7
+ export type ShieldRateLimitConfig = { resolver: SubjectRequestResolver; window: tools.Duration };
11
8
 
12
9
  type Dependencies = { Clock: ClockPort; CacheResolver: CacheResolverStrategy };
13
10
 
14
- export const ShieldRateLimitError = new HTTPException(429, { message: "shield.rate.limit" });
11
+ export const ShieldRateLimitStrategyError = { Rejected: "shield.rate.limit.rejected" };
15
12
 
16
- export class ShieldRateLimitStrategy implements ShieldStrategy {
13
+ export class ShieldRateLimitStrategy {
17
14
  constructor(
18
- private readonly options: ShieldRateLimitOptionsType,
15
+ private readonly config: ShieldRateLimitConfig,
19
16
  private readonly deps: Dependencies,
20
17
  ) {}
21
18
 
22
- verify = createMiddleware(async (c, next) => {
23
- const context = new RequestContextAdapterHono(c);
24
- const subject = await this.options.resolver.resolve(context);
19
+ async evaluate(context: RequestContext): Promise<boolean> {
20
+ const subject = await this.config.resolver.resolve(context);
25
21
 
26
22
  const limiter = await this.deps.CacheResolver.resolve(
27
23
  subject.hex,
28
- async () => new tools.RateLimiter(this.options.window),
24
+ async () => new tools.RateLimiter(this.config.window),
29
25
  );
30
26
 
31
- const result = limiter.verify(this.deps.Clock.now());
32
-
33
- if (!result.allowed) throw ShieldRateLimitError;
34
-
35
- return next();
36
- });
27
+ return limiter.verify(this.deps.Clock.now()).allowed;
28
+ }
37
29
  }
@@ -0,0 +1,31 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
4
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
5
+ import {
6
+ type ShieldRecaptchaConfig,
7
+ ShieldRecaptchaStrategy,
8
+ ShieldRecaptchaStrategyError,
9
+ } from "./shield-recaptcha.strategy";
10
+
11
+ export const ShieldRecaptchaError = new HTTPException(403, {
12
+ message: ShieldRecaptchaStrategyError.Rejected,
13
+ });
14
+
15
+ export class ShieldRecaptchaHonoStrategy implements MiddlewareHonoPort {
16
+ private readonly strategy: ShieldRecaptchaStrategy;
17
+
18
+ constructor(config: ShieldRecaptchaConfig) {
19
+ this.strategy = new ShieldRecaptchaStrategy(config);
20
+ }
21
+
22
+ handle(): MiddlewareHandler {
23
+ return async (c, next) => {
24
+ const context = new RequestContextHonoAdapter(c);
25
+ const token = (await c.req.formData()).get("g-recaptcha-response")?.toString() ?? null;
26
+
27
+ if (await this.strategy.evaluate(context, token)) return next();
28
+ throw ShieldRecaptchaError;
29
+ };
30
+ }
31
+ }
@@ -1,34 +1,28 @@
1
1
  import * as tools from "@bgord/tools";
2
- import { createMiddleware } from "hono/factory";
3
- import { HTTPException } from "hono/http-exception";
4
2
  import type { RecaptchaSecretKeyType } from "./recaptcha-secret-key.vo";
5
- import { RequestContextAdapterHono } from "./request-context-hono.adapter";
6
- import type { ShieldStrategy } from "./shield.strategy";
3
+ import type { HasRequestHeader, HasRequestQuery } from "./request-context.port";
7
4
 
8
- export type RecaptchaVerifierConfigType = { secretKey: RecaptchaSecretKeyType };
9
- export type RecaptchaResultType = { success: boolean; score: number };
5
+ export type ShieldRecaptchaConfig = { secretKey: RecaptchaSecretKeyType };
6
+ export type RecaptchaResult = { success: boolean; score: number };
10
7
 
11
- export const ShieldRecaptchaError = new HTTPException(403, { message: "shield.recaptcha" });
8
+ export const ShieldRecaptchaStrategyError = { Rejected: "shield.recaptcha.rejected" };
12
9
 
13
- export class ShieldRecaptchaStrategy implements ShieldStrategy {
10
+ export class ShieldRecaptchaStrategy {
14
11
  private static readonly URL = tools.UrlWithoutSlash.parse(
15
12
  "https://www.google.com/recaptcha/api/siteverify",
16
13
  );
17
14
 
18
- constructor(private readonly config: RecaptchaVerifierConfigType) {}
15
+ constructor(private readonly config: ShieldRecaptchaConfig) {}
19
16
 
20
- verify = createMiddleware(async (c, next) => {
17
+ async evaluate(context: HasRequestHeader & HasRequestQuery, formToken: string | null): Promise<boolean> {
21
18
  try {
22
- const context = new RequestContextAdapterHono(c);
23
-
24
19
  const header = context.request.header("x-recaptcha-token");
25
20
  const query = context.request.query().recaptchaToken;
26
- const form = (await c.req.formData()).get("g-recaptcha-response")?.toString();
27
21
  const remoteip = context.request.header("x-forwarded-for") ?? "";
28
22
 
29
- const token = header ?? query ?? form;
23
+ const token = header ?? query ?? formToken;
30
24
 
31
- if (!token) throw ShieldRecaptchaError;
25
+ if (!token) return false;
32
26
 
33
27
  const params = new URLSearchParams({ secret: this.config.secretKey, response: token, remoteip });
34
28
 
@@ -38,13 +32,13 @@ export class ShieldRecaptchaStrategy implements ShieldStrategy {
38
32
  body: params,
39
33
  });
40
34
 
41
- const result: RecaptchaResultType = await response.json();
35
+ const result: RecaptchaResult = await response.json();
42
36
 
43
- if (!result.success || result.score < 0.5) throw ShieldRecaptchaError;
37
+ if (!result.success || result.score < 0.5) return false;
44
38
 
45
- await next();
39
+ return true;
46
40
  } catch {
47
- throw ShieldRecaptchaError;
41
+ return false;
48
42
  }
49
- });
43
+ }
50
44
  }
@@ -0,0 +1,62 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import type { ContentfulStatusCode } from "hono/utils/http-status";
3
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
4
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
5
+ import type { SecurityPolicy } from "./security-policy.vo";
6
+ import { ShieldSecurityStrategy } from "./shield-security.strategy";
7
+ import type { SleeperPort } from "./sleeper.port";
8
+
9
+ type Dependencies = { Sleeper: SleeperPort };
10
+
11
+ export const ShieldSecurityHonoStrategyError = {
12
+ Unhandled: "shield.security.hono.strategy.error.unhandled",
13
+ };
14
+
15
+ export class ShieldSecurityHonoStrategy implements MiddlewareHonoPort {
16
+ private readonly strategy: ShieldSecurityStrategy;
17
+
18
+ constructor(
19
+ policies: ReadonlyArray<SecurityPolicy>,
20
+ private readonly deps: Dependencies,
21
+ ) {
22
+ this.strategy = new ShieldSecurityStrategy(policies);
23
+ }
24
+
25
+ handle(): MiddlewareHandler {
26
+ return async (c, next) => {
27
+ const context = new RequestContextHonoAdapter(c);
28
+ const action = await this.strategy.evaluate(context);
29
+
30
+ if (!action) return next();
31
+
32
+ switch (action.kind) {
33
+ case "allow":
34
+ return next();
35
+
36
+ case "deny":
37
+ return c.text(action.reason, action.response.status as ContentfulStatusCode);
38
+
39
+ case "mirage":
40
+ return c.json({}, action.response.status as ContentfulStatusCode);
41
+
42
+ case "delay": {
43
+ await this.deps.Sleeper.wait(action.duration);
44
+
45
+ switch (action.after.kind) {
46
+ case "allow":
47
+ return next();
48
+
49
+ case "deny":
50
+ return c.text(action.after.reason, action.after.response.status as ContentfulStatusCode);
51
+
52
+ case "mirage":
53
+ return c.json({}, action.after.response.status as ContentfulStatusCode);
54
+
55
+ default:
56
+ throw new Error(ShieldSecurityHonoStrategyError.Unhandled);
57
+ }
58
+ }
59
+ }
60
+ };
61
+ }
62
+ }
@@ -1,81 +1,38 @@
1
- import { createMiddleware } from "hono/factory";
2
- import type { ContentfulStatusCode } from "hono/utils/http-status";
3
1
  import { Client } from "./client.vo";
4
- import { RequestContextAdapterHono } from "./request-context-hono.adapter";
2
+ import type { HasIdentityIp, HasIdentityUa, HasIdentityUserId, RequestContext } from "./request-context.port";
5
3
  import { SecurityContext } from "./security-context.vo";
4
+ import type { SecurityAction } from "./security-countermeasure.strategy";
6
5
  import type { SecurityPolicy } from "./security-policy.vo";
7
- import type { ShieldStrategy } from "./shield.strategy";
8
- import type { SleeperPort } from "./sleeper.port";
9
6
 
10
- type Dependencies = { Sleeper: SleeperPort };
11
-
12
- export const ShieldSecurityAdapterError = {
13
- Unhandled: "shield.security.adapter.error.unhandled",
14
- MissingPolicies: "shield.security.adapter.error.missing.policies",
15
- MaxPolicies: "shield.security.adapter.error.max.policies",
7
+ export const ShieldSecurityStrategyError = {
8
+ MissingPolicies: "shield.security.strategy.error.missing.policies",
9
+ MaxPolicies: "shield.security.strategy.error.max.policies",
16
10
  };
17
11
 
18
- export class ShieldSecurityStrategy implements ShieldStrategy {
19
- constructor(
20
- private readonly policies: ReadonlyArray<SecurityPolicy>,
21
- private readonly deps: Dependencies,
22
- ) {
23
- if (policies.length === 0) throw new Error(ShieldSecurityAdapterError.MissingPolicies);
24
- if (policies.length > 5) throw new Error(ShieldSecurityAdapterError.MaxPolicies);
12
+ export class ShieldSecurityStrategy {
13
+ constructor(private readonly policies: ReadonlyArray<SecurityPolicy>) {
14
+ if (policies.length === 0) throw new Error(ShieldSecurityStrategyError.MissingPolicies);
15
+ if (policies.length > 5) throw new Error(ShieldSecurityStrategyError.MaxPolicies);
25
16
  }
26
17
 
27
- verify = createMiddleware(async (c, next) => {
18
+ async evaluate(
19
+ context: RequestContext & HasIdentityIp & HasIdentityUa & HasIdentityUserId,
20
+ ): Promise<SecurityAction | null> {
28
21
  for (const policy of this.policies) {
29
- const request = new RequestContextAdapterHono(c);
30
-
31
- const violation = await policy.rule.isViolated(request);
22
+ const violation = await policy.rule.isViolated(context);
32
23
 
33
24
  if (!violation) continue;
34
25
 
35
- const context = new SecurityContext(
26
+ const securityContext = new SecurityContext(
36
27
  policy.rule.name,
37
28
  policy.countermeasure.name,
38
- Client.fromParts(request.identity.ip(), request.identity.ua()),
39
- request.identity.userId(),
29
+ Client.fromParts(context.identity.ip(), context.identity.ua()),
30
+ context.identity.userId(),
40
31
  );
41
32
 
42
- const action = await policy.countermeasure.execute(context);
43
-
44
- // Stryker disable all
45
- switch (action.kind) {
46
- case "allow":
47
- return next();
48
-
49
- case "deny":
50
- return c.text(action.reason, action.response.status as ContentfulStatusCode);
51
-
52
- case "mirage":
53
- return c.json({}, action.response.status as ContentfulStatusCode);
54
-
55
- case "delay": {
56
- await this.deps.Sleeper.wait(action.duration);
57
-
58
- switch (action.after.kind) {
59
- case "allow":
60
- return next();
61
-
62
- case "deny":
63
- return c.text(action.after.reason, action.after.response.status as ContentfulStatusCode);
64
-
65
- case "mirage":
66
- return c.json({}, action.after.response.status as ContentfulStatusCode);
67
-
68
- case "delay":
69
- throw new Error(ShieldSecurityAdapterError.Unhandled);
70
-
71
- default:
72
- throw new Error(ShieldSecurityAdapterError.Unhandled);
73
- }
74
- }
75
- }
76
- // Stryker restore all
33
+ return await policy.countermeasure.execute(securityContext);
77
34
  }
78
35
 
79
- return next();
80
- });
36
+ return null;
37
+ }
81
38
  }
@@ -0,0 +1,25 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ import { timeout } from "hono/timeout";
4
+ import type { MiddlewareHonoPort } from "./middleware-hono.port";
5
+ import {
6
+ type ShieldTimeoutConfig,
7
+ ShieldTimeoutStrategy,
8
+ ShieldTimeoutStrategyError,
9
+ } from "./shield-timeout.strategy";
10
+
11
+ export const ShieldTimeoutError = new HTTPException(408, { message: ShieldTimeoutStrategyError.Rejected });
12
+
13
+ export class ShieldTimeoutHonoStrategy implements MiddlewareHonoPort {
14
+ private readonly timeout: MiddlewareHandler;
15
+
16
+ constructor(config: ShieldTimeoutConfig) {
17
+ const strategy = new ShieldTimeoutStrategy(config);
18
+
19
+ this.timeout = timeout(strategy.config.duration.ms, ShieldTimeoutError);
20
+ }
21
+
22
+ handle(): MiddlewareHandler {
23
+ return this.timeout;
24
+ }
25
+ }