@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
@@ -0,0 +1,621 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) blamejs contributors
3
+ "use strict";
4
+ /**
5
+ * b.storage — the classification-routing, residency-validating object-
6
+ * storage layer above b.objectStore. Exercises the config-normalization
7
+ * and dispatch error branches (unknown backend, classification mismatch,
8
+ * refuse-unclassified, no-backend-for-classification, empty registry),
9
+ * the encrypt/decrypt round-trip and its fail-closed KEY_REQUIRED guard,
10
+ * the raw/delete/exists surface, the presign success + rejection paths
11
+ * (sigv4 signing is pure-local, no network), boot-time residency
12
+ * validation, and the chunkScratch resumable-upload primitive with its
13
+ * assemblyId / chunkIndex adversarial-input rejections.
14
+ *
15
+ * Run standalone: `node test/layer-0-primitives/storage.test.js`
16
+ * Or via smoke: `node test/smoke.js`
17
+ */
18
+
19
+ var helpers = require("../helpers");
20
+ var b = helpers.b;
21
+ var fs = helpers.fs;
22
+ var os = helpers.os;
23
+ var path = helpers.path;
24
+ var check = helpers.check;
25
+ var C = require("../../lib/constants");
26
+
27
+ // ---- small local utilities (not mocks — assertion + tmp-dir plumbing) ----
28
+
29
+ var _tmpDirs = [];
30
+ function _mkTmp(tag) {
31
+ var d = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-storage-" + tag + "-"));
32
+ _tmpDirs.push(d);
33
+ return d;
34
+ }
35
+ function _cleanupTmp() {
36
+ while (_tmpDirs.length) {
37
+ var d = _tmpDirs.pop();
38
+ try { fs.rmSync(d, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
39
+ }
40
+ }
41
+
42
+ // expectThrow — drives fn (sync throw OR async rejection) and asserts the
43
+ // framework error code. Not a fixture: a thin assertion wrapper over check().
44
+ async function expectThrow(label, code, fn) {
45
+ var threw = null;
46
+ try { await fn(); } catch (e) { threw = e; }
47
+ check(label + " throws " + code, threw && threw.code === code);
48
+ }
49
+
50
+ // ---- getBackend escape-hatch (original coverage, retained) ----
51
+
52
+ async function testGetBackend() {
53
+ var uploadDir = _mkTmp("getbackend");
54
+ b.storage._resetForTest();
55
+ try {
56
+ // Before init, any file-op accessor refuses.
57
+ var preThrew = null;
58
+ try { b.storage.getBackend("default"); } catch (e) { preThrew = e; }
59
+ check("storage.getBackend before init throws NOT_INITIALIZED",
60
+ preThrew && preThrew.code === "NOT_INITIALIZED");
61
+
62
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
63
+
64
+ var backend = b.storage.getBackend("default");
65
+ check("storage.getBackend returns the registered backend instance",
66
+ backend && typeof backend === "object");
67
+ check("storage.getBackend backend reports protocol 'local'",
68
+ backend.protocol === "local");
69
+ check("storage.getBackend unknown name returns null",
70
+ b.storage.getBackend("does-not-exist") === null);
71
+
72
+ // The escape-hatch handle corresponds to what listBackends reports.
73
+ var listed = b.storage.listBackends();
74
+ check("storage.getBackend default name matches listBackends",
75
+ listed.length === 1 && listed[0].name === "default" && listed[0].protocol === "local");
76
+ check("storage.listBackends surfaces the resolved local rootDir",
77
+ typeof listed[0].rootDir === "string" && listed[0].rootDir.length > 0);
78
+ check("storage.listBackends surfaces breakerState",
79
+ typeof listed[0].breakerState === "string");
80
+ // Same registry object on repeat lookups (not a fresh build per call).
81
+ check("storage.getBackend returns a stable handle across calls",
82
+ b.storage.getBackend("default") === backend);
83
+ } finally {
84
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
85
+ _cleanupTmp();
86
+ }
87
+ }
88
+
89
+ // ---- init config normalization + validation ----
90
+
91
+ async function testInitConfigValidation() {
92
+ var uploadDir = _mkTmp("initcfg");
93
+ b.storage._resetForTest();
94
+ try {
95
+ // Missing options entirely.
96
+ await expectThrow("storage.init(undefined)", "INVALID_CONFIG",
97
+ function () { b.storage.init(undefined); });
98
+
99
+ // 's3' was renamed to 'sigv4' — the rename is a hard error, not a silent alias.
100
+ await expectThrow("storage.init { backend: 's3' }", "INVALID_CONFIG",
101
+ function () { b.storage.init({ backend: "s3", uploadDir: uploadDir }); });
102
+
103
+ // Unknown single-backend name.
104
+ await expectThrow("storage.init unknown backend", "INVALID_CONFIG",
105
+ function () { b.storage.init({ backend: "frobnicate", uploadDir: uploadDir }); });
106
+
107
+ // Neither { backend } nor { backends }.
108
+ await expectThrow("storage.init with no backend/backends", "INVALID_CONFIG",
109
+ function () { b.storage.init({ defaultClassification: "public" }); });
110
+
111
+ // Multi-backend shape sets defaultClassification + refuseUnclassified.
112
+ b.storage._resetForTest();
113
+ b.storage.init({
114
+ backends: {
115
+ "eu-private": { protocol: "local", rootDir: path.join(uploadDir, "eu"), classifications: ["personal"], residencyTag: "EU" },
116
+ "us-ops": { protocol: "local", rootDir: path.join(uploadDir, "us"), classifications: ["operational", "public"], residencyTag: "US" },
117
+ },
118
+ defaultClassification: "operational",
119
+ refuseUnclassified: true,
120
+ });
121
+ var listed = b.storage.listBackends();
122
+ check("storage.init multi-backend registers both backends", listed.length === 2);
123
+
124
+ // Idempotent: a second init after a successful one is a no-op.
125
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
126
+ check("storage.init is idempotent (second call is a no-op)",
127
+ b.storage.listBackends().length === 2);
128
+
129
+ // Single remote-protocol shorthand normalizes to a forwarded default backend.
130
+ b.storage._resetForTest();
131
+ b.storage.init({ backend: "http-put", baseUrl: "https://uploads.example.com/put" });
132
+ var httpListed = b.storage.listBackends();
133
+ check("storage.init http-put shorthand forwards a single default backend",
134
+ httpListed.length === 1 && httpListed[0].name === "default" && httpListed[0].protocol === "http-put");
135
+ } finally {
136
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
137
+ _cleanupTmp();
138
+ }
139
+ }
140
+
141
+ // ---- backend-selection dispatch errors (_pickBackend) ----
142
+
143
+ async function testBackendDispatchErrors() {
144
+ var uploadDir = _mkTmp("dispatch");
145
+ b.storage._resetForTest();
146
+ try {
147
+ b.storage.init({
148
+ backends: {
149
+ "eu-private": { protocol: "local", rootDir: path.join(uploadDir, "eu"), classifications: ["personal"], residencyTag: "EU" },
150
+ "us-ops": { protocol: "local", rootDir: path.join(uploadDir, "us"), classifications: ["operational", "public"], residencyTag: "US" },
151
+ },
152
+ defaultClassification: "operational",
153
+ });
154
+ var body = Buffer.from("dispatch-bytes");
155
+
156
+ // Explicit backend that doesn't exist.
157
+ await expectThrow("saveRaw explicit unknown backend", "UNKNOWN_BACKEND",
158
+ function () { return b.storage.saveRaw(body, "k1", { backend: "no-such" }); });
159
+
160
+ // Explicit backend that doesn't serve the requested classification.
161
+ await expectThrow("saveRaw explicit backend classification mismatch", "CLASSIFICATION_MISMATCH",
162
+ function () { return b.storage.saveRaw(body, "k2", { backend: "eu-private", classification: "operational" }); });
163
+
164
+ // A classification no backend serves.
165
+ await expectThrow("saveRaw classification with no serving backend", "NO_BACKEND_FOR_CLASSIFICATION",
166
+ function () { return b.storage.saveRaw(body, "k3", { classification: "top-secret" }); });
167
+
168
+ // Explicit backend + matching classification routes correctly.
169
+ var savedEu = await b.storage.saveRaw(body, "eu/doc.bin", { backend: "eu-private", classification: "personal" });
170
+ check("saveRaw explicit backend+classification routes to eu-private", savedEu.backend === "eu-private");
171
+
172
+ // No classification → defaultClassification routes to the serving backend.
173
+ var savedDefault = await b.storage.saveRaw(body, "ops/doc.bin", {});
174
+ check("saveRaw no-classification routes via defaultClassification to us-ops", savedDefault.backend === "us-ops");
175
+ check("saveRaw returns versionId null on a non-versioning backend", savedDefault.versionId === null);
176
+
177
+ // Explicit classification that a backend serves routes by classification.
178
+ var savedPublic = await b.storage.saveRaw(body, "pub/logo.bin", { classification: "public" });
179
+ check("saveRaw classification 'public' routes to us-ops", savedPublic.backend === "us-ops");
180
+
181
+ // refuseUnclassified: a call with no classification and no explicit backend refuses.
182
+ b.storage._resetForTest();
183
+ b.storage.init({
184
+ backends: {
185
+ "us-ops": { protocol: "local", rootDir: path.join(uploadDir, "us2"), classifications: ["operational"], residencyTag: "US" },
186
+ },
187
+ refuseUnclassified: true,
188
+ });
189
+ await expectThrow("saveRaw under refuseUnclassified without classification", "UNCLASSIFIED",
190
+ function () { return b.storage.saveRaw(body, "k4", {}); });
191
+
192
+ // An empty backend registry is a valid-but-degenerate config; dispatch fails closed.
193
+ b.storage._resetForTest();
194
+ b.storage.init({ backends: {} });
195
+ await expectThrow("saveRaw with an empty backend registry", "NO_BACKENDS",
196
+ function () { return b.storage.saveRaw(body, "k5", {}); });
197
+ } finally {
198
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
199
+ _cleanupTmp();
200
+ }
201
+ }
202
+
203
+ // ---- encrypt/decrypt round-trip + body validation ----
204
+
205
+ async function testEncryptionRoundTripAndBodyValidation() {
206
+ var uploadDir = _mkTmp("encrypt");
207
+ b.storage._resetForTest();
208
+ try {
209
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
210
+
211
+ // Pre-init guard is exercised on a fresh reset (drives _requireInit's throw).
212
+ b.storage._resetForTest();
213
+ await expectThrow("saveFile before init", "NOT_INITIALIZED",
214
+ function () { return b.storage.saveFile(Buffer.from("x"), "k"); });
215
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
216
+
217
+ // Non-Buffer bodies are refused before any encryption / write.
218
+ await expectThrow("saveFile non-Buffer body", "INVALID_BODY",
219
+ function () { return b.storage.saveFile("not-a-buffer", "k"); });
220
+ await expectThrow("saveRaw non-Buffer body", "INVALID_BODY",
221
+ function () { return b.storage.saveRaw({}, "k"); });
222
+
223
+ // Full encrypted round-trip: saveFile seals a per-file key; getFileBuffer
224
+ // unseals + verifies the AEAD tag before releasing plaintext.
225
+ var plaintext = Buffer.from("invoice pdf bytes — sensitive");
226
+ var saved = await b.storage.saveFile(plaintext, "invoices/001.pdf");
227
+ check("saveFile returns a sealed encryptionKey", typeof saved.encryptionKey === "string" && saved.encryptionKey.length > 0);
228
+ check("saveFile returns the storedPath", saved.storedPath === "invoices/001.pdf");
229
+
230
+ var roundTrip = await b.storage.getFileBuffer("invoices/001.pdf", saved.encryptionKey);
231
+ check("getFileBuffer round-trips the plaintext", roundTrip.equals(plaintext));
232
+
233
+ // Ciphertext on disk is NOT the plaintext (encryption actually happened).
234
+ var onDisk = await b.storage.getRawBuffer("invoices/001.pdf");
235
+ check("stored bytes are ciphertext, not plaintext", !onDisk.equals(plaintext));
236
+
237
+ // getFileStream buffers-then-streams the same verified plaintext.
238
+ var stream = await b.storage.getFileStream("invoices/001.pdf", saved.encryptionKey);
239
+ var chunks = [];
240
+ for await (var chunk of stream) chunks.push(chunk);
241
+ check("getFileStream yields the decrypted plaintext", Buffer.concat(chunks).equals(plaintext));
242
+
243
+ // Fail-closed: a decrypt attempt without the sealed key is refused (no
244
+ // legacy plaintext fallback).
245
+ await b.storage.saveRaw(Buffer.from("raw-envelope-bytes"), "raw/blob.bin");
246
+ await expectThrow("getFileBuffer without a sealed key", "KEY_REQUIRED",
247
+ function () { return b.storage.getFileBuffer("raw/blob.bin", undefined); });
248
+ } finally {
249
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
250
+ _cleanupTmp();
251
+ }
252
+ }
253
+
254
+ // ---- saveRaw / getRawBuffer / deleteFile / exists ----
255
+
256
+ async function testRawDeleteExists() {
257
+ var uploadDir = _mkTmp("rawops");
258
+ b.storage._resetForTest();
259
+ try {
260
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
261
+
262
+ // saveRaw skips the envelope — getRawBuffer returns byte-for-byte.
263
+ var raw = Buffer.from("public-cdn-bytes");
264
+ var savedRaw = await b.storage.saveRaw(raw, "assets/logo.png");
265
+ check("saveRaw stores to the default backend", savedRaw.backend === "default");
266
+ var fetched = await b.storage.getRawBuffer("assets/logo.png");
267
+ check("getRawBuffer returns raw bytes unchanged", fetched.equals(raw));
268
+
269
+ // exists is a HEAD-style probe.
270
+ check("exists returns true for a present key", (await b.storage.exists("assets/logo.png")) === true);
271
+ check("exists returns false for an absent key", (await b.storage.exists("assets/missing.png")) === false);
272
+
273
+ // A non-NOT_FOUND backend error (traversal-escaping key) propagates rather
274
+ // than being swallowed as "doesn't exist".
275
+ await expectThrow("exists propagates a non-NOT_FOUND backend error", "INVALID_KEY",
276
+ function () { return b.storage.exists("../escape.png"); });
277
+
278
+ // deleteFile: true when present, false when already absent.
279
+ check("deleteFile returns true when the object existed", (await b.storage.deleteFile("assets/logo.png")) === true);
280
+ check("deleteFile returns false when already absent", (await b.storage.deleteFile("assets/logo.png")) === false);
281
+
282
+ // A versioned delete against a filesystem backend is refused — a local file
283
+ // has no version history to erase.
284
+ await b.storage.saveRaw(raw, "assets/keep.png");
285
+ await expectThrow("deleteFile versionId on a filesystem backend", "VERSIONID_UNSUPPORTED",
286
+ function () { return b.storage.deleteFile("assets/keep.png", { versionId: "v-does-not-exist" }); });
287
+ } finally {
288
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
289
+ _cleanupTmp();
290
+ }
291
+ }
292
+
293
+ // ---- listVersions unsupported (local) + presign paths (sigv4 = offline signing) ----
294
+
295
+ async function testListVersionsAndPresign() {
296
+ var uploadDir = _mkTmp("presign");
297
+ b.storage._resetForTest();
298
+ try {
299
+ // A filesystem backend has no version surface — listVersions refuses
300
+ // rather than silently returning the current-only view.
301
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
302
+ await expectThrow("listVersions on a filesystem backend", "VERSIONS_UNSUPPORTED",
303
+ function () { return b.storage.listVersions("prefix/"); });
304
+
305
+ // Calling a presign primitive on a local backend surfaces PRESIGN_NOT_SUPPORTED.
306
+ await expectThrow("presignedUploadUrl on a local backend", "PRESIGN_NOT_SUPPORTED",
307
+ function () { b.storage.presignedUploadUrl("k", {}); });
308
+
309
+ // sigv4 presigning is pure-local HMAC signing — no network. Drives the
310
+ // success + audit-emit path for all three presign surfaces.
311
+ b.storage._resetForTest();
312
+ b.storage.init({
313
+ backends: {
314
+ "us-ops": {
315
+ protocol: "sigv4",
316
+ endpoint: "https://s3.us-east-1.amazonaws.com",
317
+ region: "us-east-1",
318
+ bucket: "uploads",
319
+ accessKeyId: "AKIAEXAMPLE",
320
+ secretAccessKey: "secret",
321
+ classifications: ["operational", "public"],
322
+ residencyTag: "US",
323
+ },
324
+ },
325
+ });
326
+
327
+ // Empty key is refused before any signing work.
328
+ await expectThrow("presignedUploadUrl empty key", "INVALID_KEY",
329
+ function () { b.storage.presignedUploadUrl("", { backend: "us-ops" }); });
330
+ await expectThrow("presignedUploadPolicy empty key", "INVALID_KEY",
331
+ function () { b.storage.presignedUploadPolicy("", { backend: "us-ops" }); });
332
+
333
+ var up = b.storage.presignedUploadUrl("incoming/x.bin", { backend: "us-ops", expiresInSec: 300 });
334
+ check("presignedUploadUrl returns a PUT URL", up.method === "PUT" && typeof up.url === "string" && up.url.indexOf("X-Amz-Signature") !== -1);
335
+ check("presignedUploadUrl carries an expiresAt", typeof up.expiresAt === "number");
336
+
337
+ var down = b.storage.presignedDownloadUrl("public/logo.png", {
338
+ backend: "us-ops",
339
+ expiresInSec: 60,
340
+ responseHeaders: { contentDisposition: 'attachment; filename="logo.png"' },
341
+ });
342
+ check("presignedDownloadUrl returns a GET URL", down.method === "GET");
343
+
344
+ var policy = b.storage.presignedUploadPolicy("user/avatar.png", {
345
+ backend: "us-ops",
346
+ maxBytes: C.BYTES.mib(5),
347
+ expiresInSec: 300,
348
+ contentType: "image/png",
349
+ });
350
+ check("presignedUploadPolicy returns a POST policy", policy.method === "POST");
351
+ check("presignedUploadPolicy bakes in the maxBytes cap", policy.maxBytes === C.BYTES.mib(5));
352
+ check("presignedUploadPolicy reports an enforcement mode", typeof policy.enforcement === "string" && policy.enforcement.length > 0);
353
+ } finally {
354
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
355
+ _cleanupTmp();
356
+ }
357
+ }
358
+
359
+ // ---- boot-time residency validation (needs a db with dataResidency) ----
360
+
361
+ async function testResidencyValidation() {
362
+ var tmpDir = _mkTmp("residency");
363
+ process.env.BLAMEJS_SKIP_NTP_CHECK = "1";
364
+ helpers.setTestPassphraseEnv();
365
+ b.cluster._resetForTest();
366
+ b.audit._resetForTest();
367
+ b.vault._resetForTest();
368
+ b.db._resetForTest();
369
+ await b.vault.init({ dataDir: tmpDir });
370
+ await b.db.init({
371
+ dataDir: tmpDir,
372
+ tmpDir: path.join(tmpDir, "tmpfs"),
373
+ allowNonTmpfsTmpDir: true,
374
+ schema: [],
375
+ dataResidency: { region: "EU", allowedStorageRegions: ["EU"] },
376
+ });
377
+ try {
378
+ var euDir = path.join(tmpDir, "eu");
379
+ var usDir = path.join(tmpDir, "us");
380
+ var pubDir = path.join(tmpDir, "pub");
381
+
382
+ // A backend serving 'personal' data outside the app's residency region
383
+ // fails the deployment at boot instead of leaking on first write.
384
+ b.storage._resetForTest();
385
+ await expectThrow("init residency violation (personal served from US, app region EU)", "RESIDENCY_VIOLATION",
386
+ function () {
387
+ b.storage.init({
388
+ backends: { "bad": { protocol: "local", rootDir: euDir, classifications: ["personal"], residencyTag: "US" } },
389
+ });
390
+ });
391
+
392
+ // defaultClassification 'personal' with no backend that declares 'personal'.
393
+ b.storage._resetForTest();
394
+ await expectThrow("init defaultClassification=personal with no personal backend", "NO_PERSONAL_BACKEND",
395
+ function () {
396
+ b.storage.init({
397
+ backends: { "pub": { protocol: "local", rootDir: pubDir, classifications: ["public"], residencyTag: "EU" } },
398
+ defaultClassification: "personal",
399
+ });
400
+ });
401
+
402
+ // A correctly-tagged personal backend inside the region passes validation.
403
+ b.storage._resetForTest();
404
+ b.storage.init({
405
+ backends: { "eu-private": { protocol: "local", rootDir: usDir, classifications: ["personal"], residencyTag: "EU" } },
406
+ defaultClassification: "personal",
407
+ });
408
+ check("init passes with an in-region personal backend", b.storage.listBackends().length === 1);
409
+
410
+ // A wildcard ('*') backend serves personal implicitly; validated the same way.
411
+ b.storage._resetForTest();
412
+ b.storage.init({
413
+ backends: { "any": { protocol: "local", rootDir: path.join(tmpDir, "any"), classifications: ["*"], residencyTag: "EU" } },
414
+ });
415
+ check("init passes with an in-region wildcard backend", b.storage.listBackends().length === 1);
416
+ } finally {
417
+ // Drain + anchor the audit chain BEFORE close so close()'s own
418
+ // fire-and-forget checkpoint no-ops (mirrors teardownTestDb ordering and
419
+ // avoids a checkpoint straddling the db boundary).
420
+ try { await b.audit.flush(); } catch (_e) { /* best-effort */ }
421
+ try { await b.audit.checkpoint({ skipIfUnchanged: true }); } catch (_e) { /* best-effort */ }
422
+ try { b.db.close(); } catch (_e) { /* best-effort */ }
423
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
424
+ b.db._resetForTest();
425
+ b.vault._resetForTest();
426
+ b.audit._resetForTest();
427
+ b.cluster._resetForTest();
428
+ _cleanupTmp();
429
+ }
430
+ }
431
+
432
+ // ---- chunkScratch adversarial-input validation ----
433
+
434
+ async function testChunkScratchValidation() {
435
+ var uploadDir = _mkTmp("chunkval");
436
+ b.storage._resetForTest();
437
+ try {
438
+ // chunkScratch itself is gated on init.
439
+ await expectThrow("chunkScratch before init", "NOT_INITIALIZED",
440
+ function () { b.storage.chunkScratch(); });
441
+
442
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
443
+
444
+ // Numeric opts are validated at construction.
445
+ await expectThrow("chunkScratch negative maxChunkBytes", "INVALID_ARGUMENT",
446
+ function () { b.storage.chunkScratch({ maxChunkBytes: -1 }); });
447
+ await expectThrow("chunkScratch zero staleAfterMs", "INVALID_ARGUMENT",
448
+ function () { b.storage.chunkScratch({ staleAfterMs: 0 }); });
449
+
450
+ // rootKeyPrefix with trailing slashes is normalized (linear strip).
451
+ var cs = b.storage.chunkScratch({ rootKeyPrefix: "uploads/scratch///" });
452
+ var data = Buffer.from("chunk-bytes");
453
+
454
+ // saveChunk arg-shape + assemblyId rejections.
455
+ await expectThrow("saveChunk non-object args", "INVALID_ARGUMENT",
456
+ function () { return cs.saveChunk(null); });
457
+ await expectThrow("saveChunk empty assemblyId", "INVALID_ARGUMENT",
458
+ function () { return cs.saveChunk({ assemblyId: "", chunkIndex: 0, data: data }); });
459
+ await expectThrow("saveChunk oversize assemblyId", "INVALID_ARGUMENT",
460
+ function () { return cs.saveChunk({ assemblyId: "a".repeat(129), chunkIndex: 0, data: data }); });
461
+ await expectThrow("saveChunk assemblyId with slash", "INVALID_ARGUMENT",
462
+ function () { return cs.saveChunk({ assemblyId: "has/slash", chunkIndex: 0, data: data }); });
463
+ await expectThrow("saveChunk assemblyId with control char", "INVALID_ARGUMENT",
464
+ function () { return cs.saveChunk({ assemblyId: "ctrl\u0001id", chunkIndex: 0, data: data }); });
465
+ await expectThrow("saveChunk assemblyId with dot-dot traversal", "INVALID_ARGUMENT",
466
+ function () { return cs.saveChunk({ assemblyId: "a..b", chunkIndex: 0, data: data }); });
467
+ await expectThrow("saveChunk assemblyId with leading dot", "INVALID_ARGUMENT",
468
+ function () { return cs.saveChunk({ assemblyId: ".hidden", chunkIndex: 0, data: data }); });
469
+
470
+ // chunkIndex rejections.
471
+ await expectThrow("saveChunk non-integer chunkIndex", "INVALID_ARGUMENT",
472
+ function () { return cs.saveChunk({ assemblyId: "ok", chunkIndex: 1.5, data: data }); });
473
+ await expectThrow("saveChunk negative chunkIndex", "INVALID_ARGUMENT",
474
+ function () { return cs.saveChunk({ assemblyId: "ok", chunkIndex: -1, data: data }); });
475
+ await expectThrow("saveChunk chunkIndex over cap", "INVALID_ARGUMENT",
476
+ function () { return cs.saveChunk({ assemblyId: "ok", chunkIndex: 100000, data: data }); });
477
+
478
+ // data-shape + size rejections.
479
+ await expectThrow("saveChunk non-Buffer data", "INVALID_ARGUMENT",
480
+ function () { return cs.saveChunk({ assemblyId: "ok", chunkIndex: 0, data: "nope" }); });
481
+ var csTiny = b.storage.chunkScratch({ rootKeyPrefix: "tiny", maxChunkBytes: C.BYTES.bytes(4) });
482
+ await expectThrow("saveChunk exceeds maxChunkBytes", "INVALID_ARGUMENT",
483
+ function () { return csTiny.saveChunk({ assemblyId: "ok", chunkIndex: 0, data: Buffer.from("too-long") }); });
484
+
485
+ // getChunk arg-shape rejections.
486
+ await expectThrow("getChunk non-object args", "INVALID_ARGUMENT",
487
+ function () { return cs.getChunk(null); });
488
+ await expectThrow("getChunk missing encryptionKey", "INVALID_ARGUMENT",
489
+ function () { return cs.getChunk({ assemblyId: "ok", chunkIndex: 0, encryptionKey: "" }); });
490
+
491
+ // assemble arg-shape rejections.
492
+ await expectThrow("assemble non-object args", "INVALID_ARGUMENT",
493
+ function () { return cs.assemble(null); });
494
+ await expectThrow("assemble empty chunkEncryptionKeys", "INVALID_ARGUMENT",
495
+ function () { return cs.assemble({ assemblyId: "ok", chunkEncryptionKeys: [] }); });
496
+ } finally {
497
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
498
+ _cleanupTmp();
499
+ }
500
+ }
501
+
502
+ // ---- chunkScratch full round-trip + assembly integrity ----
503
+
504
+ async function testChunkScratchRoundTrip() {
505
+ var uploadDir = _mkTmp("chunkrt");
506
+ b.storage._resetForTest();
507
+ try {
508
+ b.storage.init({ backend: "local", uploadDir: uploadDir });
509
+ var cs = b.storage.chunkScratch({ rootKeyPrefix: "uploads/scratch" });
510
+
511
+ // Save three ordered chunks; collect the per-chunk sealed keys.
512
+ var keys = [];
513
+ var parts = ["aaa", "bbb", "ccc"];
514
+ for (var i = 0; i < parts.length; i += 1) {
515
+ var res = await cs.saveChunk({ assemblyId: "upload-abc", chunkIndex: i, data: Buffer.from(parts[i]) });
516
+ check("saveChunk[" + i + "] returns a sealed encryptionKey", typeof res.encryptionKey === "string" && res.encryptionKey.length > 0);
517
+ check("saveChunk[" + i + "] reports sizeBytes", res.sizeBytes === 3);
518
+ keys.push(res.encryptionKey);
519
+ }
520
+
521
+ // getChunk round-trips one chunk's plaintext.
522
+ var c0 = await cs.getChunk({ assemblyId: "upload-abc", chunkIndex: 0, encryptionKey: keys[0] });
523
+ check("getChunk round-trips chunk bytes", c0.toString("utf8") === "aaa");
524
+
525
+ // chunkExists / listChunks / countChunks.
526
+ check("chunkExists true for a saved chunk", (await cs.chunkExists({ assemblyId: "upload-abc", chunkIndex: 1 })) === true);
527
+ check("chunkExists false for a missing chunk", (await cs.chunkExists({ assemblyId: "upload-abc", chunkIndex: 9 })) === false);
528
+ var indices = await cs.listChunks("upload-abc");
529
+ check("listChunks returns sorted indices", indices.length === 3 && indices[0] === 0 && indices[1] === 1 && indices[2] === 2);
530
+ check("countChunks matches", (await cs.countChunks("upload-abc")) === 3);
531
+
532
+ // assemble integrity rejections.
533
+ await expectThrow("assemble expectedTotal mismatch", "INCOMPLETE_ASSEMBLY",
534
+ function () { return cs.assemble({ assemblyId: "upload-abc", expectedTotal: 5, chunkEncryptionKeys: keys }); });
535
+ await expectThrow("assemble key-count mismatch", "INVALID_ARGUMENT",
536
+ function () { return cs.assemble({ assemblyId: "upload-abc", chunkEncryptionKeys: [keys[0]] }); });
537
+
538
+ // Valid assemble concatenates in order.
539
+ var assembled = await cs.assemble({ assemblyId: "upload-abc", expectedTotal: 3, chunkEncryptionKeys: keys });
540
+ check("assemble concatenates chunks in order", assembled.toString("utf8") === "aaabbbccc");
541
+
542
+ // A gapped assembly (chunks 0 and 2, missing 1) is refused.
543
+ var gapKeys = [];
544
+ gapKeys.push((await cs.saveChunk({ assemblyId: "gappy", chunkIndex: 0, data: Buffer.from("g0") })).encryptionKey);
545
+ gapKeys.push((await cs.saveChunk({ assemblyId: "gappy", chunkIndex: 2, data: Buffer.from("g2") })).encryptionKey);
546
+ await expectThrow("assemble refuses a chunk gap", "INCOMPLETE_ASSEMBLY",
547
+ function () { return cs.assemble({ assemblyId: "gappy", expectedTotal: 2, chunkEncryptionKeys: gapKeys }); });
548
+
549
+ // listAssemblies surfaces both assembly ids.
550
+ var assemblies = await cs.listAssemblies();
551
+ check("listAssemblies includes the saved assemblies",
552
+ assemblies.indexOf("upload-abc") !== -1 && assemblies.indexOf("gappy") !== -1);
553
+
554
+ // Stale-scan + gc run cleanly (filesystem backend surfaces no mtime, so
555
+ // nothing is stale — exercises the scan/gc paths without a false prune).
556
+ var staleDefault = await cs.listStaleAssemblies();
557
+ check("listStaleAssemblies returns an array (default window)", Array.isArray(staleDefault));
558
+ var staleExplicit = await cs.listStaleAssemblies({ olderThanMs: 1 });
559
+ check("listStaleAssemblies returns an array (explicit window)", Array.isArray(staleExplicit));
560
+ var gcRes = await cs.gc({ olderThanMs: C.TIME.hours(48) });
561
+ check("gc returns a removed[] list", Array.isArray(gcRes.removed));
562
+ // gc with no args uses the constructed staleAfterMs default window.
563
+ var gcDefault = await cs.gc();
564
+ check("gc with no args returns a removed[] list", Array.isArray(gcDefault.removed));
565
+
566
+ // removeChunk / removeAssembly.
567
+ check("removeChunk deletes a single chunk", (await cs.removeChunk({ assemblyId: "upload-abc", chunkIndex: 2 })) === true);
568
+ var removed = await cs.removeAssembly("upload-abc");
569
+ check("removeAssembly reports the removed chunk count", removed.chunksRemoved >= 1);
570
+ await cs.removeAssembly("gappy");
571
+
572
+ // The backend-override path routes chunks through an explicitly named backend.
573
+ var csOverride = b.storage.chunkScratch({ rootKeyPrefix: "ov", backend: "default" });
574
+ var ovRes = await csOverride.saveChunk({ assemblyId: "ov-1", chunkIndex: 0, data: Buffer.from("z") });
575
+ check("chunkScratch backend override saves through the named backend", typeof ovRes.encryptionKey === "string");
576
+ await csOverride.removeAssembly("ov-1");
577
+
578
+ // Construction with no opts (default rootKeyPrefix "chunk-scratch") and with
579
+ // explicit numeric windows exercises the opts-default branches.
580
+ var csDefaults = b.storage.chunkScratch();
581
+ var defRes = await csDefaults.saveChunk({ assemblyId: "def-1", chunkIndex: 0, data: Buffer.from("d") });
582
+ check("chunkScratch with no opts uses the default prefix", typeof defRes.encryptionKey === "string");
583
+ await csDefaults.removeAssembly("def-1");
584
+
585
+ var csWindows = b.storage.chunkScratch({ rootKeyPrefix: "win", maxChunkBytes: C.BYTES.mib(8), staleAfterMs: C.TIME.hours(1) });
586
+ var winStale = await csWindows.listStaleAssemblies();
587
+ check("chunkScratch with explicit windows scans cleanly", Array.isArray(winStale));
588
+ } finally {
589
+ try { b.storage._resetForTest(); } catch (_e) { /* best-effort */ }
590
+ _cleanupTmp();
591
+ }
592
+ }
593
+
594
+ async function run() {
595
+ await testGetBackend();
596
+ await testResidencyValidation();
597
+
598
+ var vaultDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-storage-vault-"));
599
+ await helpers.setupVaultOnly(vaultDir);
600
+ try {
601
+ await testInitConfigValidation();
602
+ await testBackendDispatchErrors();
603
+ await testEncryptionRoundTripAndBodyValidation();
604
+ await testRawDeleteExists();
605
+ await testListVersionsAndPresign();
606
+ await testChunkScratchValidation();
607
+ await testChunkScratchRoundTrip();
608
+ } finally {
609
+ helpers.teardownVaultOnly(vaultDir);
610
+ _cleanupTmp();
611
+ }
612
+ }
613
+
614
+ module.exports = { run: run };
615
+
616
+ if (require.main === module) {
617
+ run().then(
618
+ function () { console.log("[storage] OK — " + helpers.getChecks() + " checks passed"); },
619
+ function (e) { console.error("FAIL:", e); process.exit(1); }
620
+ );
621
+ }
@@ -0,0 +1,47 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) blamejs contributors
3
+ "use strict";
4
+ /**
5
+ * b.subject — GDPR data-subject rights (export / erase). Regression for the
6
+ * no-subject-tables path: subject.export/exportData `return`ed _writeAudit()'s
7
+ * value (undefined, it has no return) instead of the documented empty dump {},
8
+ * so an operator exporting before declaring any subjectField-tagged table got
9
+ * `undefined` and `Object.keys(dump)` / `dump.<table>` threw.
10
+ */
11
+
12
+ var fs = require("node:fs");
13
+ var os = require("node:os");
14
+ var path = require("node:path");
15
+ var helpers = require("../helpers");
16
+ var b = helpers.b;
17
+ var check = helpers.check;
18
+ var { setupTestDb, teardownTestDb } = require("../helpers/db");
19
+
20
+ // A schema with NO subjectField-tagged column → db()._getSubjectTables() is
21
+ // empty → export/exportData takes the no-subject-tables early return.
22
+ var NO_SUBJECT_SCHEMA = [{ name: "widget", columns: { id: "TEXT PRIMARY KEY", name: "TEXT" } }];
23
+
24
+ async function run() {
25
+ var dir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-subject-"));
26
+ try {
27
+ await setupTestDb(dir, NO_SUBJECT_SCHEMA);
28
+
29
+ var dump = b.subject.exportData("subj-1");
30
+ check("subject.exportData returns {} (not undefined) with no subject tables",
31
+ dump !== undefined && JSON.stringify(dump) === "{}");
32
+ check("subject.export is the same function as exportData (alias)",
33
+ b.subject.export === b.subject.exportData);
34
+ var keysOk = true;
35
+ try { Object.keys(dump); } catch (_e) { keysOk = false; }
36
+ check("Object.keys(export dump) does not throw on the empty-dump path", keysOk);
37
+ } finally {
38
+ await teardownTestDb(dir);
39
+ }
40
+ }
41
+
42
+ if (require.main === module) {
43
+ run().then(function () { console.log("subject OK — " + helpers.getChecks() + " checks"); },
44
+ function (e) { console.error(e && e.stack || e); process.exit(1); });
45
+ }
46
+
47
+ module.exports = { run: run };