@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
@@ -13,10 +13,19 @@
13
13
  *
14
14
  * Live wire-protocol coverage lives in test/integration/ — this layer
15
15
  * mocks the SMTP transport to verify the composer's classify-route-
16
- * compose logic.
16
+ * compose logic. Error / adversarial branches are exercised here too:
17
+ * classifier fallthroughs, every create() validation code, resolver
18
+ * shape variance + timeout + node:dns fallback, the MTA-STS / DANE
19
+ * policy matrices (fault-injected by swapping b.network.smtp.policy's
20
+ * mtaSts / dane exports for in-memory stubs, restored in a finally),
21
+ * DSN default fields + callback failure, header-block separator
22
+ * variants, and the retry-budget clamp.
17
23
  */
18
24
 
19
- var helpers = require("../helpers");
25
+ var helpers = require("../helpers");
26
+ var smtpPolicyMod = require("../../lib/network-smtp-policy");
27
+ var dnsPromises = require("node:dns").promises;
28
+
20
29
  var b = helpers.b;
21
30
  var check = helpers.check;
22
31
 
@@ -574,11 +583,667 @@ async function testMxFailover() {
574
583
  check("failover: delivered via mx2", result.delivered[0].mxHost === "mx2.example.com");
575
584
  }
576
585
 
