@blamejs/blamejs-shop 0.5.12 → 0.5.13

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 (521) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/vendor/MANIFEST.json +632 -416
  4. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  5. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  6. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  7. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  8. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  9. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  11. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  12. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  13. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  14. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  15. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  16. package/lib/vendor/blamejs/.gitignore +2 -0
  17. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  18. package/lib/vendor/blamejs/NOTICE +26 -1
  19. package/lib/vendor/blamejs/SECURITY.md +1 -1
  20. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  21. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  22. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  23. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  25. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  26. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  27. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  28. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  29. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  30. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  31. package/lib/vendor/blamejs/index.js +6 -0
  32. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  33. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  34. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  35. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  36. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  37. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  38. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  39. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  40. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  41. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  42. package/lib/vendor/blamejs/lib/audit.js +71 -8
  43. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  44. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  45. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  46. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  47. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  48. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  49. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  50. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  51. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  52. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  53. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  54. package/lib/vendor/blamejs/lib/base32.js +21 -0
  55. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  56. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  57. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  58. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  59. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  60. package/lib/vendor/blamejs/lib/cert.js +29 -11
  61. package/lib/vendor/blamejs/lib/cli.js +94 -24
  62. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  63. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  64. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  65. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  68. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  69. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  70. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  71. package/lib/vendor/blamejs/lib/cose.js +31 -16
  72. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  73. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  74. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  75. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  76. package/lib/vendor/blamejs/lib/csp.js +11 -3
  77. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  78. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  79. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  80. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  81. package/lib/vendor/blamejs/lib/db.js +18 -6
  82. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  83. package/lib/vendor/blamejs/lib/dev.js +21 -2
  84. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  85. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  86. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  87. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  88. package/lib/vendor/blamejs/lib/forms.js +113 -27
  89. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  90. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  91. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  92. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  93. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  94. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  95. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  96. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  97. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  98. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  99. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  100. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  101. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  102. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  105. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  106. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  107. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  108. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  109. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  110. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  111. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  112. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  113. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  114. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  115. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  116. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  117. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  118. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  119. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  120. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  121. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  124. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  125. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  126. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  128. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  129. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  130. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  131. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  132. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  133. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  134. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  136. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  137. package/lib/vendor/blamejs/lib/mail.js +15 -5
  138. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  139. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  140. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  141. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  142. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  143. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  144. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  145. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  146. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  147. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  148. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  150. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  151. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  153. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  154. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  155. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  156. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  157. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  158. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  159. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  160. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  161. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  162. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  164. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  165. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  166. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  167. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  168. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  169. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  170. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  171. package/lib/vendor/blamejs/lib/redact.js +54 -0
  172. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  173. package/lib/vendor/blamejs/lib/restore.js +19 -0
  174. package/lib/vendor/blamejs/lib/retention.js +12 -4
  175. package/lib/vendor/blamejs/lib/router.js +60 -6
  176. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  177. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  178. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  179. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  180. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  181. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  182. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  183. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  184. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  185. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  186. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  187. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  188. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  189. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  190. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  191. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  192. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  193. package/lib/vendor/blamejs/lib/session.js +34 -12
  194. package/lib/vendor/blamejs/lib/sql.js +15 -1
  195. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  196. package/lib/vendor/blamejs/lib/static.js +55 -13
  197. package/lib/vendor/blamejs/lib/storage.js +8 -2
  198. package/lib/vendor/blamejs/lib/subject.js +6 -1
  199. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  200. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  201. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  202. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  203. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  204. package/lib/vendor/blamejs/lib/vc.js +44 -5
  205. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  206. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  207. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  209. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  210. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  212. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  213. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  214. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  215. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  216. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  217. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  218. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  219. package/lib/vendor/blamejs/package-lock.json +2 -2
  220. package/lib/vendor/blamejs/package.json +1 -1
  221. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  222. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  245. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  246. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  247. package/lib/vendor/blamejs/socket.yml +94 -0
  248. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  249. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  250. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  251. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  252. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  253. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  254. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  256. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  257. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  258. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  259. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  262. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  263. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  268. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  284. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  293. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  307. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  321. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  322. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  326. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  330. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  334. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  335. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  336. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  348. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  365. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  376. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  377. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  413. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  432. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  442. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  443. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  477. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  478. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  490. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  491. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  492. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  493. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  502. package/lib/vendor/blamejs/test/smoke.js +2 -0
  503. package/package.json +1 -1
  504. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  505. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  506. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  507. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  508. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  509. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  511. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  512. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  513. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  514. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  515. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  517. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  518. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  519. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  520. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  521. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -12,6 +12,7 @@
12
12
  */
13
13
 
14
14
  var http = require("node:http");
15
+ var crypto = require("node:crypto");
15
16
  var helpers = require("../helpers");
16
17
  var b = helpers.b;
17
18
  var fs = helpers.fs;
@@ -556,6 +557,815 @@ async function testConditionalEntityTagPrecedence() {
556
557
  }
557
558
  }
558
559
 
