@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,1249 @@
1
+ "use strict";
2
+ /**
3
+ * staticServe — server-side download primitive with the same v1-defensible
4
+ * surface as b.fileUpload: permissions integration, audit emission with
5
+ * 5-W's actor context, observability counters, bandwidth + concurrency
6
+ * quotas (cluster-shared via b.cache), Range support (RFC 7233 single-range),
7
+ * the full conditional-request set (If-None-Match / If-Match /
8
+ * If-Modified-Since / If-Unmodified-Since), MIME allowlist with magic-byte
9
+ * verification (composes b.fileType), per-request operator hook, idle-stream
10
+ * timeout, cancellation propagation, force-revoke, and compliance-retention
11
+ * gating.
12
+ *
13
+ * var serve = b.staticServe.create({ root, ...opts });
14
+ * await serve.revoke(absUrlPath); // operator force-revoke
15
+ * serve.stats(); // bytes / requests / etag-hits
16
+ * var mw = serve.middleware; // (req, res, next)
17
+ * await b.staticServe.integrity(absFilePath); // SRI helper (SHA-384)
18
+ *
19
+ * Backwards compatible: every existing opt (root, mountPath,
20
+ * hashedPathPattern, indexFile, defaultMaxAge, contentTypes) keeps its
21
+ * original meaning. New opts (permissions, cache, audit, observability,
22
+ * fileType, allowedFileTypes, maxBytesPerActorPerWindowMs, etc.) are all
23
+ * optional with security-on defaults (auditSuccess / auditFailures default
24
+ * true; range support defaults true; ETag is SHA3-512-truncated for PQC
25
+ * posture, the SRI integrity helper keeps SHA-384 because the W3C
26
+ * subresource-integrity spec only allows sha256/sha384/sha512).
27
+ *
28
+ * Backward-compat shape: create(opts) MAY be called for the bare middleware
29
+ * (the v0.6.x shape) — the result is callable as `(req, res, next)` and
30
+ * also exposes the new methods. That keeps existing tests + operator code
31
+ * passing while opening the surface.
32
+ */
33
+
34
+ var nodeFs = require("node:fs");
35
+ var fsp = require("node:fs/promises");
36
+ var nodeCrypto = require("node:crypto");
37
+ var nodePath = require("node:path");
38
+ var C = require("./constants");
39
+ var gateContract = require("./gate-contract");
40
+ var lazyRequire = require("./lazy-require");
41
+ var numericBounds = require("./numeric-bounds");
42
+ var requestHelpers = require("./request-helpers");
43
+ var validateOpts = require("./validate-opts");
44
+ var { StaticServeError } = require("./framework-error");
45
+
46
+ // observability is lazy-required because it pulls in the metrics tap +
47
+ // safeEvent path, and during framework boot static.js may load before
48
+ // observability is ready.
49
+ var observability = lazyRequire(function () { return require("./observability"); });
50
+
51
+ // guard-* family is wired on by default; lazy-loaded to avoid eager
52
+ // import cycles. Operators opt out via contentSafety: null (audited).
53
+ var guardAll = lazyRequire(function () { return require("./guard-all"); });
54
+ var guardFilename = lazyRequire(function () { return require("./guard-filename"); });
55
+
56
+ var _err = StaticServeError.factory;
57
+
58
+ var HTTP = requestHelpers.HTTP_STATUS;
59
+
60
+ var DEFAULT_HASHED_PATTERN = /\.[a-fA-F0-9]{8,}\./;
61
+ var DEFAULT_INDEX_FILE = "index.html";
62
+ var DEFAULT_MAX_AGE_SEC = C.TIME.hours(1) / C.TIME.seconds(1); // 1h non-hashed
63
+ var IMMUTABLE_MAX_AGE_SEC = C.TIME.days(365) / C.TIME.seconds(1); // 1y hashed
64
+ var DEFAULT_BANDWIDTH_WINDOW_MS = C.TIME.minutes(1);
65
+ var DEFAULT_MAX_IDLE_MS = C.TIME.minutes(2);
66
+ // SHA3-512 produces 64 bytes / 128 hex chars. ETag uses the first 32 hex
67
+ // chars (128 bits) — overkill for collision resistance but cheap; the same
68
+ // hash powers content addressing across the framework.
69
+ var ETAG_HEX_PREFIX = C.BYTES.bytes(32);
70
+
71
+ // Minimal MIME table (kept from the v0.6 ship for compat).
72
+ var DEFAULT_CONTENT_TYPES = {
73
+ ".html": "text/html; charset=utf-8",
74
+ ".htm": "text/html; charset=utf-8",
75
+ ".css": "text/css; charset=utf-8",
76
+ ".js": "application/javascript; charset=utf-8",
77
+ ".mjs": "application/javascript; charset=utf-8",
78
+ ".json": "application/json; charset=utf-8",
79
+ ".map": "application/json; charset=utf-8",
80
+ ".txt": "text/plain; charset=utf-8",
81
+ ".md": "text/markdown; charset=utf-8",
82
+ ".xml": "application/xml; charset=utf-8",
83
+ ".svg": "image/svg+xml",
84
+ ".png": "image/png",
85
+ ".jpg": "image/jpeg",
86
+ ".jpeg": "image/jpeg",
87
+ ".gif": "image/gif",
88
+ ".webp": "image/webp",
89
+ ".avif": "image/avif",
90
+ ".ico": "image/x-icon",
91
+ ".woff": "font/woff",
92
+ ".woff2": "font/woff2",
93
+ ".ttf": "font/ttf",
94
+ ".otf": "font/otf",
95
+ ".pdf": "application/pdf",
96
+ ".wasm": "application/wasm",
97
+ ".webmanifest": "application/manifest+json",
98
+ };
99
+
100
+ var DEFAULTS = Object.freeze({
101
+ defaultMaxAge: DEFAULT_MAX_AGE_SEC,
102
+ acceptRanges: true,
103
+ // Per-range byte cap — slowloris-range defense. A single Range
104
+ // request that asks for 1 GiB pins a worker on a long read; many
105
+ // concurrent requests asking for the same exhaust the process pool.
106
+ // The cap rejects ranges larger than maxRangeBytes with 416. Set to
107
+ // Infinity to opt out (audited reason).
108
+ maxRangeBytes: C.BYTES.mib(64),
109
+ // Empty array = no MIME allowlist gate.
110
+ allowedFileTypes: Object.freeze([]),
111
+ // Bandwidth + concurrency caps default to 0 = "no cap". Operators opt
112
+ // in by setting a positive integer.
113
+ maxBytesPerActorPerWindowMs: 0,
114
+ maxBytesAllActorsPerWindowMs: 0,
115
+ bandwidthWindowMs: DEFAULT_BANDWIDTH_WINDOW_MS,
116
+ maxConcurrentDownloadsPerActor: 0,
117
+ maxIdleMs: DEFAULT_MAX_IDLE_MS,
118
+ // Audit / observability defaults follow the framework's posture: the
119
+ // serve event is the audit-worthy act, not a precursor.
120
+ auditSuccess: true,
121
+ auditFailures: true,
122
+ // forceAttachmentForNonText — stored-XSS defense for user-upload
123
+ // directories. Default OFF because operator-curated asset dirs
124
+ // (CSS / JS bundles / fonts) need inline render. Opt in for
125
+ // user-upload-backed mounts so HTML / JS / SVG without sanitizer
126
+ // / PDF / archives are forced to download. See
127
+ // `_shouldForceAttachment` below for the safe-render allowlist.
128
+ forceAttachmentForNonText: false,
129
+ // Companion knobs — when forceAttachmentForNonText is on, allow
130
+ // image/svg+xml inline render IF an SVG sanitizer gate is wired
131
+ // (default true; the framework's default-on contentSafety wiring
132
+ // includes b.guardSvg). PDF inline render defaults OFF — operators
133
+ // who serve a trusted PDF library opt in explicitly.
134
+ safeRenderSvg: true,
135
+ safeRenderPdf: false,
136
+ });
137
+
138
+ // Module-level metadata cache. Entries hold:
139
+ // { mtimeMs, size, etag, integrity, lastModified, sha3Hex, absPath }
140
+ // Invalidated on mtime / size change.
141
+ var _metaCache = new Map();
142
+
143
+ async function _readMeta(absPath) {
144
+ var stat;
145
+ try { stat = await fsp.stat(absPath); }
146
+ catch (_e) { return null; }
147
+ if (!stat.isFile()) return null;
148
+
149
+ var cached = _metaCache.get(absPath);
150
+ if (cached && cached.mtimeMs === stat.mtimeMs && cached.size === stat.size) {
151
+ return cached;
152
+ }
153
+
154
+ // Stream both hashes side-by-side: SHA-384 for SRI (W3C spec), SHA3-512
155
+ // for the framework ETag (PQC posture). Two transforms over the same
156
+ // chunk avoids re-reading the file.
157
+ var sri = nodeCrypto.createHash("sha384");
158
+ var sha3 = nodeCrypto.createHash("sha3-512");
159
+ await new Promise(function (resolve, reject) {
160
+ // lgtm[js/path-injection] — `absPath` is the sandbox-validated return
161
+ // of `_resolveSafe` (lib/static.js:181 — lexical resolve + startsWith
162
+ // root-prefix check + realpath escape guard + guardFilename gate).
163
+ // Callers cannot reach `_readMeta` with an unvalidated path.
164
+ var s = nodeFs.createReadStream(absPath);
165
+ s.on("data", function (chunk) { sri.update(chunk); sha3.update(chunk); });
166
+ s.on("end", resolve);
167
+ s.on("error", reject);
168
+ });
169
+ var sriDigest = sri.digest("base64");
170
+ var sha3Hex = sha3.digest("hex");
171
+
172
+ var entry = {
173
+ mtimeMs: stat.mtimeMs,
174
+ size: stat.size,
175
+ etag: '"' + sha3Hex.slice(0, ETAG_HEX_PREFIX) + '"',
176
+ integrity: "sha384-" + sriDigest,
177
+ lastModified: new Date(stat.mtimeMs).toUTCString(),
178
+ sha3Hex: sha3Hex,
179
+ absPath: absPath,
180
+ };
181
+ _metaCache.set(absPath, entry);
182
+ return entry;
183
+ }
184
+
185
+ function _resolveSafe(root, requestedPath) {
186
+ if (typeof requestedPath !== "string" || requestedPath.length === 0) return null;
187
+ if (requestedPath.indexOf("\0") !== -1) return null;
188
+ var resolved = nodePath.resolve(root, "." + requestedPath);
189
+ var rootResolved = nodePath.resolve(root);
190
+ if (resolved !== rootResolved &&
191
+ !resolved.startsWith(rootResolved + nodePath.sep)) return null;
192
+
193
+ // Symlink-escape defense — the lexical resolve above only sees the
194
+ // requested path tokens; a symlink anywhere along `resolved` can
195
+ // still point outside `rootResolved` on disk. Compare via realpath
196
+ // for the escape check ONLY; do NOT substitute the realpath result
197
+ // for `resolved`. Substituting breaks downstream consumers that key
198
+ // on the lexical path (revoke list, ETag cache, audit row) AND
199
+ // breaks deploys where the OS prefix-symlinks the temp dir
200
+ // (macOS: /var/folders/X/Y → /private/var/folders/X/Y).
201
+ try {
202
+ var real = nodeFs.realpathSync(resolved);
203
+ var rootReal = nodeFs.realpathSync(rootResolved);
204
+ if (real !== rootReal && !real.startsWith(rootReal + nodePath.sep)) return null;
205
+ } catch (_e) {
206
+ // Path doesn't exist (or is denied) — fall through with the lexical
207
+ // resolution so the caller's stat() returns the natural ENOENT and
208
+ // 404s. realpath failures from non-existence are NOT a smuggling
209
+ // signal; the lexical bound check above already rejected escapes.
210
+ }
211
+
212
+ // Filename safety — the basename gates against path-traversal /
213
+ // null-byte / NTFS ADS / UNC / RTLO bidi / overlong UTF-8 / Windows
214
+ // reserved device names. Uses balanced profile + explicit
215
+ // shellExecExtPolicy: "allow" because static-serve serves operator-
216
+ // deposited disk content: shell-exec extensions (.exe / .bin / .so /
217
+ // legitimate `<name>.<hash>.js` bundler output) are valid here. The
218
+ // other balanced checks still reject the traversal + smuggling
219
+ // surface the user surfaced.
220
+ var fname = nodePath.basename(resolved);
221
+ var rv = guardFilename().validate(fname, {
222
+ profile: "balanced",
223
+ shellExecExtPolicy: "allow",
224
+ });
225
+ if (!rv.ok) return null;
226
+
227
+ return resolved;
228
+ }
229
+
230
+ function _contentTypeFor(filePath, table) {
231
+ var ext = nodePath.extname(filePath).toLowerCase();
232
+ return (table && table[ext]) || DEFAULT_CONTENT_TYPES[ext] || "application/octet-stream";
233
+ }
234
+
235
+ // Risky MIMEs that the browser executes inline. When safeAttachment is
236
+ // on, the framework forces Content-Disposition: attachment so
237
+ // drive-by uploads can't be executed in the user's browser. Operators
238
+ // serving trusted assets (CSS / JS bundle / SVG icon) opt out by NOT
239
+ // setting safeAttachmentForRiskyMimes — leaving the existing inline
240
+ // default. The defense is per-CVE-2017-15012 (SVG XSS) /
241
+ // CVE-2009-1312 (HTML drive-by) class.
242
+ var RISKY_INLINE_MIMES = {
243
+ "text/html": true,
244
+ "text/xml": true,
245
+ "application/xml": true,
246
+ "application/xhtml+xml": true,
247
+ "image/svg+xml": true,
248
+ "application/javascript": true,
249
+ "text/javascript": true,
250
+ "application/x-javascript": true,
251
+ };
252
+
253
+ function _isRiskyInlineMime(contentType) {
254
+ if (typeof contentType !== "string" || contentType.length === 0) return false;
255
+ // Strip parameters like "; charset=utf-8".
256
+ var semi = contentType.indexOf(";");
257
+ var bare = (semi === -1 ? contentType : contentType.slice(0, semi)).trim().toLowerCase();
258
+ return RISKY_INLINE_MIMES[bare] === true;
259
+ }
260
+
261
+ // Safe-render allowlist for `forceAttachmentForNonText`. When the
262
+ // operator opts in, every served file whose Content-Type is NOT
263
+ // `text/*` AND NOT in this allowlist is forced to download via
264
+ // `Content-Disposition: attachment` plus `X-Content-Type-Options:
265
+ // nosniff`. The list is intentionally narrow:
266
+ //
267
+ // - image/png / jpeg / webp / gif: raster formats — browsers can't
268
+ // interpret as scripts, no inline-execution surface.
269
+ // - image/svg+xml: ONLY when an SVG-sanitizer is wired via
270
+ // `contentSafety` (the default-on `b.guardSvg` covers this) —
271
+ // SVG is XML and can carry `<script>` / event handlers; we
272
+ // refuse to render it inline without sanitization.
273
+ // - application/pdf: ONLY when `safeRenderPdf: true` is explicitly
274
+ // set. PDFs commonly carry JavaScript and can bypass the SOP via
275
+ // embedded forms; default is to force download.
276
+ var SAFE_RENDER_RASTER_MIMES = {
277
+ "image/png": true,
278
+ "image/jpeg": true,
279
+ "image/webp": true,
280
+ "image/gif": true,
281
+ };
282
+
283
+ function _bareMime(contentType) {
284
+ if (typeof contentType !== "string" || contentType.length === 0) return "";
285
+ var semi = contentType.indexOf(";");
286
+ return (semi === -1 ? contentType : contentType.slice(0, semi)).trim().toLowerCase();
287
+ }
288
+
289
+ // _shouldForceAttachment — decide whether the operator's opt-in policy
290
+ // forces this content type to download. Returns true when the
291
+ // response should carry `Content-Disposition: attachment` +
292
+ // `X-Content-Type-Options: nosniff`.
293
+ //
294
+ // Allowlist intent: text/plain / text/css / text/markdown render
295
+ // inline (no execution surface), raster images render inline (no
296
+ // execution surface), SVG renders inline ONLY when an SVG sanitizer
297
+ // gate is wired AND `safeRenderSvg` is enabled, PDF renders inline
298
+ // ONLY when `safeRenderPdf` is explicitly enabled. text/html and
299
+ // text/javascript are inside `text/*` but the browser executes them
300
+ // — they go through the risky nodePath. Everything else (HTML, JS, MJS,
301
+ // XML, executables, archives, fonts when served from a user-upload
302
+ // directory) gets forced download to defeat stored-XSS via the
303
+ // upload directory.
304
+ function _shouldForceAttachment(contentType, ext, contentSafetyMap, allowSvgRender, allowPdfRender) {
305
+ var bare = _bareMime(contentType);
306
+ if (bare.length === 0) return true; // unknown MIME → safest path
307
+ // text/html / text/xml / text/javascript / xhtml are inside `text/*`
308
+ // but the browser executes them — risky nodePath.
309
+ if (bare === "text/html" || bare === "text/xml" ||
310
+ bare === "text/javascript" || bare === "application/xhtml+xml") {
311
+ return true;
312
+ }
313
+ if (bare.indexOf("text/") === 0) return false;
314
+ if (SAFE_RENDER_RASTER_MIMES[bare]) return false;
315
+ if (bare === "image/svg+xml") {
316
+ if (!allowSvgRender) return true;
317
+ if (!contentSafetyMap || typeof contentSafetyMap !== "object") return true;
318
+ var svgGate = contentSafetyMap[".svg"];
319
+ if (!svgGate || typeof svgGate.check !== "function") return true;
320
+ return false;
321
+ }
322
+ if (bare === "application/pdf") {
323
+ return !allowPdfRender;
324
+ }
325
+ // Defense-in-depth: files served with .html / .htm / .xhtml / .js /
326
+ // .mjs / .svg / .xml / .pdf extensions but a generic
327
+ // application/octet-stream MIME still get forced download. The
328
+ // extension check catches misconfigured tables / sniffed-down MIMEs.
329
+ if (ext === ".html" || ext === ".htm" || ext === ".xhtml" ||
330
+ ext === ".js" || ext === ".mjs" || ext === ".svg" ||
331
+ ext === ".xml" || ext === ".pdf") {
332
+ if (ext === ".svg" && allowSvgRender) {
333
+ if (contentSafetyMap && contentSafetyMap[".svg"] &&
334
+ typeof contentSafetyMap[".svg"].check === "function") return false;
335
+ }
336
+ if (ext === ".pdf" && allowPdfRender) return false;
337
+ return true;
338
+ }
339
+ return true;
340
+ }
341
+
342
+ // Build a safe Content-Disposition value for an attachment. The
343
+ // filename is RFC 5987-encoded so non-ASCII characters survive without
344
+ // allowing CR/LF header injection.
345
+ function _attachmentDisposition(filePath) {
346
+ var name = nodePath.basename(filePath);
347
+ // Refuse CR/LF/NUL outright — they're already filtered upstream by
348
+ // the path-traversal guard, but defense-in-depth here.
349
+ if (/[\r\n\0]/.test(name)) name = "download";
350
+ // ASCII-safe filename (replace non-ASCII with _) plus filename* = UTF-8 form.
351
+ var asciiName = name.replace(/[^\x20-\x7e]/g, "_").replace(/["\\]/g, "_");
352
+ var encName = encodeURIComponent(name);
353
+ return 'attachment; filename="' + asciiName + '"; filename*=UTF-8\'\'' + encName;
354
+ }
355
+
356
+ // _parseRangeHeader — RFC 7233 single-range parser. Returns null when:
357
+ // - header absent
358
+ // - syntactically malformed (not `bytes=`, multi-range, suffix syntax
359
+ // "-N" handled, end > size, start > end)
360
+ // - the request can be answered as 416 the caller does (start >= size).
361
+ //
362
+ // Returns { start, end, length } for a valid satisfiable single range.
363
+ // Multi-range (`bytes=0-99,200-299`) returns { multi: true } so the
364
+ // caller can refuse with 416 — we don't ship multipart/byteranges in v1
365
+ // (operators with that need pull bytes via b.objectStore presigned URL).
366
+ function _parseRangeHeader(header, size) {
367
+ if (typeof header !== "string" || header.length === 0) return null;
368
+ if (header.indexOf("bytes=") !== 0) return { malformed: true };
369
+ var spec = header.slice(6).trim();
370
+ if (spec.length === 0) return { malformed: true };
371
+ if (spec.indexOf(",") !== -1) return { multi: true };
372
+ var dash = spec.indexOf("-");
373
+ if (dash === -1) return { malformed: true };
374
+ var startStr = spec.slice(0, dash);
375
+ var endStr = spec.slice(dash + 1);
376
+ var start, end;
377
+ if (startStr === "") {
378
+ // Suffix range: "bytes=-N" → last N bytes.
379
+ var suffix = parseInt(endStr, 10);
380
+ if (!isFinite(suffix) || suffix <= 0) return { malformed: true };
381
+ if (suffix > size) suffix = size;
382
+ start = size - suffix;
383
+ end = size - 1;
384
+ } else {
385
+ start = parseInt(startStr, 10);
386
+ if (!isFinite(start) || start < 0) return { malformed: true };
387
+ if (endStr === "") {
388
+ end = size - 1;
389
+ } else {
390
+ end = parseInt(endStr, 10);
391
+ if (!isFinite(end) || end < start) return { malformed: true };
392
+ if (end > size - 1) end = size - 1;
393
+ }
394
+ }
395
+ if (start >= size) return { unsatisfiable: true };
396
+ return { start: start, end: end, length: end - start + 1 };
397
+ }
398
+
399
+ function _httpDate(date) {
400
+ return (date instanceof Date ? date : new Date(date)).toUTCString();
401
+ }
402
+
403
+ function _validateCreateOpts(opts) {
404
+ validateOpts.requireObject(opts, "staticServe.create", StaticServeError);
405
+ validateOpts.requireNonEmptyString(opts.root, "staticServe.create: root", StaticServeError, "BAD_OPT");
406
+ if (!nodeFs.existsSync(opts.root)) {
407
+ throw _err("BAD_OPT", "staticServe.create: root does not exist: " + opts.root);
408
+ }
409
+ if (typeof opts.mountPath === "string" && opts.mountPath.length === 0) {
410
+ // empty string is operator-permissible: "no mount, root is request URL"
411
+ } else if (opts.mountPath !== undefined && opts.mountPath !== null &&
412
+ typeof opts.mountPath !== "string") {
413
+ throw _err("BAD_OPT", "staticServe.create: mountPath must be a string");
414
+ }
415
+ if (opts.hashedPathPattern !== undefined && opts.hashedPathPattern !== null &&
416
+ !(opts.hashedPathPattern instanceof RegExp)) {
417
+ throw _err("BAD_OPT", "staticServe.create: hashedPathPattern must be a RegExp");
418
+ }
419
+ // indexFile === null is the operator's "disable" sentinel; the helper
420
+ // returns null/undefined unchanged so we keep that semantic.
421
+ validateOpts.optionalNonEmptyString(opts.indexFile,
422
+ "staticServe.create: indexFile", StaticServeError, "BAD_OPT");
423
+ numericBounds.requireNonNegativeFiniteIntIfPresent(opts.defaultMaxAge,
424
+ "staticServe.create: defaultMaxAge", StaticServeError, "BAD_OPT");
425
+ validateOpts.optionalPlainObject(opts.contentTypes,
426
+ "staticServe.create: contentTypes", StaticServeError, "BAD_OPT");
427
+ validateOpts.optionalObjectWithMethod(opts.permissions, "check",
428
+ "staticServe.create: permissions", StaticServeError, "BAD_OPT",
429
+ "must be a b.permissions instance (check fn)");
430
+ validateOpts.optionalObjectWithMethod(opts.cache, "get",
431
+ "staticServe.create: cache", StaticServeError, "BAD_OPT",
432
+ "must be a b.cache instance (used for cluster-shared bandwidth + concurrency tracking)");
433
+ validateOpts.optionalObjectWithMethod(opts.fileType, "detect",
434
+ "staticServe.create: fileType", StaticServeError, "BAD_OPT",
435
+ "must be a b.fileType instance (magic-byte MIME detection)");
436
+ validateOpts.optionalObjectWithMethod(opts.retention, "isServable",
437
+ "staticServe.create: retention", StaticServeError, "BAD_OPT",
438
+ "must expose isServable(absPath, ctx) → boolean (compliance retention check)");
439
+ validateOpts.optionalObjectWithMethod(opts.revokeStore, "isRevoked",
440
+ "staticServe.create: revokeStore", StaticServeError, "BAD_OPT",
441
+ "must expose isRevoked(key) and revoke(key) for force-revoke support");
442
+ validateOpts.optionalNonEmptyStringArray(opts.allowedFileTypes,
443
+ "staticServe.create: allowedFileTypes", StaticServeError, "BAD_OPT");
444
+ if (Array.isArray(opts.allowedFileTypes) && opts.allowedFileTypes.length > 0 &&
445
+ (!opts.fileType || typeof opts.fileType.detect !== "function")) {
446
+ throw _err("BAD_OPT",
447
+ "staticServe.create: allowedFileTypes is set but fileType primitive is not wired " +
448
+ "(pass fileType: b.fileType so the framework can sniff magic bytes before serving)");
449
+ }
450
+ validateOpts.auditShape(opts.audit, "staticServe.create", StaticServeError);
451
+ validateOpts.observabilityShape(opts.observability, "staticServe.create", StaticServeError);
452
+ validateOpts.optionalFunction(opts.onServe, "staticServe.create: onServe", StaticServeError);
453
+ // contentSafety — extension-keyed gate map. Default behaviour: when
454
+ // undefined, the framework wires b.guardAll.byExtension({ profile:
455
+ // "strict" }) automatically so every shipped guard is ON by default.
456
+ // Explicit opt-out: contentSafety: null (audited at create() time so
457
+ // a security review can reconstruct which deploys disabled the
458
+ // default-on protection).
459
+ // Example: contentSafety: { ".csv": b.guardCsv.gate({ profile: "strict" }) }
460
+ if (opts.contentSafety !== undefined && opts.contentSafety !== null) {
461
+ validateOpts.optionalPlainObject(opts.contentSafety,
462
+ "staticServe.create: contentSafety", StaticServeError, "BAD_OPT",
463
+ "must be a plain { ext: gate } object, null to opt out, or " +
464
+ "undefined for the default-on b.guardAll wiring");
465
+ var safetyKeys = Object.keys(opts.contentSafety);
466
+ for (var sk = 0; sk < safetyKeys.length; sk++) {
467
+ var ext = safetyKeys[sk];
468
+ var g = opts.contentSafety[ext];
469
+ if (!g || typeof g.check !== "function") {
470
+ throw _err("BAD_OPT",
471
+ "staticServe.create: contentSafety[" + JSON.stringify(ext) +
472
+ "] must be a gate (b.guardCsv.gate / b.guardHtml.gate / etc.)");
473
+ }
474
+ }
475
+ }
476
+ validateOpts.optionalBoolean(opts.acceptRanges, "staticServe.create: acceptRanges", StaticServeError);
477
+ validateOpts.optionalBoolean(opts.auditSuccess, "staticServe.create: auditSuccess", StaticServeError);
478
+ validateOpts.optionalBoolean(opts.auditFailures, "staticServe.create: auditFailures", StaticServeError);
479
+ validateOpts.optionalBoolean(opts.safeAttachmentForRiskyMimes,
480
+ "staticServe.create: safeAttachmentForRiskyMimes", StaticServeError);
481
+ validateOpts.optionalBoolean(opts.forceAttachmentForNonText,
482
+ "staticServe.create: forceAttachmentForNonText", StaticServeError);
483
+ validateOpts.optionalBoolean(opts.safeRenderSvg,
484
+ "staticServe.create: safeRenderSvg", StaticServeError);
485
+ validateOpts.optionalBoolean(opts.safeRenderPdf,
486
+ "staticServe.create: safeRenderPdf", StaticServeError);
487
+ numericBounds.requireNonNegativeFiniteIntIfPresent(opts.maxBytesPerActorPerWindowMs,
488
+ "staticServe.create: maxBytesPerActorPerWindowMs", StaticServeError, "BAD_OPT");
489
+ numericBounds.requireNonNegativeFiniteIntIfPresent(opts.maxBytesAllActorsPerWindowMs,
490
+ "staticServe.create: maxBytesAllActorsPerWindowMs", StaticServeError, "BAD_OPT");
491
+ numericBounds.requirePositiveFiniteIntIfPresent(opts.bandwidthWindowMs,
492
+ "staticServe.create: bandwidthWindowMs", StaticServeError, "BAD_OPT");
493
+ numericBounds.requireNonNegativeFiniteIntIfPresent(opts.maxConcurrentDownloadsPerActor,
494
+ "staticServe.create: maxConcurrentDownloadsPerActor", StaticServeError, "BAD_OPT");
495
+ numericBounds.requirePositiveFiniteIntIfPresent(opts.maxIdleMs,
496
+ "staticServe.create: maxIdleMs", StaticServeError, "BAD_OPT");
497
+ // Quotas require a cache for cluster-shared coordination.
498
+ if ((opts.maxBytesPerActorPerWindowMs > 0 ||
499
+ opts.maxBytesAllActorsPerWindowMs > 0 ||
500
+ opts.maxConcurrentDownloadsPerActor > 0) &&
501
+ !opts.cache) {
502
+ throw _err("BAD_OPT",
503
+ "staticServe.create: bandwidth / concurrency quotas require opts.cache " +
504
+ "(pass cache: b.cache.create({ backend: 'cluster' }) so multi-replica deploys honor caps globally)");
505
+ }
506
+ }
507
+
508
+ // _checkBandwidthQuota — token-bucket via b.cache. Returns { ok: true } or
509
+ // { ok: false, retryAfter, scope: "actor"|"global" }.
510
+ async function _checkBandwidthQuota(cache, actorKey, perActorCap, globalCap, windowMs, requestedBytes) {
511
+ if (!cache || (perActorCap === 0 && globalCap === 0)) return { ok: true };
512
+ var now = Date.now();
513
+ var windowStart = now - windowMs;
514
+ if (perActorCap > 0 && actorKey) {
515
+ var aKey = "static:bw:actor:" + actorKey;
516
+ var aUsed = (await cache.get(aKey)) || 0;
517
+ if (aUsed + requestedBytes > perActorCap) {
518
+ return { ok: false, retryAfter: Math.ceil(windowMs / C.TIME.seconds(1)), scope: "actor", used: aUsed, cap: perActorCap };
519
+ }
520
+ }
521
+ if (globalCap > 0) {
522
+ var gKey = "static:bw:global";
523
+ var gUsed = (await cache.get(gKey)) || 0;
524
+ if (gUsed + requestedBytes > globalCap) {
525
+ return { ok: false, retryAfter: Math.ceil(windowMs / C.TIME.seconds(1)), scope: "global", used: gUsed, cap: globalCap };
526
+ }
527
+ }
528
+ return { ok: true, windowStart: windowStart, now: now };
529
+ }
530
+
531
+ async function _consumeBandwidth(cache, actorKey, perActorCap, globalCap, windowMs, bytes) {
532
+ if (!cache) return;
533
+ if (perActorCap > 0 && actorKey) {
534
+ var aKey = "static:bw:actor:" + actorKey;
535
+ var aUsed = (await cache.get(aKey)) || 0;
536
+ await cache.set(aKey, aUsed + bytes, { ttlMs: windowMs });
537
+ }
538
+ if (globalCap > 0) {
539
+ var gKey = "static:bw:global";
540
+ var gUsed = (await cache.get(gKey)) || 0;
541
+ await cache.set(gKey, gUsed + bytes, { ttlMs: windowMs });
542
+ }
543
+ }
544
+
545
+ async function _checkConcurrencyCap(cache, actorKey, cap) {
546
+ if (!cache || cap === 0 || !actorKey) return { ok: true };
547
+ var key = "static:conc:" + actorKey;
548
+ var current = (await cache.get(key)) || 0;
549
+ if (current >= cap) return { ok: false, current: current, cap: cap };
550
+ return { ok: true, current: current };
551
+ }
552
+
553
+ async function _incConcurrency(cache, actorKey) {
554
+ if (!cache || !actorKey) return;
555
+ var key = "static:conc:" + actorKey;
556
+ var current = (await cache.get(key)) || 0;
557
+ await cache.set(key, current + 1, { ttlMs: C.TIME.minutes(10) });
558
+ }
559
+
560
+ async function _decConcurrency(cache, actorKey) {
561
+ if (!cache || !actorKey) return;
562
+ var key = "static:conc:" + actorKey;
563
+ var current = (await cache.get(key)) || 0;
564
+ var next = current > 0 ? current - 1 : 0;
565
+ await cache.set(key, next, { ttlMs: C.TIME.minutes(10) });
566
+ }
567
+
568
+ function _actorKeyFromContext(ctx) {
569
+ if (!ctx) return null;
570
+ if (ctx.userId) return "id:" + ctx.userId;
571
+ if (ctx.ip) return "ip:" + ctx.ip;
572
+ return null;
573
+ }
574
+
575
+ // _writeError — uniform error response with audit + observability emission.
576
+ function _writeError(res, status, code, message, headers) {
577
+ var hdrs = Object.assign({ "Content-Type": "text/plain; charset=utf-8" }, headers || {});
578
+ hdrs["Content-Length"] = Buffer.byteLength(message, "utf8");
579
+ try {
580
+ res.writeHead(status, hdrs);
581
+ res.end(message);
582
+ } catch (_e) {
583
+ // response already torn down — best effort
584
+ }
585
+ void code;
586
+ }
587
+
588
+ // integrity() — module-level helper, kept for compat with the v0.6 SRI use.
589
+ async function integrity(absPath) {
590
+ if (typeof absPath !== "string" || absPath.length === 0) {
591
+ throw _err("BAD_OPT", "staticServe.integrity: absPath must be a non-empty string");
592
+ }
593
+ var meta = await _readMeta(nodePath.resolve(absPath));
594
+ if (!meta) throw _err("NOT_FOUND", "staticServe.integrity: file not found: " + absPath);
595
+ return meta.integrity;
596
+ }
597
+
598
+ function create(opts) {
599
+ opts = opts || {};
600
+ // The v0.6.x test surface called `validateOpts(opts, [...allowed], label)`
601
+ // for the unknown-key check. Preserve that gate in addition to the
602
+ // throw-at-config-time validation so tests catch typos.
603
+ validateOpts(opts, [
604
+ "root", "mountPath", "hashedPathPattern",
605
+ "indexFile", "defaultMaxAge", "contentTypes",
606
+ "permissions", "cache", "fileType", "retention", "revokeStore",
607
+ "allowedFileTypes", "audit", "observability", "onServe",
608
+ "acceptRanges", "auditSuccess", "auditFailures",
609
+ "maxBytesPerActorPerWindowMs", "maxBytesAllActorsPerWindowMs",
610
+ "bandwidthWindowMs", "maxConcurrentDownloadsPerActor", "maxIdleMs",
611
+ "contentSafety", "contentSafetyDisabledReason",
612
+ "forceAttachmentForNonText", "safeRenderSvg", "safeRenderPdf",
613
+ ], "staticServe.create");
614
+ _validateCreateOpts(opts);
615
+ var cfg = validateOpts.applyDefaults(opts, DEFAULTS);
616
+ var root = nodePath.resolve(opts.root);
617
+ var mountPath = opts.mountPath || "";
618
+ var hashedPattern = opts.hashedPathPattern || DEFAULT_HASHED_PATTERN;
619
+ var indexFile = opts.indexFile === null ? null : (opts.indexFile || DEFAULT_INDEX_FILE);
620
+ var defaultMaxAge = cfg.defaultMaxAge;
621
+ var contentTypes = opts.contentTypes || null;
622
+ var permissions = opts.permissions || null;
623
+ var cache = opts.cache || null;
624
+ var fileType = opts.fileType || null;
625
+ var retention = opts.retention || null;
626
+ var revokeStore = opts.revokeStore || null;
627
+ var allowedFileTypes = Array.isArray(opts.allowedFileTypes) ? opts.allowedFileTypes.slice() : [];
628
+ // contentSafety: undefined → wire b.guardAll.byExtension({ profile: "strict" })
629
+ // contentSafety: null → explicit opt-out, audit row emitted
630
+ // contentSafety: { ... } → use operator-supplied map
631
+ var contentSafety;
632
+ if (opts.contentSafety === undefined) {
633
+ // Strict profile is the security-correct default. Operators who
634
+ // serve a broader content vocabulary opt up explicitly via
635
+ // contentSafety: b.guardAll.byExtension({ profile: "balanced" |
636
+ // "permissive" }).
637
+ contentSafety = guardAll().byExtension({
638
+ profile: "strict",
639
+ audit: opts.audit,
640
+ observability: opts.observability,
641
+ });
642
+ } else if (opts.contentSafety === null) {
643
+ if (opts.audit && typeof opts.audit.safeEmit === "function") {
644
+ try {
645
+ opts.audit.safeEmit({
646
+ action: "staticServe.contentSafety.disabled",
647
+ actor: {},
648
+ outcome: "success",
649
+ metadata: {
650
+ reason: opts.contentSafetyDisabledReason || "operator-explicit-opt-out",
651
+ },
652
+ });
653
+ } catch (_e) { /* audit best-effort */ }
654
+ }
655
+ contentSafety = null;
656
+ } else {
657
+ contentSafety = opts.contentSafety;
658
+ }
659
+ var onServe = opts.onServe || null;
660
+ var audit = opts.audit || null;
661
+ var auditSuccess = cfg.auditSuccess;
662
+ var auditFailures = cfg.auditFailures;
663
+ var acceptRanges = cfg.acceptRanges;
664
+ var safeAttachment = !!cfg.safeAttachmentForRiskyMimes;
665
+ var forceAttachmentForNonText = !!cfg.forceAttachmentForNonText;
666
+ var allowSvgRender = cfg.safeRenderSvg !== false;
667
+ var allowPdfRender = !!cfg.safeRenderPdf;
668
+ var perActorCap = cfg.maxBytesPerActorPerWindowMs;
669
+ var globalCap = cfg.maxBytesAllActorsPerWindowMs;
670
+ var bandwidthWindowMs = cfg.bandwidthWindowMs;
671
+ var concurrencyCap = cfg.maxConcurrentDownloadsPerActor;
672
+ var maxIdleMs = cfg.maxIdleMs;
673
+
674
+ var emitAudit = validateOpts.makeAuditEmitter(audit);
675
+
676
+ // In-memory revoke set (operator can wire revokeStore for cluster-shared
677
+ // revocation; this Map is only used when no store is wired and gives
678
+ // single-process operators a working force-revoke without requiring cache).
679
+ var localRevoked = new Set();
680
+
681
+ function _emitObs(name, value, labels) {
682
+ observability().safeEvent(name, value, labels || {});
683
+ }
684
+
685
+ // Per-instance counters for serve.stats(). Cluster-shared counters live in
686
+ // observability; these are local snapshots for a single process.
687
+ var stats = {
688
+ requestsServed: 0,
689
+ bytesServed: 0,
690
+ etagHits: 0,
691
+ rangeRequests: 0,
692
+ permissionDenied: 0,
693
+ quotaRejected: 0,
694
+ failures: 0,
695
+ };
696
+
697
+ function _cacheControlFor(urlPath) {
698
+ if (hashedPattern.test(urlPath)) {
699
+ return "public, max-age=" + IMMUTABLE_MAX_AGE_SEC + ", immutable";
700
+ }
701
+ return "public, max-age=" + defaultMaxAge;
702
+ }
703
+
704
+ async function _isRevoked(key) {
705
+ if (revokeStore) {
706
+ try { return !!(await revokeStore.isRevoked(key)); }
707
+ catch (_e) { return false; }
708
+ }
709
+ return localRevoked.has(key);
710
+ }
711
+
712
+ async function _checkRetention(absPath, ctx) {
713
+ if (!retention) return true;
714
+ try { return !!(await retention.isServable(absPath, ctx)); }
715
+ catch (_e) { return false; }
716
+ }
717
+
718
+ async function _checkPermission(req) {
719
+ if (!permissions) return { ok: true };
720
+ try {
721
+ var ok = await permissions.check(req, "static.serve");
722
+ return { ok: !!ok };
723
+ } catch (_e) {
724
+ return { ok: false, error: _e };
725
+ }
726
+ }
727
+
728
+ async function _checkMimeAllowlist(absPath, meta) {
729
+ if (allowedFileTypes.length === 0 || !fileType) return { ok: true };
730
+ var sample;
731
+ try { sample = await fsp.readFile(absPath, { flag: "r" }); }
732
+ catch (_e) { return { ok: false, reason: "read-failed" }; }
733
+ var detected = fileType.detect(sample.slice(0, C.BYTES.kib(64))) || {};
734
+ if (!detected.mime) return { ok: false, reason: "indeterminate" };
735
+ if (allowedFileTypes.indexOf(detected.mime) === -1) {
736
+ return { ok: false, reason: "not-allowed", detected: detected.mime };
737
+ }
738
+ void meta;
739
+ return { ok: true, detected: detected.mime };
740
+ }
741
+
742
+ async function middleware(req, res, next) {
743
+ if (req.method !== "GET" && req.method !== "HEAD") return next();
744
+
745
+ var urlPath = (req.url || "").split("?")[0];
746
+ if (mountPath && urlPath.indexOf(mountPath) === 0) {
747
+ urlPath = urlPath.slice(mountPath.length) || "/";
748
+ }
749
+ var decoded;
750
+ try { decoded = decodeURIComponent(urlPath); }
751
+ catch (_e) { return next(); }
752
+
753
+ var absPath = _resolveSafe(root, decoded);
754
+ if (!absPath) return next();
755
+
756
+ var actorCtx = requestHelpers.extractActorContext(req);
757
+ var actorKey = _actorKeyFromContext(actorCtx);
758
+
759
+ // Permission gate (403)
760
+ var perm = await _checkPermission(req);
761
+ if (!perm.ok) {
762
+ stats.permissionDenied += 1;
763
+ _emitObs("staticServe.permission_denied", 1, { route: urlPath });
764
+ if (auditFailures) {
765
+ emitAudit("staticServe.serve.failure", Object.assign({
766
+ outcome: "failure", reason: "permission_denied", resource: urlPath,
767
+ }, actorCtx));
768
+ }
769
+ return _writeError(res, HTTP.FORBIDDEN, "permission_denied",
770
+ "Forbidden");
771
+ }
772
+
773
+ // Stat first to discover directory → index file.
774
+ var stat;
775
+ try { stat = await fsp.stat(absPath); }
776
+ catch (_e) { return next(); }
777
+ if (stat.isDirectory()) {
778
+ if (!indexFile) return next();
779
+ absPath = nodePath.join(absPath, indexFile);
780
+ }
781
+
782
+ // Force-revoke (404 — opaque to clients)
783
+ if (await _isRevoked(absPath)) {
784
+ stats.failures += 1;
785
+ _emitObs("staticServe.revoked", 1, { route: urlPath });
786
+ if (auditFailures) {
787
+ emitAudit("staticServe.serve.failure", Object.assign({
788
+ outcome: "failure", reason: "revoked", resource: urlPath,
789
+ }, actorCtx));
790
+ }
791
+ return _writeError(res, HTTP.NOT_FOUND, "not_found", "Not Found");
792
+ }
793
+
794
+ // Compliance retention (451)
795
+ if (!(await _checkRetention(absPath, actorCtx))) {
796
+ stats.failures += 1;
797
+ _emitObs("staticServe.retention_blocked", 1, { route: urlPath });
798
+ if (auditFailures) {
799
+ emitAudit("staticServe.serve.failure", Object.assign({
800
+ outcome: "failure", reason: "retention_blocked", resource: urlPath,
801
+ }, actorCtx));
802
+ }
803
+ return _writeError(res, HTTP.UNAVAILABLE_FOR_LEGAL_REASONS,
804
+ "retention_blocked", "Unavailable For Legal Reasons");
805
+ }
806
+
807
+ var meta = await _readMeta(absPath);
808
+ if (!meta) return next();
809
+
810
+ // MIME allowlist (415) — checked before sending bytes so a misnamed
811
+ // .txt holding a binary payload is refused at serve time.
812
+ if (allowedFileTypes.length > 0) {
813
+ var mimeCheck = await _checkMimeAllowlist(absPath, meta);
814
+ if (!mimeCheck.ok) {
815
+ stats.failures += 1;
816
+ _emitObs("staticServe.mime_rejected", 1, { route: urlPath, reason: mimeCheck.reason });
817
+ if (auditFailures) {
818
+ emitAudit("staticServe.serve.failure", Object.assign({
819
+ outcome: "failure", reason: "mime_rejected", resource: urlPath,
820
+ detectedMime: mimeCheck.detected || null,
821
+ }, actorCtx));
822
+ }
823
+ return _writeError(res, HTTP.UNSUPPORTED_MEDIA_TYPE,
824
+ "mime_rejected", "Unsupported Media Type");
825
+ }
826
+ }
827
+
828
+ // Content-safety gate — operator-supplied per-extension gate
829
+ // (b.guardCsv.gate / b.guardHtml.gate / etc.). Reads the file once
830
+ // up to maxRuntimeMs and routes the bytes through the gate's
831
+ // check() before serving. The gate's decision is honored:
832
+ // - serve → continue with the original bytes
833
+ // - sanitize → continue with decision.sanitized
834
+ // - refuse → 415 / opaque to clients
835
+ // - audit-only / warn → continue (gate emits to audit)
836
+ var gateBytesOverride = null;
837
+ if (contentSafety) {
838
+ var ext = nodePath.extname(absPath).toLowerCase();
839
+ var safetyGate = contentSafety[ext];
840
+ if (safetyGate && typeof safetyGate.check === "function") {
841
+ // CodeQL js/file-system-race defense — single fd anchored to the
842
+ // inode for the bytes we hand to the content-safety gate. The
843
+ // absPath was anchored under root by _resolveSafe above; the
844
+ // filehandle pattern binds size + read to the same inode so a
845
+ // swap between stat (line 771) and read can't slip different
846
+ // bytes past the gate.
847
+ var gateBuf;
848
+ var gateHandle = null;
849
+ try {
850
+ gateHandle = await fsp.open(absPath, "r");
851
+ var gateStat = await gateHandle.stat();
852
+ gateBuf = Buffer.alloc(gateStat.size);
853
+ var gateRead = 0;
854
+ while (gateRead < gateStat.size) {
855
+ var gateN = await gateHandle.read(gateBuf, gateRead, gateStat.size - gateRead, null);
856
+ if (gateN.bytesRead === 0) break;
857
+ gateRead += gateN.bytesRead;
858
+ }
859
+ if (gateRead < gateStat.size) gateBuf = gateBuf.slice(0, gateRead);
860
+ }
861
+ catch (_e) {
862
+ stats.failures += 1;
863
+ if (gateHandle) { try { await gateHandle.close(); } catch (_ce) { /* close best-effort */ } }
864
+ return _writeError(res, HTTP.INTERNAL_SERVER_ERROR,
865
+ "read_failed", "Internal Server Error");
866
+ }
867
+ try { await gateHandle.close(); } catch (_ce) { /* close best-effort */ }
868
+ var gateDecision;
869
+ try {
870
+ gateDecision = await safetyGate.check({
871
+ bytes: gateBuf,
872
+ contentType: _contentTypeFor(absPath, contentTypes),
873
+ filename: nodePath.basename(absPath),
874
+ actor: actorCtx,
875
+ route: urlPath,
876
+ direction: "outbound",
877
+ req: req,
878
+ });
879
+ } catch (gateErr) {
880
+ stats.failures += 1;
881
+ _emitObs("staticServe.content_safety_threw", 1, { route: urlPath });
882
+ if (auditFailures) {
883
+ emitAudit("staticServe.serve.failure", Object.assign({
884
+ outcome: "failure", reason: "content_safety_threw", resource: urlPath,
885
+ error: gateErr && gateErr.message,
886
+ }, actorCtx));
887
+ }
888
+ return _writeError(res, HTTP.INTERNAL_SERVER_ERROR,
889
+ "content_safety_threw", "Internal Server Error");
890
+ }
891
+ if (!gateDecision.ok || gateDecision.action === "refuse") {
892
+ stats.failures += 1;
893
+ _emitObs("staticServe.content_safety_refused", 1, { route: urlPath });
894
+ if (auditFailures) {
895
+ emitAudit("staticServe.serve.failure", Object.assign({
896
+ outcome: "failure", reason: "content_safety_refused",
897
+ resource: urlPath, ext: ext,
898
+ issues: gateContract.summarizeIssues(gateDecision.issues),
899
+ }, actorCtx));
900
+ }
901
+ return _writeError(res, HTTP.UNSUPPORTED_MEDIA_TYPE,
902
+ "content_safety_refused", "Unsupported Media Type");
903
+ }
904
+ if (gateDecision.action === "sanitize" && gateDecision.sanitized) {
905
+ gateBytesOverride = gateDecision.sanitized;
906
+ }
907
+ }
908
+ }
909
+
910
+ var cacheControl = _cacheControlFor(urlPath);
911
+
912
+ var headersIn = req.headers || {};
913
+
914
+ // Conditional: If-None-Match (304)
915
+ var ifNone = headersIn["if-none-match"];
916
+ if (ifNone && ifNone === meta.etag) {
917
+ stats.etagHits += 1;
918
+ _emitObs("staticServe.etag_hits", 1, { route: urlPath });
919
+ res.writeHead(HTTP.NOT_MODIFIED, {
920
+ "ETag": meta.etag,
921
+ "Cache-Control": cacheControl,
922
+ "Last-Modified": meta.lastModified,
923
+ });
924
+ return res.end();
925
+ }
926
+
927
+ // Conditional: If-Match (412 if no match — strong validator only)
928
+ var ifMatch = headersIn["if-match"];
929
+ if (ifMatch && ifMatch !== "*" && ifMatch !== meta.etag) {
930
+ stats.failures += 1;
931
+ _emitObs("staticServe.precondition_failed", 1, { route: urlPath, header: "if-match" });
932
+ return _writeError(res, HTTP.PRECONDITION_FAILED || 412,
933
+ "precondition_failed", "Precondition Failed");
934
+ }
935
+
936
+ // Conditional: If-Modified-Since (304)
937
+ var ifModSince = headersIn["if-modified-since"];
938
+ if (ifModSince) {
939
+ var ims = Date.parse(ifModSince);
940
+ if (isFinite(ims) && Math.floor(meta.mtimeMs / C.TIME.seconds(1)) <= Math.floor(ims / C.TIME.seconds(1))) {
941
+ stats.etagHits += 1;
942
+ _emitObs("staticServe.if_modified_since_hits", 1, { route: urlPath });
943
+ res.writeHead(HTTP.NOT_MODIFIED, {
944
+ "ETag": meta.etag,
945
+ "Cache-Control": cacheControl,
946
+ "Last-Modified": meta.lastModified,
947
+ });
948
+ return res.end();
949
+ }
950
+ }
951
+
952
+ // Conditional: If-Unmodified-Since (412)
953
+ var ifUnmodSince = headersIn["if-unmodified-since"];
954
+ if (ifUnmodSince) {
955
+ var ius = Date.parse(ifUnmodSince);
956
+ if (isFinite(ius) && Math.floor(meta.mtimeMs / C.TIME.seconds(1)) > Math.floor(ius / C.TIME.seconds(1))) {
957
+ stats.failures += 1;
958
+ _emitObs("staticServe.precondition_failed", 1, { route: urlPath, header: "if-unmodified-since" });
959
+ return _writeError(res, HTTP.PRECONDITION_FAILED,
960
+ "precondition_failed", "Precondition Failed");
961
+ }
962
+ }
963
+
964
+ // Range parsing
965
+ var range = null;
966
+ if (acceptRanges) {
967
+ var raw = headersIn["range"];
968
+ if (raw) {
969
+ range = _parseRangeHeader(raw, meta.size);
970
+ if (range && (range.malformed || range.multi)) {
971
+ stats.failures += 1;
972
+ _emitObs("staticServe.range_invalid", 1, { route: urlPath });
973
+ return _writeError(res, HTTP.RANGE_NOT_SATISFIABLE, "range_not_satisfiable",
974
+ "Range Not Satisfiable", { "Content-Range": "bytes */" + meta.size });
975
+ }
976
+ if (range && range.unsatisfiable) {
977
+ stats.failures += 1;
978
+ _emitObs("staticServe.range_invalid", 1, { route: urlPath });
979
+ return _writeError(res, HTTP.RANGE_NOT_SATISFIABLE, "range_not_satisfiable",
980
+ "Range Not Satisfiable", { "Content-Range": "bytes */" + meta.size });
981
+ }
982
+ if (range && cfg.maxRangeBytes !== Infinity && range.length > cfg.maxRangeBytes) {
983
+ stats.failures += 1;
984
+ _emitObs("staticServe.range_too_large", 1, { route: urlPath });
985
+ return _writeError(res, HTTP.RANGE_NOT_SATISFIABLE, "range_too_large",
986
+ "Range Not Satisfiable", { "Content-Range": "bytes */" + meta.size });
987
+ }
988
+ if (range) {
989
+ stats.rangeRequests += 1;
990
+ _emitObs("staticServe.range_requests", 1, { route: urlPath });
991
+ }
992
+ }
993
+ }
994
+
995
+ var sendBytes = range ? range.length : meta.size;
996
+
997
+ // Concurrency gate (429)
998
+ var concCheck = await _checkConcurrencyCap(cache, actorKey, concurrencyCap);
999
+ if (!concCheck.ok) {
1000
+ stats.quotaRejected += 1;
1001
+ _emitObs("staticServe.concurrency_rejected", 1, { route: urlPath });
1002
+ if (auditFailures) {
1003
+ emitAudit("staticServe.serve.failure", Object.assign({
1004
+ outcome: "failure", reason: "concurrency_cap", resource: urlPath,
1005
+ current: concCheck.current, cap: concCheck.cap,
1006
+ }, actorCtx));
1007
+ }
1008
+ return _writeError(res, HTTP.TOO_MANY_REQUESTS,
1009
+ "concurrency_cap", "Too Many Requests",
1010
+ { "Retry-After": "5" });
1011
+ }
1012
+
1013
+ // Bandwidth gate (429)
1014
+ var bwCheck = await _checkBandwidthQuota(cache, actorKey, perActorCap, globalCap, bandwidthWindowMs, sendBytes);
1015
+ if (!bwCheck.ok) {
1016
+ stats.quotaRejected += 1;
1017
+ _emitObs("staticServe.bandwidth_rejected", 1, { route: urlPath, scope: bwCheck.scope });
1018
+ if (auditFailures) {
1019
+ emitAudit("staticServe.serve.failure", Object.assign({
1020
+ outcome: "failure", reason: "bandwidth_quota", resource: urlPath,
1021
+ scope: bwCheck.scope, used: bwCheck.used, cap: bwCheck.cap,
1022
+ }, actorCtx));
1023
+ }
1024
+ return _writeError(res, HTTP.TOO_MANY_REQUESTS,
1025
+ "bandwidth_quota", "Too Many Requests",
1026
+ { "Retry-After": String(bwCheck.retryAfter) });
1027
+ }
1028
+
1029
+ var status = range ? 206 : HTTP.OK;
1030
+ var headers = {
1031
+ "Content-Type": _contentTypeFor(absPath, contentTypes),
1032
+ "Content-Length": sendBytes,
1033
+ "ETag": meta.etag,
1034
+ "Cache-Control": cacheControl,
1035
+ "Last-Modified": meta.lastModified,
1036
+ "X-Integrity": meta.integrity,
1037
+ };
1038
+ // Drive-by-execution defense — when safeAttachmentForRiskyMimes is
1039
+ // on, force Content-Disposition: attachment for HTML / JS / SVG /
1040
+ // XML so the browser downloads instead of rendering. Operator's
1041
+ // onServe hook can override.
1042
+ if (safeAttachment && _isRiskyInlineMime(headers["Content-Type"])) {
1043
+ headers["Content-Disposition"] = _attachmentDisposition(absPath);
1044
+ }
1045
+ // Stored-XSS defense for user-upload directories: when
1046
+ // forceAttachmentForNonText is on, force download for every MIME
1047
+ // outside the safe-render allowlist (text/* except html/xml/js,
1048
+ // image/png|jpeg|webp|gif, image/svg+xml only when an SVG sanitizer
1049
+ // gate is wired, application/pdf only when safeRenderPdf is
1050
+ // explicitly on). Pairs with X-Content-Type-Options: nosniff so
1051
+ // browsers can't sniff the bytes back into an executable type.
1052
+ if (forceAttachmentForNonText) {
1053
+ var dispoExt = nodePath.extname(absPath).toLowerCase();
1054
+ if (_shouldForceAttachment(headers["Content-Type"], dispoExt, contentSafety,
1055
+ allowSvgRender, allowPdfRender)) {
1056
+ headers["Content-Disposition"] = _attachmentDisposition(absPath);
1057
+ headers["X-Content-Type-Options"] = "nosniff";
1058
+ }
1059
+ }
1060
+ if (acceptRanges) headers["Accept-Ranges"] = "bytes";
1061
+ if (range) headers["Content-Range"] = "bytes " + range.start + "-" + range.end + "/" + meta.size;
1062
+
1063
+ // onServe hook — operator can mutate headers / set extra fields.
1064
+ if (onServe) {
1065
+ try {
1066
+ await onServe({
1067
+ req: req, res: res, absPath: absPath, urlPath: urlPath,
1068
+ size: meta.size, sendBytes: sendBytes, range: range,
1069
+ headers: headers, actor: actorCtx,
1070
+ });
1071
+ } catch (e) {
1072
+ stats.failures += 1;
1073
+ _emitObs("staticServe.onServe_threw", 1, { route: urlPath });
1074
+ if (auditFailures) {
1075
+ emitAudit("staticServe.serve.failure", Object.assign({
1076
+ outcome: "failure", reason: "onServe_threw", resource: urlPath,
1077
+ error: e && e.message,
1078
+ }, actorCtx));
1079
+ }
1080
+ return _writeError(res, HTTP.INTERNAL_SERVER_ERROR, "onServe_threw",
1081
+ "Internal Server Error");
1082
+ }
1083
+ }
1084
+
1085
+ if (req.method === "HEAD") {
1086
+ res.writeHead(status, headers);
1087
+ res.end();
1088
+ stats.requestsServed += 1;
1089
+ _emitObs("staticServe.requests_served", 1, { route: urlPath, method: "HEAD" });
1090
+ if (auditSuccess) {
1091
+ emitAudit("staticServe.serve.success", Object.assign({
1092
+ outcome: "success", resource: urlPath, method: "HEAD",
1093
+ size: meta.size, contentType: headers["Content-Type"],
1094
+ }, actorCtx));
1095
+ }
1096
+ return;
1097
+ }
1098
+
1099
+ // Sanitized override path — content-safety gate replaced the
1100
+ // bytes; emit them directly without re-reading the file. Bypasses
1101
+ // range / idle-timer machinery (the override is already in memory
1102
+ // and Range over a sanitized variant doesn't have a useful
1103
+ // contract — sanitization changes byte offsets).
1104
+ if (gateBytesOverride) {
1105
+ var overrideHeaders = Object.assign({}, headers, {
1106
+ "Content-Length": gateBytesOverride.length,
1107
+ });
1108
+ delete overrideHeaders["Content-Range"];
1109
+ res.writeHead(HTTP.OK, overrideHeaders);
1110
+ res.end(gateBytesOverride);
1111
+ stats.requestsServed += 1;
1112
+ stats.bytesServed += gateBytesOverride.length;
1113
+ _emitObs("staticServe.requests_served", 1, { route: urlPath, method: "GET", sanitized: true });
1114
+ _emitObs("staticServe.bytes_served", gateBytesOverride.length, { route: urlPath, sanitized: true });
1115
+ if (auditSuccess) {
1116
+ emitAudit("staticServe.serve.success", Object.assign({
1117
+ outcome: "success", resource: urlPath, method: "GET",
1118
+ size: gateBytesOverride.length, contentType: overrideHeaders["Content-Type"],
1119
+ sanitized: true,
1120
+ }, actorCtx));
1121
+ }
1122
+ return;
1123
+ }
1124
+
1125
+ res.writeHead(status, headers);
1126
+
1127
+ // Acquire concurrency slot (released on stream end / error / abort).
1128
+ await _incConcurrency(cache, actorKey);
1129
+ var slotReleased = false;
1130
+ function releaseSlot() {
1131
+ if (slotReleased) return;
1132
+ slotReleased = true;
1133
+ _decConcurrency(cache, actorKey).catch(function () {});
1134
+ }
1135
+
1136
+ var streamOpts = range ? { start: range.start, end: range.end } : {};
1137
+ // lgtm[js/path-injection] — `absPath` is the sandbox-validated return
1138
+ // of `_resolveSafe` (lib/static.js:181 — lexical resolve + startsWith
1139
+ // root-prefix check + realpath escape guard + guardFilename gate).
1140
+ // The request-serve path rejects with 404 before reaching this stream.
1141
+ var fileStream = nodeFs.createReadStream(absPath, streamOpts);
1142
+
1143
+ // Idle timeout — close the connection if the client stalls. Pattern is
1144
+ // a deadline-style debounce (clearTimeout + setTimeout) tied directly
1145
+ // to the file-stream "data" event lifecycle; the safeAsync.debounce
1146
+ // helper isn't yet ship-implemented, and pulling it through here would
1147
+ // pre-allocate a closure for every served byte. Tracked for extraction.
1148
+ var idleTimer = null;
1149
+ function resetIdleTimer() {
1150
+ if (idleTimer) clearTimeout(idleTimer); // allow:handrolled-debounce — file-stream idle deadline
1151
+ idleTimer = setTimeout(function () {
1152
+ try { fileStream.destroy(_err("IDLE_TIMEOUT", "client idle for " + maxIdleMs + "ms")); }
1153
+ catch (_) { /* stream already torn down */ }
1154
+ try { res.destroy(); } catch (_) { /* response already torn down */ }
1155
+ }, maxIdleMs);
1156
+ }
1157
+ resetIdleTimer();
1158
+
1159
+ // Cancellation propagation: when the client disconnects mid-stream.
1160
+ function onClientClose() {
1161
+ try { fileStream.destroy(); } catch (_) { /* allow:silent-catch — stream already torn down */ }
1162
+ releaseSlot();
1163
+ if (idleTimer) { clearTimeout(idleTimer); idleTimer = null; }
1164
+ }
1165
+ req.on("aborted", onClientClose);
1166
+ res.on("close", onClientClose);
1167
+
1168
+ var bytesSent = 0;
1169
+ fileStream.on("data", function (chunk) {
1170
+ bytesSent += chunk.length;
1171
+ resetIdleTimer();
1172
+ });
1173
+
1174
+ fileStream.on("error", function (e) {
1175
+ stats.failures += 1;
1176
+ _emitObs("staticServe.stream_error", 1, { route: urlPath });
1177
+ if (auditFailures) {
1178
+ emitAudit("staticServe.serve.failure", Object.assign({
1179
+ outcome: "failure", reason: "stream_error", resource: urlPath,
1180
+ error: e && e.message,
1181
+ }, actorCtx));
1182
+ }
1183
+ try { res.destroy(e); } catch (_) { /* allow:silent-catch — response already torn down */ }
1184
+ releaseSlot();
1185
+ if (idleTimer) { clearTimeout(idleTimer); idleTimer = null; }
1186
+ });
1187
+
1188
+ fileStream.on("end", function () {
1189
+ if (idleTimer) { clearTimeout(idleTimer); idleTimer = null; }
1190
+ stats.requestsServed += 1;
1191
+ stats.bytesServed += bytesSent;
1192
+ _emitObs("staticServe.requests_served", 1, { route: urlPath, method: "GET" });
1193
+ _emitObs("staticServe.bytes_served", bytesSent, { route: urlPath });
1194
+ _consumeBandwidth(cache, actorKey, perActorCap, globalCap, bandwidthWindowMs, bytesSent)
1195
+ .catch(function () {});
1196
+ if (auditSuccess) {
1197
+ emitAudit("staticServe.serve.success", Object.assign({
1198
+ outcome: "success", resource: urlPath, method: "GET",
1199
+ size: bytesSent, contentType: headers["Content-Type"],
1200
+ range: range ? { start: range.start, end: range.end } : null,
1201
+ }, actorCtx));
1202
+ }
1203
+ releaseSlot();
1204
+ });
1205
+
1206
+ fileStream.pipe(res);
1207
+ }
1208
+
1209
+ // Operator-facing handle: callable as middleware (back-compat) AND
1210
+ // exposes serve-instance methods.
1211
+ async function fn(req, res, next) { return middleware(req, res, next); }
1212
+ fn.middleware = middleware;
1213
+ fn.revoke = async function (key) {
1214
+ if (revokeStore && typeof revokeStore.revoke === "function") {
1215
+ await revokeStore.revoke(key);
1216
+ return { ok: true, key: key };
1217
+ }
1218
+ localRevoked.add(key);
1219
+ return { ok: true, key: key };
1220
+ };
1221
+ fn.unrevoke = async function (key) {
1222
+ if (revokeStore && typeof revokeStore.unrevoke === "function") {
1223
+ await revokeStore.unrevoke(key);
1224
+ return { ok: true, key: key };
1225
+ }
1226
+ localRevoked.delete(key);
1227
+ return { ok: true, key: key };
1228
+ };
1229
+ fn.stats = function () {
1230
+ return Object.assign({}, stats);
1231
+ };
1232
+ fn.invalidateMeta = function (key) {
1233
+ _metaCache.delete(key);
1234
+ return { ok: true, key: key };
1235
+ };
1236
+ return fn;
1237
+ }
1238
+
1239
+ function _resetCacheForTest() { _metaCache.clear(); }
1240
+
1241
+ module.exports = {
1242
+ create: create,
1243
+ integrity: integrity,
1244
+ DEFAULT_MAX_AGE_SEC: DEFAULT_MAX_AGE_SEC,
1245
+ IMMUTABLE_MAX_AGE_SEC: IMMUTABLE_MAX_AGE_SEC,
1246
+ DEFAULT_HASHED_PATTERN: DEFAULT_HASHED_PATTERN,
1247
+ _resetCacheForTest: _resetCacheForTest,
1248
+ _parseRangeHeader: _parseRangeHeader,
1249
+ };