586
+ // ---- local test utilities ----
587
+
588
+ function threw(fn) {
589
+ try { fn(); return null; } catch (e) { return e; }
590
+ }
591
+ function okResolver(mxFor) {
592
+ return { queryMx: async function (domain) { return mxFor(domain); } };
593
+ }
594
+ function okTransport() {
595
+ return function () {
596
+ return { send: async function () { return { ok: true, code: 250 }; } };
597
+ };
598
+ }
599
+
600
+ // Swap b.network.smtp.policy's mtaSts / dane export objects for stubs.
601
+ // The top-level exports object is mutable (only the inner objects are
602
+ // frozen), so property reassignment is visible to the deliver module's
603
+ // cached lazyRequire handle. Restored in finally.
604
+ async function withSmtpPolicyStub(overrides, body) {
605
+ var origMta = smtpPolicyMod.mtaSts;
606
+ var origDane = smtpPolicyMod.dane;
607
+ try {
608
+ if (overrides.mtaSts) smtpPolicyMod.mtaSts = overrides.mtaSts;
609
+ if (overrides.dane) smtpPolicyMod.dane = overrides.dane;
610
+ return await body();
611
+ } finally {
612
+ smtpPolicyMod.mtaSts = origMta;
613
+ smtpPolicyMod.dane = origDane;
614
+ }
615
+ }
616
+
617
+ async function withNodeDnsResolveMx(fake, body) {
618
+ var orig = dnsPromises.resolveMx;
619
+ try {
620
+ dnsPromises.resolveMx = fake;
621
+ return await body();
622
+ } finally {
623
+ dnsPromises.resolveMx = orig;
624
+ }
625
+ }
626
+
627
+ // ---- Outcome classifier — fallthrough / OR-alternative branches ----
628
+
629
+ function testClassifierFallthroughs() {
630
+ var deliver = b.mail.send.deliver({ hostname: "m.example", audit: false });
631
+
632
+ // No error, no response → the terminal `return "transient"`.
633
+ check("classify(null,null) → transient",
634
+ deliver.classifyOutcome(null, null) === "transient");
635
+ // 3xx is neither 2/4/5xx → falls through to transient.
636
+ check("classify 3xx → transient (fallthrough)",
637
+ deliver.classifyOutcome(null, { code: 354 }) === "transient");
638
+ // Response present but no code → String("") matches nothing → transient.
639
+ check("classify response w/o code → transient",
640
+ deliver.classifyOutcome(null, {}) === "transient");
641
+ // Policy signal in the MESSAGE only (empty code) → the OR alternative
642
+ // of the policy-class regex must still classify permanent.
643
+ check("classify policy-signal via message only → permanent",
644
+ deliver.classifyOutcome({ code: "", message: "REQUIRETLS was not offered" }, null) === "permanent");
645
+ // Generic error code that is neither a network code nor a policy
646
+ // signal → transient (the err-branch fallthrough).
647
+ check("classify generic err code → transient",
648
+ deliver.classifyOutcome({ code: "EPIPE", message: "broken pipe" }, null) === "transient");
649
+ check("classify ENETUNREACH → transient",
650
+ deliver.classifyOutcome({ code: "ENETUNREACH" }, null) === "transient");
651
+ // Response wins over err when both present.
652
+ check("classify 550 response beats err → permanent",
653
+ deliver.classifyOutcome({ code: "ECONNREFUSED" }, { code: 550 }) === "permanent");
654
+ }
655
+
656
+ // ---- create(): remaining shape-validation codes ----
657
+
658
+ function testCreateValidationCodes() {
659
+ var eUnknown = threw(function () {
660
+ b.mail.send.deliver({ hostname: "m.example", bogusKey: 1 });
661
+ });
662
+ check("unknown top-level opt → throws (unknown option)",
663
+ eUnknown && /unknown option/.test(eUnknown.message || ""));
664
+
665
+ var ePolicy = threw(function () { b.mail.send.deliver({ hostname: "m.example", policy: 5 }); });
666
+ check("policy non-object → deliver/bad-policy", ePolicy && ePolicy.code === "deliver/bad-policy");
667
+
668
+ var eRetry = threw(function () { b.mail.send.deliver({ hostname: "m.example", retry: 5 }); });
669
+ check("retry non-object → deliver/bad-retry", eRetry && eRetry.code === "deliver/bad-retry");
670
+
671
+ var eDsn = threw(function () { b.mail.send.deliver({ hostname: "m.example", dsn: 5 }); });
672
+ check("dsn non-object → deliver/bad-dsn", eDsn && eDsn.code === "deliver/bad-dsn");
673
+
674
+ var eTo = threw(function () { b.mail.send.deliver({ hostname: "m.example", timeouts: 5 }); });
675
+ check("timeouts non-object → deliver/bad-timeouts", eTo && eTo.code === "deliver/bad-timeouts");
676
+
677
+ var eRes = threw(function () { b.mail.send.deliver({ hostname: "m.example", resolver: 5 }); });
678
+ check("resolver non-object → deliver/bad-resolver", eRes && eRes.code === "deliver/bad-resolver");
679
+
680
+ var eTf = threw(function () { b.mail.send.deliver({ hostname: "m.example", transportFactory: 5 }); });
681
+ check("transportFactory non-function → deliver/bad-transport-factory",
682
+ eTf && eTf.code === "deliver/bad-transport-factory");
683
+
684
+ var eAudit = threw(function () { b.mail.send.deliver({ hostname: "m.example", audit: "yes" }); });
685
+ check("audit non-boolean → deliver/bad-audit", eAudit && eAudit.code === "deliver/bad-audit");
686
+
687
+ var eDsnFrom = threw(function () {
688
+ b.mail.send.deliver({ hostname: "m.example", dsn: { from: 123, onPermanentFailure: function () {} } });
689
+ });
690
+ check("dsn.from non-string → deliver/bad-dsn-from", eDsnFrom && eDsnFrom.code === "deliver/bad-dsn-from");
691
+
692
+ var ePerHost = threw(function () {
693
+ b.mail.send.deliver({ hostname: "m.example", timeouts: { perHostMs: "30000" } });
694
+ });
695
+ check("timeouts.perHostMs string → deliver/bad-timeout-perHostMs",
696
+ ePerHost && ePerHost.code === "deliver/bad-timeout-perHostMs");
697
+
698
+ var ePolicyKey = threw(function () {
699
+ b.mail.send.deliver({ hostname: "m.example", policy: { mtaSts: "off", nope: 1 } });
700
+ });
701
+ check("unknown policy sub-key → throws (unknown option)",
702
+ ePolicyKey && /unknown option/.test(ePolicyKey.message || ""));
703
+
704
+ // Custom backoffMs array is accepted (the truthy branch of the
705
+ // backoffMs default-or-supplied selection).
706
+ var okBackoff = threw(function () {
707
+ b.mail.send.deliver({
708
+ hostname: "m.example",
709
+ retry: { backoffMs: [b.constants.TIME.seconds(30), b.constants.TIME.minutes(2)] },
710
+ audit: false,
711
+ });
712
+ });
713
+ check("custom retry.backoffMs accepted", okBackoff === null);
714
+ }
715
+
716
+ // ---- DSN composer — default-field branches ----
717
+
718
+ function testDsnDefaultFields() {
719
+ var deliver = b.mail.send.deliver({ hostname: "m.example", audit: false });
720
+
721
+ // reportingMta / statusCode / reason / originalHeaders all omitted →
722
+ // every `|| default` branch fires.
723
+ var dsn = deliver.buildDsn({
724
+ dsnFrom: "mailer-daemon@m.example",
725
+ originalFrom: "alice@sender.com",
726
+ recipient: "bob@dest.com",
727
+ });
728
+ check("DSN default reason is 'permanent failure'",
729
+ /^Diagnostic-Code: smtp; permanent failure/m.test(dsn));
730
+ check("DSN default Status is 5.0.0", /^Status: 5\.0\.0/m.test(dsn));
731
+ check("DSN reportingMta falls back to dsnFrom in the prose line",
732
+ dsn.indexOf("mail delivery system at mailer-daemon@m.example") !== -1);
733
+ check("DSN Reporting-MTA falls back to dsnFrom's domain",
734
+ /^Reporting-MTA: dns; m\.example/m.test(dsn));
735
+
736
+ // dsnFrom with no '@' → from.split("@")[1] is undefined → the final
737
+ // `|| ""` fallback produces an empty Reporting-MTA authority.
738
+ var dsn2 = deliver.buildDsn({
739
+ dsnFrom: "mailerdaemon",
740
+ originalFrom: "alice@sender.com",
741
+ recipient: "bob@dest.com",
742
+ });
743
+ check("DSN Reporting-MTA empty-authority fallback (dsnFrom has no @)",
744
+ dsn2.indexOf("Reporting-MTA: dns; \r\n") !== -1);
745
+ }
746
+
747
+ // ---- Resolver wrapper shape { rrs: [...] } ----
748
+
749
+ async function testResolverWrapperShape() {
750
+ var deliver = b.mail.send.deliver({
751
+ hostname: "mta1.example.com",
752
+ resolver: { queryMx: async function (domain) {
753
+ return { rrs: [{ exchange: "mx1." + domain, priority: 10 }], ttl: 300, provenance: "doh" };
754
+ } },
755
+ policy: { mtaSts: "off", dane: "off" },
756
+ transportFactory: okTransport(),
757
+ audit: false,
758
+ });
759
+ var result = await deliver({ from: "ops@example.com", to: ["a@recipient.com"], rfc822: Buffer.from("hi") });
760
+ check("resolver { rrs } wrapper shape is accepted → delivered",
761
+ result.delivered.length === 1 && result.delivered[0].mxHost === "mx1.recipient.com");
762
+ }
763
+
764
+ // ---- Resolver bad shapes → no-mx / null-mx → permanent ----
765
+
766
+ async function testResolverBadShapes() {
767
+ function deliverForResolver(resolver) {
768
+ return b.mail.send.deliver({
769
+ hostname: "mta1.example.com", resolver: resolver,
770
+ policy: { mtaSts: "off", dane: "off" }, audit: false,
771
+ });
772
+ }
773
+ var msg = Buffer.from("hi");
774
+
775
+ var r1 = await deliverForResolver({ queryMx: async function () { return {}; } })(
776
+ { from: "ops@example.com", to: ["a@x.com"], rfc822: msg });
777
+ check("resolver returns non-array/non-rrs → no-mx permanent",
778
+ r1.failed.length === 1 && r1.failed[0].reasonCode === "5.1.2");
779
+
780
+ var r2 = await deliverForResolver({ queryMx: async function () { return []; } })(
781
+ { from: "ops@example.com", to: ["a@x.com"], rfc822: msg });
782
+ check("resolver returns empty array → no-mx permanent",
783
+ r2.failed.length === 1 && r2.failed[0].reasonCode === "5.1.2");
784
+
785
+ // RFC 7505 null MX signalled with an empty-string exchange (the "."
786
+ // form is exercised by testNullMx above).
787
+ var r3 = await deliverForResolver({ queryMx: async function () { return [{ exchange: "", priority: 0 }]; } })(
788
+ { from: "ops@example.com", to: ["a@x.com"], rfc822: msg });
789
+ check("resolver returns empty-exchange null-MX → permanent 5.1.2",
790
+ r3.failed.length === 1 && r3.failed[0].reasonCode === "5.1.2");
791
+ check("null-MX failed.mxHost is null (no host was tried)",
792
+ r3.failed[0].mxHost === null);
793
+ }
794
+
795
+ // ---- MX lookup timeout → transient → deferred ----
796
+
797
+ async function testMxLookupTimeout() {
798
+ await helpers.withTestTimeout("mx-lookup timeout branch", async function () {
799
+ var deliver = b.mail.send.deliver({
800
+ hostname: "mta1.example.com",
801
+ // Never-resolving lookup + a 1ms budget forces the internal
802
+ // setTimeout reject path in _resolveMx. `1` is an intentionally
803
+ // tiny timeout to exercise the timeout branch, not a duration.
804
+ resolver: { queryMx: function () { return new Promise(function () {}); } },
805
+ policy: { mtaSts: "off", dane: "off" },
806
+ timeouts: { mxLookupMs: 1 },
807
+ audit: false,
808
+ });
809
+ var result = await deliver({ from: "ops@example.com", to: ["a@slow.example"], rfc822: Buffer.from("hi") });
810
+ check("mx-timeout → deferred (transient)", result.deferred.length === 1);
811
+ check("mx-timeout → reasonCode 4.4.4", result.deferred[0].reasonCode === "4.4.4");
812
+ });
813
+ }
814
+
815
+ // ---- No resolver → node:dns fallback path ----
816
+
817
+ async function testNodeDnsFallback() {
818
+ await withNodeDnsResolveMx(async function (domain) {
819
+ return [{ exchange: "mx.node." + domain, priority: 5 }];
820
+ }, async function () {
821
+ // resolver omitted → ctx.resolver null → _resolveMx uses nodeDns.resolveMx.
822
+ var deliver = b.mail.send.deliver({
823
+ hostname: "mta1.example.com",
824
+ policy: { mtaSts: "off", dane: "off" },
825
+ transportFactory: okTransport(),
826
+ audit: false,
827
+ });
828
+ var result = await deliver({ from: "ops@example.com", to: ["a@recipient.com"], rfc822: Buffer.from("hi") });
829
+ check("no-resolver node:dns fallback → delivered",
830
+ result.delivered.length === 1 && result.delivered[0].mxHost === "mx.node.recipient.com");
831
+ });
832
+ }
833
+
834
+ // ---- Recipient with no usable domain ----
835
+
836
+ async function testRecipientNoDomain() {
837
+ var deliver = b.mail.send.deliver({
838
+ hostname: "mta1.example.com",
839
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
840
+ policy: { mtaSts: "off", dane: "off" },
841
+ transportFactory: okTransport(),
842
+ audit: false,
843
+ });
844
+ var r1 = await deliver({ from: "ops@example.com", to: ["nodomain"], rfc822: Buffer.from("hi") });
845
+ check("recipient without '@' → permanent no-domain 5.1.3",
846
+ r1.failed.length === 1 && r1.failed[0].reasonCode === "5.1.3");
847
+ var r2 = await deliver({ from: "ops@example.com", to: ["trailingat@"], rfc822: Buffer.from("hi") });
848
+ check("recipient with empty domain (trailing @) → permanent 5.1.3",
849
+ r2.failed.length === 1 && r2.failed[0].reasonCode === "5.1.3");
850
+ }
851
+
852
+ // ---- All MX hosts transient → final transient → deferred ----
853
+
854
+ async function testAllHostsTransient() {
855
+ var deliver = b.mail.send.deliver({
856
+ hostname: "mta1.example.com",
857
+ resolver: okResolver(function (d) {
858
+ return [{ exchange: "mx1." + d, priority: 10 }, { exchange: "mx2." + d, priority: 20 }];
859
+ }),
860
+ policy: { mtaSts: "off", dane: "off" },
861
+ transportFactory: function () {
862
+ return { send: async function () {
863
+ var err = new Error("temporary failure");
864
+ err.smtpResponse = { code: 451 };
865
+ throw err;
866
+ } };
867
+ },
868
+ audit: false,
869
+ });
870
+ var result = await deliver({ from: "ops@example.com", to: ["a@example.com"], rfc822: Buffer.from("hi") });
871
+ check("all-MX-transient → deferred (no delivery, no permanent fail)",
872
+ result.deferred.length === 1 && result.delivered.length === 0 && result.failed.length === 0);
873
+ check("all-MX-transient carries the last SMTP response code (4xx)",
874
+ result.deferred[0].reasonCode === 451);
875
+ }
876
+
877
+ // ---- Permanent 5xx send failure records the MX host on the result ----
878
+
879
+ async function testPermanentFailKeepsMxHost() {
880
+ var deliver = b.mail.send.deliver({
881
+ hostname: "mta1.example.com",
882
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
883
+ policy: { mtaSts: "off", dane: "off" },
884
+ transportFactory: function () {
885
+ return { send: async function () {
886
+ var err = new Error("550 5.1.1 no such user");
887
+ err.smtpResponse = { code: 550 };
888
+ throw err;
889
+ } };
890
+ },
891
+ audit: false,
892
+ });
893
+ var result = await deliver({ from: "ops@example.com", to: ["a@example.com"], rfc822: Buffer.from("hi") });
894
+ check("permanent 5xx → failed with mxHost recorded",
895
+ result.failed.length === 1 && result.failed[0].mxHost === "mx1.example.com");
896
+ check("permanent 5xx reasonCode is the SMTP code",
897
+ result.failed[0].reasonCode === 550);
898
+ }
899
+
900
+ // ---- MTA-STS policy matrix (fault-injected b.network.smtp.policy) ----
901
+
902
+ async function runMtaStsScenario(sc) {
903
+ var mtaStub = {
904
+ fetch: async function () {
905
+ if (sc.fetchThrows) throw new Error(sc.fetchThrows);
906
+ return sc.fetchResult;
907
+ },
908
+ matchMx: function () { return !!sc.matchMx; },
909
+ parsePolicy: smtpPolicyMod.mtaSts.parsePolicy,
910
+ };
911
+ var out = { result: null, err: null };
912
+ await withSmtpPolicyStub({ mtaSts: mtaStub }, async function () {
913
+ var deliver = b.mail.send.deliver({
914
+ hostname: "mta1.example.com",
915
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
916
+ policy: { mtaSts: sc.policyMtaSts, dane: "off" },
917
+ transportFactory: okTransport(),
918
+ audit: false,
919
+ });
920
+ try {
921
+ out.result = await deliver({ from: "ops@example.com", to: ["a@recipient.com"], rfc822: Buffer.from("hi") });
922
+ } catch (e) { out.err = e; }
923
+ });
924
+ return out;
925
+ }
926
+
927
+ async function testMtaStsMatrix() {
928
+ // fetch throws under enforce → permanent mta-sts-fetch-failed (5.7.10).
929
+ var s1 = await runMtaStsScenario({ policyMtaSts: "enforce", fetchThrows: "network down" });
930
+ check("MTA-STS fetch fail under enforce → permanent 5.7.10",
931
+ s1.result && s1.result.failed.length === 1 && s1.result.failed[0].reasonCode === "5.7.10");
932
+
933
+ // fetch throws under testing → skip + continue with original MX → delivered.
934
+ var s2 = await runMtaStsScenario({ policyMtaSts: "testing", fetchThrows: "network down" });
935
+ check("MTA-STS fetch fail under testing → skipped, delivered",
936
+ s2.result && s2.result.delivered.length === 1);
937
+
938
+ // null policy → 'none' audit + continue → delivered.
939
+ var s3 = await runMtaStsScenario({ policyMtaSts: "enforce", fetchResult: null });
940
+ check("MTA-STS fetch returns null → delivered (no policy published)",
941
+ s3.result && s3.result.delivered.length === 1);
942
+
943
+ // mode 'none' → delivered.
944
+ var s4 = await runMtaStsScenario({ policyMtaSts: "enforce", fetchResult: { mode: "none" } });
945
+ check("MTA-STS mode none → delivered",
946
+ s4.result && s4.result.delivered.length === 1);
947
+
948
+ // enforce policy, MX matches → filtered non-empty → delivered.
949
+ var s5 = await runMtaStsScenario({
950
+ policyMtaSts: "enforce", fetchResult: { mode: "enforce", mx: ["*.recipient.com"] }, matchMx: true });
951
+ check("MTA-STS enforce + MX match → delivered",
952
+ s5.result && s5.result.delivered.length === 1);
953
+
954
+ // enforce policy, MX does not match → mismatch → permanent 5.7.10.
955
+ var s6 = await runMtaStsScenario({
956
+ policyMtaSts: "enforce", fetchResult: { mode: "enforce", mx: ["mail.other.com"] }, matchMx: false });
957
+ check("MTA-STS enforce + no MX match → permanent 5.7.10",
958
+ s6.result && s6.result.failed.length === 1 && s6.result.failed[0].reasonCode === "5.7.10");
959
+
960
+ // testing policy + testing local + no match → 'no-match' audit + continue → delivered.
961
+ var s7 = await runMtaStsScenario({
962
+ policyMtaSts: "testing", fetchResult: { mode: "testing", mx: ["mail.other.com"] }, matchMx: false });
963
+ check("MTA-STS testing + no match (local testing) → delivered (report-only)",
964
+ s7.result && s7.result.delivered.length === 1);
965
+
966
+ // testing policy + enforce local + match → 'testing' audit + filtered → delivered.
967
+ var s8 = await runMtaStsScenario({
968
+ policyMtaSts: "enforce", fetchResult: { mode: "testing", mx: ["*.recipient.com"] }, matchMx: true });
969
+ check("MTA-STS testing published + local enforce + match → delivered",
970
+ s8.result && s8.result.delivered.length === 1);
971
+ }
972
+
973
+ // ---- RFC 8461 §5.2: published testing-mode policy is report-only ----
974
+ // A domain-published "testing" policy MUST NOT cause a hard failure —
975
+ // failures are report-only and delivery proceeds. The default local
976
+ // posture (mtaSts:"enforce") cannot promote a domain's testing policy
977
+ // to a bounce. RED before the fix (the no-match testing policy threw
978
+ // mta-sts-mx-mismatch → permanent bounce under local enforce).
979
+ async function testMtaStsTestingNotEnforcedUnderLocalEnforce() {
980
+ var s = await runMtaStsScenario({
981
+ policyMtaSts: "enforce", fetchResult: { mode: "testing", mx: ["mail.other.com"] }, matchMx: false });
982
+ check("testing-mode + local enforce + no MX match → NOT bounced (report-only)",
983
+ s.result && s.result.failed.length === 0 && s.result.deferred.length === 0);
984
+ check("testing-mode + local enforce + no MX match → delivered against full MX set",
985
+ s.result && s.result.delivered.length === 1);
986
+ check("testing-mode report-only does not reject deliver()",
987
+ s.err === null);
988
+ }
989
+
990
+ // ---- DANE lookup matrix (fault-injected b.network.smtp.policy.dane) ----
991
+
992
+ async function runDaneScenario(sc) {
993
+ var daneStub = {
994
+ tlsa: async function () {
995
+ if (sc.tlsaThrows) throw new Error(sc.tlsaThrows);
996
+ return sc.tlsaResult;
997
+ },
998
+ recordShape: smtpPolicyMod.dane.recordShape,
999
+ verifyChain: smtpPolicyMod.dane.verifyChain,
1000
+ };
1001
+ var out = { result: null, err: null };
1002
+ await withSmtpPolicyStub({ dane: daneStub }, async function () {
1003
+ var deliver = b.mail.send.deliver({
1004
+ hostname: "mta1.example.com",
1005
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
1006
+ policy: { mtaSts: "off", dane: sc.policyDane },
1007
+ transportFactory: okTransport(),
1008
+ audit: false,
1009
+ });
1010
+ try {
1011
+ out.result = await deliver({ from: "ops@example.com", to: ["a@recipient.com"], rfc822: Buffer.from("hi") });
1012
+ } catch (e) { out.err = e; }
1013
+ });
1014
+ return out;
1015
+ }
1016
+
1017
+ async function testDaneMatrix() {
1018
+ var d1 = await runDaneScenario({ policyDane: "opportunistic",
1019
+ tlsaResult: [{ usage: 3, selector: 1, mtype: 1, dataHex: "ab" }] });
1020
+ check("DANE opportunistic + TLSA records present → delivered",
1021
+ d1.result && d1.result.delivered.length === 1);
1022
+
1023
+ var d2 = await runDaneScenario({ policyDane: "opportunistic", tlsaResult: [] });
1024
+ check("DANE opportunistic + empty TLSA → delivered",
1025
+ d2.result && d2.result.delivered.length === 1);
1026
+
1027
+ var d3 = await runDaneScenario({ policyDane: "opportunistic", tlsaResult: null });
1028
+ check("DANE opportunistic + no TLSA → delivered",
1029
+ d3.result && d3.result.delivered.length === 1);
1030
+
1031
+ var d4 = await runDaneScenario({ policyDane: "opportunistic", tlsaThrows: "SERVFAIL" });
1032
+ check("DANE opportunistic + TLSA lookup throws → skipped, delivered",
1033
+ d4.result && d4.result.delivered.length === 1);
1034
+ }
1035
+
1036
+ // ---- DANE enforce TLSA failure is per-recipient, not batch-fatal ----
1037
+ // A DANE-enforce TLSA lookup failure must fail (defer) the single
1038
+ // affected recipient and STILL return the batch result object the
1039
+ // contract promises — it must NOT throw out of deliver() and discard
1040
+ // the sibling recipients' outcomes. RED before the fix (the throw
1041
+ // propagated out of deliver() and rejected the whole call).
1042
+ async function testDaneEnforceFailsOneRecipientNotBatch() {
1043
+ var d = await runDaneScenario({ policyDane: "enforce", tlsaThrows: "SERVFAIL" });
1044
+ check("DANE enforce TLSA failure does not reject deliver()",
1045
+ d.err === null && d.result !== null);
1046
+ check("DANE enforce TLSA failure defers the affected recipient",
1047
+ d.result && d.result.deferred.length === 1 && d.result.delivered.length === 0);
1048
+ }
1049
+
1050
+ // A DANE-enforce TLSA failure for ONE recipient's MX must not abort the
1051
+ // sibling recipient in the same deliver() batch. The DANE stub throws
1052
+ // only for the "bad" domain's MX host; the "good" domain must still be
1053
+ // delivered in the same call.
1054
+ async function testDaneEnforceBatchSurvivesSiblingFailure() {
1055
+ var daneStub = {
1056
+ tlsa: async function (mxHost) {
1057
+ // Fault-inject a TLSA lookup failure for the bad domain's MX only.
1058
+ if (String(mxHost).indexOf("bad.example") !== -1) throw new Error("SERVFAIL");
1059
+ return null;
1060
+ },
1061
+ recordShape: smtpPolicyMod.dane.recordShape,
1062
+ verifyChain: smtpPolicyMod.dane.verifyChain,
1063
+ };
1064
+ var out = { result: null, err: null };
1065
+ await withSmtpPolicyStub({ dane: daneStub }, async function () {
1066
+ var deliver = b.mail.send.deliver({
1067
+ hostname: "mta1.example.com",
1068
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
1069
+ policy: { mtaSts: "off", dane: "enforce" },
1070
+ transportFactory: okTransport(),
1071
+ audit: false,
1072
+ });
1073
+ try {
1074
+ out.result = await deliver({
1075
+ from: "ops@example.com",
1076
+ to: ["victim@bad.example", "friend@good.example"],
1077
+ rfc822: Buffer.from("hi"),
1078
+ });
1079
+ } catch (e) { out.err = e; }
1080
+ });
1081
+ check("mixed DANE batch does not reject deliver()",
1082
+ out.err === null && out.result !== null);
1083
+ check("mixed DANE batch delivers the healthy sibling recipient",
1084
+ out.result && out.result.delivered.length === 1 &&
1085
+ out.result.delivered[0].recipient === "friend@good.example");
1086
+ check("mixed DANE batch defers the DANE-failed recipient",
1087
+ out.result && out.result.deferred.length === 1 &&
1088
+ out.result.deferred[0].recipient === "victim@bad.example");
1089
+ }
1090
+
1091
+ // ---- DSN callback failure path ----
1092
+
1093
+ async function testDsnCallbackFailure() {
1094
+ var deliver = b.mail.send.deliver({
1095
+ hostname: "mta1.example.com",
1096
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
1097
+ policy: { mtaSts: "off", dane: "off" },
1098
+ transportFactory: function () {
1099
+ return { send: async function () {
1100
+ var err = new Error("550 5.1.1 no such user");
1101
+ err.smtpResponse = { code: 550 };
1102
+ throw err;
1103
+ } };
1104
+ },
1105
+ dsn: {
1106
+ from: "mailer-daemon@example.com",
1107
+ onPermanentFailure: async function () { throw new Error("DSN transport exploded"); },
1108
+ },
1109
+ audit: false,
1110
+ });
1111
+ var result = await deliver({ from: "ops@example.com", to: ["a@example.com"], rfc822: Buffer.from("hi") });
1112
+ check("DSN callback throwing → recipient still recorded as failed",
1113
+ result.failed.length === 1);
1114
+ check("DSN callback throwing → dsnSent flag stays false",
1115
+ result.failed[0].dsnSent === false);
1116
+ }
1117
+
1118
+ // ---- _extractHeaderBlock separator variants (via the DSN path) ----
1119
+
1120
+ async function testExtractHeaderBlockVariants() {
1121
+ var seen = [];
1122
+ function makeDeliver() {
1123
+ return b.mail.send.deliver({
1124
+ hostname: "mta1.example.com",
1125
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
1126
+ policy: { mtaSts: "off", dane: "off" },
1127
+ transportFactory: function () {
1128
+ return { send: async function () {
1129
+ var err = new Error("550 5.1.1 no such user");
1130
+ err.smtpResponse = { code: 550 };
1131
+ throw err;
1132
+ } };
1133
+ },
1134
+ dsn: {
1135
+ from: "mailer-daemon@example.com",
1136
+ onPermanentFailure: async function (env, res, dsnMessage) { seen.push(dsnMessage); },
1137
+ },
1138
+ audit: false,
1139
+ });
1140
+ }
1141
+
1142
+ // LF-only header separator → the `\n\n` fallback branch.
1143
+ await makeDeliver()({ from: "ops@example.com", to: ["a@example.com"],
1144
+ rfc822: Buffer.from("Subject: lf-only\nX-Tag: one\n\nbody") });
1145
+ check("DSN embeds LF-only-separated original headers",
1146
+ seen.length === 1 && seen[0].indexOf("Subject: lf-only") !== -1);
1147
+
1148
+ // No blank-line separator at all → whole string returned.
1149
+ await makeDeliver()({ from: "ops@example.com", to: ["a@example.com"],
1150
+ rfc822: Buffer.from("Subject: no-separator-single-line") });
1151
+ check("DSN embeds header block when message has no blank-line separator",
1152
+ seen.length === 2 && seen[1].indexOf("Subject: no-separator-single-line") !== -1);
1153
+ }
1154
+
1155
+ // ---- Retry budget: custom backoff + attempt-index clamp + envelope.attempt ----
1156
+
1157
+ async function testRetryBudgetClamp() {
1158
+ var backoff = [b.constants.TIME.seconds(30), b.constants.TIME.minutes(2)];
1159
+ var deliver = b.mail.send.deliver({
1160
+ hostname: "mta1.example.com",
1161
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
1162
+ policy: { mtaSts: "off", dane: "off" },
1163
+ retry: { maxAttempts: 10, backoffMs: backoff },
1164
+ transportFactory: function () {
1165
+ return { send: async function () {
1166
+ var err = new Error("temporary");
1167
+ err.smtpResponse = { code: 451 };
1168
+ throw err;
1169
+ } };
1170
+ },
1171
+ audit: false,
1172
+ });
1173
+ // envelope.attempt: 3 → attempts becomes 4; still < maxAttempts(10) so
1174
+ // it defers; idx = min(attempts-1=3, backoffMs.length-1=1) = 1 → clamps
1175
+ // to the last backoff entry.
1176
+ var result = await deliver({
1177
+ from: "ops@example.com", to: ["a@example.com"], rfc822: Buffer.from("hi"), attempt: 3,
1178
+ });
1179
+ check("retry: prior attempt count carried through → deferred attempt is 4",
1180
+ result.deferred.length === 1 && result.deferred[0].attempt === 4);
1181
+ check("retry: attempt index clamps to the last backoff entry",
1182
+ result.deferred[0].retryAfterMs === backoff[backoff.length - 1]);
1183
+ }
1184
+
1185
+ // ---- Default-audit (audit enabled) path executes cleanly ----
1186
+
1187
+ async function testDefaultAuditEnabled() {
1188
+ // audit omitted → auditEnabled true branch; the real (best-effort)
1189
+ // audit sink runs. Delivery must still succeed.
1190
+ var deliver = b.mail.send.deliver({
1191
+ hostname: "mta1.example.com",
1192
+ resolver: okResolver(function (d) { return [{ exchange: "mx1." + d, priority: 10 }]; }),
1193
+ policy: { mtaSts: "off", dane: "off" },
1194
+ transportFactory: okTransport(),
1195
+ });
1196
+ var result = await deliver({ from: "ops@example.com", to: ["a@recipient.com"], rfc822: Buffer.from("hi") });
1197
+ check("audit-enabled default path delivers", result.delivered.length === 1);
1198
+ }
1199
+
1200
+ // ---- b.mail.send.deliver.create — documented factory dotted form ----
1201
+ //
1202
+ // The @primitive / @signature / @example advertise
1203
+ // `b.mail.send.deliver.create(opts)` as the way to build a delivery
1204
+ // handle. This drives that exact dotted form end-to-end (stubbed MX +
1205
+ // transport, no real SMTP socket) so the documented operator consumer
1206
+ // path is verified — not only the collapsed `b.mail.send.deliver(opts)`
1207
+ // callable the other tests exercise.
1208
+ async function testDeliverCreateDottedForm() {
1209
+ check("b.mail.send.deliver.create is a function",
1210
+ typeof b.mail.send.deliver.create === "function");
1211
+
1212
+ var fakeResolver = {
1213
+ queryMx: async function (domain) { return [{ exchange: "mx1." + domain, priority: 10 }]; },
1214
+ };
1215
+ var fakeTransport = function () {
1216
+ return { send: async function () { return { ok: true, code: 250 }; } };
1217
+ };
1218
+ var deliver = b.mail.send.deliver.create({
1219
+ hostname: "mta1.example.com",
1220
+ resolver: fakeResolver,
1221
+ policy: { mtaSts: "off", dane: "off" },
1222
+ transportFactory: fakeTransport,
1223
+ audit: false,
1224
+ });
1225
+ check("create() returns a callable deliver handle", typeof deliver === "function");
1226
+ var result = await deliver({
1227
+ from: "ops@example.com",
1228
+ to: ["alice@recipient.com"],
1229
+ rfc822: Buffer.from("From: ops@example.com\r\nTo: alice@recipient.com\r\nSubject: hi\r\n\r\nbody"),
1230
+ });
1231
+ check("create()'d handle delivers via the stubbed transport",
1232
+ result.delivered.length === 1 && result.delivered[0].recipient === "alice@recipient.com");
1233
+
1234
+ // The documented factory refuses bad opts the same as the callable form.
1235
+ var threw = null;
1236
+ try { b.mail.send.deliver.create({}); } catch (e) { threw = e; }
1237
+ check("create({}) without hostname → deliver/bad-hostname",
1238
+ threw && threw.code === "deliver/bad-hostname");
1239
+ }
1240
+
577
1241
  // ---- Run ----