560
+ // ---------------------------------------------------------------------------
561
+ // Shared fixture for the error / adversarial / defensive-branch coverage below.
562
+ // _ctx writes the fixture files, resets the module meta-cache, builds a real
563
+ // staticServe handle behind a localhost http server, and exposes the handle
564
+ // (fn) so revoke / stats / invalidateMeta can be driven through the operator
565
+ // surface. close() tears down the server AND the temp dir.
566
+ // ---------------------------------------------------------------------------
567
+ async function _ctx(opts, files) {
568
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-static-cov-"));
569
+ if (files) {
570
+ Object.keys(files).forEach(function (rel) { _writeFile(dir, rel, files[rel]); });
571
+ }
572
+ b.staticServe._resetCacheForTest();
573
+ var fn = b.staticServe.create(Object.assign({ root: dir }, opts || {}));
574
+ var server = http.createServer(function (req, res) {
575
+ fn(req, res, function () { res.writeHead(404); res.end("nf"); });
576
+ });
577
+ var port = await listenOnRandomPort(server);
578
+ return {
579
+ dir: dir, fn: fn, port: port, server: server,
580
+ close: function () {
581
+ server.close();
582
+ fs.rmSync(dir, { recursive: true, force: true });
583
+ },
584
+ };
585
+ }
586
+
587
+ // Method-parametrized request driver (the module _get is GET-only).
588
+ function _req(port, method, urlPath, headers) {
589
+ return new Promise(function (resolve, reject) {
590
+ var req = http.request({
591
+ hostname: "127.0.0.1", port: port, path: urlPath, method: method,
592
+ headers: headers || undefined,
593
+ }, function (res) {
594
+ var chunks = [];
595
+ res.on("data", function (c) { chunks.push(c); });
596
+ res.on("end", function () {
597
+ resolve({ statusCode: res.statusCode, headers: res.headers, body: Buffer.concat(chunks) });
598
+ });
599
+ res.on("error", reject);
600
+ });
601
+ req.on("error", reject);
602
+ req.end();
603
+ });
604
+ }
605
+
606
+ // --- Range requests (RFC 7233 single-range) ------------------------------
607
+
608
+ async function testRangeSingle() {
609
+ var ctx = await _ctx({ contentSafety: null }, { "data.txt": "0123456789" });
610
+ try {
611
+ var r = await _get(ctx.port, "/data.txt", { "Range": "bytes=2-5" });
612
+ check("range: single satisfiable range → 206",
613
+ r.statusCode === 206);
614
+ check("range: Content-Range reflects the served slice",
615
+ r.headers["content-range"] === "bytes 2-5/10");
616
+ check("range: Content-Length is the slice length",
617
+ r.headers["content-length"] === "4");
618
+ check("range: Accept-Ranges advertised", r.headers["accept-ranges"] === "bytes");
619
+ check("range: body is exactly the requested bytes",
620
+ r.body.toString("utf8") === "2345");
621
+ } finally { ctx.close(); }
622
+ }
623
+
624
+ async function testRangeSuffixAndOpenEnded() {
625
+ var ctx = await _ctx({ contentSafety: null }, { "data.txt": "0123456789" });
626
+ try {
627
+ var suffix = await _get(ctx.port, "/data.txt", { "Range": "bytes=-3" });
628
+ check("range: suffix bytes=-3 serves the last 3 bytes → 206",
629
+ suffix.statusCode === 206 && suffix.body.toString("utf8") === "789");
630
+ check("range: suffix Content-Range",
631
+ suffix.headers["content-range"] === "bytes 7-9/10");
632
+
633
+ var open = await _get(ctx.port, "/data.txt", { "Range": "bytes=6-" });
634
+ check("range: open-ended bytes=6- serves to EOF → 206",
635
+ open.statusCode === 206 && open.body.toString("utf8") === "6789");
636
+
637
+ // Suffix larger than the file clamps to the whole file (parser branch).
638
+ var bigSuffix = await _get(ctx.port, "/data.txt", { "Range": "bytes=-99" });
639
+ check("range: over-long suffix clamps to the full file → 206 whole body",
640
+ bigSuffix.statusCode === 206 && bigSuffix.body.toString("utf8") === "0123456789");
641
+
642
+ // End past EOF clamps to size-1 (parser branch).
643
+ var clampEnd = await _get(ctx.port, "/data.txt", { "Range": "bytes=4-99" });
644
+ check("range: end past EOF clamps to last byte → 206",
645
+ clampEnd.statusCode === 206 && clampEnd.body.toString("utf8") === "456789");
646
+ } finally { ctx.close(); }
647
+ }
648
+
649
+ async function testRangeMalformedAndMulti() {
650
+ var ctx = await _ctx({ contentSafety: null }, { "data.txt": "0123456789" });
651
+ try {
652
+ var cases = [
653
+ ["bytes=abc", "no dash"],
654
+ ["bytes=foo-bar", "non-numeric bounds"],
655
+ ["items=0-1", "wrong unit"],
656
+ ["bytes=", "empty spec"],
657
+ ["bytes=5-2", "end before start"],
658
+ ["bytes=-0", "zero-length suffix"],
659
+ ];
660
+ for (var i = 0; i < cases.length; i++) {
661
+ var r = await _get(ctx.port, "/data.txt", { "Range": cases[i][0] });
662
+ check("range: malformed (" + cases[i][1] + ") → 416",
663
+ r.statusCode === 416 &&
664
+ r.headers["content-range"] === "bytes */10");
665
+ }
666
+ var multi = await _get(ctx.port, "/data.txt", { "Range": "bytes=0-1,4-5" });
667
+ check("range: multi-range refused → 416 (v1 ships single-range only)",
668
+ multi.statusCode === 416 && multi.headers["content-range"] === "bytes */10");
669
+ } finally { ctx.close(); }
670
+ }
671
+
672
+ async function testRangeUnsatisfiableAndTooLarge() {
673
+ var ctx = await _ctx({ contentSafety: null }, { "data.txt": "0123456789" });
674
+ try {
675
+ var unsat = await _get(ctx.port, "/data.txt", { "Range": "bytes=50-60" });
676
+ check("range: start past EOF is unsatisfiable → 416",
677
+ unsat.statusCode === 416 && unsat.headers["content-range"] === "bytes */10");
678
+ } finally { ctx.close(); }
679
+
680
+ // maxRangeBytes caps a single Range (slowloris-range defense).
681
+ var capped = await _ctx({ contentSafety: null, maxRangeBytes: 4 },
682
+ { "data.txt": "0123456789" });
683
+ try {
684
+ var tooBig = await _get(capped.port, "/data.txt", { "Range": "bytes=0-8" });
685
+ check("range: length over maxRangeBytes → 416 range_too_large",
686
+ tooBig.statusCode === 416 && tooBig.headers["content-range"] === "bytes */10");
687
+ // A range within the cap still serves.
688
+ var okRange = await _get(capped.port, "/data.txt", { "Range": "bytes=0-3" });
689
+ check("range: within maxRangeBytes still serves → 206",
690
+ okRange.statusCode === 206 && okRange.body.toString("utf8") === "0123");
691
+ } finally { capped.close(); }
692
+ }
693
+
694
+ // acceptRanges:false disables the whole Range machinery — a Range header is
695
+ // ignored and the full body is served 200.
696
+ async function testAcceptRangesDisabled() {
697
+ var ctx = await _ctx({ contentSafety: null, acceptRanges: false },
698
+ { "data.txt": "0123456789" });
699
+ try {
700
+ var r = await _get(ctx.port, "/data.txt", { "Range": "bytes=0-3" });
701
+ check("acceptRanges:false: Range ignored, full body 200",
702
+ r.statusCode === 200 && r.body.toString("utf8") === "0123456789");
703
+ check("acceptRanges:false: no Accept-Ranges header",
704
+ r.headers["accept-ranges"] === undefined);
705
+ } finally { ctx.close(); }
706
+ }
707
+
708
+ // --- Conditional requests (RFC 7232) -------------------------------------
709
+
710
+ async function testConditionalHits() {
711
+ var ctx = await _ctx({ contentSafety: null }, { "doc.txt": "conditional body" });
712
+ try {
713
+ var base = await _get(ctx.port, "/doc.txt");
714
+ var etag = base.headers.etag;
715
+ var lastMod = base.headers["last-modified"];
716
+ check("conditional: baseline 200 exposes ETag + Last-Modified",
717
+ base.statusCode === 200 && typeof etag === "string" && typeof lastMod === "string");
718
+
719
+ // If-None-Match matching → 304, empty body.
720
+ var inm = await _get(ctx.port, "/doc.txt", { "If-None-Match": etag });
721
+ check("If-None-Match (matching) → 304 with empty body",
722
+ inm.statusCode === 304 && inm.body.length === 0);
723
+ check("304 carries the validator headers",
724
+ inm.headers.etag === etag && typeof inm.headers["cache-control"] === "string");
725
+
726
+ // If-Match non-matching → 412.
727
+ var ifm = await _get(ctx.port, "/doc.txt", { "If-Match": '"not-the-etag"' });
728
+ check("If-Match (non-matching strong validator) → 412", ifm.statusCode === 412);
729
+
730
+ // If-Modified-Since in the future (no If-None-Match) → 304.
731
+ var future = new Date(Date.now() + 86400000).toUTCString();
732
+ var ims = await _get(ctx.port, "/doc.txt", { "If-Modified-Since": future });
733
+ check("If-Modified-Since (future) → 304", ims.statusCode === 304);
734
+
735
+ // If-Unmodified-Since in the past (no If-Match) → 412.
736
+ var past = new Date(Date.now() - 86400000).toUTCString();
737
+ var ius = await _get(ctx.port, "/doc.txt", { "If-Unmodified-Since": past });
738
+ check("If-Unmodified-Since (past) → 412", ius.statusCode === 412);
739
+ } finally { ctx.close(); }
740
+ }
741
+
742
+ // --- HEAD -----------------------------------------------------------------
743
+
744
+ async function testHeadRequest() {
745
+ var ctx = await _ctx({ contentSafety: null }, { "page.html": "<h1>hi</h1>" });
746
+ try {
747
+ var r = await _req(ctx.port, "HEAD", "/page.html");
748
+ check("HEAD: 200 with headers, no body",
749
+ r.statusCode === 200 && r.body.length === 0);
750
+ check("HEAD: Content-Length reflects the file size",
751
+ r.headers["content-length"] === String(Buffer.byteLength("<h1>hi</h1>")));
752
+ check("HEAD: ETag + X-Integrity present",
753
+ typeof r.headers.etag === "string" &&
754
+ /^sha384-/.test(r.headers["x-integrity"] || ""));
755
+ } finally { ctx.close(); }
756
+ }
757
+
758
+ // --- safeAttachmentForRiskyMimes (distinct from forceAttachmentForNonText) --
759
+
760
+ async function testSafeAttachmentRiskyMime() {
761
+ var ctx = await _ctx({ contentSafety: null, safeAttachmentForRiskyMimes: true },
762
+ { "page.html": "<h1>hi</h1>" });
763
+ try {
764
+ var r = await _get(ctx.port, "/page.html");
765
+ check("safeAttachmentForRiskyMimes: risky text/html forced to attachment",
766
+ r.statusCode === 200 &&
767
+ /^attachment;/.test(r.headers["content-disposition"] || ""));
768
+ check("safeAttachmentForRiskyMimes: filename encoded in disposition",
769
+ /filename="page\.html"/.test(r.headers["content-disposition"] || ""));
770
+ } finally { ctx.close(); }
771
+ }
772
+
773
+ // --- onServe hook ---------------------------------------------------------
774
+
775
+ async function testOnServeMutatesHeaders() {
776
+ var seen = [];
777
+ var ctx = await _ctx({
778
+ contentSafety: null,
779
+ onServe: function (info) {
780
+ seen.push(info);
781
+ info.headers["X-Custom-Serve"] = "yes";
782
+ },
783
+ }, { "a.txt": "abc" });
784
+ try {
785
+ var r = await _get(ctx.port, "/a.txt");
786
+ check("onServe: fires on the success path and can mutate headers",
787
+ r.statusCode === 200 && r.headers["x-custom-serve"] === "yes");
788
+ check("onServe: receives the serve context",
789
+ seen.length === 1 && seen[0].urlPath === "/a.txt" && seen[0].size === 3);
790
+ } finally { ctx.close(); }
791
+ }
792
+
793
+ async function testOnServeThrows() {
794
+ var ctx = await _ctx({
795
+ contentSafety: null,
796
+ onServe: function () { throw new Error("hook boom"); },
797
+ }, { "a.txt": "abc" });
798
+ try {
799
+ var r = await _get(ctx.port, "/a.txt");
800
+ check("onServe: a throwing hook fails closed with 500 (never partial 200)",
801
+ r.statusCode === 500 && /Internal Server Error/.test(r.body.toString("utf8")));
802
+ } finally { ctx.close(); }
803
+ }
804
+
805
+ // --- content-safety gate branches ----------------------------------------
806
+
807
+ async function testContentSafetyRefuse() {
808
+ var gate = { check: async function () { return { ok: false, action: "refuse", issues: [] }; } };
809
+ var ctx = await _ctx({ contentSafety: { ".csv": gate } }, { "rows.csv": "a,b\n1,2" });
810
+ try {
811
+ var r = await _get(ctx.port, "/rows.csv");
812
+ check("content-safety: gate refuse → 415 opaque", r.statusCode === 415);
813
+ } finally { ctx.close(); }
814
+ }
815
+
816
+ async function testContentSafetySanitize() {
817
+ var gate = {
818
+ check: async function () {
819
+ return { ok: true, action: "sanitize", sanitized: Buffer.from("SAFE-BYTES") };
820
+ },
821
+ };
822
+ var ctx = await _ctx({ contentSafety: { ".csv": gate } }, { "rows.csv": "a,b\n1,2" });
823
+ try {
824
+ var r = await _get(ctx.port, "/rows.csv");
825
+ check("content-safety: sanitize serves the replacement bytes → 200",
826
+ r.statusCode === 200 && r.body.toString("utf8") === "SAFE-BYTES");
827
+ check("content-safety: sanitized Content-Length matches the override",
828
+ r.headers["content-length"] === "10");
829
+ check("content-safety: sanitized override drops Content-Range",
830
+ r.headers["content-range"] === undefined);
831
+ } finally { ctx.close(); }
832
+ }
833
+
834
+ async function testContentSafetySanitizeIntegrityHeaders() {
835
+ // When the content-safety gate REPLACES the served bytes (sanitize), the
836
+ // strong ETag and the SRI X-Integrity header must describe the bytes
837
+ // ACTUALLY DELIVERED — not the on-disk original the meta cache hashed.
838
+ // Otherwise a consumer verifying the served body against the advertised
839
+ // X-Integrity fails, and a strong-validator / If-None-Match cache is keyed
840
+ // to a representation the client never receives (RFC 7232 §2.3 strong
841
+ // validator; W3C SRI).
842
+ var sanitized = Buffer.from("SAFE-BYTES");
843
+ var gate = {
844
+ check: async function () {
845
+ return { ok: true, action: "sanitize", sanitized: sanitized };
846
+ },
847
+ };
848
+ var ctx = await _ctx({ contentSafety: { ".csv": gate } },
849
+ { "rows.csv": "a,b\n1,2,ORIGINAL-BYTES-THAT-DIFFER-FROM-SANITIZED" });
850
+ try {
851
+ var r = await _get(ctx.port, "/rows.csv");
852
+ var expectEtag = '"' +
853
+ crypto.createHash("sha3-512").update(sanitized).digest("hex").slice(0, 32) + '"';
854
+ var expectSri = "sha384-" +
855
+ crypto.createHash("sha384").update(sanitized).digest("base64");
856
+ check("content-safety: sanitized ETag hashes the DELIVERED bytes, not the original",
857
+ r.headers["etag"] === expectEtag);
858
+ check("content-safety: sanitized X-Integrity (SRI) hashes the DELIVERED bytes",
859
+ r.headers["x-integrity"] === expectSri);
860
+ // A consumer that verifies the served body against the advertised
861
+ // X-Integrity must succeed.
862
+ var deliveredSri = "sha384-" +
863
+ crypto.createHash("sha384").update(r.body).digest("base64");
864
+ check("content-safety: served body verifies against its advertised X-Integrity",
865
+ deliveredSri === r.headers["x-integrity"]);
866
+ // Conditional revalidation with the advertised ETag round-trips to 304
867
+ // (the strong validator names the representation that is actually served).
868
+ var r304 = await _get(ctx.port, "/rows.csv", { "If-None-Match": r.headers["etag"] });
869
+ check("content-safety: If-None-Match with the advertised (sanitized) ETag → 304",
870
+ r304.statusCode === 304);
871
+ } finally { ctx.close(); }
872
+ }
873
+
874
+ async function testContentSafetyThrows() {
875
+ var gate = { check: async function () { throw new Error("gate exploded"); } };
876
+ var ctx = await _ctx({ contentSafety: { ".csv": gate } }, { "rows.csv": "a,b\n1,2" });
877
+ try {
878
+ var r = await _get(ctx.port, "/rows.csv");
879
+ check("content-safety: a throwing gate fails closed → 500", r.statusCode === 500);
880
+ } finally { ctx.close(); }
881
+ }
882
+
883
+ async function testContentSafetyTooLarge() {
884
+ // A gated file over the 16 MiB inspection cap is refused before the gate
885
+ // buffers it (request-reachable OOM defense) — the gate's check is never
886
+ // invoked.
887
+ var gateCalled = false;
888
+ var gate = { check: async function () { gateCalled = true; return { ok: true, action: "serve" }; } };
889
+ var big = Buffer.alloc(16 * 1024 * 1024 + 1);
890
+ var ctx = await _ctx({ contentSafety: { ".bin": gate } }, { "huge.bin": big });
891
+ try {
892
+ var r = await _get(ctx.port, "/huge.bin");
893
+ check("content-safety: file over the inspection cap → 415 (not buffered)",
894
+ r.statusCode === 415);
895
+ check("content-safety: oversize file never reaches the gate", gateCalled === false);
896
+ } finally { ctx.close(); }
897
+ }
898
+
899
+ // --- MIME allowlist (magic-byte sniff via b.fileType) ---------------------
900
+
901
+ async function testMimeAllowlistSuccess() {
902
+ var png = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0, 0, 0, 0]);
903
+ var ctx = await _ctx({
904
+ contentSafety: null, fileType: b.fileType, allowedFileTypes: ["image/png"],
905
+ }, { "logo.png": png });
906
+ try {
907
+ var r = await _get(ctx.port, "/logo.png");
908
+ check("mime-allowlist: sniffed image/png in the allowlist → 200", r.statusCode === 200);
909
+ } finally { ctx.close(); }
910
+ }
911
+
912
+ async function testMimeAllowlistRejections() {
913
+ var png = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0, 0, 0, 0]);
914
+ var notAllowed = await _ctx({
915
+ contentSafety: null, fileType: b.fileType, allowedFileTypes: ["image/jpeg"],
916
+ }, { "logo.png": png });
917
+ try {
918
+ var r = await _get(notAllowed.port, "/logo.png");
919
+ check("mime-allowlist: sniffed MIME not in the allowlist → 415", r.statusCode === 415);
920
+ } finally { notAllowed.close(); }
921
+
922
+ // A file whose magic bytes are indeterminate (plain text) is also refused
923
+ // when an allowlist is active.
924
+ var indet = await _ctx({
925
+ contentSafety: null, fileType: b.fileType, allowedFileTypes: ["image/png"],
926
+ }, { "notes.png": "this is really just text, not a png" });
927
+ try {
928
+ var r2 = await _get(indet.port, "/notes.png");
929
+ check("mime-allowlist: indeterminate magic bytes → 415", r2.statusCode === 415);
930
+ } finally { indet.close(); }
931
+ }
932
+
933
+ // --- Force-revoke (404, opaque) ------------------------------------------
934
+
935
+ async function testRevokeLocal() {
936
+ var ctx = await _ctx({ contentSafety: null }, { "secret.txt": "classified" });
937
+ try {
938
+ var before = await _get(ctx.port, "/secret.txt");
939
+ check("revoke: file serves before revocation", before.statusCode === 200);
940
+ await ctx.fn.revoke(path.join(ctx.dir, "secret.txt"));
941
+ var after = await _get(ctx.port, "/secret.txt");
942
+ check("revoke: revoked file → 404 (opaque to clients)", after.statusCode === 404);
943
+ await ctx.fn.unrevoke(path.join(ctx.dir, "secret.txt"));
944
+ var restored = await _get(ctx.port, "/secret.txt");
945
+ check("revoke: unrevoke restores serving", restored.statusCode === 200);
946
+ } finally { ctx.close(); }
947
+ }
948
+
949
+ async function testRevokeStore() {
950
+ var revoked = true;
951
+ var calls = { revoke: 0, unrevoke: 0 };
952
+ var revokeStore = {
953
+ isRevoked: async function () { return revoked; },
954
+ revoke: async function () { calls.revoke += 1; revoked = true; },
955
+ unrevoke: async function () { calls.unrevoke += 1; revoked = false; },
956
+ };
957
+ var ctx = await _ctx({ contentSafety: null, revokeStore: revokeStore },
958
+ { "f.txt": "body" });
959
+ try {
960
+ var r = await _get(ctx.port, "/f.txt");
961
+ check("revokeStore: isRevoked(true) → 404", r.statusCode === 404);
962
+ var res = await ctx.fn.revoke("k");
963
+ check("revokeStore: fn.revoke routes to the store", calls.revoke === 1 && res.ok === true);
964
+ var res2 = await ctx.fn.unrevoke("k");
965
+ check("revokeStore: fn.unrevoke routes to the store", calls.unrevoke === 1 && res2.ok === true);
966
+ var r2 = await _get(ctx.port, "/f.txt");
967
+ check("revokeStore: after unrevoke the file serves again", r2.statusCode === 200);
968
+ } finally { ctx.close(); }
969
+ }
970
+
971
+ // --- Compliance retention (451) ------------------------------------------
972
+
973
+ async function testRetentionBlocked() {
974
+ var retention = { isServable: async function () { return false; } };
975
+ var ctx = await _ctx({ contentSafety: null, retention: retention },
976
+ { "record.txt": "phi" });
977
+ try {
978
+ var r = await _get(ctx.port, "/record.txt");
979
+ check("retention: non-servable file → 451 Unavailable For Legal Reasons",
980
+ r.statusCode === 451);
981
+ } finally { ctx.close(); }
982
+
983
+ // A retention check that throws fails closed (also 451).
984
+ var throwing = { isServable: async function () { throw new Error("retention backend down"); } };
985
+ var ctx2 = await _ctx({ contentSafety: null, retention: throwing },
986
+ { "record.txt": "phi" });
987
+ try {
988
+ var r2 = await _get(ctx2.port, "/record.txt");
989
+ check("retention: a throwing check fails closed → 451", r2.statusCode === 451);
990
+ } finally { ctx2.close(); }
991
+ }
992
+
993
+ // --- Bandwidth / concurrency quotas (429, cluster-shared via b.cache) ------
994
+
995
+ async function testConcurrencyCapRejected() {
996
+ var cache = b.cache.create({ namespace: "static-conc-" + process.pid, backend: "memory" });
997
+ var ctx = await _ctx({
998
+ contentSafety: null, cache: cache, maxConcurrentDownloadsPerActor: 1,
999
+ }, { "f.txt": "body" });
1000
+ try {
1001
+ // Seed the per-actor concurrency counter above the cap for every plausible
1002
+ // localhost actor key so the gate rejects deterministically (no request race).
1003
+ var ipCands = ["127.0.0.1", "::1", "::ffff:127.0.0.1"];
1004
+ for (var i = 0; i < ipCands.length; i++) {
1005
+ await cache.set("static:conc:ip:" + ipCands[i], 5);
1006
+ }
1007
+ var r = await _get(ctx.port, "/f.txt");
1008
+ check("concurrency-cap: actor at the cap → 429", r.statusCode === 429);
1009
+ check("concurrency-cap: Retry-After advertised", r.headers["retry-after"] === "5");
1010
+ } finally {
1011
+ ctx.close();
1012
+ if (typeof cache.close === "function") await cache.close();
1013
+ }
1014
+ }
1015
+
1016
+ async function testBandwidthCapRejected() {
1017
+ var cache = b.cache.create({ namespace: "static-bw-" + process.pid, backend: "memory" });
1018
+ var ctx = await _ctx({
1019
+ contentSafety: null, cache: cache, maxBytesAllActorsPerWindowMs: 4,
1020
+ }, { "f.txt": "0123456789" });
1021
+ try {
1022
+ // Pre-charge the global bandwidth window above the cap.
1023
+ await cache.set("static:bw:global", 1000);
1024
+ var r = await _get(ctx.port, "/f.txt");
1025
+ check("bandwidth-cap: global window over cap → 429", r.statusCode === 429);
1026
+ check("bandwidth-cap: Retry-After advertised",
1027
+ typeof r.headers["retry-after"] === "string");
1028
+ } finally {
1029
+ ctx.close();
1030
+ if (typeof cache.close === "function") await cache.close();
1031
+ }
1032
+ }
1033
+
1034
+ async function testQuotaSuccessConsumesAndReleases() {
1035
+ var cache = b.cache.create({ namespace: "static-ok-" + process.pid, backend: "memory" });
1036
+ var ctx = await _ctx({
1037
+ contentSafety: null, cache: cache,
1038
+ maxBytesPerActorPerWindowMs: 1000000,
1039
+ maxBytesAllActorsPerWindowMs: 1000000,
1040
+ maxConcurrentDownloadsPerActor: 4,
1041
+ }, { "f.txt": "0123456789" });
1042
+ try {
1043
+ var r = await _get(ctx.port, "/f.txt");
1044
+ check("quota-success: under-cap request serves 200 with full body",
1045
+ r.statusCode === 200 && r.body.toString("utf8") === "0123456789");
1046
+ // Bandwidth is charged on stream end (fire-and-forget) — poll for it.
1047
+ await helpers.waitUntil(async function () {
1048
+ return ((await cache.get("static:bw:global")) || 0) >= 10;
1049
+ }, { timeoutMs: 5000, label: "static quota: global bandwidth counter charged after serve" });
1050
+ check("quota-success: served bytes charged to the global window",
1051
+ ((await cache.get("static:bw:global")) || 0) >= 10);
1052
+ // Concurrency slot released back to 0 after the stream ends.
1053
+ await helpers.waitUntil(async function () {
1054
+ var ip = ["127.0.0.1", "::1", "::ffff:127.0.0.1"];
1055
+ for (var i = 0; i < ip.length; i++) {
1056
+ if (((await cache.get("static:conc:ip:" + ip[i])) || 0) > 0) return false;
1057
+ }
1058
+ return true;
1059
+ }, { timeoutMs: 5000, label: "static quota: concurrency slot released after serve" });
1060
+ check("quota-success: concurrency slot released after the stream ends", true);
1061
+ } finally {
1062
+ ctx.close();
1063
+ if (typeof cache.close === "function") await cache.close();
1064
+ }
1065
+ }
1066
+
1067
+ // --- create() config-time validation (throw tier) -------------------------
1068
+
1069
+ function testCreateValidationThrows() {
1070
+ function throwsOn(opts, label) {
1071
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-static-val-"));
1072
+ var threw = null;
1073
+ try { b.staticServe.create(Object.assign({ root: dir }, opts)); }
1074
+ catch (e) { threw = e; }
1075
+ finally { fs.rmSync(dir, { recursive: true, force: true }); }
1076
+ check("validation: " + label + " throws at create()", threw !== null);
1077
+ return threw;
1078
+ }
1079
+
1080
+ // root does not exist
1081
+ var noRoot = null;
1082
+ try { b.staticServe.create({ root: path.join(os.tmpdir(), "blamejs-does-not-exist-" + process.pid) }); }
1083
+ catch (e) { noRoot = e; }
1084
+ check("validation: non-existent root throws",
1085
+ noRoot && /root does not exist/.test(noRoot.message));
1086
+
1087
+ throwsOn({ allowedFileTypes: ["image/png"] }, "allowedFileTypes without fileType");
1088
+ throwsOn({ maxBytesPerActorPerWindowMs: 100 }, "bandwidth quota without cache");
1089
+ throwsOn({ maxConcurrentDownloadsPerActor: 2, cache: { get: function () {} } },
1090
+ "quota cache lacking atomic update()");
1091
+ throwsOn({ maxRangeBytes: -1 }, "negative maxRangeBytes");
1092
+ throwsOn({ hashedPathPattern: "not-a-regexp" }, "non-RegExp hashedPathPattern");
1093
+ throwsOn({ contentSafety: { ".csv": { notAGate: true } } }, "contentSafety value missing check()");
1094
+ throwsOn({ mountPath: 123 }, "non-string mountPath");
1095
+
1096
+ // mountPath:"" is the documented "no mount" sentinel — must NOT throw.
1097
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-static-val-"));
1098
+ var okThrew = null;
1099
+ try { b.staticServe.create({ root: dir, mountPath: "", contentSafety: null }); }
1100
+ catch (e) { okThrew = e; }
1101
+ finally { fs.rmSync(dir, { recursive: true, force: true }); }
1102
+ check("validation: empty-string mountPath is accepted (no mount)", okThrew === null);
1103
+ }
1104
+
1105
+ // --- integrity() module helper (SRI) --------------------------------------
1106
+
1107
+ async function testIntegrityHelper() {
1108
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-static-sri-"));
1109
+ var abs = path.join(dir, "asset.js");
1110
+ fs.writeFileSync(abs, "console.log(1)");
1111
+ try {
1112
+ var sri = await b.staticServe.integrity(abs);
1113
+ check("integrity: returns an sha384- SRI digest for a real file",
1114
+ typeof sri === "string" && /^sha384-[A-Za-z0-9+/=]+$/.test(sri));
1115
+
1116
+ var emptyThrew = null;
1117
+ try { await b.staticServe.integrity(""); } catch (e) { emptyThrew = e; }
1118
+ check("integrity: empty path throws BAD_OPT",
1119
+ emptyThrew && emptyThrew.code === "BAD_OPT");
1120
+
1121
+ var missingThrew = null;
1122
+ try { await b.staticServe.integrity(path.join(dir, "nope.js")); }
1123
+ catch (e) { missingThrew = e; }
1124
+ check("integrity: missing file throws NOT_FOUND",
1125
+ missingThrew && missingThrew.code === "NOT_FOUND");
1126
+ } finally {
1127
+ fs.rmSync(dir, { recursive: true, force: true });
1128
+ }
1129
+ }
1130
+
1131
+ // --- fn handle surface: stats() + invalidateMeta() ------------------------
1132
+
1133
+ async function testStatsAndInvalidateMeta() {
1134
+ var ctx = await _ctx({ contentSafety: null }, { "a.txt": "abc", "b.txt": "defgh" });
1135
+ try {
1136
+ await _get(ctx.port, "/a.txt");
1137
+ var etagHit = await _get(ctx.port, "/a.txt");
1138
+ // Second identical request with the ETag → counts an etag hit.
1139
+ var base = await _get(ctx.port, "/b.txt");
1140
+ await _get(ctx.port, "/b.txt", { "If-None-Match": base.headers.etag });
1141
+ var s = ctx.fn.stats();
1142
+ check("stats: requestsServed accumulates", s.requestsServed >= 2);
1143
+ check("stats: bytesServed accumulates", s.bytesServed >= 3);
1144
+ check("stats: etagHits counted for a matching conditional", s.etagHits >= 1);
1145
+ check("stats: returns a copy (mutating it does not corrupt internal state)",
1146
+ (function () { s.requestsServed = -999; return ctx.fn.stats().requestsServed !== -999; })());
1147
+ void etagHit;
1148
+
1149
+ var inv = ctx.fn.invalidateMeta(path.join(ctx.dir, "a.txt"));
1150
+ check("invalidateMeta: returns ok for the evicted key",
1151
+ inv.ok === true && inv.key === path.join(ctx.dir, "a.txt"));
1152
+ } finally { ctx.close(); }
1153
+ }
1154
+
1155
+ // --- contentSafety:null audit emission ------------------------------------
1156
+
1157
+ async function testContentSafetyDisabledAudit() {
1158
+ var rows = [];
1159
+ var audit = { safeEmit: function (row) { rows.push(row); } };
1160
+ var ctx = await _ctx({
1161
+ contentSafety: null, audit: audit,
1162
+ contentSafetyDisabledReason: "trusted-curated-assets",
1163
+ }, { "a.txt": "abc" });
1164
+ try {
1165
+ var disabledRow = rows.filter(function (r) {
1166
+ return r.action === "staticServe.contentSafety.disabled";
1167
+ })[0];
1168
+ check("contentSafety:null emits an audit row recording the opt-out",
1169
+ !!disabledRow && disabledRow.metadata.reason === "trusted-curated-assets");
1170
+ } finally { ctx.close(); }
1171
+ }
1172
+
1173
+ // --- hashed-asset immutable Cache-Control ---------------------------------
1174
+
1175
+ async function testHashedImmutableCacheControl() {
1176
+ var ctx = await _ctx({ contentSafety: null }, { "app.abcdef12.js": "x=1" });
1177
+ try {
1178
+ var r = await _get(ctx.port, "/app.abcdef12.js");
1179
+ check("hashed asset: immutable long-max-age Cache-Control",
1180
+ r.statusCode === 200 && /immutable/.test(r.headers["cache-control"] || ""));
1181
+ var plain = await _ctx({ contentSafety: null }, { "app.js": "x=1" });
1182
+ try {
1183
+ var r2 = await _get(plain.port, "/app.js");
1184
+ check("non-hashed asset: short-max-age Cache-Control (no immutable)",
1185
+ !/immutable/.test(r2.headers["cache-control"] || ""));
1186
+ } finally { plain.close(); }
1187
+ } finally { ctx.close(); }
1188
+ }
1189
+
1190
+ // --- mountPath stripping --------------------------------------------------
1191
+
1192
+ async function testMountPathStrip() {
1193
+ var ctx = await _ctx({ contentSafety: null, mountPath: "/static" },
1194
+ { "site.css": "body{}" });
1195
+ try {
1196
+ var r = await _get(ctx.port, "/static/site.css");
1197
+ check("mountPath: prefix stripped, file served from root",
1198
+ r.statusCode === 200 && r.body.toString("utf8") === "body{}");
1199
+ } finally { ctx.close(); }
1200
+ }
1201
+
1202
+ // --- indexFile:null disables directory-index serving ----------------------
1203
+
1204
+ async function testIndexFileDisabled() {
1205
+ var ctx = await _ctx({ contentSafety: null, indexFile: null },
1206
+ { "docs/index.html": "<h1>x</h1>" });
1207
+ try {
1208
+ var r = await _get(ctx.port, "/docs/");
1209
+ check("indexFile:null: directory request falls through → 404",
1210
+ r.statusCode === 404);
1211
+ } finally { ctx.close(); }
1212
+ }
1213
+
1214
+ // --- _shouldForceAttachment extension-fallback branches -------------------
1215
+
1216
+ async function testForceAttachmentExtFallback() {
1217
+ // A .zip served as the generic octet-stream, forced download (final
1218
+ // catch-all return true).
1219
+ var zip = await _ctx({ contentSafety: null, forceAttachmentForNonText: true },
1220
+ { "bundle.zip": "PKstuff" });
1221
+ try {
1222
+ var r = await _get(zip.port, "/bundle.zip");
1223
+ check("force-attachment: octet-stream .zip forced to download",
1224
+ /^attachment;/.test(r.headers["content-disposition"] || ""));
1225
+ } finally { zip.close(); }
1226
+
1227
+ // A .svg mislabeled as octet-stream but backed by a sanitizer gate renders
1228
+ // inline via the extension-fallback safe-render allowance.
1229
+ var svgGate = { check: async function () { return { ok: true, action: "serve" }; } };
1230
+ var svg = await _ctx({
1231
+ forceAttachmentForNonText: true,
1232
+ contentTypes: { ".svg": "application/octet-stream" },
1233
+ contentSafety: { ".svg": svgGate },
1234
+ }, { "icon.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\"></svg>" });
1235
+ try {
1236
+ var r2 = await _get(svg.port, "/icon.svg");
1237
+ check("force-attachment: octet-stream .svg with a sanitizer gate renders inline",
1238
+ r2.statusCode === 200 && !r2.headers["content-disposition"]);
1239
+ } finally { svg.close(); }
1240
+ }
1241
+
1242
+ // Per-actor bandwidth window (distinct scope from the global window).
1243
+ async function testBandwidthPerActorCapRejected() {
1244
+ var cache = b.cache.create({ namespace: "static-bwa-" + process.pid, backend: "memory" });
1245
+ var ctx = await _ctx({
1246
+ contentSafety: null, cache: cache, maxBytesPerActorPerWindowMs: 4,
1247
+ }, { "f.txt": "0123456789" });
1248
+ try {
1249
+ var ipCands = ["127.0.0.1", "::1", "::ffff:127.0.0.1"];
1250
+ for (var i = 0; i < ipCands.length; i++) {
1251
+ await cache.set("static:bw:actor:ip:" + ipCands[i], 1000);
1252
+ }
1253
+ var r = await _get(ctx.port, "/f.txt");
1254
+ check("bandwidth-cap: per-actor window over cap → 429", r.statusCode === 429);
1255
+ } finally {
1256
+ ctx.close();
1257
+ if (typeof cache.close === "function") await cache.close();
1258
+ }
1259
+ }
1260
+
1261
+ // The atomic counter retries the whole read-modify-write when the cache
1262
+ // signals UPDATE_CONTENTION (cluster CAS lost the race); a stub cache that
1263
+ // throws contention once then delegates proves the retry recovers.
1264
+ async function testCounterRetriesOnContention() {
1265
+ var real = b.cache.create({ namespace: "static-cas-" + process.pid, backend: "memory" });
1266
+ var threwOnce = false;
1267
+ var stub = {
1268
+ get: function (k) { return real.get(k); },
1269
+ set: function (k, v, o) { return real.set(k, v, o); },
1270
+ update: async function (k, fn, o) {
1271
+ if (!threwOnce) {
1272
+ threwOnce = true;
1273
+ var e = new Error("cluster CAS lost the race");
1274
+ e.code = "UPDATE_CONTENTION";
1275
+ throw e;
1276
+ }
1277
+ return real.update(k, fn, o);
1278
+ },
1279
+ };
1280
+ var ctx = await _ctx({
1281
+ contentSafety: null, cache: stub, maxConcurrentDownloadsPerActor: 4,
1282
+ }, { "f.txt": "body" });
1283
+ try {
1284
+ var r = await _get(ctx.port, "/f.txt");
1285
+ check("counter-contention: serve recovers after an UPDATE_CONTENTION retry → 200",
1286
+ r.statusCode === 200 && r.body.toString("utf8") === "body");
1287
+ check("counter-contention: the contention path was actually exercised",
1288
+ threwOnce === true);
1289
+ } finally {
1290
+ ctx.close();
1291
+ if (typeof real.close === "function") await real.close();
1292
+ }
1293
+ }
1294
+
1295
+ // A malformed percent-encoding makes decodeURIComponent throw; the middleware
1296
+ // falls through to next() (404) rather than surfacing the decode error.
1297
+ async function testMalformedPercentEncoding() {
1298
+ var ctx = await _ctx({ contentSafety: null }, { "ok.txt": "ok" });
1299
+ try {
1300
+ var r = await _get(ctx.port, "/%zz");
1301
+ check("decode: malformed %-escape falls through to 404", r.statusCode === 404);
1302
+ } finally { ctx.close(); }
1303
+ }
1304
+
1305
+ // A request whose path equals the mount prefix exactly resolves to root "/".
1306
+ async function testMountPathExactMatch() {
1307
+ var ctx = await _ctx({ contentSafety: null, mountPath: "/static" },
1308
+ { "index.html": "<h1>root index</h1>" });
1309
+ try {
1310
+ var r = await _get(ctx.port, "/static");
1311
+ check("mountPath: request equal to the mount prefix resolves to the root index",
1312
+ r.statusCode === 200 && /root index/.test(r.body.toString("utf8")));
1313
+ } finally { ctx.close(); }
1314
+ }
1315
+
1316
+ // safeRenderSvg:false forces an SVG to download even with a sanitizer wired.
1317
+ async function testSafeRenderSvgDisabled() {
1318
+ var svgGate = { check: async function () { return { ok: true, action: "serve" }; } };
1319
+ var ctx = await _ctx({
1320
+ forceAttachmentForNonText: true, safeRenderSvg: false,
1321
+ contentSafety: { ".svg": svgGate },
1322
+ }, { "icon.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\"></svg>" });
1323
+ try {
1324
+ var r = await _get(ctx.port, "/icon.svg");
1325
+ check("safeRenderSvg:false forces SVG to download even with a sanitizer gate",
1326
+ /^attachment;/.test(r.headers["content-disposition"] || ""));
1327
+ } finally { ctx.close(); }
1328
+ }
1329
+
1330
+ // contentSafety:null with an audit sink but no explicit reason records the
1331
+ // default opt-out reason.
1332
+ async function testContentSafetyDisabledDefaultReason() {
1333
+ var rows = [];
1334
+ var audit = { safeEmit: function (row) { rows.push(row); } };
1335
+ var ctx = await _ctx({ contentSafety: null, audit: audit }, { "a.txt": "abc" });
1336
+ try {
1337
+ var row = rows.filter(function (r) {
1338
+ return r.action === "staticServe.contentSafety.disabled";
1339
+ })[0];
1340
+ check("contentSafety:null without a reason records the default opt-out reason",
1341
+ !!row && row.metadata.reason === "operator-explicit-opt-out");
1342
+ } finally { ctx.close(); }
1343
+ }
1344
+
1345
+ // A revokeStore whose isRevoked() throws fails open on the revocation check
1346
+ // (the file still serves) — a revoke-store outage must not 404 every asset.
1347
+ async function testRevokeStoreIsRevokedThrows() {
1348
+ var revokeStore = {
1349
+ isRevoked: async function () { throw new Error("revoke backend down"); },
1350
+ revoke: async function () {},
1351
+ };
1352
+ var ctx = await _ctx({ contentSafety: null, revokeStore: revokeStore },
1353
+ { "f.txt": "body" });
1354
+ try {
1355
+ var r = await _get(ctx.port, "/f.txt");
1356
+ check("revokeStore: a throwing isRevoked() does not block serving (200)",
1357
+ r.statusCode === 200 && r.body.toString("utf8") === "body");
1358
+ } finally { ctx.close(); }
1359
+ }
1360
+
1361
+ // create() with no argument still runs the required-opt validation (opts||{}).
1362
+ function testCreateNoArgThrows() {
1363
+ var threw = null;
1364
+ try { b.staticServe.create(); } catch (e) { threw = e; }
1365
+ check("create() with no opts throws (root is required)",
1366
+ threw && /root/.test(threw.message));
1367
+ }
1368
+
559
1369
  // The _get helper drives each fixture server with a default-agent http.request
