@blamejs/blamejs-shop 0.0.44

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 (1220) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/LICENSE +17 -0
  3. package/README.md +117 -0
  4. package/SECURITY.md +139 -0
  5. package/lib/admin.js +952 -0
  6. package/lib/analytics.js +267 -0
  7. package/lib/cart.js +279 -0
  8. package/lib/catalog-import.js +344 -0
  9. package/lib/catalog.js +769 -0
  10. package/lib/checkout.js +320 -0
  11. package/lib/config.js +151 -0
  12. package/lib/customers.js +322 -0
  13. package/lib/email.js +242 -0
  14. package/lib/externaldb-d1.js +283 -0
  15. package/lib/index.js +57 -0
  16. package/lib/inventory-alerts.js +198 -0
  17. package/lib/newsletter.js +142 -0
  18. package/lib/order.js +380 -0
  19. package/lib/payment.js +318 -0
  20. package/lib/pricing.js +185 -0
  21. package/lib/r2-bridge.js +169 -0
  22. package/lib/shipping.js +185 -0
  23. package/lib/storefront.js +2160 -0
  24. package/lib/subscriptions.js +410 -0
  25. package/lib/tax.js +161 -0
  26. package/lib/theme.js +194 -0
  27. package/lib/vendor/MANIFEST.json +19 -0
  28. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
  29. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
  30. package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
  31. package/lib/vendor/blamejs/.dockerignore +45 -0
  32. package/lib/vendor/blamejs/.gitattributes +42 -0
  33. package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
  34. package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
  35. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
  36. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
  37. package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
  38. package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
  39. package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
  40. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
  41. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
  42. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
  43. package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
  44. package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
  45. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
  46. package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
  47. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
  48. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
  49. package/lib/vendor/blamejs/.gitignore +102 -0
  50. package/lib/vendor/blamejs/.gitleaks.toml +166 -0
  51. package/lib/vendor/blamejs/.hadolint.yaml +18 -0
  52. package/lib/vendor/blamejs/.npmrc +5 -0
  53. package/lib/vendor/blamejs/.pinact.yaml +17 -0
  54. package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
  55. package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
  56. package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
  57. package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
  58. package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
  59. package/lib/vendor/blamejs/LICENSE +201 -0
  60. package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
  61. package/lib/vendor/blamejs/MIGRATING.md +29 -0
  62. package/lib/vendor/blamejs/NOTICE +81 -0
  63. package/lib/vendor/blamejs/README.md +304 -0
  64. package/lib/vendor/blamejs/SECURITY.md +432 -0
  65. package/lib/vendor/blamejs/api-snapshot.json +48709 -0
  66. package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
  67. package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
  68. package/lib/vendor/blamejs/bench/README.md +77 -0
  69. package/lib/vendor/blamejs/bench/_helpers.js +70 -0
  70. package/lib/vendor/blamejs/bench/baseline.json +183 -0
  71. package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
  72. package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
  73. package/lib/vendor/blamejs/bench/run.js +140 -0
  74. package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
  75. package/lib/vendor/blamejs/bin/blamejs.js +13 -0
  76. package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
  77. package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
  78. package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
  79. package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
  80. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
  81. package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
  82. package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
  83. package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
  84. package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
  85. package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
  86. package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
  87. package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
  88. package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
  89. package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
  90. package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
  91. package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
  92. package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
  93. package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
  94. package/lib/vendor/blamejs/eslint.config.mjs +204 -0
  95. package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
  96. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
  97. package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
  98. package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
  99. package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
  100. package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
  101. package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
  102. package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
  103. package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
  104. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
  105. package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
  106. package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
  107. package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
  108. package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
  109. package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
  110. package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
  111. package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
  112. package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
  113. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
  114. package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
  115. package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
  116. package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
  117. package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
  118. package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
  119. package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
  120. package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
  121. package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
  122. package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
  123. package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
  124. package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
  125. package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
  126. package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
  127. package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
  128. package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
  129. package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
  130. package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
  131. package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
  132. package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
  133. package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
  134. package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
  135. package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
  136. package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
  137. package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
  138. package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
  139. package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
  140. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
  141. package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
  142. package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
  143. package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
  144. package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
  145. package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
  146. package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
  147. package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
  148. package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
  149. package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
  150. package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
  151. package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
  152. package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
  153. package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
  154. package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
  155. package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
  156. package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
  157. package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
  158. package/lib/vendor/blamejs/fuzz/README.md +137 -0
  159. package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
  160. package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
  161. package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
  162. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
  163. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
  164. package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
  165. package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
  166. package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
  167. package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
  168. package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
  169. package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
  170. package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
  171. package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
  172. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
  173. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
  174. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
  175. package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
  176. package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
  177. package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
  178. package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
  179. package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
  180. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
  181. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
  182. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
  183. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
  184. package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
  185. package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
  186. package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
  187. package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
  188. package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
  189. package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
  190. package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
  191. package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
  192. package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
  193. package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
  194. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
  195. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
  196. package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
  197. package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
  198. package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
  199. package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
  200. package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
  201. package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
  202. package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
  203. package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
  204. package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
  205. package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
  206. package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
  207. package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
  208. package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
  209. package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
  210. package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
  211. package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
  212. package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
  213. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
  214. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
  215. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
  216. package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
  217. package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
  218. package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
  219. package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
  220. package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
  221. package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
  222. package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
  223. package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
  224. package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
  225. package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
  226. package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
  227. package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
  228. package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
  229. package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
  230. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
  231. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
  232. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
  233. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
  234. package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
  235. package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
  236. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
  237. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
  238. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
  239. package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
  240. package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
  241. package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
  242. package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
  243. package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
  244. package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
  245. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
  246. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
  247. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
  248. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
  249. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
  250. package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
  251. package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
  252. package/lib/vendor/blamejs/index.js +678 -0
  253. package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
  254. package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
  255. package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
  256. package/lib/vendor/blamejs/lib/a2a.js +407 -0
  257. package/lib/vendor/blamejs/lib/acme.js +1448 -0
  258. package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
  259. package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
  260. package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
  261. package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
  262. package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
  263. package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
  264. package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
  265. package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
  266. package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
  267. package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
  268. package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
  269. package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
  270. package/lib/vendor/blamejs/lib/ai-input.js +201 -0
  271. package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
  272. package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
  273. package/lib/vendor/blamejs/lib/api-key.js +721 -0
  274. package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
  275. package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
  276. package/lib/vendor/blamejs/lib/app.js +365 -0
  277. package/lib/vendor/blamejs/lib/archive.js +547 -0
  278. package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
  279. package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
  280. package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
  281. package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
  282. package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
  283. package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
  284. package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
  285. package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
  286. package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
  287. package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
  288. package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
  289. package/lib/vendor/blamejs/lib/audit.js +1671 -0
  290. package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
  291. package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
  292. package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
  293. package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
  294. package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
  295. package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
  296. package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
  297. package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
  298. package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
  299. package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
  300. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
  301. package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
  302. package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
  303. package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
  304. package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
  305. package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
  306. package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
  307. package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
  308. package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
  309. package/lib/vendor/blamejs/lib/auth/password.js +693 -0
  310. package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
  311. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
  312. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
  313. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
  314. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
  315. package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
  316. package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
  317. package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
  318. package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
  319. package/lib/vendor/blamejs/lib/auth-header.js +148 -0
  320. package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
  321. package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
  322. package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
  323. package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
  324. package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
  325. package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
  326. package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
  327. package/lib/vendor/blamejs/lib/budr.js +205 -0
  328. package/lib/vendor/blamejs/lib/bundler.js +461 -0
  329. package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
  330. package/lib/vendor/blamejs/lib/cache-status.js +288 -0
  331. package/lib/vendor/blamejs/lib/cache.js +1331 -0
  332. package/lib/vendor/blamejs/lib/calendar.js +1240 -0
  333. package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
  334. package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
  335. package/lib/vendor/blamejs/lib/cert.js +763 -0
  336. package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
  337. package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
  338. package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
  339. package/lib/vendor/blamejs/lib/cli.js +2328 -0
  340. package/lib/vendor/blamejs/lib/client-hints.js +318 -0
  341. package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
  342. package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
  343. package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
  344. package/lib/vendor/blamejs/lib/cluster.js +1017 -0
  345. package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
  346. package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
  347. package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
  348. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
  349. package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
  350. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
  351. package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
  352. package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
  353. package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
  354. package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
  355. package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
  356. package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
  357. package/lib/vendor/blamejs/lib/compliance.js +1558 -0
  358. package/lib/vendor/blamejs/lib/config-drift.js +426 -0
  359. package/lib/vendor/blamejs/lib/config.js +446 -0
  360. package/lib/vendor/blamejs/lib/consent.js +369 -0
  361. package/lib/vendor/blamejs/lib/constants.js +209 -0
  362. package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
  363. package/lib/vendor/blamejs/lib/cookies.js +560 -0
  364. package/lib/vendor/blamejs/lib/cra-report.js +299 -0
  365. package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
  366. package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
  367. package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
  368. package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
  369. package/lib/vendor/blamejs/lib/crypto.js +1908 -0
  370. package/lib/vendor/blamejs/lib/csp.js +271 -0
  371. package/lib/vendor/blamejs/lib/csv.js +418 -0
  372. package/lib/vendor/blamejs/lib/daemon.js +481 -0
  373. package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
  374. package/lib/vendor/blamejs/lib/data-act.js +328 -0
  375. package/lib/vendor/blamejs/lib/db-collection.js +587 -0
  376. package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
  377. package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
  378. package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
  379. package/lib/vendor/blamejs/lib/db-query.js +802 -0
  380. package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
  381. package/lib/vendor/blamejs/lib/db-schema.js +322 -0
  382. package/lib/vendor/blamejs/lib/db.js +3111 -0
  383. package/lib/vendor/blamejs/lib/dbsc.js +299 -0
  384. package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
  385. package/lib/vendor/blamejs/lib/deprecate.js +377 -0
  386. package/lib/vendor/blamejs/lib/dev.js +405 -0
  387. package/lib/vendor/blamejs/lib/dora.js +402 -0
  388. package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
  389. package/lib/vendor/blamejs/lib/dsr.js +1188 -0
  390. package/lib/vendor/blamejs/lib/dual-control.js +526 -0
  391. package/lib/vendor/blamejs/lib/early-hints.js +212 -0
  392. package/lib/vendor/blamejs/lib/error-page.js +420 -0
  393. package/lib/vendor/blamejs/lib/events.js +214 -0
  394. package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
  395. package/lib/vendor/blamejs/lib/external-db.js +1877 -0
  396. package/lib/vendor/blamejs/lib/fapi2.js +394 -0
  397. package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
  398. package/lib/vendor/blamejs/lib/fdx.js +370 -0
  399. package/lib/vendor/blamejs/lib/fedcm.js +264 -0
  400. package/lib/vendor/blamejs/lib/file-type.js +360 -0
  401. package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
  402. package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
  403. package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
  404. package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
  405. package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
  406. package/lib/vendor/blamejs/lib/flag.js +346 -0
  407. package/lib/vendor/blamejs/lib/forms.js +525 -0
  408. package/lib/vendor/blamejs/lib/framework-error.js +724 -0
  409. package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
  410. package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
  411. package/lib/vendor/blamejs/lib/fsm.js +469 -0
  412. package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
  413. package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
  414. package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
  415. package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
  416. package/lib/vendor/blamejs/lib/guard-all.js +555 -0
  417. package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
  418. package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
  419. package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
  420. package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
  421. package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
  422. package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
  423. package/lib/vendor/blamejs/lib/guard-email.js +951 -0
  424. package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
  425. package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
  426. package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
  427. package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
  428. package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
  429. package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
  430. package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
  431. package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
  432. package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
  433. package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
  434. package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
  435. package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
  436. package/lib/vendor/blamejs/lib/guard-image.js +584 -0
  437. package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
  438. package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
  439. package/lib/vendor/blamejs/lib/guard-json.js +935 -0
  440. package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
  441. package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
  442. package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
  443. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
  444. package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
  445. package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
  446. package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
  447. package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
  448. package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
  449. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
  450. package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
  451. package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
  452. package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
  453. package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
  454. package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
  455. package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
  456. package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
  457. package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
  458. package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
  459. package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
  460. package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
  461. package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
  462. package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
  463. package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
  464. package/lib/vendor/blamejs/lib/guard-template.js +490 -0
  465. package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
  466. package/lib/vendor/blamejs/lib/guard-time.js +586 -0
  467. package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
  468. package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
  469. package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
  470. package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
  471. package/lib/vendor/blamejs/lib/hal.js +125 -0
  472. package/lib/vendor/blamejs/lib/handlers.js +350 -0
  473. package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
  474. package/lib/vendor/blamejs/lib/html-balance.js +347 -0
  475. package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
  476. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
  477. package/lib/vendor/blamejs/lib/http-client.js +2152 -0
  478. package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
  479. package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
  480. package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
  481. package/lib/vendor/blamejs/lib/i18n.js +931 -0
  482. package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
  483. package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
  484. package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
  485. package/lib/vendor/blamejs/lib/inbox.js +435 -0
  486. package/lib/vendor/blamejs/lib/incident-report.js +314 -0
  487. package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
  488. package/lib/vendor/blamejs/lib/jobs.js +185 -0
  489. package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
  490. package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
  491. package/lib/vendor/blamejs/lib/keychain.js +865 -0
  492. package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
  493. package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
  494. package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
  495. package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
  496. package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
  497. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
  498. package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
  499. package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
  500. package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
  501. package/lib/vendor/blamejs/lib/log-stream.js +584 -0
  502. package/lib/vendor/blamejs/lib/log.js +625 -0
  503. package/lib/vendor/blamejs/lib/lro.js +200 -0
  504. package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
  505. package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
  506. package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
  507. package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
  508. package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
  509. package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
  510. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
  511. package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
  512. package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
  513. package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
  514. package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
  515. package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
  516. package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
  517. package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
  518. package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
  519. package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
  520. package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
  521. package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
  522. package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
  523. package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
  524. package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
  525. package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
  526. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
  527. package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
  528. package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
  529. package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
  530. package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
  531. package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
  532. package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
  533. package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
  534. package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
  535. package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
  536. package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
  537. package/lib/vendor/blamejs/lib/mail-store.js +929 -0
  538. package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
  539. package/lib/vendor/blamejs/lib/mail.js +1971 -0
  540. package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
  541. package/lib/vendor/blamejs/lib/mcp.js +950 -0
  542. package/lib/vendor/blamejs/lib/metrics.js +1503 -0
  543. package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
  544. package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
  545. package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
  546. package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
  547. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
  548. package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
  549. package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
  550. package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
  551. package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
  552. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
  553. package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
  554. package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
  555. package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
  556. package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
  557. package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
  558. package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
  559. package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
  560. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
  561. package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
  562. package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
  563. package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
  564. package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
  565. package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
  566. package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
  567. package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
  568. package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
  569. package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
  570. package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
  571. package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
  572. package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
  573. package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
  574. package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
  575. package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
  576. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
  577. package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
  578. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
  579. package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
  580. package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
  581. package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
  582. package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
  583. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
  584. package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
  585. package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
  586. package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
  587. package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
  588. package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
  589. package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
  590. package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
  591. package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
  592. package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
  593. package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
  594. package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
  595. package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
  596. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
  597. package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
  598. package/lib/vendor/blamejs/lib/migration-files.js +37 -0
  599. package/lib/vendor/blamejs/lib/migrations.js +385 -0
  600. package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
  601. package/lib/vendor/blamejs/lib/money.js +699 -0
  602. package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
  603. package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
  604. package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
  605. package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
  606. package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
  607. package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
  608. package/lib/vendor/blamejs/lib/network-nts.js +574 -0
  609. package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
  610. package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
  611. package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
  612. package/lib/vendor/blamejs/lib/network.js +346 -0
  613. package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
  614. package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
  615. package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
  616. package/lib/vendor/blamejs/lib/notify.js +683 -0
  617. package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
  618. package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
  619. package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
  620. package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
  621. package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
  622. package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
  623. package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
  624. package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
  625. package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
  626. package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
  627. package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
  628. package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
  629. package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
  630. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
  631. package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
  632. package/lib/vendor/blamejs/lib/observability.js +720 -0
  633. package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
  634. package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
  635. package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
  636. package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
  637. package/lib/vendor/blamejs/lib/openapi.js +489 -0
  638. package/lib/vendor/blamejs/lib/otel-export.js +278 -0
  639. package/lib/vendor/blamejs/lib/outbox.js +547 -0
  640. package/lib/vendor/blamejs/lib/pagination.js +542 -0
  641. package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
  642. package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
  643. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
  644. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
  645. package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
  646. package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
  647. package/lib/vendor/blamejs/lib/permissions.js +793 -0
  648. package/lib/vendor/blamejs/lib/pick.js +105 -0
  649. package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
  650. package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
  651. package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
  652. package/lib/vendor/blamejs/lib/problem-details.js +482 -0
  653. package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
  654. package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
  655. package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
  656. package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
  657. package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
  658. package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
  659. package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
  660. package/lib/vendor/blamejs/lib/pubsub.js +463 -0
  661. package/lib/vendor/blamejs/lib/queue-local.js +476 -0
  662. package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
  663. package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
  664. package/lib/vendor/blamejs/lib/queue.js +1016 -0
  665. package/lib/vendor/blamejs/lib/redact.js +1007 -0
  666. package/lib/vendor/blamejs/lib/redis-client.js +520 -0
  667. package/lib/vendor/blamejs/lib/render.js +285 -0
  668. package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
  669. package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
  670. package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
  671. package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
  672. package/lib/vendor/blamejs/lib/restore.js +409 -0
  673. package/lib/vendor/blamejs/lib/retention.js +640 -0
  674. package/lib/vendor/blamejs/lib/retry.js +523 -0
  675. package/lib/vendor/blamejs/lib/router.js +1289 -0
  676. package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
  677. package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
  678. package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
  679. package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
  680. package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
  681. package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
  682. package/lib/vendor/blamejs/lib/safe-json.js +946 -0
  683. package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
  684. package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
  685. package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
  686. package/lib/vendor/blamejs/lib/safe-path.js +254 -0
  687. package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
  688. package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
  689. package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
  690. package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
  691. package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
  692. package/lib/vendor/blamejs/lib/safe-url.js +428 -0
  693. package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
  694. package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
  695. package/lib/vendor/blamejs/lib/sandbox.js +358 -0
  696. package/lib/vendor/blamejs/lib/scheduler.js +827 -0
  697. package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
  698. package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
  699. package/lib/vendor/blamejs/lib/security-assert.js +395 -0
  700. package/lib/vendor/blamejs/lib/seeders.js +620 -0
  701. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
  702. package/lib/vendor/blamejs/lib/self-update.js +804 -0
  703. package/lib/vendor/blamejs/lib/server-timing.js +174 -0
  704. package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
  705. package/lib/vendor/blamejs/lib/session-stores.js +138 -0
  706. package/lib/vendor/blamejs/lib/session.js +1162 -0
  707. package/lib/vendor/blamejs/lib/slug.js +381 -0
  708. package/lib/vendor/blamejs/lib/sse.js +349 -0
  709. package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
  710. package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
  711. package/lib/vendor/blamejs/lib/static.js +1249 -0
  712. package/lib/vendor/blamejs/lib/storage.js +1272 -0
  713. package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
  714. package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
  715. package/lib/vendor/blamejs/lib/subject.js +667 -0
  716. package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
  717. package/lib/vendor/blamejs/lib/template.js +931 -0
  718. package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
  719. package/lib/vendor/blamejs/lib/test-harness.js +275 -0
  720. package/lib/vendor/blamejs/lib/testing.js +1185 -0
  721. package/lib/vendor/blamejs/lib/time.js +578 -0
  722. package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
  723. package/lib/vendor/blamejs/lib/totp.js +318 -0
  724. package/lib/vendor/blamejs/lib/tracing.js +546 -0
  725. package/lib/vendor/blamejs/lib/uuid.js +207 -0
  726. package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
  727. package/lib/vendor/blamejs/lib/vault/index.js +638 -0
  728. package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
  729. package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
  730. package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
  731. package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
  732. package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
  733. package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
  734. package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
  735. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
  736. package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
  737. package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
  738. package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
  739. package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
  740. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
  741. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
  742. package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
  743. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
  744. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
  745. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
  746. package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
  747. package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
  748. package/lib/vendor/blamejs/lib/vex.js +630 -0
  749. package/lib/vendor/blamejs/lib/watcher.js +608 -0
  750. package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
  751. package/lib/vendor/blamejs/lib/webhook.js +977 -0
  752. package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
  753. package/lib/vendor/blamejs/lib/websocket.js +1561 -0
  754. package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
  755. package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
  756. package/lib/vendor/blamejs/lib/ws-client.js +978 -0
  757. package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
  758. package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
  759. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
  760. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
  761. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
  762. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
  763. package/lib/vendor/blamejs/package.json +81 -0
  764. package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
  765. package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
  766. package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
  767. package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
  768. package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
  769. package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
  770. package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
  771. package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
  772. package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
  773. package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
  774. package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
  775. package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
  776. package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
  777. package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
  778. package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
  779. package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
  780. package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
  781. package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
  782. package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
  783. package/lib/vendor/blamejs/scripts/check-services.js +483 -0
  784. package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
  785. package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
  786. package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
  787. package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
  788. package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
  789. package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
  790. package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
  791. package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
  792. package/lib/vendor/blamejs/scripts/release.js +652 -0
  793. package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
  794. package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
  795. package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
  796. package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
  797. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
  798. package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
  799. package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
  800. package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
  801. package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
  802. package/lib/vendor/blamejs/test/10-state.js +622 -0
  803. package/lib/vendor/blamejs/test/20-db.js +561 -0
  804. package/lib/vendor/blamejs/test/30-chain.js +2110 -0
  805. package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
  806. package/lib/vendor/blamejs/test/50-integration.js +486 -0
  807. package/lib/vendor/blamejs/test/_helpers.js +10 -0
  808. package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
  809. package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
  810. package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
  811. package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
  812. package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
  813. package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
  814. package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
  815. package/lib/vendor/blamejs/test/helpers/check.js +36 -0
  816. package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
  817. package/lib/vendor/blamejs/test/helpers/db.js +143 -0
  818. package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
  819. package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
  820. package/lib/vendor/blamejs/test/helpers/http.js +14 -0
  821. package/lib/vendor/blamejs/test/helpers/index.js +93 -0
  822. package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
  823. package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
  824. package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
  825. package/lib/vendor/blamejs/test/helpers/services.js +380 -0
  826. package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
  827. package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
  828. package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
  829. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
  830. package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
  831. package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
  832. package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
  833. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
  834. package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
  835. package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
  836. package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
  837. package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
  838. package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
  839. package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
  840. package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
  841. package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
  842. package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
  843. package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
  844. package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
  845. package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
  846. package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
  847. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
  848. package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
  849. package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
  850. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
  851. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
  852. package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
  853. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
  854. package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
  855. package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
  856. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
  857. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
  858. package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
  859. package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
  860. package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
  861. package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
  862. package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
  863. package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
  864. package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
  865. package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
  866. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
  867. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
  868. package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
  869. package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
  870. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
  871. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
  872. package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
  873. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
  874. package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
  875. package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
  876. package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
  877. package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
  878. package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
  879. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
  880. package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
  881. package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
  882. package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
  883. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
  884. package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
  885. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
  886. package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
  887. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
  888. package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
  889. package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
  890. package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
  891. package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
  892. package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
  893. package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
  894. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
  895. package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
  896. package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
  897. package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
  898. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
  899. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
  900. package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
  901. package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
  902. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
  903. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
  904. package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
  905. package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
  906. package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
  907. package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
  908. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
  909. package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
  910. package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
  911. package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
  912. package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
  913. package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
  914. package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
  915. package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
  916. package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
  917. package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
  918. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
  919. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
  920. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
  921. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
  922. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
  923. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
  924. package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
  925. package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
  926. package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
  927. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
  928. package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
  929. package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
  930. package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
  931. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
  932. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
  933. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
  934. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
  935. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
  936. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
  937. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
  938. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
  939. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
  940. package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
  941. package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
  942. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
  943. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
  944. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
  945. package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
  946. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
  947. package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
  948. package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
  949. package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
  950. package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
  951. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
  952. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
  953. package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
  954. package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
  955. package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
  956. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
  957. package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
  958. package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
  959. package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
  960. package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
  961. package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
  962. package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
  963. package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
  964. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
  965. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
  966. package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
  967. package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
  968. package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
  969. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
  970. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
  971. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
  972. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
  973. package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
  974. package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
  975. package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
  976. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
  977. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
  978. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
  979. package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
  980. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
  981. package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
  982. package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
  983. package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
  984. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
  985. package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
  986. package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
  987. package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
  988. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
  989. package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
  990. package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
  991. package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
  992. package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
  993. package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
  994. package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
  995. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
  996. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
  997. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
  998. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
  999. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  1000. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +174 -0
  1001. package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
  1002. package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
  1003. package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
  1004. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
  1005. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
  1006. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
  1007. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
  1008. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
  1009. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
  1010. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
  1011. package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
  1012. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
  1013. package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
  1014. package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
  1015. package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
  1016. package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
  1017. package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
  1018. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
  1019. package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
  1020. package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
  1021. package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
  1022. package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
  1023. package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
  1024. package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
  1025. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
  1026. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
  1027. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
  1028. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
  1029. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
  1030. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
  1031. package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
  1032. package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
  1033. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
  1034. package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
  1035. package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
  1036. package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
  1037. package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
  1038. package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
  1039. package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
  1040. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
  1041. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  1042. package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
  1043. package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
  1044. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
  1045. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
  1046. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
  1047. package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
  1048. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
  1049. package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
  1050. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
  1051. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
  1052. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
  1053. package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
  1054. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
  1055. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
  1056. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
  1057. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
  1058. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
  1059. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
  1060. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
  1061. package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
  1062. package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
  1063. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
  1064. package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
  1065. package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
  1066. package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
  1067. package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
  1068. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
  1069. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
  1070. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
  1071. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
  1072. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
  1073. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
  1074. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
  1075. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
  1076. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
  1077. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
  1078. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
  1079. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
  1080. package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
  1081. package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
  1082. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
  1083. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
  1084. package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
  1085. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
  1086. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
  1087. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
  1088. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
  1089. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
  1090. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
  1091. package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
  1092. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
  1093. package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
  1094. package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
  1095. package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
  1096. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
  1097. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
  1098. package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
  1099. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
  1100. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
  1101. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
  1102. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
  1103. package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
  1104. package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
  1105. package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
  1106. package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
  1107. package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
  1108. package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
  1109. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
  1110. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
  1111. package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
  1112. package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
  1113. package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
  1114. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
  1115. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
  1116. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
  1117. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
  1118. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
  1119. package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
  1120. package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
  1121. package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
  1122. package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
  1123. package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
  1124. package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
  1125. package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
  1126. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
  1127. package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
  1128. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
  1129. package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
  1130. package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
  1131. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
  1132. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
  1133. package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
  1134. package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
  1135. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
  1136. package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
  1137. package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
  1138. package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
  1139. package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
  1140. package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
  1141. package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
  1142. package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
  1143. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
  1144. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
  1145. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
  1146. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
  1147. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
  1148. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
  1149. package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
  1150. package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
  1151. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
  1152. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
  1153. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
  1154. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
  1155. package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
  1156. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
  1157. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
  1158. package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
  1159. package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
  1160. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
  1161. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
  1162. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
  1163. package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
  1164. package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
  1165. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
  1166. package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
  1167. package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
  1168. package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
  1169. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
  1170. package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
  1171. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
  1172. package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
  1173. package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
  1174. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
  1175. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
  1176. package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
  1177. package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
  1178. package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
  1179. package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
  1180. package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
  1181. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
  1182. package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
  1183. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
  1184. package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
  1185. package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
  1186. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
  1187. package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
  1188. package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
  1189. package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
  1190. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
  1191. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
  1192. package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
  1193. package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
  1194. package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
  1195. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
  1196. package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
  1197. package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
  1198. package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
  1199. package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
  1200. package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
  1201. package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
  1202. package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
  1203. package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
  1204. package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
  1205. package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
  1206. package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
  1207. package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
  1208. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
  1209. package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
  1210. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
  1211. package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
  1212. package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
  1213. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
  1214. package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
  1215. package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
  1216. package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
  1217. package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
  1218. package/lib/vendor/blamejs/test/smoke.js +431 -0
  1219. package/lib/webhooks.js +305 -0
  1220. package/package.json +43 -0
