@blamejs/blamejs-shop 0.5.12 → 0.5.14

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 (522) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/asset-manifest.json +1 -1
  3. package/lib/sales-tax-filings.js +143 -0
  4. package/lib/vendor/MANIFEST.json +632 -416
  5. package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
  6. package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
  7. package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
  8. package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
  9. package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
  10. package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
  11. package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
  12. package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
  13. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
  14. package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
  15. package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
  16. package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
  17. package/lib/vendor/blamejs/.gitignore +2 -0
  18. package/lib/vendor/blamejs/CHANGELOG.md +122 -0
  19. package/lib/vendor/blamejs/NOTICE +26 -1
  20. package/lib/vendor/blamejs/SECURITY.md +1 -1
  21. package/lib/vendor/blamejs/api-snapshot.json +207 -5
  22. package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
  23. package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
  24. package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
  25. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
  26. package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
  27. package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
  28. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
  29. package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
  30. package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
  31. package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
  32. package/lib/vendor/blamejs/index.js +6 -0
  33. package/lib/vendor/blamejs/lib/a2a.js +4 -4
  34. package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
  35. package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
  36. package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
  37. package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
  38. package/lib/vendor/blamejs/lib/archive-read.js +8 -0
  39. package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
  40. package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
  41. package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
  42. package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
  43. package/lib/vendor/blamejs/lib/audit.js +71 -8
  44. package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
  45. package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
  46. package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
  47. package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
  48. package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
  49. package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
  50. package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
  51. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
  52. package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
  53. package/lib/vendor/blamejs/lib/backup/index.js +16 -5
  54. package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
  55. package/lib/vendor/blamejs/lib/base32.js +21 -0
  56. package/lib/vendor/blamejs/lib/break-glass.js +19 -10
  57. package/lib/vendor/blamejs/lib/bundler.js +5 -1
  58. package/lib/vendor/blamejs/lib/cache-status.js +3 -7
  59. package/lib/vendor/blamejs/lib/calendar.js +21 -1
  60. package/lib/vendor/blamejs/lib/cbor.js +12 -1
  61. package/lib/vendor/blamejs/lib/cert.js +29 -11
  62. package/lib/vendor/blamejs/lib/cli.js +94 -24
  63. package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
  64. package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
  65. package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
  66. package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
  67. package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
  68. package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
  69. package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
  70. package/lib/vendor/blamejs/lib/content-digest.js +2 -1
  71. package/lib/vendor/blamejs/lib/cookies.js +13 -3
  72. package/lib/vendor/blamejs/lib/cose.js +31 -16
  73. package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
  74. package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
  75. package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
  76. package/lib/vendor/blamejs/lib/crypto.js +314 -19
  77. package/lib/vendor/blamejs/lib/csp.js +11 -3
  78. package/lib/vendor/blamejs/lib/daemon.js +270 -24
  79. package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
  80. package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
  81. package/lib/vendor/blamejs/lib/db-query.js +34 -7
  82. package/lib/vendor/blamejs/lib/db.js +18 -6
  83. package/lib/vendor/blamejs/lib/dbsc.js +17 -0
  84. package/lib/vendor/blamejs/lib/dev.js +21 -2
  85. package/lib/vendor/blamejs/lib/dsr.js +157 -102
  86. package/lib/vendor/blamejs/lib/external-db.js +41 -2
  87. package/lib/vendor/blamejs/lib/file-upload.js +25 -7
  88. package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
  89. package/lib/vendor/blamejs/lib/forms.js +113 -27
  90. package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
  91. package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
  92. package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
  93. package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
  94. package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
  95. package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
  96. package/lib/vendor/blamejs/lib/guard-html.js +26 -53
  97. package/lib/vendor/blamejs/lib/guard-image.js +24 -5
  98. package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
  99. package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
  100. package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
  101. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
  102. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
  103. package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
  104. package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
  105. package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
  106. package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
  107. package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
  108. package/lib/vendor/blamejs/lib/guard-time.js +1 -1
  109. package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
  110. package/lib/vendor/blamejs/lib/html-balance.js +3 -3
  111. package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
  112. package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
  113. package/lib/vendor/blamejs/lib/http-client.js +39 -7
  114. package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
  115. package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
  116. package/lib/vendor/blamejs/lib/i18n.js +35 -21
  117. package/lib/vendor/blamejs/lib/incident-report.js +8 -1
  118. package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
  119. package/lib/vendor/blamejs/lib/json-path.js +23 -1
  120. package/lib/vendor/blamejs/lib/jwk.js +20 -3
  121. package/lib/vendor/blamejs/lib/link-header.js +2 -1
  122. package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
  123. package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
  124. package/lib/vendor/blamejs/lib/log-stream.js +8 -3
  125. package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
  126. package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
  127. package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
  128. package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
  129. package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
  130. package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
  131. package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
  132. package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
  133. package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
  134. package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
  135. package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
  136. package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
  137. package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
  138. package/lib/vendor/blamejs/lib/mail.js +15 -5
  139. package/lib/vendor/blamejs/lib/metrics.js +268 -63
  140. package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
  141. package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
  142. package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
  143. package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
  144. package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
  145. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
  146. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
  147. package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
  148. package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
  149. package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
  150. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
  151. package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
  152. package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
  153. package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
  154. package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
  155. package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
  156. package/lib/vendor/blamejs/lib/network-dns.js +21 -2
  157. package/lib/vendor/blamejs/lib/network-tls.js +69 -7
  158. package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
  159. package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
  160. package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
  161. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
  162. package/lib/vendor/blamejs/lib/outbox.js +1 -1
  163. package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
  164. package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
  165. package/lib/vendor/blamejs/lib/permissions.js +6 -3
  166. package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
  167. package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
  168. package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
  169. package/lib/vendor/blamejs/lib/pubsub.js +20 -9
  170. package/lib/vendor/blamejs/lib/queue-local.js +8 -1
  171. package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
  172. package/lib/vendor/blamejs/lib/redact.js +54 -0
  173. package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
  174. package/lib/vendor/blamejs/lib/restore.js +19 -0
  175. package/lib/vendor/blamejs/lib/retention.js +12 -4
  176. package/lib/vendor/blamejs/lib/router.js +60 -6
  177. package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
  178. package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
  179. package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
  180. package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
  181. package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
  182. package/lib/vendor/blamejs/lib/safe-object.js +80 -0
  183. package/lib/vendor/blamejs/lib/safe-path.js +52 -4
  184. package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
  185. package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
  186. package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
  187. package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
  188. package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
  189. package/lib/vendor/blamejs/lib/scheduler.js +8 -1
  190. package/lib/vendor/blamejs/lib/security-assert.js +6 -6
  191. package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
  192. package/lib/vendor/blamejs/lib/self-update.js +517 -87
  193. package/lib/vendor/blamejs/lib/server-timing.js +2 -4
  194. package/lib/vendor/blamejs/lib/session.js +34 -12
  195. package/lib/vendor/blamejs/lib/sql.js +15 -1
  196. package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
  197. package/lib/vendor/blamejs/lib/static.js +55 -13
  198. package/lib/vendor/blamejs/lib/storage.js +8 -2
  199. package/lib/vendor/blamejs/lib/subject.js +6 -1
  200. package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
  201. package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
  202. package/lib/vendor/blamejs/lib/tsa.js +34 -13
  203. package/lib/vendor/blamejs/lib/uri-template.js +8 -1
  204. package/lib/vendor/blamejs/lib/vault/index.js +13 -0
  205. package/lib/vendor/blamejs/lib/vc.js +44 -5
  206. package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
  207. package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
  208. package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
  209. package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
  210. package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
  211. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
  212. package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
  213. package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
  214. package/lib/vendor/blamejs/lib/watcher.js +89 -17
  215. package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
  216. package/lib/vendor/blamejs/lib/webhook.js +12 -2
  217. package/lib/vendor/blamejs/lib/ws-client.js +32 -1
  218. package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
  219. package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
  220. package/lib/vendor/blamejs/package-lock.json +2 -2
  221. package/lib/vendor/blamejs/package.json +1 -1
  222. package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
  223. package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
  224. package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
  225. package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
  226. package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
  227. package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
  228. package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
  229. package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
  230. package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
  231. package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
  232. package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
  233. package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
  234. package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
  235. package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
  236. package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
  237. package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
  238. package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
  239. package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
  240. package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
  241. package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
  242. package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
  243. package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
  244. package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
  245. package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
  246. package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
  247. package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
  248. package/lib/vendor/blamejs/socket.yml +94 -0
  249. package/lib/vendor/blamejs/test/00-primitives.js +605 -0
  250. package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
  251. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
  252. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
  253. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
  254. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
  255. package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
  256. package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
  257. package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
  258. package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
  259. package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
  260. package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
  262. package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
  263. package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
  264. package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
  267. package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
  268. package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
  269. package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
  270. package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
  271. package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
  275. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
  276. package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
  277. package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
  278. package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
  282. package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
  283. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
  284. package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
  285. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
  286. package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
  287. package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
  288. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
  293. package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
  294. package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
  295. package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
  296. package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
  302. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
  303. package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
  307. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
  308. package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
  309. package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
  315. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
  317. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
  318. package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
  319. package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
  320. package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
  321. package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
  322. package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
  323. package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
  324. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
  325. package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
  326. package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
  327. package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
  328. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
  329. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
  330. package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
  331. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
  332. package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
  333. package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
  334. package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
  335. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
  336. package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
  337. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
  338. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
  339. package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
  340. package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
  341. package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
  342. package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
  343. package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
  344. package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
  345. package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
  346. package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
  347. package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
  348. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
  349. package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
  350. package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
  351. package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
  352. package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
  353. package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
  354. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
  355. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
  356. package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
  357. package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
  358. package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
  359. package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
  360. package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
  361. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
  362. package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
  363. package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
  364. package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
  365. package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
  366. package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
  367. package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
  368. package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
  369. package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
  370. package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
  371. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
  372. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
  373. package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
  374. package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
  375. package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
  376. package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
  377. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
  378. package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
  379. package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
  380. package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
  381. package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
  382. package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
  383. package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
  384. package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
  385. package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
  386. package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
  387. package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
  388. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
  389. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
  390. package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
  391. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
  392. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
  393. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
  394. package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
  395. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
  396. package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
  397. package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
  398. package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
  399. package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
  400. package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
  401. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
  402. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
  403. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
  404. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
  405. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
  406. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
  407. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
  408. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
  409. package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
  410. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
  411. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
  412. package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
  413. package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
  414. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
  415. package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
  416. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
  417. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
  418. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
  419. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
  420. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
  421. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
  422. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
  423. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
  424. package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
  425. package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
  426. package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
  427. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
  428. package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
  429. package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
  430. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
  431. package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
  432. package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
  433. package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
  434. package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
  435. package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
  436. package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
  437. package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
  438. package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
  439. package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
  440. package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
  441. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
  442. package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
  443. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
  444. package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
  445. package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
  446. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
  447. package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
  448. package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
  449. package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
  450. package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
  451. package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
  452. package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
  453. package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
  454. package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
  455. package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
  456. package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
  457. package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
  458. package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
  459. package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
  460. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
  461. package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
  462. package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
  463. package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
  464. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
  465. package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
  466. package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
  467. package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
  468. package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
  469. package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
  470. package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
  471. package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
  472. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
  473. package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
  474. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
  475. package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
  476. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
  477. package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
  478. package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
  479. package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
  480. package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
  481. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
  482. package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
  483. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
  484. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
  485. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
  486. package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
  487. package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
  488. package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
  489. package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
  490. package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
  491. package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
  492. package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
  493. package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
  494. package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
  495. package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
  496. package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
  497. package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
  498. package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
  499. package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
  500. package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
  501. package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
  502. package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
  503. package/lib/vendor/blamejs/test/smoke.js +2 -0
  504. package/package.json +1 -1
  505. package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
  506. package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
  507. package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
  508. package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
  509. package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
  510. package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
  511. package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
  512. package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
  513. package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
  514. package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
  515. package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
  516. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
  517. package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
  518. package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
  519. package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
  520. package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
  521. package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
  522. package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