578
1242
 
579
1243
  async function run() {
580
1244
  testSurface();
581
1245
  testFactoryRefusesBadOpts();
1246
+ await testDeliverCreateDottedForm();
582
1247
  await testEnvelopeValidation();
583
1248
  testOutcomeClassifier();
584
1249
  testDsnComposer();
@@ -590,6 +1255,25 @@ async function run() {
590
1255
  await testMxFailover();
591
1256
  await testPortReachesTransport();
592
1257
  await testMaxAttemptsFlowsThrough();
1258
+ testClassifierFallthroughs();
1259
+ testCreateValidationCodes();
1260
+ testDsnDefaultFields();
1261
+ await testResolverWrapperShape();
1262
+ await testResolverBadShapes();
1263
+ await testMxLookupTimeout();
1264
+ await testNodeDnsFallback();
1265
+ await testRecipientNoDomain();
1266
+ await testAllHostsTransient();
1267
+ await testPermanentFailKeepsMxHost();
1268
+ await testMtaStsMatrix();
1269
+ await testMtaStsTestingNotEnforcedUnderLocalEnforce();
1270
+ await testDaneMatrix();
1271
+ await testDaneEnforceFailsOneRecipientNotBatch();
1272
+ await testDaneEnforceBatchSurvivesSiblingFailure();
1273
+ await testDsnCallbackFailure();
1274
+ await testExtractHeaderBlockVariants();
1275
+ await testRetryBudgetClamp();
1276
+ await testDefaultAuditEnabled();
593
1277
  }
594
1278
 
595
1279
  module.exports = { run: run };