@@ -0,0 +1,1289 @@
1
+ "use strict";
2
+ /**
3
+ * @module b.router
4
+ * @featured true
5
+ * @nav HTTP
6
+ * @title Router
7
+ *
8
+ * @intro
9
+ * HTTP route registration + dispatch. Operators register handlers
10
+ * against method+pattern pairs, the router compiles each pattern
11
+ * once at registration time and walks the table linearly per
12
+ * request — first match wins.
13
+ *
14
+ * Patterns are segment-based (`/users/:id`); named parameters land
15
+ * on `req.params`. Handler dispatch follows arity:
16
+ * - `handler.length >= 3` is middleware (req, res, next) — the
17
+ * chain stops unless `next()` is called.
18
+ * - `handler.length <= 2` is a terminal handler (req, res) — the
19
+ * chain falls through to the next entry unless the response is
20
+ * already ended.
21
+ *
22
+ * When no pattern matches, the registered `onNotFound` handler runs;
23
+ * the framework default is a 404 with a small text/html body. The
24
+ * router boots an HTTP/2 + HTTP/1.1 ALPN server on `listen()` when
25
+ * given TLS options, an HTTP/1.1 server otherwise.
26
+ *
27
+ * Zero npm runtime deps — this primitive replaces express / koa /
28
+ * fastify entirely while keeping the framework's security defaults
29
+ * (TLS 1.3 minimum, 0-RTT anti-replay, Slowloris timeouts, h2
30
+ * CONTINUATION-flood + Rapid-Reset caps) wired in by default.
31
+ *
32
+ * @card
33
+ * HTTP route registration + dispatch.
34
+ */
35
+ var http = require("node:http");
36
+ var http2 = require("node:http2");
37
+ var nodeFs = require("node:fs");
38
+ var nodePath = require("node:path");
39
+ var C = require("./constants");
40
+ var requestHelpers = require("./request-helpers");
41
+ var lazyRequire = require("./lazy-require");
42
+ var safeAsync = require("./safe-async");
43
+ var safeEnv = require("./parsers/safe-env");
44
+ var safeUrl = require("./safe-url");
45
+ var websocket = require("./websocket");
46
+ var { boot } = require("./log");
47
+ var { RouterError } = require("./framework-error");
48
+
49
+ var audit = lazyRequire(function () { return require("./audit"); });
50
+ // compliance — lazy because router.js is required during boot before
51
+ // the operator's `b.compliance.set(...)` runs; the posture lookup only
52
+ // matters at listen() time, well after boot finishes.
53
+ var compliance = lazyRequire(function () { return require("./compliance"); });
54
+
55
+ var log = boot("router");
56
+ var HTTP_STATUS = requestHelpers.HTTP_STATUS;
57
+
58
+ // CVE-2026-21714 — h2 WINDOW_UPDATE leak after GOAWAY. nghttp2 holds
59
+ // per-stream flow-control state after the session has emitted GOAWAY;
60
+ // late-arriving WINDOW_UPDATE frames can re-credit a draining stream
61
+ // and starve the connection. The framework cap defends defense-in-depth
62
+ // even when Node's nghttp2 vendor lags the upstream fix: tag every
63
+ // session with `_blamejsGoawaySent` on the framework's GOAWAY emission,
64
+ // and force-destroy on any subsequent frame activity.
65
+ var WINDOW_UPDATE_FRAME_TYPE = 0x8; // allow:raw-byte-literal — RFC 7540 §6.9 frame type
66
+ // Per-stream WINDOW_UPDATE rate cap. Above this rate the framework
67
+ // destroys the stream; legitimate clients never burst this fast on a
68
+ // healthy connection.
69
+ var WINDOW_UPDATE_RATE_CAP = 100; // allow:raw-byte-literal — frames per second per stream
70
+ var WINDOW_UPDATE_RATE_WINDOW_MS = C.TIME.seconds(1);
71
+
72
+ // Cap on operator-defined route patterns. A route registration that
73
+ // somehow attracts a multi-megabyte template string would stall regex
74
+ // compilation; bound it before new RegExp() so the gate at registration
75
+ // time is bounded.
76
+ var MAX_ROUTE_PATTERN_LEN = C.BYTES.kib(1);
77
+
78
+ // ---- Schema-spec helpers (route-level body/query/params validation) ----
79
+
80
+ var ALLOWED_SPEC_KEYS = [
81
+ "body", "query", "params", "response",
82
+ "bodyJsonSchema", "queryJsonSchema", "paramsJsonSchema", "responseJsonSchema",
83
+ "description", "summary", "tags", "validateResponse",
84
+ ];
85
+
86
+ function _validateRouteSpec(spec, method, pattern) {
87
+ var keys = Object.keys(spec);
88
+ for (var i = 0; i < keys.length; i++) {
89
+ if (ALLOWED_SPEC_KEYS.indexOf(keys[i]) === -1) {
90
+ throw new Error("router." + method.toLowerCase() + "(" + pattern +
91
+ "): unknown spec key '" + keys[i] + "'. Allowed: " +
92
+ ALLOWED_SPEC_KEYS.slice().sort().join(", "));
93
+ }
94
+ }
95
+ function _checkSchema(name) {
96
+ var s = spec[name];
97
+ if (s === undefined) return;
98
+ if (!s || typeof s !== "object" || typeof s.safeParse !== "function") {
99
+ throw new Error("router." + method.toLowerCase() + "(" + pattern +
100
+ "): spec." + name + " must be a b.safeSchema-shaped schema (with safeParse)");
101
+ }
102
+ }
103
+ _checkSchema("body");
104
+ _checkSchema("query");
105
+ _checkSchema("params");
106
+ _checkSchema("response");
107
+ if (spec.tags !== undefined) {
108
+ if (!Array.isArray(spec.tags) || !spec.tags.every(function (t) { return typeof t === "string"; })) {
109
+ throw new Error("router." + method.toLowerCase() + "(" + pattern +
110
+ "): spec.tags must be an array of strings");
111
+ }
112
+ }
113
+ }
114
+
115
+ function _writeValidationError(res, where, errors) {
116
+ if (res.writableEnded || res.headersSent) return;
117
+ var body = JSON.stringify({
118
+ error: "validation",
119
+ where: where,
120
+ issues: errors,
121
+ });
122
+ res.writeHead(HTTP_STATUS.BAD_REQUEST, {
123
+ "Content-Type": "application/json; charset=utf-8",
124
+ "Content-Length": Buffer.byteLength(body),
125
+ });
126
+ res.end(body);
127
+ }
128
+
129
+ function _makeSchemaValidator(spec) {
130
+ // 3-arg signature → router treats as middleware, chains via next().
131
+ return function schemaValidator(req, res, next) {
132
+ if (spec.params && req.params !== undefined) {
133
+ var pp = spec.params.safeParse(req.params);
134
+ if (!pp.ok) return _writeValidationError(res, "params", pp.errors);
135
+ req.params = pp.value;
136
+ }
137
+ if (spec.query && req.query !== undefined) {
138
+ var qq = spec.query.safeParse(req.query);
139
+ if (!qq.ok) return _writeValidationError(res, "query", qq.errors);
140
+ req.query = qq.value;
141
+ }
142
+ if (spec.body && req.body !== undefined) {
143
+ var bb = spec.body.safeParse(req.body);
144
+ if (!bb.ok) return _writeValidationError(res, "body", bb.errors);
145
+ req.body = bb.value;
146
+ }
147
+ next();
148
+ };
149
+ }
150
+
151
+ function _makeResponseValidator(spec) {
152
+ // Wraps res.json (and res.end when called with a JSON-shaped buffer)
153
+ // to validate the response body against spec.response. Mode:
154
+ // - BLAMEJS_VALIDATE_RESPONSES=throw (or per-route validateResponse: "throw")
155
+ // → throw a SafeSchemaError-shaped error; route handler's caller sees a 500.
156
+ // - BLAMEJS_VALIDATE_RESPONSES=warn (or per-route validateResponse: "warn")
157
+ // → log a warning; ship the response as-is (prod-safe).
158
+ var perRoute = spec.validateResponse;
159
+ var globalMode = safeEnv.readVar("BLAMEJS_VALIDATE_RESPONSES");
160
+ var mode = (perRoute === "throw" || perRoute === "warn") ? perRoute :
161
+ (globalMode === "throw" || globalMode === "warn") ? globalMode : null;
162
+ if (!mode) return function passthrough(_req, _res, next) { next(); };
163
+
164
+ return function responseValidator(req, res, next) {
165
+ var origJson = typeof res.json === "function" ? res.json.bind(res) : null;
166
+ if (origJson) {
167
+ res.json = function (value) {
168
+ var rr = spec.response.safeParse(value);
169
+ if (!rr.ok) {
170
+ if (mode === "throw") {
171
+ throw new Error("router response-validation failed for " +
172
+ (req.method + " " + req.routePattern) + ": " +
173
+ JSON.stringify(rr.errors));
174
+ }
175
+ // warn mode
176
+ log.warn("response-validation drift on " + req.method + " " + req.routePattern +
177
+ ": " + JSON.stringify(rr.errors).slice(0, 500));
178
+ }
179
+ return origJson(value);
180
+ };
181
+ }
182
+ next();
183
+ };
184
+ }
185
+
186
+ function compilePattern(pattern) {
187
+ // pattern is operator-supplied at route registration (router.get(...)).
188
+ // Cap length up-front to bound matcher work even against pathological
189
+ // operator config.
190
+ if (typeof pattern !== "string" || pattern.length === 0) {
191
+ throw new Error("router: pattern must be a non-empty string");
192
+ }
193
+ if (pattern.length > MAX_ROUTE_PATTERN_LEN) {
194
+ throw new Error("router: pattern exceeds " + MAX_ROUTE_PATTERN_LEN +
195
+ " chars (got " + pattern.length + ")");
196
+ }
197
+ // Segment-based matcher — splits on "/" once at registration time and
198
+ // walks token-by-token at match time. Avoids compiling a RegExp from
199
+ // the operator-supplied pattern (which would be a dynamic-regex /
200
+ // ReDoS shape even though pattern is operator-controlled).
201
+ //
202
+ // Each segment is either:
203
+ // - a literal (e.g. "users", "v1")
204
+ // - a named parameter ":id" — captures into params[name]
205
+ //
206
+ // Matching is exact on segment count: "/a/b" does not match "/a/b/c".
207
+ var rawSegments = pattern.split("/");
208
+ var segments = [];
209
+ var keys = [];
210
+ for (var si = 0; si < rawSegments.length; si++) {
211
+ var seg = rawSegments[si];
212
+ if (seg.length > 0 && seg.charAt(0) === ":") {
213
+ var key = seg.slice(1);
214
+ if (key.length === 0) {
215
+ throw new Error("router: pattern '" + pattern +
216
+ "' has an empty parameter name (':' segment)");
217
+ }
218
+ keys.push(key);
219
+ segments.push({ literal: false, key: key });
220
+ } else {
221
+ segments.push({ literal: true, value: seg });
222
+ }
223
+ }
224
+ return { pattern: pattern, segments: segments, keys: keys };
225
+ }
226
+
227
+ // Walk a request path against a compiled pattern. Returns the params
228
+ // object on match, null otherwise. Single non-empty trailing slash
229
+ // difference is treated as a no-match (callers that want trailing-slash
230
+ // tolerance normalize the path before dispatch).
231
+ function _matchCompiled(compiled, pathname) {
232
+ var pathSegments = pathname.split("/");
233
+ var patSegments = compiled.segments;
234
+ if (pathSegments.length !== patSegments.length) return null;
235
+ var params = {};
236
+ for (var i = 0; i < patSegments.length; i++) {
237
+ var seg = patSegments[i];
238
+ if (seg.literal) {
239
+ if (pathSegments[i] !== seg.value) return null;
240
+ } else {
241
+ // Named param: must be non-empty (mirrors the regex `[^/]+`
242
+ // capture from the previous compiled regex).
243
+ if (pathSegments[i].length === 0) return null;
244
+ params[seg.key] = pathSegments[i];
245
+ }
246
+ }
247
+ return params;
248
+ }
249
+
250
+ var MIME_TYPES = {
251
+ ".html": "text/html",
252
+ ".css": "text/css",
253
+ ".js": "application/javascript",
254
+ ".json": "application/json",
255
+ ".png": "image/png",
256
+ ".jpg": "image/jpeg",
257
+ ".jpeg": "image/jpeg",
258
+ ".gif": "image/gif",
259
+ ".svg": "image/svg+xml",
260
+ ".ico": "image/x-icon",
261
+ ".woff2": "font/woff2",
262
+ ".woff": "font/woff",
263
+ };
264
+
265
+ // TLS 1.3 0-RTT anti-replay posture (RFC 8446 §8 / §2.3 early-data).
266
+ //
267
+ // 0-RTT lets the client smuggle application-data bytes alongside the
268
+ // ClientHello — saving one round-trip on resumed sessions but admitting
269
+ // the replay class: an attacker that captured the encrypted early-data
270
+ // can re-send the same handshake bytes and the server processes the
271
+ // payload twice. RFC 8446 §8 requires the server EITHER refuse early
272
+ // data outright OR maintain a single-use anti-replay state per ticket
273
+ // for the configured early_data lifetime.
274
+ //
275
+ // Postures:
276
+ // "refuse" — Node default; the framework does not request 0-RTT
277
+ // and refuses peer early-data attempts.
278
+ // "replay-cache" — opts in; the framework de-duplicates incoming
279
+ // early-data by SHA3-512(early-data-bytes) inside a
280
+ // short rolling window. Cache hit = refuse + audit
281
+ // (potential replay). Cache miss = accept + audit.
282
+ //
283
+ // Under regulated postures (`pci-dss`, `fapi2`) the framework refuses
284
+ // 0-RTT regardless of operator opt-in — these regimes treat every
285
+ // authenticated request as non-idempotent and forbid early-data
286
+ // processing. The router consults `b.compliance.current()` at listen
287
+ // time and overrides "replay-cache" → "refuse" with an audit row.
288
+ var TLS_0RTT_VALID_POSTURES = ["refuse", "replay-cache"];
289
+ var TLS_0RTT_REPLAY_WINDOW_MS = C.TIME.seconds(10);
290
+ var TLS_0RTT_REPLAY_CACHE_CAP = 4096; // allow:raw-byte-literal — entry count, not bytes
291
+ var TLS_0RTT_FAILCLOSED_POSTURES = ["pci-dss", "fapi2"];
292
+
293
+ class Router {
294
+ constructor(opts) {
295
+ opts = opts || {};
296
+ this.routes = [];
297
+ this.middleware = [];
298
+ // WebSocket routes are kept separate from HTTP routes — they're
299
+ // matched on the upgrade / Extended CONNECT nodePath, not on a method
300
+ // verb. Map<nodePath, { handler, opts }>.
301
+ this._wsRoutes = new Map();
302
+ // Active WebSocket connections opened through router.ws(). Tracked
303
+ // so router.closeWebSockets() can do a clean rolling-shutdown.
304
+ // h1-upgrade detaches the socket from http.Server's connection
305
+ // tracking — without our own registry there's no other way to
306
+ // enumerate active WS connections for graceful close.
307
+ this._activeWsConns = new Set();
308
+
309
+ // TLS 1.3 0-RTT anti-replay posture — see TLS_0RTT_* above.
310
+ var posture = opts.tls0Rtt === undefined ? "refuse" : opts.tls0Rtt;
311
+ if (typeof posture !== "string" || TLS_0RTT_VALID_POSTURES.indexOf(posture) === -1) {
312
+ throw new TypeError(
313
+ "router.create: tls0Rtt must be one of " + TLS_0RTT_VALID_POSTURES.join(", ") +
314
+ "; got " + JSON.stringify(opts.tls0Rtt));
315
+ }
316
+ this._tls0RttPosture = posture;
317
+ // Replay cache — Map<sha3-512(early-data) hex, expiresAtMs>.
318
+ // Bounded entry count + rolling-window expiry.
319
+ this._tls0RttReplayCache = new Map();
320
+
321
+ // Cross-origin redirect allowlist. `res.redirect(url)` defaults to
322
+ // same-origin only — apps that need to bounce the user agent to an
323
+ // external IdP (OAuth authorization endpoint, SAML SSO, SCIM step-up)
324
+ // declare the operator-trusted destinations up front. Each entry is
325
+ // an exact-match HTTPS origin (`scheme://host[:port]`). Any redirect
326
+ // to a target whose origin is not on the list is refused loud — the
327
+ // operator gets a RouterError, not a silent bounce to "/".
328
+ var allowedOrigins = opts.allowedRedirectOrigins;
329
+ if (allowedOrigins !== undefined) {
330
+ if (!Array.isArray(allowedOrigins)) {
331
+ throw new RouterError(
332
+ "router/allowed-redirect-origins-not-array",
333
+ "router.create: allowedRedirectOrigins must be an array of HTTPS origin strings"
334
+ );
335
+ }
336
+ var normalized = [];
337
+ for (var oi = 0; oi < allowedOrigins.length; oi += 1) {
338
+ var entry = allowedOrigins[oi];
339
+ if (typeof entry !== "string" || entry.length === 0) {
340
+ throw new RouterError(
341
+ "router/allowed-redirect-origin-not-string",
342
+ "router.create: allowedRedirectOrigins[" + oi + "] must be a non-empty string"
343
+ );
344
+ }
345
+ var parsedOrigin;
346
+ try {
347
+ parsedOrigin = safeUrl.parse(entry, {
348
+ allowedProtocols: ["https:"],
349
+ });
350
+ } catch (parseErr) {
351
+ throw new RouterError(
352
+ "router/allowed-redirect-origin-not-https-origin",
353
+ "router.create: allowedRedirectOrigins[" + oi + "] '" + entry +
354
+ "' is not a valid HTTPS origin (" + parseErr.message + ")"
355
+ );
356
+ }
357
+ // RFC 6454 §4 origin form: scheme://host[:port]. We refuse
358
+ // anything carrying path / query / userinfo so the allowlist
359
+ // stays comparable byte-for-byte against URL.origin at redirect
360
+ // time. Operators who want to gate by full URL apply their own
361
+ // post-redirect validation in the handler.
362
+ if (parsedOrigin.pathname !== "/" && parsedOrigin.pathname !== "") {
363
+ throw new RouterError(
364
+ "router/allowed-redirect-origin-has-path",
365
+ "router.create: allowedRedirectOrigins[" + oi + "] '" + entry +
366
+ "' must be an origin (scheme://host[:port]) — path / query / userinfo not allowed"
367
+ );
368
+ }
369
+ if (parsedOrigin.search.length > 0 || parsedOrigin.hash.length > 0 ||
370
+ parsedOrigin.username.length > 0 || parsedOrigin.password.length > 0) {
371
+ throw new RouterError(
372
+ "router/allowed-redirect-origin-has-extras",
373
+ "router.create: allowedRedirectOrigins[" + oi + "] '" + entry +
374
+ "' must be an origin (scheme://host[:port]) — path / query / userinfo not allowed"
375
+ );
376
+ }
377
+ normalized.push(parsedOrigin.origin);
378
+ }
379
+ this._allowedRedirectOrigins = normalized;
380
+ } else {
381
+ this._allowedRedirectOrigins = [];
382
+ }
383
+ }
384
+
385
+ // Operator-facing read of the cross-origin redirect allowlist. Returns
386
+ // a defensive copy so handlers cannot mutate router state.
387
+ allowedRedirectOrigins() {
388
+ return this._allowedRedirectOrigins.slice();
389
+ }
390
+
391
+ tls0RttPosture() { return this._tls0RttPosture; }
392
+
393
+ // Active WebSocket connections opened via router.ws(). Useful for
394
+ // ops dashboards / health endpoints.
395
+ activeWebSockets() {
396
+ return this._activeWsConns.size;
397
+ }
398
+
399
+ // Graceful shutdown of all WebSocket connections opened via
400
+ // router.ws(). Sends close frame (code 1001 'going away') to each;
401
+ // awaits each connection's 'close' event up to opts.timeoutMs
402
+ // (default 5s). Returns the count of connections closed.
403
+ //
404
+ // Operators call this during rolling deploy:
405
+ // await router.closeWebSockets({ timeoutMs: 10_000 });
406
+ // await new Promise(r => server.close(r));
407
+ // process.exit(0);
408
+ //
409
+ // Tests use the same primitive in teardown — no parallel cleanup
410
+ // nodePath, no h1-upgrade detached-socket workaround.
411
+ async closeWebSockets(opts) {
412
+ opts = opts || {};
413
+ var timeoutMs = typeof opts.timeoutMs === "number" ? opts.timeoutMs : C.TIME.seconds(5);
414
+ var code = opts.code || 1001; // 1001 = going away
415
+ var reason = opts.reason || "server shutting down";
416
+
417
+ var conns = Array.from(this._activeWsConns);
418
+ if (conns.length === 0) return 0;
419
+
420
+ var closes = conns.map(function (conn) {
421
+ return new Promise(function (resolve) {
422
+ if (conn.readyState === "closed") { resolve(); return; }
423
+ conn.once("close", resolve);
424
+ try { conn.close(code, reason); }
425
+ catch (_e) {
426
+ // close() may throw if already closed; resolve immediately
427
+ // since the 'close' event won't fire again.
428
+ resolve();
429
+ }
430
+ });
431
+ });
432
+
433
+ // Wait up to `timeoutMs` for graceful WS closes, then force-destroy
434
+ // any laggards. `safeAsync.sleep({ unref: true })` matches the
435
+ // framework's outbound-timeout convention.
436
+ await Promise.race([
437
+ Promise.all(closes),
438
+ safeAsync.sleep(timeoutMs, { unref: true }),
439
+ ]);
440
+ // Force-destroy any laggards — at this point we've waited the full
441
+ // timeout and they didn't ack. The operator chose timeoutMs; honor it.
442
+ this._activeWsConns.forEach(function (conn) {
443
+ try { if (conn.socket && conn.socket.destroy) conn.socket.destroy(); }
444
+ catch (_e) { /* socket already destroyed */ }
445
+ });
446
+ return conns.length;
447
+ }
448
+
449
+ use(fn) {
450
+ this.middleware.push(fn);
451
+ }
452
+
453
+ // Internal: split a route registration's args into { spec, handlers }.
454
+ // The first non-pattern arg is the schema spec when it's a plain object
455
+ // (not a function); subsequent args are handler middlewares. Operators
456
+ // who never pass a spec keep the existing two-arg shape working.
457
+ _splitArgs(args) {
458
+ if (args.length > 0 && args[0] && typeof args[0] === "object" &&
459
+ !Array.isArray(args[0]) && typeof args[0] !== "function") {
460
+ return { spec: args[0], handlers: args.slice(1) };
461
+ }
462
+ return { spec: null, handlers: args };
463
+ }
464
+
465
+ _registerRoute(method, pattern, args) {
466
+ // CVE-2026-4923 — refuse pattern with more than 3 consecutive `*`
467
+ // metacharacters. The framework's segment matcher doesn't compile
468
+ // regex from operator input, but the policy stays crisp at the
469
+ // registration boundary.
470
+ if (typeof pattern === "string" && /\*{4,}/.test(pattern)) {
471
+ throw new Error(method + " " + pattern + ": route pattern refused " +
472
+ "(CVE-2026-4923) — more than 3 consecutive '*' metacharacters");
473
+ }
474
+ var split = this._splitArgs(args);
475
+ if (split.spec) _validateRouteSpec(split.spec, method, pattern);
476
+ var handlers = split.handlers;
477
+ if (split.spec) {
478
+ // Pre-handler validates body / query / params. Runs after the
479
+ // global middleware chain (bodyParser populates req.body before
480
+ // route dispatch) but before any route-specific handler.
481
+ handlers = [_makeSchemaValidator(split.spec)].concat(handlers);
482
+ // Response validation (dev/opt-in via env or per-route opt).
483
+ var globalValidateMode = safeEnv.readVar("BLAMEJS_VALIDATE_RESPONSES");
484
+ if (split.spec.response &&
485
+ (globalValidateMode === "throw" ||
486
+ globalValidateMode === "warn" ||
487
+ split.spec.validateResponse)) {
488
+ handlers = [_makeResponseValidator(split.spec)].concat(handlers);
489
+ }
490
+ }
491
+ this.routes.push(Object.assign(
492
+ { method: method, handlers: handlers, spec: split.spec || null },
493
+ compilePattern(pattern)
494
+ ));
495
+ }
496
+
497
+ get(pattern, ...args) {
498
+ this._registerRoute("GET", pattern, args);
499
+ }
500
+
501
+ post(pattern, ...args) {
502
+ this._registerRoute("POST", pattern, args);
503
+ }
504
+
505
+ put(pattern, ...args) {
506
+ this._registerRoute("PUT", pattern, args);
507
+ }
508
+
509
+ patch(pattern, ...args) {
510
+ this._registerRoute("PATCH", pattern, args);
511
+ }
512
+
513
+ delete(pattern, ...args) {
514
+ this._registerRoute("DELETE", pattern, args);
515
+ }
516
+
517
+ // Operator-facing introspection — returns a copy of the route table
518
+ // with each entry's method, pattern, description, and (when provided)
519
+ // operator-supplied jsonSchema bodies for OpenAPI publication.
520
+ inspectRoutes() {
521
+ return this.routes
522
+ .filter(function (r) { return typeof r.method === "string"; })
523
+ .map(function (r) {
524
+ return {
525
+ method: r.method,
526
+ pattern: r.pattern,
527
+ description: r.spec ? r.spec.description || null : null,
528
+ spec: r.spec ? {
529
+ hasBodySchema: !!r.spec.body,
530
+ hasQuerySchema: !!r.spec.query,
531
+ hasParamsSchema: !!r.spec.params,
532
+ hasResponseSchema: !!r.spec.response,
533
+ bodyJsonSchema: r.spec.bodyJsonSchema || null,
534
+ queryJsonSchema: r.spec.queryJsonSchema || null,
535
+ paramsJsonSchema: r.spec.paramsJsonSchema || null,
536
+ responseJsonSchema: r.spec.responseJsonSchema || null,
537
+ tags: Array.isArray(r.spec.tags) ? r.spec.tags.slice() : [],
538
+ summary: r.spec.summary || null,
539
+ } : null,
540
+ };
541
+ });
542
+ }
543
+
544
+ // openapi(opts?) → minimal Swagger 3.0 document covering every
545
+ // schema-spec'd route. Body / query / params show up as parameter
546
+ // entries when the operator supplies bodyJsonSchema / etc. (a
547
+ // safeSchema → JSON Schema converter is its own primitive — operators
548
+ // who want full schema bodies in the OpenAPI doc supply the JSON
549
+ // Schema alongside the safeSchema today).
550
+ openapi(opts) {
551
+ opts = opts || {};
552
+ var info = opts.info || { title: "blamejs app", version: "0.0.0" };
553
+ var paths = {};
554
+ var routes = this.inspectRoutes();
555
+ for (var i = 0; i < routes.length; i++) {
556
+ var r = routes[i];
557
+ var openapiPath = r.pattern.replace(/:([a-zA-Z0-9_]+)/g, "{$1}");
558
+ if (!paths[openapiPath]) paths[openapiPath] = {};
559
+ var op = {
560
+ summary: r.spec ? r.spec.summary || r.description || (r.method + " " + r.pattern) :
561
+ (r.method + " " + r.pattern),
562
+ description: r.description || null,
563
+ };
564
+ if (r.spec) {
565
+ op.tags = r.spec.tags;
566
+ var params = [];
567
+ // Path params from pattern
568
+ var pathParams = (r.pattern.match(/:[a-zA-Z0-9_]+/g) || [])
569
+ .map(function (s) { return s.slice(1); });
570
+ for (var pp = 0; pp < pathParams.length; pp++) {
571
+ params.push({ name: pathParams[pp], in: "path", required: true,
572
+ schema: { type: "string" } });
573
+ }
574
+ if (r.spec.queryJsonSchema && r.spec.queryJsonSchema.properties) {
575
+ var qprops = r.spec.queryJsonSchema.properties;
576
+ var qreq = r.spec.queryJsonSchema.required || [];
577
+ var qkeys = Object.keys(qprops);
578
+ for (var qi = 0; qi < qkeys.length; qi++) {
579
+ params.push({ name: qkeys[qi], in: "query",
580
+ required: qreq.indexOf(qkeys[qi]) !== -1,
581
+ schema: qprops[qkeys[qi]] });
582
+ }
583
+ }
584
+ if (params.length > 0) op.parameters = params;
585
+ if (r.spec.bodyJsonSchema) {
586
+ op.requestBody = {
587
+ required: true,
588
+ content: { "application/json": { schema: r.spec.bodyJsonSchema } },
589
+ };
590
+ } else if (r.spec.hasBodySchema) {
591
+ // Operator validates via safeSchema but didn't supply JSON Schema.
592
+ op["x-blamejs-body-validation"] = "safe-schema (json schema not provided)";
593
+ }
594
+ if (r.spec.responseJsonSchema) {
595
+ op.responses = {
596
+ "200": {
597
+ description: "OK",
598
+ content: { "application/json": { schema: r.spec.responseJsonSchema } },
599
+ },
600
+ };
601
+ }
602
+ }
603
+ paths[openapiPath][r.method.toLowerCase()] = op;
604
+ }
605
+ return {
606
+ openapi: "3.0.3",
607
+ info: info,
608
+ paths: paths,
609
+ };
610
+ }
611
+
612
+ // ---- WebSocket route registration ----
613
+ //
614
+ // ws(nodePath, handler, opts?)
615
+ // path — exact match. Path-param patterns aren't supported on
616
+ // upgrade requests; operators that need dynamic paths
617
+ // register one ws route per stable shape.
618
+ // handler — function(conn, req) — called with the WebSocketConnection
619
+ // and the original HTTP request (req for h1, request
620
+ // headers object for h2 Extended CONNECT). Operator owns
621
+ // the conn lifecycle from there.
622
+ // opts:
623
+ // transport: "auto" (default) | "h1-only" | "h2-only"
624
+ // auto — accept both transports per ALPN negotiation
625
+ // h1-only — refuse h2 Extended CONNECT with :status 405
626
+ // h2-only — refuse h1 upgrade with 426 Upgrade Required +
627
+ // `Upgrade: h2c` advisory header
628
+ // origins: string[] | "*" | undefined — operator allowlist;
629
+ // omitted = accept all (a startup warning fires when
630
+ // the path is registered, since omitting origin
631
+ // policy on a public-facing path is rarely intended)
632
+ // subprotocols: string[] — first match wins
633
+ // maxMessageBytes / pingIntervalMs / pongTimeoutMs — passed
634
+ // through to WebSocketConnection
635
+ ws(pathStr, handler, opts) {
636
+ if (typeof pathStr !== "string" || pathStr.length === 0) {
637
+ throw new Error("router.ws: path must be a non-empty string");
638
+ }
639
+ if (typeof handler !== "function") {
640
+ throw new Error("router.ws: handler must be a function");
641
+ }
642
+ opts = opts || {};
643
+ var transport = opts.transport || "auto";
644
+ if (transport !== "auto" && transport !== "h1-only" && transport !== "h2-only") {
645
+ throw new Error("router.ws: transport must be 'auto' | 'h1-only' | 'h2-only'");
646
+ }
647
+ if (!opts.origins) {
648
+ log.warn("WebSocket route '" + pathStr + "' registered without origins allowlist — accepting all origins. Pass { origins: [...] } or { origins: '*' } to silence.");
649
+ }
650
+ this._wsRoutes.set(pathStr, { handler: handler, opts: opts, transport: transport });
651
+ }
652
+
653
+ _match(route, pathname) {
654
+ return _matchCompiled(route, pathname);
655
+ }
656
+
657
+ async handle(req, res) {
658
+ // Compose an absolute URL from the request's path + Host header so
659
+ // safeUrl.parse can validate the protocol + length. The "http://"
660
+ // base is the relative-resolution origin; the request's actual
661
+ // scheme lives in requestHelpers.requestProtocol elsewhere.
662
+ var absolute = "http://" + (req.headers.host || "localhost") + (req.url || "/");
663
+ var parsed = safeUrl.parse(absolute, {
664
+ allowedProtocols: safeUrl.ALLOW_HTTP_ALL,
665
+ });
666
+ req.pathname = parsed.pathname;
667
+ // CVE-2026-21717 V8 HashDoS defense — cap distinct query keys
668
+ // before forming the dense object. Integer-shaped keys past 1000
669
+ // entries degrade V8 hidden-class transitions to O(n²).
670
+ var queryEntries = [];
671
+ var queryKeyCount = 0;
672
+ for (var pair of parsed.searchParams) {
673
+ queryKeyCount += 1;
674
+ if (queryKeyCount > 1000) { // allow:raw-byte-literal — CVE-2026-21717 V8 HashDoS query-key cap
675
+ res.statusCode = 400;
676
+ res.end("400 Bad Request: too many query keys");
677
+ return;
678
+ }
679
+ queryEntries.push(pair);
680
+ }
681
+ req.query = Object.fromEntries(queryEntries);
682
+
683
+ // Run middleware
684
+ for (var mw of this.middleware) {
685
+ var next = false;
686
+ try {
687
+ await mw(req, res, () => (next = true));
688
+ } catch (mwErr) {
689
+ log.error("middleware error: " + (mw.name || "anonymous") + " " +
690
+ req.method + " " + req.url + " " + mwErr.message + " " +
691
+ (mwErr.stack ? mwErr.stack.split("\n").slice(0, 3).join(" | ") : ""));
692
+ throw mwErr;
693
+ }
694
+ if (!next || res.writableEnded) return;
695
+ }
696
+
697
+ // Match route
698
+ for (var route of this.routes) {
699
+ if (route.method !== req.method) continue;
700
+ var params = this._match(route, req.pathname);
701
+ if (!params) continue;
702
+ req.params = params;
703
+ // Expose the route TEMPLATE so framework middleware (metrics,
704
+ // tracing) can label by template instead of the actual URL —
705
+ // otherwise every distinct path-param value becomes its own
706
+ // cardinality bucket.
707
+ req.routePattern = route.pattern;
708
+
709
+ for (var handler of route.handlers) {
710
+ if (res.writableEnded) return;
711
+ if (handler.length >= 3) {
712
+ var proceeded = false;
713
+ await handler(req, res, () => (proceeded = true));
714
+ if (!proceeded) return;
715
+ } else {
716
+ await handler(req, res);
717
+ }
718
+ }
719
+ return;
720
+ }
721
+
722
+ // Not found
723
+ if (this.notFoundHandler) {
724
+ this.notFoundHandler(req, res);
725
+ } else {
726
+ res.writeHead(HTTP_STATUS.NOT_FOUND, { "Content-Type": "text/html" });
727
+ res.end("<h1>404 Not Found</h1>");
728
+ }
729
+ }
730
+
731
+ getReservedSlugs() {
732
+ var slugs = new Set();
733
+ for (var i = 0; i < this.routes.length; i++) {
734
+ var parts = this.routes[i].pattern.split("/").filter(Boolean);
735
+ if (parts.length > 0 && !parts[0].startsWith(":")) {
736
+ slugs.add(parts[0].toLowerCase());
737
+ }
738
+ }
739
+ return slugs;
740
+ }
741
+
742
+ onNotFound(handler) {
743
+ this.notFoundHandler = handler;
744
+ }
745
+
746
+ onError(handler) {
747
+ this.errorHandler = handler;
748
+ }
749
+
750
+ // Compute the effective TLS 0-RTT posture, fail-closing under the
751
+ // posture-asserted regimes (`pci-dss`, `fapi2`) regardless of operator
752
+ // opt-in. RFC 8446 §8 + PCI DSS 4.0 §6.4.3 + FAPI 2.0 §5.2.2.
753
+ _effective0RttPosture() {
754
+ var declared = this._tls0RttPosture;
755
+ if (declared !== "replay-cache") return declared;
756
+ var active = null;
757
+ try {
758
+ var complianceInst = compliance();
759
+ if (complianceInst && typeof complianceInst.current === "function") active = complianceInst.current();
760
+ } catch (_e) { /* compliance not initialized */ }
761
+ if (active && TLS_0RTT_FAILCLOSED_POSTURES.indexOf(active) !== -1) {
762
+ try {
763
+ audit().safeEmit({
764
+ action: "tls.0rtt.refused",
765
+ outcome: "denied",
766
+ metadata: { reason: "posture-failclosed", posture: active, declared: declared },
767
+ });
768
+ } catch (_e) { /* audit best-effort */ }
769
+ return "refuse";
770
+ }
771
+ return "replay-cache";
772
+ }
773
+
774
+ // Check inbound `Early-Data: 1` (RFC 8470 §5) requests against the
775
+ // 0-RTT replay cache. Returns null when the request should proceed,
776
+ // or a status-code+reason when the request must be refused.
777
+ _check0RttReplay(req) {
778
+ var posture = this._effective0RttPosture();
779
+ var earlyDataHeader = req.headers && (req.headers["early-data"] || req.headers["Early-Data"]);
780
+ if (earlyDataHeader === undefined) return null; // not an early-data forward
781
+ if (String(earlyDataHeader).trim() !== "1") return null; // RFC 8470: only "1" means early data
782
+ if (posture === "refuse") {
783
+ try {
784
+ audit().safeEmit({
785
+ action: "tls.0rtt.refused",
786
+ outcome: "denied",
787
+ metadata: { reason: "posture-refuse", method: req.method, url: req.url },
788
+ });
789
+ } catch (_e) { /* audit best-effort */ }
790
+ return { status: 425, reason: "early-data-refused" };
791
+ }
792
+ // posture === "replay-cache" — dedupe by SHA3-512 within the rolling
793
+ // window. Hash inputs (method + url + Host + Authorization + bound
794
+ // request id) so identical retries replay-detect; legitimate-but-
795
+ // distinct retries differentiate via Idempotency-Key / Date.
796
+ var nowMs = Date.now();
797
+ this._reap0RttCache(nowMs);
798
+ var hash = require("node:crypto").createHash("sha3-512");
799
+ hash.update(String(req.method || "") + "\n");
800
+ hash.update(String(req.url || "") + "\n");
801
+ hash.update(String((req.headers && req.headers["host"]) || "") + "\n");
802
+ hash.update(String((req.headers && req.headers["authorization"]) || "") + "\n");
803
+ hash.update(String((req.headers && req.headers["date"]) || "") + "\n");
804
+ hash.update(String((req.headers && req.headers["idempotency-key"]) || "") + "\n");
805
+ var key = hash.digest("hex");
806
+ if (this._tls0RttReplayCache.has(key)) {
807
+ try {
808
+ audit().safeEmit({
809
+ action: "tls.0rtt.replayed",
810
+ outcome: "denied",
811
+ metadata: { reason: "cache-hit", method: req.method, url: req.url,
812
+ windowMs: TLS_0RTT_REPLAY_WINDOW_MS },
813
+ });
814
+ } catch (_e) { /* audit best-effort */ }
815
+ return { status: 425, reason: "early-data-replay" };
816
+ }
817
+ // Bounded entry count — when the cache hits the cap, drop the
818
+ // oldest entries to make room. The reap pass already ran above.
819
+ if (this._tls0RttReplayCache.size >= TLS_0RTT_REPLAY_CACHE_CAP) {
820
+ var keys = this._tls0RttReplayCache.keys();
821
+ var toEvict = (this._tls0RttReplayCache.size - TLS_0RTT_REPLAY_CACHE_CAP) + 1;
822
+ for (var i = 0; i < toEvict; i += 1) {
823
+ var first = keys.next();
824
+ if (first.done) break;
825
+ this._tls0RttReplayCache.delete(first.value);
826
+ }
827
+ }
828
+ this._tls0RttReplayCache.set(key, nowMs + TLS_0RTT_REPLAY_WINDOW_MS);
829
+ try {
830
+ audit().safeEmit({
831
+ action: "tls.0rtt.accepted",
832
+ outcome: "success",
833
+ metadata: { method: req.method, url: req.url, windowMs: TLS_0RTT_REPLAY_WINDOW_MS },
834
+ });
835
+ } catch (_e) { /* audit best-effort */ }
836
+ return null;
837
+ }
838
+
839
+ _reap0RttCache(nowMs) {
840
+ if (this._tls0RttReplayCache.size === 0) return;
841
+ var iter = this._tls0RttReplayCache.entries();
842
+ for (var entry = iter.next(); !entry.done; entry = iter.next()) {
843
+ if (entry.value[1] <= nowMs) this._tls0RttReplayCache.delete(entry.value[0]);
844
+ }
845
+ }
846
+
847
+ listen(port, cb, tlsOptions, host) {
848
+ var self = this;
849
+ var requestHandler = (req, res) => {
850
+ // RFC 8446 §8 / RFC 8470 — TLS 1.3 0-RTT anti-replay gate.
851
+ // Refuse / dedupe Early-Data: 1 forwarded requests per the
852
+ // operator's tls0Rtt posture.
853
+ var verdict0Rtt = self._check0RttReplay(req);
854
+ if (verdict0Rtt) {
855
+ // RFC 8470 §5 — 425 Too Early. Connection: close so the peer
856
+ // cannot reuse the session ticket on the next attempt.
857
+ res.writeHead(425, {
858
+ "Content-Type": "text/plain; charset=utf-8",
859
+ "Connection": "close",
860
+ });
861
+ res.end(verdict0Rtt.reason);
862
+ return;
863
+ }
864
+ // Response helpers
865
+ res.json = (data) => {
866
+ res.writeHead(res.statusCode || HTTP_STATUS.OK, { "Content-Type": "application/json" });
867
+ res.end(JSON.stringify(data));
868
+ };
869
+ res.redirect = (url) => {
870
+ // Same-origin (single leading slash, not protocol-relative) is
871
+ // always allowed. Cross-origin redirects (OAuth authorization
872
+ // endpoint, SSO bounce, SCIM step-up) require the operator to
873
+ // declare the destination via `allowedRedirectOrigins` on
874
+ // router.create. Anything else throws RouterError — silently
875
+ // rewriting attacker-controlled redirect targets to "/" hides
876
+ // open-redirect attempts that operators want to see in audit.
877
+ if (typeof url !== "string" || url.length === 0) {
878
+ throw new RouterError(
879
+ "router/redirect-target-not-string",
880
+ "res.redirect: target must be a non-empty string"
881
+ );
882
+ }
883
+ // Reject embedded CR / LF / NUL early — header injection class.
884
+ // Node's writeHead would refuse these too, but the explicit
885
+ // refusal here gives operators a router-shaped error rather than
886
+ // a generic ERR_INVALID_CHAR.
887
+ for (var ci = 0; ci < url.length; ci += 1) {
888
+ var cc = url.charCodeAt(ci);
889
+ if (cc === 0x00 || cc === 0x0A || cc === 0x0D) {
890
+ throw new RouterError(
891
+ "router/redirect-target-has-control-chars",
892
+ "res.redirect: target must not contain CR / LF / NUL bytes"
893
+ );
894
+ }
895
+ }
896
+ // Same-origin path: a single leading "/" not followed by another
897
+ // "/" or "\" (the protocol-relative + Windows-share shapes that
898
+ // browsers happily resolve as off-origin).
899
+ if (url.charAt(0) === "/" &&
900
+ url.charAt(1) !== "/" && url.charAt(1) !== "\\") {
901
+ // 302 Found — RFC 7231 §6.4.3. Not in HTTP_STATUS table.
902
+ res.writeHead(302, { Location: url });
903
+ res.end();
904
+ return;
905
+ }
906
+ // Cross-origin path: parse + match against the allowlist.
907
+ var parsedTarget;
908
+ try {
909
+ parsedTarget = safeUrl.parse(url, {
910
+ allowedProtocols: ["https:"],
911
+ });
912
+ } catch (parseErr) {
913
+ try {
914
+ audit().safeEmit({
915
+ action: "router.redirect.cross_origin.refused",
916
+ outcome: "denied",
917
+ metadata: {
918
+ reason: "target-parse-failed",
919
+ target: url,
920
+ cause: parseErr && parseErr.message,
921
+ },
922
+ });
923
+ } catch (_e) { /* audit best-effort */ }
924
+ throw new RouterError(
925
+ "router/redirect-cross-origin-refused",
926
+ "res.redirect: cross-origin target '" + url + "' is not a valid HTTPS URL (" +
927
+ (parseErr && parseErr.message) + ")"
928
+ );
929
+ }
930
+ var targetOrigin = parsedTarget.origin;
931
+ var allowlist = self._allowedRedirectOrigins;
932
+ var match = false;
933
+ for (var ai = 0; ai < allowlist.length; ai += 1) {
934
+ if (allowlist[ai] === targetOrigin) { match = true; break; }
935
+ }
936
+ if (!match) {
937
+ try {
938
+ audit().safeEmit({
939
+ action: "router.redirect.cross_origin.refused",
940
+ outcome: "denied",
941
+ metadata: {
942
+ reason: allowlist.length === 0 ? "no-allowlist" : "origin-not-in-allowlist",
943
+ target: url,
944
+ origin: targetOrigin,
945
+ },
946
+ });
947
+ } catch (_e) { /* audit best-effort */ }
948
+ throw new RouterError(
949
+ "router/redirect-cross-origin-refused",
950
+ "res.redirect: cross-origin target '" + targetOrigin +
951
+ "' is not in router.allowedRedirectOrigins"
952
+ );
953
+ }
954
+ try {
955
+ audit().safeEmit({
956
+ action: "router.redirect.cross_origin.allowed",
957
+ outcome: "success",
958
+ metadata: { target: url, origin: targetOrigin },
959
+ });
960
+ } catch (_e) { /* audit best-effort */ }
961
+ res.writeHead(302, { Location: url });
962
+ res.end();
963
+ };
964
+ res.status = (code) => {
965
+ res.statusCode = code;
966
+ return res;
967
+ };
968
+
969
+ self.handle(req, res).catch((err) => {
970
+ log.error("route error: " + req.method + " " + req.url + " " + err.message + " " +
971
+ (err.stack ? err.stack.split("\n").slice(0, 5).join(" | ") : ""));
972
+ if (self.errorHandler) {
973
+ try { self.errorHandler(err, req, res); } catch (_) {
974
+ if (!res.writableEnded) {
975
+ res.writeHead(HTTP_STATUS.INTERNAL_SERVER_ERROR, { "Content-Type": "text/plain" });
976
+ res.end("Internal Server Error");
977
+ }
978
+ }
979
+ } else if (!res.writableEnded) {
980
+ res.writeHead(HTTP_STATUS.INTERNAL_SERVER_ERROR, { "Content-Type": "text/plain" });
981
+ res.end("Internal Server Error");
982
+ }
983
+ });
984
+ };
985
+ var server;
986
+ if (tlsOptions) {
987
+ // CVE-2026-21637 — Node propagates synchronous throws from a
988
+ // user-supplied SNICallback up through the TLS handshake
989
+ // listener; an unhandled throw on an unexpected servername
990
+ // crashes the listener. Wrap the operator's SNICallback so any
991
+ // synchronous error becomes a clean async (err, null) callback.
992
+ // RFC 6066 §3 expects the server to abort the handshake on a
993
+ // failed callback, not crash the process.
994
+ if (tlsOptions.SNICallback && typeof tlsOptions.SNICallback === "function") {
995
+ var operatorSniCallback = tlsOptions.SNICallback;
996
+ tlsOptions = Object.assign({}, tlsOptions, {
997
+ SNICallback: function (servername, cb) {
998
+ try {
999
+ operatorSniCallback(servername, cb);
1000
+ } catch (err) {
1001
+ log.error("SNICallback threw for servername=" +
1002
+ JSON.stringify(servername) + ": " + (err && err.message));
1003
+ try { cb(err, null); } catch (_e) { /* cb already invoked */ }
1004
+ }
1005
+ },
1006
+ });
1007
+ }
1008
+ // TLS 1.3 minimum — operator can override but the framework's
1009
+ // default refuses pre-1.3 negotiation. Without this set the
1010
+ // bare {key, cert} path inherits Node's TLSv1.2 default; the
1011
+ // outbound httpClient already pins TLS 1.3.
1012
+ if (!tlsOptions.minVersion) {
1013
+ tlsOptions = Object.assign({ minVersion: "TLSv1.3" }, tlsOptions);
1014
+ }
1015
+ // RFC 8446 §8 / §2.3 — TLS 1.3 0-RTT anti-replay posture. Operator
1016
+ // sets allowEarlyData per `tls0Rtt`. Default "refuse" matches Node.
1017
+ // "replay-cache" admits 0-RTT but every Early-Data: 1 request is
1018
+ // dedupe-checked in the request handler against the rolling cache.
1019
+ var posture0Rtt = self._effective0RttPosture();
1020
+ if (tlsOptions.allowEarlyData === undefined) {
1021
+ tlsOptions.allowEarlyData = (posture0Rtt === "replay-cache");
1022
+ }
1023
+ // h2-capable server with h1 fallback via ALPN. ["h2", "http/1.1"]
1024
+ // means modern clients negotiate h2 (preferred); legacy clients
1025
+ // fall back to h1. allowHTTP1: true is what makes the same server
1026
+ // accept both. enableConnectProtocol: true is what enables h2
1027
+ // WebSocket (RFC 8441) — clients refuse to issue Extended CONNECT
1028
+ // until they see this in the server's SETTINGS frame.
1029
+ // Framework-default HTTP/2 hardening — operator-supplied
1030
+ // tlsOptions can override any of these.
1031
+ //
1032
+ // maxConcurrentStreams: cap concurrent streams per session (Node
1033
+ // default is 4294967295 — way too high; CVE-2023-44487 Rapid
1034
+ // Reset relies on the unbounded default).
1035
+ // maxSessionMemory: 10 MB cap per session (Node default; explicit).
1036
+ // maxHeaderListPairs: 100 header pairs max (Node default 128;
1037
+ // tightened — CVE-2024-27983 / CVE-2024-28182 CONTINUATION
1038
+ // flood relies on header-pair amplification).
1039
+ // maxSettings: cap SETTINGS-frame entries.
1040
+ // peerMaxConcurrentStreams: cap how many streams the peer is
1041
+ // willing to accept (limits server-initiated push, which the
1042
+ // framework doesn't use).
1043
+ // unknownProtocolTimeout: 10s — drop sessions stuck in protocol-
1044
+ // detection (Slowloris-h2 variant).
1045
+ server = http2.createSecureServer(Object.assign({
1046
+ allowHTTP1: true,
1047
+ ALPNProtocols: ["h2", "http/1.1"],
1048
+ settings: { enableConnectProtocol: true },
1049
+ maxConcurrentStreams: 100, // allow:raw-byte-literal — CVE-2023-44487 Rapid Reset cap
1050
+ maxSessionMemory: 10, // allow:raw-byte-literal — MB cap (Node default explicit)
1051
+ maxHeaderListPairs: 100, // allow:raw-byte-literal — CVE-2024-27983 CONTINUATION-flood cap
1052
+ maxSettings: 32, // allow:raw-byte-literal — SETTINGS-frame entry ceiling
1053
+ peerMaxConcurrentStreams: 100, // allow:raw-byte-literal — peer-side stream cap
1054
+ maxOutstandingPings: 10, // allow:raw-byte-literal — CVE-2019-9512 ping-flood cap (pin to Node default rather than letting it drift)
1055
+ unknownProtocolTimeout: C.TIME.seconds(10),
1056
+ }, tlsOptions), requestHandler);
1057
+
1058
+ // CVE-2026-21714 — H/2 WINDOW_UPDATE leak after GOAWAY. nghttp2
1059
+ // holds per-stream flow-control state after GOAWAY; late-arriving
1060
+ // WINDOW_UPDATE frames can re-credit a draining stream. Node's
1061
+ // http2 module hands flow control to nghttp2 internally and does
1062
+ // not expose a per-frame WINDOW_UPDATE listener; the framework
1063
+ // gate is to track GOAWAY state on every session, refuse new
1064
+ // streams once GOAWAY has been emitted by either side, and
1065
+ // force-destroy the session on any post-GOAWAY stream activity.
1066
+ // Combined with the Node 24.14+ engine pin (where the upstream
1067
+ // nghttp2 fix lives), the path closes at both layers.
1068
+ server.on("session", function (h2session) {
1069
+ h2session._blamejsGoawaySent = false;
1070
+ // Wrap goaway() so the framework's own send marks the session.
1071
+ var origGoaway = (typeof h2session.goaway === "function")
1072
+ ? h2session.goaway.bind(h2session) : null;
1073
+ if (origGoaway) {
1074
+ h2session.goaway = function (code, lastStreamID, opaqueData) {
1075
+ h2session._blamejsGoawaySent = true;
1076
+ return origGoaway(code, lastStreamID, opaqueData);
1077
+ };
1078
+ }
1079
+ // Inbound GOAWAY from peer also flips the flag — once GOAWAY is
1080
+ // in flight in either direction, no new streams should land.
1081
+ h2session.on("goaway", function () {
1082
+ h2session._blamejsGoawaySent = true;
1083
+ });
1084
+ // Per-stream rate cap on _any_ post-GOAWAY activity. If a stream
1085
+ // opens after GOAWAY emission, refuse + audit + destroy session
1086
+ // (a clean peer would not initiate after GOAWAY).
1087
+ h2session.on("stream", function (stream) {
1088
+ if (h2session._blamejsGoawaySent) {
1089
+ try { audit().safeEmit({
1090
+ action: "http2.window_update.refused",
1091
+ outcome: "denied",
1092
+ metadata: { reason: "post-goaway-stream", streamId: stream.id || null,
1093
+ frameType: WINDOW_UPDATE_FRAME_TYPE,
1094
+ rateCap: WINDOW_UPDATE_RATE_CAP,
1095
+ rateWindowMs: WINDOW_UPDATE_RATE_WINDOW_MS },
1096
+ }); } catch (_e) { /* audit best-effort */ }
1097
+ try { stream.close(); } catch (_e) { /* stream already closed */ }
1098
+ try { h2session.destroy(); } catch (_e) { /* session already closed */ }
1099
+ }
1100
+ });
1101
+ });
1102
+ } else {
1103
+ // Cleartext path is h1-only. Operators wanting h2c on cleartext
1104
+ // are typically running behind a TLS-terminating LB that does
1105
+ // h1↔h2 translation; the framework's TLS path covers that.
1106
+ server = http.createServer(requestHandler);
1107
+ }
1108
+
1109
+ // ---- WebSocket wiring ----
1110
+ // Only registers handlers when there are ws routes — keeps the
1111
+ // server's emitter list clean for HTTP-only deployments.
1112
+ if (self._wsRoutes.size > 0) {
1113
+ // h1 upgrade event — fires for "Upgrade: websocket" from h1
1114
+ // clients. Routes by nodePath; refuses with 426 in h2-only mode.
1115
+ server.on("upgrade", function (req, socket, head) {
1116
+ var pathname = String(req.url || "/").split("?")[0];
1117
+ var route = self._wsRoutes.get(pathname);
1118
+ if (!route) {
1119
+ socket.destroy();
1120
+ return;
1121
+ }
1122
+ if (route.transport === "h2-only") {
1123
+ // RFC-correct way to say "use h2": 426 Upgrade Required plus
1124
+ // an Upgrade advisory pointing to h2c.
1125
+ var body = "WebSocket on this path requires HTTP/2";
1126
+ var resp =
1127
+ "HTTP/1.1 426 Upgrade Required\r\n" +
1128
+ "Upgrade: h2c\r\n" +
1129
+ "Connection: close\r\n" +
1130
+ "Content-Type: text/plain; charset=utf-8\r\n" +
1131
+ "Content-Length: " + Buffer.byteLength(body, "utf8") + "\r\n" +
1132
+ "\r\n" +
1133
+ body;
1134
+ try { socket.write(resp); } catch (_e) { /* socket already closed */ }
1135
+ try { socket.destroy(); } catch (_e) { /* socket already destroyed */ }
1136
+ return;
1137
+ }
1138
+ var conn = websocket.handleUpgrade(req, socket, head, route.opts);
1139
+ if (conn) {
1140
+ self._activeWsConns.add(conn);
1141
+ conn.once("close", function () { self._activeWsConns.delete(conn); });
1142
+ try { route.handler(conn, req); }
1143
+ catch (err) { log.error("ws handler threw: " + err.message); conn._abort(websocket.CLOSE_INTERNAL_ERROR, "handler error"); }
1144
+ }
1145
+ });
1146
+
1147
+ // h2 Extended CONNECT — only fires on h2-capable (TLS) server.
1148
+ // The 'stream' event filter checks for :method=CONNECT,
1149
+ // :protocol=websocket. Other CONNECT methods (e.g. tunnel) and
1150
+ // ordinary requests pass through.
1151
+ if (tlsOptions) {
1152
+ server.on("stream", function (stream, headers) {
1153
+ if (headers[":method"] !== "CONNECT") return;
1154
+ if (headers[":protocol"] !== "websocket") return;
1155
+ var pathname = String(headers[":path"] || "/").split("?")[0];
1156
+ var route = self._wsRoutes.get(pathname);
1157
+ if (!route) {
1158
+ try { stream.respond({ ":status": 404 }); stream.end(); } catch (_e) { /* stream already closed */ }
1159
+ return;
1160
+ }
1161
+ if (route.transport === "h1-only") {
1162
+ try {
1163
+ stream.respond({ ":status": 405, "content-type": "text/plain; charset=utf-8" });
1164
+ stream.end("WebSocket on this path requires HTTP/1.1 Upgrade");
1165
+ } catch (_e) { /* stream already closed */ }
1166
+ return;
1167
+ }
1168
+ var conn = websocket.handleExtendedConnect(stream, headers, route.opts);
1169
+ if (conn) {
1170
+ self._activeWsConns.add(conn);
1171
+ conn.once("close", function () { self._activeWsConns.delete(conn); });
1172
+ try { route.handler(conn, headers); }
1173
+ catch (err) { log.error("ws handler threw: " + err.message); conn._abort(websocket.CLOSE_INTERNAL_ERROR, "handler error"); }
1174
+ }
1175
+ });
1176
+ }
1177
+ }
1178
+
1179
+ if (host) server.listen(port, host, cb);
1180
+ else server.listen(port, cb);
1181
+ // Slowloris / slow-read defenses. Node defaults shifted across
1182
+ // versions; the framework pins them explicitly so operators on
1183
+ // older Node releases get the modern bar.
1184
+ //
1185
+ // headersTimeout: 60s — time allotted for the entire request-line
1186
+ // + header section. Slowloris's classic posture is a connection
1187
+ // that trickles headers indefinitely.
1188
+ // requestTimeout: 5min — total wall-clock for a request including
1189
+ // body. Body-streaming uploads through fileUpload can take
1190
+ // minutes; this is the operator-overridable ceiling.
1191
+ // keepAliveTimeout: 5s — idle timeout between requests on a
1192
+ // keep-alive connection.
1193
+ // server.timeout: 5min — hardware/network timeout (legacy).
1194
+ server.headersTimeout = C.TIME.seconds(60);
1195
+ server.requestTimeout = C.TIME.minutes(5);
1196
+ server.keepAliveTimeout = C.TIME.seconds(5);
1197
+ server.timeout = C.TIME.minutes(5);
1198
+ return server;
1199
+ }
1200
+ }
1201
+
1202
+ /**
1203
+ * @primitive b.router.serveStatic
1204
+ * @signature b.router.serveStatic(dir)
1205
+ * @since 0.1.0
1206
+ * @related b.router.create, b.staticServe
1207
+ *
1208
+ * Returns a middleware function that serves files from `dir` for GET
1209
+ * requests whose `req.pathname` resolves inside `dir`. Path traversal
1210
+ * (`..`) and NUL-byte filenames bypass the middleware (next()), as do
1211
+ * directory listings and missing files. Sniffed Content-Type comes
1212
+ * from a small extension table; unknown extensions fall back to
1213
+ * `application/octet-stream`. Versioned URLs (`?v=...`) ship with a
1214
+ * one-year `immutable` Cache-Control; un-versioned files get one hour.
1215
+ *
1216
+ * For richer content-safety, byte-range requests, and the framework's
1217
+ * full guard wiring, prefer `b.staticServe.create` over this helper.
1218
+ *
1219
+ * @example
1220
+ * var router = b.router.create();
1221
+ * router.use(b.router.serveStatic("/var/www/public"));
1222
+ * router.listen(3000);
1223
+ */
1224
+ // Static file serving middleware
1225
+ function serveStatic(dir) {
1226
+ var root = nodePath.resolve(dir);
1227
+ return (req, res, next) => {
1228
+ if (req.method !== "GET") return next();
1229
+ var rel = req.pathname;
1230
+ if (rel.includes("\0")) return next();
1231
+ var filePath = nodePath.resolve(nodePath.join(root, rel));
1232
+ if (!filePath.startsWith(root)) return next();
1233
+ if (!nodeFs.existsSync(filePath) || nodeFs.statSync(filePath).isDirectory()) return next();
1234
+
1235
+ var ext = nodePath.extname(filePath).toLowerCase();
1236
+ var mime = MIME_TYPES[ext] || "application/octet-stream";
1237
+ var stat = nodeFs.statSync(filePath);
1238
+ var hasVersion = req.url && req.url.includes("?v=");
1239
+ var cacheControl = hasVersion
1240
+ ? "public, max-age=31536000, immutable"
1241
+ : "public, max-age=3600";
1242
+ res.writeHead(HTTP_STATUS.OK, {
1243
+ "Content-Type": mime,
1244
+ "Content-Length": stat.size,
1245
+ "Cache-Control": cacheControl,
1246
+ });
1247
+ nodeFs.createReadStream(filePath).pipe(res);
1248
+ };
1249
+ }
1250
+
1251
+ /**
1252
+ * @primitive b.router.create
1253
+ * @signature b.router.create(opts?)
1254
+ * @since 0.1.0
1255
+ * @related b.router.serveStatic
1256
+ *
1257
+ * Builds a `Router` instance with the framework's security-on-by-
1258
+ * default posture. Returned object exposes `get / post / put / patch
1259
+ * / delete` for route registration, `use(fn)` for global middleware,
1260
+ * `ws(path, handler, opts?)` for WebSocket routes, `onNotFound(fn)`
1261
+ * and `onError(fn)` for fallthrough hooks, `inspectRoutes()` and
1262
+ * `openapi()` for introspection, `closeWebSockets({ timeoutMs })`
1263
+ * for graceful shutdown, and `listen(port, cb?, tlsOptions?, host?)`
1264
+ * which boots an HTTP/2-capable TLS server (ALPN h2 + http/1.1) when
1265
+ * `tlsOptions` is provided, an HTTP/1.1 server otherwise.
1266
+ *
1267
+ * @opts
1268
+ * tls0Rtt: "refuse" | "replay-cache", // RFC 8446 §8 anti-replay; default "refuse"
1269
+ * allowedRedirectOrigins: string[], // exact-match HTTPS origins for cross-origin res.redirect()
1270
+ *
1271
+ * @example
1272
+ * var router = b.router.create({
1273
+ * tls0Rtt: "refuse",
1274
+ * allowedRedirectOrigins: ["https://idp.example.com"],
1275
+ * });
1276
+ * router.get("/users/:id", function (req, res) {
1277
+ * res.json({ id: req.params.id });
1278
+ * });
1279
+ * router.listen(3000);
1280
+ */
1281
+ function create(opts) {
1282
+ return new Router(opts);
1283
+ }
1284
+
1285
+ module.exports = {
1286
+ Router: Router,
1287
+ create: create,
1288
+ serveStatic: serveStatic,
1289
+ };