@@ -16,6 +16,9 @@ var check = helpers.check;
16
16
  var b = helpers.b;
17
17
  var { setupTestDb, teardownTestDb } = require("../helpers/db");
18
18
 
19
+ // pubsub caps channel names at 1 KiB (lib/pubsub.js _MAX_CHANNEL_LEN).
20
+ var C_KIB = 1024;
21
+
19
22
  async function testSurface() {
20
23
  check("b.pubsub exposed", typeof b.pubsub === "object");
21
24
  check("b.pubsub.create is fn", typeof b.pubsub.create === "function");
@@ -260,6 +263,285 @@ async function testCacheInvalidationFanOut() {
260
263
  await ps.close();
261
264
  }
262
265
 
266
+ // A minimal in-process custom backend implementing the documented
267
+ // { publishRemote, start, stop } contract (plus optional subscribeRemote
268
+ // / unsubscribeRemote). It captures the remote-message callback so the
269
+ // test can inject cross-node deliveries, and records every remote call so
270
+ // ref-counting and scoping are observable. No external broker involved.
271
+ function makeCaptureBackend(cfg) {
272
+ cfg = cfg || {};
273
+ var state = {
274
+ started: false, stopped: false, onRemote: null,
275
+ published: [], subscribed: [], unsubscribed: [],
276
+ };
277
+ var backend = {
278
+ start: function (onRemote) { state.started = true; state.onRemote = onRemote; },
279
+ stop: function () { state.stopped = true; },
280
+ publishRemote: async function (scopedChannel, payload) {
281
+ if (cfg.throwOnPublish) throw new Error("publishRemote boom");
282
+ state.published.push({ channel: scopedChannel, payload: payload });
283
+ return cfg.publishRemoteReturn;
284
+ },
285
+ subscribeRemote: async function (scopedChannel, isPattern) {
286
+ if (cfg.throwOnSubscribe) throw new Error("subscribeRemote boom");
287
+ state.subscribed.push({ channel: scopedChannel, isPattern: isPattern });
288
+ },
289
+ unsubscribeRemote: async function (scopedChannel, isPattern) {
290
+ state.unsubscribed.push({ channel: scopedChannel, isPattern: isPattern });
291
+ },
292
+ };
293
+ return { backend: backend, state: state };
294
+ }
295
+
296
+ async function testSingleSegmentPatternMatchesDottedChannel() {
297
+ // The flagship documented pattern: '*' matches ONE '.'-delimited
298
+ // segment inside a dotted channel. Driven through the real
299
+ // subscribePattern → publish consumer path, not just the matcher.
300
+ var ps = b.pubsub.create();
301
+ var hits = [];
302
+ ps.subscribePattern("orders.*.created", function (_p, ev) { hits.push(ev.channel); });
303
+ ps.subscribePattern("a.*.b.*.c", function (_p, ev) { hits.push(ev.channel); });
304
+
305
+ await ps.publish("orders.eu.created", null); // must match (one segment)
306
+ await ps.publish("orders.eu.us.created", null); // must NOT (two segments)
307
+ await ps.publish("a.X.b.Y.c", null); // two single-segment wildcards
308
+ check("single-* pattern matches dotted channel", hits.indexOf("orders.eu.created") !== -1);
309
+ check("single-* pattern rejects two-segment span", hits.indexOf("orders.eu.us.created") === -1);
310
+ check("multi single-* pattern matches", hits.indexOf("a.X.b.Y.c") !== -1);
311
+ await ps.close();
312
+ }
313
+
314
+ async function testMatcherEdgeBranches() {
315
+ var ps = b.pubsub.create();
316
+ var m = ps._matchPatternForTest;
317
+ check("exact equality without wildcard matches", m("a.b.c", "a.b.c") === true);
318
+ check("no-wildcard non-equal pattern rejects", m("a.b.c", "a.b.d") === false);
319
+ check("'**' suffix matches any tail", m("audit.**", "audit.x.y.z") === true);
320
+ check("empty middle segment matches '*'", m("x.*.y", "x..y") === true);
321
+ check("non-string channel rejected", m("a.*", 12345) === false);
322
+
323
+ // Channel/pattern length bound (1 KiB) short-circuits to false.
324
+ var huge = "a".repeat(C_KIB + 8);
325
+ check("over-length channel rejected", m("a*", huge) === false);
326
+ check("over-length pattern rejected", m(huge + "*", "short") === false);
327
+ await ps.close();
328
+ }
329
+
330
+ async function testInputValidation() {
331
+ var ps = b.pubsub.create();
332
+ function threw(fn) { try { fn(); return null; } catch (e) { return e; } }
333
+
334
+ check("subscribe non-string channel throws BAD_OPT",
335
+ (threw(function () { ps.subscribe(42, function () {}); }) || {}).code === "BAD_OPT");
336
+ check("subscribe empty channel throws BAD_OPT",
337
+ (threw(function () { ps.subscribe("", function () {}); }) || {}).code === "BAD_OPT");
338
+ check("subscribe non-function handler throws BAD_OPT",
339
+ (threw(function () { ps.subscribe("c", "nope"); }) || {}).code === "BAD_OPT");
340
+ check("subscribePattern empty pattern throws BAD_OPT",
341
+ (threw(function () { ps.subscribePattern("", function () {}); }) || {}).code === "BAD_OPT");
342
+ check("subscribePattern non-function handler throws BAD_OPT",
343
+ (threw(function () { ps.subscribePattern("a.*", 7); }) || {}).code === "BAD_OPT");
344
+
345
+ var pubErr = null;
346
+ try { await ps.publish(null, {}); } catch (e) { pubErr = e; }
347
+ check("publish non-string channel throws BAD_OPT", pubErr && pubErr.code === "BAD_OPT");
348
+ var pubErr2 = null;
349
+ try { await ps.publish("", {}); } catch (e) { pubErr2 = e; }
350
+ check("publish empty channel throws BAD_OPT", pubErr2 && pubErr2.code === "BAD_OPT");
351
+ await ps.close();
352
+ }
353
+
354
+ async function testPatternHandlerErrorIsolation() {
355
+ // A throwing PATTERN handler must not abort dispatch to sibling
356
+ // handlers (exact or pattern) for the same channel.
357
+ var ps = b.pubsub.create();
358
+ var exactSeen = 0, patternSeen = 0;
359
+ ps.subscribePattern("c.*", function () { throw new Error("pattern boom"); });
360
+ ps.subscribePattern("c.*", function () { patternSeen++; });
361
+ ps.subscribe("c.x", function () { exactSeen++; });
362
+
363
+ await ps.publish("c.x", null);
364
+ check("throwing pattern handler did not block sibling pattern", patternSeen === 1);
365
+ check("throwing pattern handler did not block exact handler", exactSeen === 1);
366
+ await ps.close();
367
+ }
368
+
369
+ async function testUnsubscribeEdgeCases() {
370
+ var ps = b.pubsub.create();
371
+ // No-op branches: falsy / non-object / unknown token.
372
+ ps.unsubscribe(null);
373
+ ps.unsubscribe(undefined);
374
+ ps.unsubscribe("not-an-object");
375
+ ps.unsubscribe({ channel: "ghost", isPattern: false }); // never subscribed
376
+ check("unsubscribe garbage tokens are safe no-ops", ps._state().exactChannels === 0);
377
+
378
+ var seen = 0;
379
+ var pat = ps.subscribePattern("p.*", function () { seen++; });
380
+ check("pattern subscribe reflected in _state", ps._state().patternCount === 1);
381
+ ps.unsubscribe(pat);
382
+ ps.unsubscribe(pat); // double-unsubscribe: second is a no-op
383
+ await ps.publish("p.x", null);
384
+ check("pattern unsubscribe stops dispatch", seen === 0);
385
+ check("pattern unsubscribe clears _state", ps._state().patternCount === 0);
386
+
387
+ var seen2 = 0;
388
+ var ex = ps.subscribe("e1", function () { seen2++; });
389
+ check("exact channel present in _state", ps._state().exactChannels === 1);
390
+ ps.unsubscribe(ex);
391
+ check("last-handler unsubscribe drops the channel map entry", ps._state().exactChannels === 0);
392
+ await ps.publish("e1", null);
393
+ check("exact unsubscribe stops dispatch", seen2 === 0);
394
+ await ps.close();
395
+ }
396
+
397
+ async function testBackendResolution() {
398
+ function threw(fn) { try { fn(); return null; } catch (e) { return e; } }
399
+ check("unknown backend string throws UNKNOWN_BACKEND",
400
+ (threw(function () { b.pubsub.create({ backend: "bogus" }); }) || {}).code === "UNKNOWN_BACKEND");
401
+ check("custom backend missing methods throws BAD_BACKEND",
402
+ (threw(function () { b.pubsub.create({ backend: { publishRemote: function () {} } }); }) || {}).code === "BAD_BACKEND");
403
+
404
+ var cap = makeCaptureBackend();
405
+ var ps = b.pubsub.create({ backend: cap.backend });
406
+ check("custom backend name is 'custom'", ps.backend() === "custom");
407
+ check("custom backend start() invoked with remote callback",
408
+ cap.state.started === true && typeof cap.state.onRemote === "function");
409
+ await ps.close();
410
+ check("custom backend stop() invoked on close", cap.state.stopped === true);
411
+ }
412
+
413
+ async function testCustomBackendPublishRemote() {
414
+ // remote count derives from publishRemote's return: {remote:N} → N;
415
+ // anything non-{remote:finite} → 1.
416
+ async function remoteCountFor(ret) {
417
+ var cap = makeCaptureBackend({ publishRemoteReturn: ret });
418
+ var ps = b.pubsub.create({ backend: cap.backend });
419
+ var seenLocal = 0;
420
+ ps.subscribe("c1", function () { seenLocal++; });
421
+ var rv = await ps.publish("c1", { k: 1 });
422
+ check("local dispatch happens regardless of backend", seenLocal === 1 && rv.local === 1);
423
+ check("publishRemote received the (scoped) channel + payload",
424
+ cap.state.published.length === 1 &&
425
+ cap.state.published[0].channel === "c1" &&
426
+ cap.state.published[0].payload.k === 1);
427
+ await ps.close();
428
+ return rv.remote;
429
+ }
430
+ check("remote count from {remote:3}", (await remoteCountFor({ remote: 3 })) === 3);
431
+ check("remote count defaults to 1 on undefined return", (await remoteCountFor(undefined)) === 1);
432
+ check("remote count defaults to 1 on non-object return", (await remoteCountFor("nope")) === 1);
433
+ check("remote count defaults to 1 on {remote:NaN}", (await remoteCountFor({ remote: NaN })) === 1);
434
+ }
435
+
436
+ async function testCustomBackendPublishRemoteThrows() {
437
+ var cap = makeCaptureBackend({ throwOnPublish: true });
438
+ var ps = b.pubsub.create({ backend: cap.backend, audit: true });
439
+ var seen = 0;
440
+ ps.subscribe("c1", function () { seen++; });
441
+ var err = null;
442
+ try { await ps.publish("c1", { k: 1 }); } catch (e) { err = e; }
443
+ check("publish rejects when publishRemote throws", err && /publishRemote boom/.test(err.message));
444
+ check("local dispatch still ran before the remote failure", seen === 1);
445
+ await ps.close();
446
+ }
447
+
448
+ async function testTopicPrefixScopingAndRemoteInbound() {
449
+ var cap = makeCaptureBackend({ publishRemoteReturn: { remote: 1 } });
450
+ var ps = b.pubsub.create({ backend: cap.backend, topicPrefix: "svc" });
451
+ var seen = [];
452
+ ps.subscribe("orders", function (payload, ev) { seen.push({ p: payload, ev: ev }); });
453
+
454
+ await ps.publish("orders", { id: 1 });
455
+ check("publishRemote gets the topic-prefixed channel",
456
+ cap.state.published.length === 1 && cap.state.published[0].channel === "svc:orders");
457
+
458
+ // Inbound remote deliveries via the captured callback (scoped channel).
459
+ cap.state.onRemote("svc:orders", JSON.stringify({ id: 2 }), {});
460
+ cap.state.onRemote("svc:orders", Buffer.from(JSON.stringify({ id: 3 }), "utf8"), {});
461
+ cap.state.onRemote("svc:orders", { id: 4 }, {}); // object passthrough
462
+ check("remote string payload parsed + unscoped + dispatched",
463
+ seen.length === 4 && seen[1].p.id === 2 && seen[1].ev.channel === "orders");
464
+ check("remote source tagged 'remote'", seen[1].ev.source === "remote");
465
+ check("remote Buffer payload parsed", seen[2].p.id === 3);
466
+ check("remote object payload passed through", seen[3].p.id === 4);
467
+
468
+ // Malformed remote JSON drops silently — no dispatch, no throw.
469
+ cap.state.onRemote("svc:orders", "{not-valid-json", {});
470
+ check("malformed remote payload dropped silently", seen.length === 4);
471
+ await ps.close();
472
+ }
473
+
474
+ async function testRemotePatternDelivery() {
475
+ var cap = makeCaptureBackend();
476
+ var ps = b.pubsub.create({ backend: cap.backend });
477
+ var hits = [];
478
+ ps.subscribePattern("orders.*.created", function (_p, ev) { hits.push(ev.channel); });
479
+ cap.state.onRemote("orders.eu.created", JSON.stringify({ id: 1 }), {});
480
+ check("remote message dispatches to matching pattern handler",
481
+ hits.length === 1 && hits[0] === "orders.eu.created");
482
+ await ps.close();
483
+ }
484
+
485
+ async function testRemoteRefCounting() {
486
+ var cap = makeCaptureBackend();
487
+ var ps = b.pubsub.create({ backend: cap.backend });
488
+ var t1 = ps.subscribe("c1", function () {});
489
+ var t2 = ps.subscribe("c1", function () {});
490
+ // subscribeRemote is fire-and-forget; only the FIRST local handler for a
491
+ // scoped channel triggers a single remote subscribe.
492
+ await helpers.waitUntil(function () { return cap.state.subscribed.length >= 1; },
493
+ { label: "pubsub: first subscribe triggers one remote subscribeRemote" });
494
+ check("only one remote subscribe for two local handlers",
495
+ cap.state.subscribed.length === 1 && cap.state.subscribed[0].channel === "c1");
496
+
497
+ ps.unsubscribe(t1);
498
+ check("remote unsubscribe not yet called while a handler remains",
499
+ cap.state.unsubscribed.length === 0);
500
+ ps.unsubscribe(t2);
501
+ await helpers.waitUntil(function () { return cap.state.unsubscribed.length >= 1; },
502
+ { label: "pubsub: last unsubscribe triggers one remote unsubscribeRemote" });
503
+ check("remote unsubscribe fires when last local handler goes away",
504
+ cap.state.unsubscribed.length === 1 && cap.state.unsubscribed[0].channel === "c1");
505
+ await ps.close();
506
+ }
507
+
508
+ async function testSubscribeRemoteFailureSwallowed() {
509
+ // A rejecting subscribeRemote must not surface synchronously from
510
+ // subscribe(); local dispatch keeps working.
511
+ var cap = makeCaptureBackend({ throwOnSubscribe: true });
512
+ var ps = b.pubsub.create({ backend: cap.backend });
513
+ var seen = 0;
514
+ var err = null;
515
+ try { ps.subscribe("c1", function () { seen++; }); } catch (e) { err = e; }
516
+ check("subscribe does not throw when subscribeRemote rejects", err === null);
517
+ await ps.publish("c1", null);
518
+ check("local dispatch still works after remote-subscribe failure", seen === 1);
519
+ await ps.close();
520
+ }
521
+
522
+ async function testCloseIdempotentAndState() {
523
+ var cap = makeCaptureBackend();
524
+ var ps = b.pubsub.create({ backend: cap.backend });
525
+ ps.subscribe("c1", function () {});
526
+ ps.subscribePattern("p.*", function () {});
527
+ var st = ps._state();
528
+ check("_state reports backend name", st.backend === "custom");
529
+ check("_state reports exact + pattern counts", st.exactChannels === 1 && st.patternCount === 1);
530
+ check("_state reports not-closed", st.closed === false);
531
+
532
+ await ps.close();
533
+ await ps.close(); // idempotent — second close is a no-op, no throw
534
+ check("_state reports closed after close", ps._state().closed === true);
535
+ check("close cleared subscription maps", ps._state().exactChannels === 0 && ps._state().patternCount === 0);
536
+
537
+ var perr = null;
538
+ try { await ps.publish("c1", null); } catch (e) { perr = e; }
539
+ check("publish after close throws CLOSED", perr && perr.code === "CLOSED");
540
+ var serr = null;
541
+ try { ps.subscribePattern("x.*", function () {}); } catch (e) { serr = e; }
542
+ check("subscribePattern after close throws CLOSED", serr && serr.code === "CLOSED");
543
+ }
544
+
263
545
  async function run() {
264
546
  await testSurface();
265
547
  await testLocalSubscribePublish();
@@ -267,6 +549,19 @@ async function run() {
267
549
  await testHandlerErrorIsolation();
268
550
  await testTopicPrefixIsolation();
269
551
  await testPatternSubscribe();
552
+ await testSingleSegmentPatternMatchesDottedChannel();
553
+ await testMatcherEdgeBranches();
554
+ await testInputValidation();
555
+ await testPatternHandlerErrorIsolation();
556
+ await testUnsubscribeEdgeCases();
557
+ await testBackendResolution();
558
+ await testCustomBackendPublishRemote();
559
+ await testCustomBackendPublishRemoteThrows();
560
+ await testTopicPrefixScopingAndRemoteInbound();
561
+ await testRemotePatternDelivery();
562
+ await testRemoteRefCounting();
563
+ await testSubscribeRemoteFailureSwallowed();
564
+ await testCloseIdempotentAndState();
270
565
  await testClosedRejectsPublishSubscribe();
271
566
  await testClusterNumericConfigValidation();
272
567
  await testClusterFanOut();
@@ -69,6 +69,41 @@ async function testRepeatCronReEnqueuesAfterComplete() {
69
69
  }
70
70
  }
71
71
 
72
+ // A cron-repeat re-enqueue must preserve the operator's maxAttempts. The
73
+ // re-enqueue already carries priority / classification / traceId forward;
74
+ // dropping maxAttempts silently resets a fail-fast cron job (maxAttempts: 2)
75
+ // to the queue default (5) on every occurrence, so the operator's retry
76
+ // budget quietly stops holding after the first firing.
77
+ async function testRepeatPreservesMaxAttempts() {
78
+ var tmpDir = _tmp();
79
+ await setupTestDb(tmpDir);
80
+ try {
81
+ b.queue.init({ backends: { primary: { protocol: "local" } } });
82
+
83
+ await b.queue.enqueue("cron-max", { tag: "loop" },
84
+ { repeat: { cron: "* * * * *" }, maxAttempts: 3 });
85
+
86
+ var seen = 0;
87
+ var consumer = b.queue.consume("cron-max",
88
+ async function () { seen++; },
89
+ { concurrency: 1, pollIntervalMs: 25, fastPollMs: 5 });
90
+ await helpers.waitUntil(function () { return seen >= 1; }, {
91
+ timeoutMs: 3000, label: "queue cron-max: consumer saw the job",
92
+ });
93
+
94
+ var pending = await b.db.from("_blamejs_jobs")
95
+ .where({ queueName: "cron-max", status: "pending" }).all();
96
+ check("repeat: a follow-up pending row was scheduled", pending.length === 1);
97
+ check("repeat: follow-up preserves the operator's maxAttempts (not the default 5)",
98
+ Number(pending[0].maxAttempts) === 3);
99
+
100
+ consumer.cancel();
101
+ } finally {
102
+ try { await b.queue.shutdown({ timeoutMs: 500 }); } catch (_e) {}
103
+ await teardownTestDb(tmpDir);
104
+ }
105
+ }
106
+
72
107
  async function testRepeatStopsOnFinalFailure() {
73
108
  var tmpDir = _tmp();
74
109
  await setupTestDb(tmpDir);
@@ -388,6 +423,7 @@ async function run() {
388
423
  await testPatchFlowDepsDoesNotReparkReleasedChild();
389
424
  await testFlowSurface();
390
425
  await testRepeatCronReEnqueuesAfterComplete();
426
+ await testRepeatPreservesMaxAttempts();
391
427
  await testRepeatStopsOnFinalFailure();
392
428
  await testEnqueueRoundTripsAvailableAt();
393
429
  await testFlowLinearChain();
@@ -0,0 +1,83 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) blamejs contributors
3
+ "use strict";
4
+ /**
5
+ * queue.bootFromEnv — env-driven queue init mirroring
6
+ * network.bootFromEnv. Reads BLAMEJS_QUEUE_* from a supplied fixture env
7
+ * and wires a single `default` backend; idempotent; throws INVALID_CONFIG
8
+ * on an unknown protocol or a redis selection with no URL.
9
+ *
10
+ * Run standalone: `node test/layer-0-primitives/queue.test.js`
11
+ * Or via smoke: `node test/smoke.js`
12
+ */
13
+
14
+ var helpers = require("../helpers");
15
+ var b = helpers.b;
16
+ var check = helpers.check;
17
+
18
+ function testBootFromEnvRejectsUnknownProtocol() {
19
+ b.queue._resetForTest();
20
+ var threw = null;
21
+ try { b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "wibble" } }); } catch (e) { threw = e; }
22
+ check("queue.bootFromEnv rejects an unknown protocol", threw && threw.code === "INVALID_CONFIG");
23
+ // The failed boot left the queue uninitialized (the throw was pre-init).
24
+ var listThrew = null;
25
+ try { b.queue.listBackends(); } catch (e) { listThrew = e; }
26
+ check("queue stays uninitialized after a rejected boot",
27
+ listThrew && listThrew.code === "NOT_INITIALIZED");
28
+ }
29
+
30
+ function testBootFromEnvRedisRequiresUrl() {
31
+ b.queue._resetForTest();
32
+ var threw = null;
33
+ try { b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "redis" } }); } catch (e) { threw = e; }
34
+ check("queue.bootFromEnv redis without URL throws INVALID_CONFIG",
35
+ threw && threw.code === "INVALID_CONFIG");
36
+ }
37
+
38
+ function testBootFromEnvLocalDefault() {
39
+ b.queue._resetForTest();
40
+ try {
41
+ b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "local" } });
42
+ var backends = b.queue.listBackends();
43
+ check("queue.bootFromEnv local wires exactly one backend", backends.length === 1);
44
+ check("queue.bootFromEnv local backend is named 'default' with protocol 'local'",
45
+ backends[0].name === "default" && backends[0].protocol === "local");
46
+
47
+ // Idempotent — a second boot after init is a no-op.
48
+ b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "local" } });
49
+ check("queue.bootFromEnv is idempotent after init",
50
+ b.queue.listBackends().length === 1);
51
+ } finally {
52
+ b.queue._resetForTest();
53
+ }
54
+ }
55
+
56
+ function testBootFromEnvDefaultsToLocal() {
57
+ b.queue._resetForTest();
58
+ try {
59
+ // No BLAMEJS_QUEUE_PROTOCOL → defaults to the local protocol.
60
+ b.queue.bootFromEnv({ env: {} });
61
+ var backends = b.queue.listBackends();
62
+ check("queue.bootFromEnv defaults to the local protocol when unset",
63
+ backends.length === 1 && backends[0].protocol === "local");
64
+ } finally {
65
+ b.queue._resetForTest();
66
+ }
67
+ }
68
+
69
+ async function run() {
70
+ testBootFromEnvRejectsUnknownProtocol();
71
+ testBootFromEnvRedisRequiresUrl();
72
+ testBootFromEnvLocalDefault();
73
+ testBootFromEnvDefaultsToLocal();
74
+ }
75
+
76
+ module.exports = { run: run };
77
+
78
+ if (require.main === module) {
79
+ run().then(
80
+ function () { console.log("[queue] OK — " + helpers.getChecks() + " checks passed"); },
81
+ function (e) { console.error("FAIL:", e); process.exit(1); }
82
+ );
83
+ }
@@ -104,6 +104,40 @@ async function run() {
104
104
  catch (e) { threwMode = e; }
105
105
  check("create: bad ipKeyMode refused", threwMode !== null && /ipKeyMode/.test(threwMode.message));
106
106
 
107
+ // scope:"per-route" must key on the route PATH only — never the query
108
+ // string. When req.pathname is absent (a raw http.IncomingMessage handed
109
+ // to the middleware directly, before b.router populates pathname) the key
110
+ // used req.url verbatim, so rotating a throwaway query param minted a fresh
111
+ // per-route bucket per request and defeated the limit — the same bucket-
112
+ // rotation evasion class as the XFF / low-64 cases above. Every sibling
113
+ // guard (request-log / require-auth / network-allowlist) already strips the
114
+ // query with `(req.url||"").split("?")[0]`; rate-limit must too.
115
+ function _rawReq(url) {
116
+ // No pathname — the shape a bare Node req has before the router runs.
117
+ return { url: url, method: "POST",
118
+ socket: { remoteAddress: "198.51.100.7" }, headers: {}, requestId: "r" };
119
+ }
120
+ var routeMw = b.middleware.rateLimit({
121
+ backend: "memory", algorithm: "fixed-window", max: 1,
122
+ windowMs: b.constants.TIME.hours(1), scope: "per-route",
123
+ });
124
+ var q1 = await _runMw(routeMw, _rawReq("/api/pay?nonce=1"));
125
+ var q2 = await _runMw(routeMw, _rawReq("/api/pay?nonce=2"));
126
+ var q3 = await _runMw(routeMw, _rawReq("/api/pay?nonce=3"));
127
+ check("per-route: first request to the route allowed", q1.next === true);
128
+ check("per-route: query-string rotation hits the SAME route bucket (blocked)",
129
+ q2.next === false && q3.next === false);
130
+
131
+ // The fix strips the query, not the path: distinct route paths stay distinct.
132
+ var routeMw2 = b.middleware.rateLimit({
133
+ backend: "memory", algorithm: "fixed-window", max: 1,
134
+ windowMs: b.constants.TIME.hours(1), scope: "per-route",
135
+ });
136
+ var r1 = await _runMw(routeMw2, _rawReq("/api/pay"));
137
+ var r2 = await _runMw(routeMw2, _rawReq("/api/refund"));
138
+ check("per-route: distinct route paths keep distinct buckets",
139
+ r1.next === true && r2.next === true);
140
+
107
141
  console.log("[rate-limit-xff-spoofing] OK — " + helpers.getChecks() + " checks passed");
108
142
  }
109
143