@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
@@ -116,6 +116,7 @@ var bCrypto = require("./crypto");
116
116
  var lazyRequire = require("./lazy-require");
117
117
  var validateOpts = require("./validate-opts");
118
118
  var safeSql = require("./safe-sql");
119
+ var sql = require("./sql");
119
120
  var safeJson = require("./safe-json");
120
121
  var boundedMap = require("./bounded-map");
121
122
  var { defineClass } = require("./framework-error");
@@ -124,6 +125,13 @@ var DsrError = defineClass("DsrError", { alwaysPermanent: true });
124
125
 
125
126
  var audit = lazyRequire(function () { return require("./audit"); });
126
127
  var observability = lazyRequire(function () { return require("./observability"); });
128
+
129
+ // A vaulted store AEAD-seals + base64-encodes the payload before binding it
130
+ // (~4/3 expansion), and the bound cell must fit b.sql's 64 MiB per-value
131
+ // ceiling. Cap the plaintext at an expansion-safe size — leave a KiB for the
132
+ // vault nonce / tag / prefix — so the sealed cell binds through b.sql; a
133
+ // plaintext store keeps the full read ceiling (safeJson.ABSOLUTE_MAX_BYTES).
134
+ var VAULTED_SEAL_SAFE_MAX_BYTES = Math.floor(safeJson.ABSOLUTE_MAX_BYTES * 3 / 4) - C.BYTES.kib(1);
127
135
  // cryptoField + vault lazy-required: dbTicketStore seals subject PII + the
128
136
  // full ticket payload at rest so a GDPR Art 17 erasure leaves no
129
137
  // decryptable copy. Lazy so the module loads in vault-less / test-tooling
@@ -912,8 +920,18 @@ function memoryTicketStore() {
912
920
  var t = entry[1];
913
921
  if (filter.status && t.status !== filter.status) continue;
914
922
  if (filter.subject) {
915
- if (filter.subject.email && t.subject.email !== filter.subject.email) continue;
916
- if (filter.subject.subjectId && t.subject.subjectId !== filter.subject.subjectId) continue;
923
+ // Fail closed: a subject filter must match on at least one of the
924
+ // store's indexable keys (email / subjectId). A subject carrying
925
+ // none of them — phone-only, alias-only, or an empty object —
926
+ // matches NOTHING, never every ticket. Fail-open here would make
927
+ // listBySubject leak other subjects' tickets and the erasure
928
+ // purge (list-by-subject → delete) destroy them.
929
+ var subj = filter.subject;
930
+ var tSubj = t.subject || {};
931
+ var applied = false;
932
+ if (subj.email) { applied = true; if (tSubj.email !== subj.email) continue; }
933
+ if (subj.subjectId) { applied = true; if (tSubj.subjectId !== subj.subjectId) continue; }
934
+ if (!applied) continue;
917
935
  }
918
936
  out.push(Object.assign({}, t));
919
937
  }