560
1370
  // (keep-alive), and srv.close() runs fire-and-forget. The kept-alive client
561
1371
  // sockets, the servers' accept sockets, and any in-flight static-file read
@@ -596,6 +1406,46 @@ async function run() {
596
1406
  await testPathTraversalRefused();
597
1407
  await testNestedFileServed();
598
1408
  await testDirectoryIndexServed();
1409
+ // Error / adversarial / defensive-branch coverage.
1410
+ await testRangeSingle();
1411
+ await testRangeSuffixAndOpenEnded();
1412
+ await testRangeMalformedAndMulti();
1413
+ await testRangeUnsatisfiableAndTooLarge();
1414
+ await testAcceptRangesDisabled();
1415
+ await testConditionalHits();
1416
+ await testHeadRequest();
1417
+ await testSafeAttachmentRiskyMime();
1418
+ await testOnServeMutatesHeaders();
1419
+ await testOnServeThrows();
1420
+ await testContentSafetyRefuse();
1421
+ await testContentSafetySanitize();
1422
+ await testContentSafetySanitizeIntegrityHeaders();
1423
+ await testContentSafetyThrows();
1424
+ await testContentSafetyTooLarge();
1425
+ await testMimeAllowlistSuccess();
1426
+ await testMimeAllowlistRejections();
1427
+ await testRevokeLocal();
1428
+ await testRevokeStore();
1429
+ await testRetentionBlocked();
1430
+ await testConcurrencyCapRejected();
1431
+ await testBandwidthCapRejected();
1432
+ await testQuotaSuccessConsumesAndReleases();
1433
+ testCreateValidationThrows();
1434
+ await testIntegrityHelper();
1435
+ await testStatsAndInvalidateMeta();
1436
+ await testContentSafetyDisabledAudit();
1437
+ await testHashedImmutableCacheControl();
1438
+ await testMountPathStrip();
1439
+ await testIndexFileDisabled();
1440
+ await testForceAttachmentExtFallback();
1441
+ await testBandwidthPerActorCapRejected();
1442
+ await testCounterRetriesOnContention();
1443
+ await testMalformedPercentEncoding();
1444
+ await testMountPathExactMatch();
1445
+ await testSafeRenderSvgDisabled();
1446
+ await testContentSafetyDisabledDefaultReason();
1447
+ await testRevokeStoreIsRevokedThrows();
1448
+ testCreateNoArgThrows();
599
1449
  } finally {
600
1450
  await _drainTcpHandles();
601
1451
  }