@@ -1027,9 +1045,15 @@ function dbTicketStore(opts) {
1027
1045
  validateOpts.requireMethods(db, ["runSql", "prepare"],
1028
1046
  "dbTicketStore: opts.db (b.db-shaped handle)", DsrError, "dsr/bad-db");
1029
1047
  var tableRaw = opts.table || "dsr_tickets";
1048
+ // b.sql builder opts for the DML below — quoteName quotes the operator-
1049
+ // supplied table name exactly as db.from() does (reserved words, schema-
1050
+ // qualified "schema.table"), so the store composes b.sql instead of
1051
+ // hand-rolling identifier quoting. DDL (CREATE/ALTER) stays hand-rolled —
1052
+ // b.sql is a DML builder, not a schema tool.
1053
+ var SQL_OPTS = { dialect: "sqlite", quoteName: true };
1030
1054
  var qTable, qEmailIdx, qStatusIdx;
1031
1055
  try {
1032
- qTable = safeSql.quoteIdentifier(tableRaw, "sqlite");
1056
+ qTable = safeSql.quoteIdentifier(tableRaw, "sqlite", { allowReserved: true }); // parity with b.db.from() (the _idx names below are suffix-derived — can't be a bare keyword)
1033
1057
  qEmailIdx = safeSql.quoteIdentifier(tableRaw + "_email_idx", "sqlite");
1034
1058
  qStatusIdx = safeSql.quoteIdentifier(tableRaw + "_status_idx", "sqlite");
1035
1059
  } catch (sqlErr) {
@@ -1109,32 +1133,57 @@ function dbTicketStore(opts) {
1109
1133
  // selected) and cheap (an empty scan) once migrated.
1110
1134
  if (vault().isInitialized()) {
1111
1135
  _ensureDsrSealTable();
1112
- var legacyRows = db.prepare(
1113
- "SELECT id, subject_id, subject_email, subject_phone, payload FROM " + qTable +
1114
- " WHERE (subject_email IS NOT NULL AND subject_email_hash IS NULL)" +
1115
- " OR (subject_id IS NOT NULL AND subject_id_hash IS NULL)").all({});
1136
+ // The grouped-OR predicate has no operator input; it is a fixed
1137
+ // structural condition, so it rides through b.sql's whereRaw escape
1138
+ // (allow:hand-rolled-sql a static, param-free legacy-detection filter
1139
+ // b.sql's structured where() cannot express as one OR-of-ANDs group).
1140
+ var legacySel = sql.select(tableRaw, SQL_OPTS)
1141
+ .columns(["id", "subject_id", "subject_email", "subject_phone", "payload"])
1142
+ .whereRaw("(subject_email IS NOT NULL AND subject_email_hash IS NULL) OR (subject_id IS NOT NULL AND subject_id_hash IS NULL)")
1143
+ .toSql();
1144
+ var legacyStmt = db.prepare(legacySel.sql);
1145
+ var legacyRows = legacyStmt.all.apply(legacyStmt, legacySel.params);
1116
1146
  for (var bi = 0; bi < (legacyRows || []).length; bi++) {
1117
1147
  var lrow = legacyRows[bi];
1118
1148
  var lEmailDerived = cryptoField().computeDerived(DSR_SEAL_TABLE, "subject_email", lrow.subject_email);
1119
1149
  var lIdDerived = cryptoField().computeDerived(DSR_SEAL_TABLE, "subject_id", lrow.subject_id);
1120
- var lSealed = cryptoField().sealRow(DSR_SEAL_TABLE, {
1150
+ // A legacy plaintext payload above the expansion-safe cap cannot be
1151
+ // sealed (its sealed form would exceed b.sql's per-value ceiling). The
1152
+ // row must still become findable + erasable, so ALWAYS seal the (small)
1153
+ // subject columns and populate the derived hashes — otherwise, in
1154
+ // vaulted mode, _subjectConds filters only on the hash columns and
1155
+ // list({ subject }) / the erasure purge would never see this prior
1156
+ // ticket, leaving its PII un-erasable. When the payload is over-cap,
1157
+ // keep it plaintext (still ≤ the read ceiling, so it binds; it is
1158
+ // DB-encrypted at rest and removed when the row is erased) and surface
1159
+ // it so the operator can chunk-migrate it.
1160
+ var payloadTooBig = Buffer.byteLength(String(lrow.payload == null ? "" : lrow.payload), "utf8") > VAULTED_SEAL_SAFE_MAX_BYTES;
1161
+ if (payloadTooBig) {
1162
+ try {
1163
+ observability().safeEvent("dsr.backfill.payload_left_plaintext", 1, { table: tableRaw });
1164
+ } catch (_e) { /* drop-silent */ }
1165
+ }
1166
+ // Omit the payload from the seal input when it is over-cap — sealRow
1167
+ // skips absent fields, so only the subject columns are sealed and the
1168
+ // plaintext payload is written back below.
1169
+ var lSealInput = {
1121
1170
  id: lrow.id,
1122
1171
  subject_id: lrow.subject_id,
1123
1172
  subject_email: lrow.subject_email,
1124
1173
  subject_phone: lrow.subject_phone,
1125
- payload: lrow.payload,
1126
- });
1127
- db.prepare("UPDATE " + qTable + " SET subject_id = $sid, subject_email = $email," +
1128
- " subject_phone = $phone, payload = $payload, subject_email_hash = $emailHash," +
1129
- " subject_id_hash = $idHash WHERE id = $id").run({
1130
- $id: lrow.id,
1131
- $sid: lSealed.subject_id,
1132
- $email: lSealed.subject_email,
1133
- $phone: lSealed.subject_phone,
1134
- $payload: lSealed.payload,
1135
- $emailHash: lEmailDerived ? lEmailDerived.value : null,
1136
- $idHash: lIdDerived ? lIdDerived.value : null,
1137
- });
1174
+ };
1175
+ if (!payloadTooBig) lSealInput.payload = lrow.payload;
1176
+ var lSealed = cryptoField().sealRow(DSR_SEAL_TABLE, lSealInput);
1177
+ var lUpd = sql.update(tableRaw, SQL_OPTS).set({
1178
+ subject_id: lSealed.subject_id,
1179
+ subject_email: lSealed.subject_email,
1180
+ subject_phone: lSealed.subject_phone,
1181
+ payload: payloadTooBig ? lrow.payload : lSealed.payload,
1182
+ subject_email_hash: lEmailDerived ? lEmailDerived.value : null,
1183
+ subject_id_hash: lIdDerived ? lIdDerived.value : null,
1184
+ }).where("id", "=", lrow.id).toSql();
1185
+ var lUpdStmt = db.prepare(lUpd.sql);
1186
+ lUpdStmt.run.apply(lUpdStmt, lUpd.params);
1138
1187
  }
1139
1188
  }
1140
1189
  }
@@ -1146,15 +1195,23 @@ function dbTicketStore(opts) {
1146
1195
  // it stores plaintext (matching the agent-* fallback).
1147
1196
  function _sealColumns(id, ticket) {
1148
1197
  // The payload column is read back through safeJson.parse, whose hard
1149
- // ceiling (safeJson.ABSOLUTE_MAX_BYTES) caps what any read can accept.
1150
- // Refuse a ticket whose serialized form exceeds that same ceiling on
1151
- // write so the store never holds a payload it cannot read back later
1152
- // (write cap == read cap, measured the same way: UTF-8 byte length).
1198
+ // ceiling (safeJson.ABSOLUTE_MAX_BYTES) caps what any read can accept, so
1199
+ // the plaintext must not exceed it on write either. When a vault is
1200
+ // configured the payload is AEAD-sealed and base64-encoded before it is
1201
+ // bound, which expands it ~4/3; the bound (sealed) cell must still fit the
1202
+ // query builder's per-value binding ceiling (b.sql's MAX_PARAM_BYTES, the
1203
+ // same 64 MiB). Cap the plaintext at an expansion-safe size when vaulted so
1204
+ // an oversized ticket is refused here with the store's own error rather
1205
+ // than a SqlBuilderError deep in the insert — and route large exports to
1206
+ // chunked storage rather than binding one giant sealed cell.
1153
1207
  var serializedPayload = JSON.stringify(ticket);
1154
- if (Buffer.byteLength(serializedPayload, "utf8") > safeJson.ABSOLUTE_MAX_BYTES) {
1208
+ var vaulted = vault().isInitialized();
1209
+ var maxPlaintextBytes = vaulted ? VAULTED_SEAL_SAFE_MAX_BYTES : safeJson.ABSOLUTE_MAX_BYTES;
1210
+ if (Buffer.byteLength(serializedPayload, "utf8") > maxPlaintextBytes) {
1155
1211
  throw new DsrError("dsr/ticket-too-large",
1156
- "_sealColumns: ticket " + id + " payload exceeds the " +
1157
- safeJson.ABSOLUTE_MAX_BYTES + "-byte store limit");
1212
+ "_sealColumns: ticket " + id + " payload exceeds the " + maxPlaintextBytes +
1213
+ "-byte store limit" +
1214
+ (vaulted ? " (sealing expands it; store large exports via chunked storage)" : ""));
1158
1215
  }
1159
1216
  var row = {
1160
1217
  id: id,
@@ -1205,16 +1262,18 @@ function dbTicketStore(opts) {
1205
1262
  { key: "email", plainCol: "subject_email", sealField: "subject_email", hashCol: "subject_email_hash", param: "$email" },
1206
1263
  { key: "subjectId", plainCol: "subject_id", sealField: "subject_id", hashCol: "subject_id_hash", param: "$sid" },
1207
1264
  ];
1208
- function _subjectConds(filter, conds, params) {
1265
+ // AND the subject-match predicate(s) onto a b.sql select builder.
1266
+ function _subjectConds(filter, qb) {
1209
1267
  if (!filter.subject) return;
1210
1268
  var vaulted = vault().isInitialized();
1211
1269
  if (vaulted) _ensureDsrSealTable();
1270
+ var appliedAny = false;
1212
1271
  SUBJECT_FILTER_SPEC.forEach(function (spec) {
1213
1272
  var supplied = filter.subject[spec.key];
1214
1273
  if (!supplied) return;
1215
1274
  if (!vaulted) {
1216
- conds.push(spec.plainCol + " = " + spec.param);
1217
- params[spec.param] = supplied;
1275
+ qb.where(spec.plainCol, "=", supplied);
1276
+ appliedAny = true;
1218
1277
  return;
1219
1278
  }
1220
1279
  // Vaulted: match BOTH the active keyed-MAC digest AND the legacy
@@ -1226,111 +1285,107 @@ function dbTicketStore(opts) {
1226
1285
  var cand = cryptoField().lookupHashCandidates(DSR_SEAL_TABLE, spec.sealField, supplied);
1227
1286
  var values = cand && cand.values ? cand.values : [];
1228
1287
  if (values.length === 0) return;
1229
- var placeholders = values.map(function (v, i) {
1230
- var p = spec.param + "_" + i;
1231
- params[p] = v;
1232
- return p;
1233
- });
1234
- conds.push(spec.hashCol + " IN (" + placeholders.join(", ") + ")");
1288
+ qb.whereIn(spec.hashCol, values);
1289
+ appliedAny = true;
1235
1290
  });
1291
+ // Fail closed: a subject filter that produced no usable predicate — a
1292
+ // phone-only / alias-only / empty subject, or a vaulted key with no hash
1293
+ // candidates — must match NOTHING, not every row. Without this, list({
1294
+ // subject }) degrades to a full-table scan and both listBySubject (leak)
1295
+ // and the erasure-completion purge (cross-subject delete) touch every
1296
+ // subject's tickets.
1297
+ if (!appliedAny) qb.whereRaw("1 = 0");
1236
1298
  }
1237
1299
 
1238
1300
  return {
1239
1301
  insert: async function (ticket) {
1240
1302
  var cols = _sealColumns(ticket.id, ticket);
1241
- var stmt = db.prepare("INSERT INTO " + qTable +
1242
- " (id, type, status, subject_id, subject_email, subject_phone, " +
1243
- " subject_email_hash, subject_id_hash, " +
1244
- " submitted_at, deadline_at, processed_at, verification_level, posture, payload) " +
1245
- " VALUES ($id, $type, $status, $sid, $email, $phone, " +
1246
- " $emailHash, $idHash, $submittedAt, " +
1247
- " $deadlineAt, $processedAt, $verLevel, $posture, $payload)");
1248
- stmt.run({
1249
- $id: ticket.id,
1250
- $type: ticket.type,
1251
- $status: ticket.status,
1252
- $sid: cols.$sid,
1253
- $email: cols.$email,
1254
- $phone: cols.$phone,
1255
- $emailHash: cols.$emailHash,
1256
- $idHash: cols.$idHash,
1257
- $submittedAt: ticket.submittedAt,
1258
- $deadlineAt: ticket.deadlineAt,
1259
- $processedAt: ticket.processedAt || null,
1260
- $verLevel: ticket.verificationLevel || null,
1261
- $posture: ticket.posture || null,
1262
- $payload: cols.$payload,
1263
- });
1303
+ var built = sql.insert(tableRaw, SQL_OPTS).values({
1304
+ id: ticket.id,
1305
+ type: ticket.type,
1306
+ status: ticket.status,
1307
+ subject_id: cols.$sid,
1308
+ subject_email: cols.$email,
1309
+ subject_phone: cols.$phone,
1310
+ subject_email_hash: cols.$emailHash,
1311
+ subject_id_hash: cols.$idHash,
1312
+ submitted_at: ticket.submittedAt,
1313
+ deadline_at: ticket.deadlineAt,
1314
+ processed_at: ticket.processedAt || null,
1315
+ verification_level: ticket.verificationLevel || null,
1316
+ posture: ticket.posture || null,
1317
+ payload: cols.$payload,
1318
+ }).toSql();
1319
+ var stmt = db.prepare(built.sql);
1320
+ stmt.run.apply(stmt, built.params);
1264
1321
  },
1265
1322
  get: async function (id) {
1266
- var rows = db.prepare("SELECT id, payload FROM " + qTable + " WHERE id = $id")
1267
- .all({ $id: id });
1323
+ var built = sql.select(tableRaw, SQL_OPTS).columns(["id", "payload"]).where("id", "=", id).toSql();
1324
+ var stmt = db.prepare(built.sql);
1325
+ var rows = stmt.all.apply(stmt, built.params);
1268
1326
  if (!rows || rows.length === 0) return null;
1269
1327
  return safeJson.parse(_unsealPayload(rows[0].payload, rows[0].id), { maxBytes: safeJson.ABSOLUTE_MAX_BYTES });
1270
1328
  },
1271
1329
  list: async function (filter) {
1272
1330
  filter = filter || {};
1273
- var sql = "SELECT id, payload FROM " + qTable;
1274
- var conds = [];
1275
- var params = {};
1276
- if (filter.status) {
1277
- conds.push("status = $status");
1278
- params.$status = filter.status;
1279
- }
1280
- _subjectConds(filter, conds, params);
1281
- if (conds.length > 0) sql += " WHERE " + conds.join(" AND ");
1282
- sql += " ORDER BY submitted_at DESC";
1283
- var rows = db.prepare(sql).all(params);
1331
+ var qb = sql.select(tableRaw, SQL_OPTS).columns(["id", "payload"]);
1332
+ if (filter.status) qb.where("status", "=", filter.status);
1333
+ _subjectConds(filter, qb);
1334
+ qb.orderBy("submitted_at", "DESC");
1335
+ var built = qb.toSql();
1336
+ var stmt = db.prepare(built.sql);
1337
+ var rows = stmt.all.apply(stmt, built.params);
1284
1338
  return rows.map(function (r) { return safeJson.parse(_unsealPayload(r.payload, r.id), { maxBytes: safeJson.ABSOLUTE_MAX_BYTES }); });
1285
1339
  },
1286
1340
  update: async function (id, ticket) {
1287
1341
  var cols = _sealColumns(id, ticket);
1288
- var stmt = db.prepare("UPDATE " + qTable + " SET " +
1289
- " type = $type, status = $status, subject_id = $sid, " +
1290
- " subject_email = $email, subject_phone = $phone, " +
1291
- " subject_email_hash = $emailHash, subject_id_hash = $idHash, " +
1292
- " submitted_at = $submittedAt, deadline_at = $deadlineAt, " +
1293
- " processed_at = $processedAt, verification_level = $verLevel, " +
1294
- " posture = $posture, payload = $payload " +
1295
- " WHERE id = $id");
1296
- var info = stmt.run({
1297
- $id: id,
1298
- $type: ticket.type,
1299
- $status: ticket.status,
1300
- $sid: cols.$sid,
1301
- $email: cols.$email,
1302
- $phone: cols.$phone,
1303
- $emailHash: cols.$emailHash,
1304
- $idHash: cols.$idHash,
1305
- $submittedAt: ticket.submittedAt,
1306
- $deadlineAt: ticket.deadlineAt,
1307
- $processedAt: ticket.processedAt || null,
1308
- $verLevel: ticket.verificationLevel || null,
1309
- $posture: ticket.posture || null,
1310
- $payload: cols.$payload,
1311
- });
1342
+ var built = sql.update(tableRaw, SQL_OPTS).set({
1343
+ type: ticket.type,
1344
+ status: ticket.status,
1345
+ subject_id: cols.$sid,
1346
+ subject_email: cols.$email,
1347
+ subject_phone: cols.$phone,
1348
+ subject_email_hash: cols.$emailHash,
1349
+ subject_id_hash: cols.$idHash,
1350
+ submitted_at: ticket.submittedAt,
1351
+ deadline_at: ticket.deadlineAt,
1352
+ processed_at: ticket.processedAt || null,
1353
+ verification_level: ticket.verificationLevel || null,
1354
+ posture: ticket.posture || null,
1355
+ payload: cols.$payload,
1356
+ }).where("id", "=", id).toSql();
1357
+ var stmt = db.prepare(built.sql);
1358
+ var info = stmt.run.apply(stmt, built.params);
1312
1359
  if (info && info.changes === 0) {
1313
1360
  throw new DsrError("dsr/ticket-not-found",
1314
1361
  "dbTicketStore: ticket " + id + " not found for update");
1315
1362
  }
1316
1363
  },
1317
1364
  delete: async function (id) {
1318
- var info = db.prepare("DELETE FROM " + qTable + " WHERE id = $id").run({ $id: id });
1365
+ var built = sql.delete(tableRaw, SQL_OPTS).where("id", "=", id).toSql();
1366
+ var stmt = db.prepare(built.sql);
1367
+ var info = stmt.run.apply(stmt, built.params);
1319
1368
  return !!(info && info.changes > 0);
1320
1369
  },
1321
1370
  purgeExpired: async function (asOfMs) {
1322
1371
  // Bulk-delete tickets in terminal states whose retentionUntil
1323
1372
  // is in the past. Returns the number of rows removed.
1324
1373
  var asOf = (typeof asOfMs === "number" && isFinite(asOfMs)) ? asOfMs : Date.now();
1325
- var rows = db.prepare("SELECT id, payload FROM " + qTable +
1326
- " WHERE status IN ('completed','partially_completed','cancelled','rejected','expired')").all({});
1374
+ var selBuilt = sql.select(tableRaw, SQL_OPTS).columns(["id", "payload"])
1375
+ .whereIn("status", ["completed", "partially_completed", "cancelled", "rejected", "expired"])
1376
+ .toSql();
1377
+ var selStmt = db.prepare(selBuilt.sql);
1378
+ var rows = selStmt.all.apply(selStmt, selBuilt.params);
1327
1379
  var purged = 0;
1328
- var del = db.prepare("DELETE FROM " + qTable + " WHERE id = $id");
1329
1380
  for (var i = 0; i < rows.length; i++) {
1330
1381
  try {
1331
1382
  var t = safeJson.parse(_unsealPayload(rows[i].payload, rows[i].id), { maxBytes: safeJson.ABSOLUTE_MAX_BYTES });
1332
1383
  if (t.retentionUntil && t.retentionUntil < asOf) {
1333
- del.run({ $id: rows[i].id });
1384
+ // The delete SQL string is identical every iteration, so db.prepare
1385
+ // returns the same cached statement — composing per-row is free.
1386
+ var dBuilt = sql.delete(tableRaw, SQL_OPTS).where("id", "=", rows[i].id).toSql();
1387
+ var dStmt = db.prepare(dBuilt.sql);
1388
+ dStmt.run.apply(dStmt, dBuilt.params);
1334
1389
  purged += 1;
1335
1390
  }
1336
1391
  } catch (_e) { /* malformed payload — leave it */ }
@@ -381,6 +381,18 @@ var _ROW_RETURNING_CLASS = Object.freeze({ SELECT: true, READ_INFO: true });
381
381
 
382
382
  function statementReturnsRows(sql) {
383
383
  if (typeof sql !== "string" || sql.length === 0) return false;
384
+ // EXPLAIN — with or without ANALYZE, wrapping any inner statement —
385
+ // always returns a plan row set to the caller: `EXPLAIN ANALYZE INSERT`
386
+ // executes the write AND yields the plan. That is the row-set question,
387
+ // orthogonal to the residency gate's read/write class (where a plain
388
+ // EXPLAIN is a read and EXPLAIN ANALYZE <write> is a write). An EXPLAIN
389
+ // prefix that does not resolve (no inner statement, unbalanced option
390
+ // parens, unterminated span) stays fail-closed false so the .all()/.run()
391
+ // chooser never mis-routes an unparseable statement.
392
+ var m = _STATEMENT_CLASS_RE.exec(sql);
393
+ if (m && m[1].toUpperCase() === "EXPLAIN") {
394
+ return _explainResolve(sql, m.index + m[0].length) !== null;
395
+ }
384
396
  if (_ROW_RETURNING_CLASS[_classifyStatement(sql)] === true) return true;
385
397
  return _hasTopLevelReturning(sql);
386
398
  }
@@ -637,11 +649,24 @@ class Pool {
637
649
  }
638
650
 
639
651
  _reapIdle() {
652
+ // Reap idle clients past idleTimeoutMs, but honor `min` as a floor on
653
+ // idle clients: retain at least `min` warm connections even when they
654
+ // have all gone idle past the timeout, so a quiet period does not drain
655
+ // the pool below its configured warm floor. The freshest entries sit at
656
+ // the end of the idle stack (release() pushes, acquire() pops), so the
657
+ // stalest expired clients are reaped first and the floor keeps the most
658
+ // recently used. min:0 opts out of the floor (reap every expired idle).
659
+ var min = (typeof this.config.min === "number" && isFinite(this.config.min) && this.config.min > 0)
660
+ ? this.config.min : 0;
661
+ var reapable = this.idle.length - min;
662
+ if (reapable <= 0) return; // at or below the floor — keep every idle client warm
640
663
  var now = Date.now();
641
664
  var keep = [];
665
+ var reaped = 0;
642
666
  var self = this;
643
667
  this.idle.forEach(function (entry) {
644
- if ((now - entry.lastUsedAt) >= self.config.idleTimeoutMs) {
668
+ if (reaped < reapable && (now - entry.lastUsedAt) >= self.config.idleTimeoutMs) {
669
+ reaped += 1;
645
670
  Promise.resolve().then(function () { return self.close(entry.client); }).catch(function () {});
646
671
  } else {
647
672
  keep.push(entry);
@@ -907,7 +932,21 @@ function init(opts) {
907
932
  };
908
933
  }
909
934
 
910
- defaultBackend = opts.defaultBackend || Object.keys(backends)[0];
935
+ // defaultBackend when supplied it must name a REGISTERED backend, so a
936
+ // typo surfaces as a typed config-time error at init() rather than as an
937
+ // opaque TypeError when the first query dereferences a missing pool.
938
+ // Omitted → the first declared backend (declaration order).
939
+ if (opts.defaultBackend !== undefined && opts.defaultBackend !== null) {
940
+ validateOpts.requireNonEmptyString(opts.defaultBackend, "defaultBackend", ExternalDbError, "INVALID_CONFIG");
941
+ if (!Object.prototype.hasOwnProperty.call(backends, opts.defaultBackend)) {
942
+ throw _err("INVALID_CONFIG",
943
+ "defaultBackend: no backend named '" + opts.defaultBackend + "' " +
944
+ "(declared backends: " + Object.keys(backends).join(", ") + ")", true);
945
+ }
946
+ defaultBackend = opts.defaultBackend;
947
+ } else {
948
+ defaultBackend = Object.keys(backends)[0];
949
+ }
911
950
 
912
951
  // dbRoleBackends — request-time role → backend mapping. Each role name
913
952
  // validates as a SQL identifier at init (matches the dbRoleFor
@@ -1191,7 +1191,11 @@ function create(opts) {
1191
1191
  }
1192
1192
  }
1193
1193
  // Run one gate; throws on refuse / gate-error, mutates bodyBuffer on
1194
- // sanitize so a later gate sees the cleaned bytes.
1194
+ // sanitize so a later gate sees the cleaned bytes. When a gate replaces
1195
+ // the payload, the integrity descriptor (sha3/size) handed to onFinalize
1196
+ // and recorded in the audit must be recomputed over the DELIVERED bytes,
1197
+ // not the pre-sanitize original — flagged here, recomputed after the loop.
1198
+ var contentSanitized = false;
1195
1199
  var _runContentSafetyGate = async function (gate, gateExt) {
1196
1200
  var safetyDecision;
1197
1201
  try {
@@ -1229,6 +1233,7 @@ function create(opts) {
1229
1233
  if (safetyDecision.action === "sanitize" && safetyDecision.sanitized) {
1230
1234
  bodyBuffer = safetyDecision.sanitized;
1231
1235
  bodyStream = null;
1236
+ contentSanitized = true;
1232
1237
  }
1233
1238
  };
1234
1239
  var ranAnyGate = false;
@@ -1271,6 +1276,19 @@ function create(opts) {
1271
1276
  verified.totalBytes);
1272
1277
  }
1273
1278
 
1279
+ // A content-safety gate that returned "sanitize" replaced the payload, so
1280
+ // the integrity descriptor handed to onFinalize + recorded in the audit
1281
+ // must describe the bytes actually DELIVERED — an operator storing
1282
+ // info.sha3 as the integrity / dedup key of the stored (sanitized) bytes
1283
+ // would otherwise get a hash that does not match what they store. When no
1284
+ // sanitize ran, the reassembly digest already describes the delivered bytes.
1285
+ var deliveredSha3 = verified.totalHashHex;
1286
+ var deliveredSize = verified.totalBytes;
1287
+ if (contentSanitized && bodyBuffer) {
1288
+ deliveredSha3 = require("node:crypto").createHash("sha3-512").update(bodyBuffer).digest("hex");
1289
+ deliveredSize = bodyBuffer.length;
1290
+ }
1291
+
1274
1292
  // Hand to operator's onFinalize.
1275
1293
  var rv;
1276
1294
  try {
@@ -1279,13 +1297,13 @@ function create(opts) {
1279
1297
  uploadId: uploadId,
1280
1298
  body: bodyBuffer,
1281
1299
  stream: bodyStream,
1282
- sha3: verified.totalHashHex,
1283
- size: verified.totalBytes,
1300
+ sha3: deliveredSha3,
1301
+ size: deliveredSize,
1284
1302
  actor: actor,
1285
1303
  metadata: meta.metadata,
1286
1304
  });
1287
1305
  } else {
1288
- rv = { ok: true, sha3: verified.totalHashHex, size: verified.totalBytes };
1306
+ rv = { ok: true, sha3: deliveredSha3, size: deliveredSize };
1289
1307
  }
1290
1308
  } catch (e) {
1291
1309
  _emitObs("fileUpload.finalize_failure", 1);
@@ -1294,7 +1312,7 @@ function create(opts) {
1294
1312
  resource: { kind: "fileUpload", id: uploadId },
1295
1313
  outcome: "failure",
1296
1314
  reason: "onfinalize-threw",
1297
- metadata: { size: verified.totalBytes, sha3: verified.totalHashHex,
1315
+ metadata: { size: deliveredSize, sha3: deliveredSha3,
1298
1316
  error: (e && e.message) || String(e) },
1299
1317
  });
1300
1318
  throw e;
@@ -1305,12 +1323,12 @@ function create(opts) {
1305
1323
  catch (_e) { /* best-effort */ }
1306
1324
 
1307
1325
  _emitObs("fileUpload.finalize_success", 1);
1308
- _emitObs("fileUpload.finalize_bytes", verified.totalBytes);
1326
+ _emitObs("fileUpload.finalize_bytes", deliveredSize);
1309
1327
  _emitAudit("fileUpload.finalize", {
1310
1328
  actor: requestHelpers.extractActorContext(actor),
1311
1329
  resource: { kind: "fileUpload", id: uploadId },
1312
1330
  outcome: "success",
1313
- metadata: { size: verified.totalBytes, sha3: verified.totalHashHex,
1331
+ metadata: { size: deliveredSize, sha3: deliveredSha3,
1314
1332
  mode: useStream ? "stream" : "buffer" },
1315
1333
  });
1316
1334
 
@@ -127,7 +127,7 @@ function memory(opts) {
127
127
 
128
128
  function localFile(opts) {
129
129
  opts = opts || {};
130
- validateOpts(opts, ["path", "watch"], "flag.providers.localFile");
130
+ validateOpts(opts, ["path", "watch", "_watch"], "flag.providers.localFile");
131
131
  validateOpts.requireNonEmptyString(opts.path,
132
132
  "providers.localFile: path", FlagError, "flag/bad-provider");
133
133
  var raw;
@@ -157,22 +157,34 @@ function localFile(opts) {
157
157
  var provider = _makeProvider("local-file", parsed.flags);
158
158
  provider._path = opts.path;
159
159
  if (opts.watch === true) {
160
- try {
161
- nodeFs.watch(opts.path, { persistent: false }, function () {
162
- try {
163
- var nextRaw = atomicFile.fdSafeReadSync(opts.path, { maxBytes: C.BYTES.mib(1), encoding: "utf8" });
164
- var nextParsed = safeJson.parse(nextRaw, { maxBytes: C.BYTES.mib(1) });
165
- if (nextParsed && nextParsed.flags) {
166
- for (var k in nextParsed.flags) {
167
- if (Object.prototype.hasOwnProperty.call(nextParsed.flags, k)) {
168
- _validateFlagSpec(k, nextParsed.flags[k]);
169
- }
160
+ // Re-read the flags from disk on a file change. Drop-silent on the hot
161
+ // path: a mid-write / transiently-invalid file must not throw out of the
162
+ // watcher callback.
163
+ var reload = function () {
164
+ try {
165
+ var nextRaw = atomicFile.fdSafeReadSync(opts.path, { maxBytes: C.BYTES.mib(1), encoding: "utf8" });
166
+ var nextParsed = safeJson.parse(nextRaw, { maxBytes: C.BYTES.mib(1) });
167
+ if (nextParsed && nextParsed.flags) {
168
+ for (var k in nextParsed.flags) {
169
+ if (Object.prototype.hasOwnProperty.call(nextParsed.flags, k)) {
170
+ _validateFlagSpec(k, nextParsed.flags[k]);
170
171
  }
171
- provider._replace(nextParsed.flags);
172
172
  }
173
- } catch (_e) { /* drop-silent on hot-path reload */ }
174
- });
175
- } catch (_w) { /* watch unavailable - non-fatal */ }
173
+ provider._replace(nextParsed.flags);
174
+ }
175
+ } catch (_e) { /* drop-silent on hot-path reload */ }
176
+ };
177
+ // Test seam: a fake watcher (opts._watch) lets a test drive reload
178
+ // deterministically. The default STAT-POLLS the file (StatWatcher), NOT
179
+ // fs.watch: fs.watch aborts libuv — an uncatchable src/win/fs-event.c
180
+ // assertion — when opts.path resolves through a Windows 8.3 short-name
181
+ // component (e.g. a path under C:\Users\SOMEUS~1\...). StatWatcher never
182
+ // opens a directory-change handle, so it is immune to the path form; a ~1s
183
+ // poll is ample latency for a feature-flag hot reload.
184
+ var watchFn = opts._watch || function (p, onChange) {
185
+ nodeFs.watchFile(p, { persistent: false, interval: C.TIME.seconds(1) }, function () { onChange(); });
186
+ };
187
+ try { watchFn(opts.path, reload); } catch (_w) { /* watch unavailable - non-fatal */ }
176
188
  }
177
189
  return provider;
178
190
  }