@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.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -619,9 +619,500 @@ async function testDbStoreSealRoundTripWithVault() {
|
|
|
619
619
|
}
|
|
620
620
|
}
|
|
621
621
|
|
|
622
|
+
function testResealMigrateInMemoryStoreUnsupported() {
|
|
623
|
+
// Operators on the in-memory store can't bulk-reseal — the helper
|
|
624
|
+
// reports the reason instead of throwing so a boot script stays quiet.
|
|
625
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
626
|
+
var info = b.middleware.idempotencyKey.resealMigrate(store);
|
|
627
|
+
check("resealMigrate: in-memory store reports store-does-not-support-reseal",
|
|
628
|
+
info.migrated === 0 && info.skipped === 0 &&
|
|
629
|
+
info.reason === "store-does-not-support-reseal");
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function testResealMigrateSealDisabled() {
|
|
633
|
+
// A dbStore with sealing off (vault not wired) can't reseal — the
|
|
634
|
+
// helper delegates and surfaces the aad-or-seal-disabled reason.
|
|
635
|
+
var db = _mockDb();
|
|
636
|
+
var store = b.middleware.idempotencyKey.dbStore({
|
|
637
|
+
db: db, tableName: "_t_reseal_noseal", hashKeys: false, seal: false,
|
|
638
|
+
});
|
|
639
|
+
var info = b.middleware.idempotencyKey.resealMigrate(store);
|
|
640
|
+
check("resealMigrate: seal-disabled dbStore reports aad-or-seal-disabled",
|
|
641
|
+
info.migrated === 0 && info.skipped === 0 && info.reason === "aad-or-seal-disabled");
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
async function testResealMigrateAlreadyAadSealed() {
|
|
645
|
+
// With vault + AAD sealing on, a row written by the store is already
|
|
646
|
+
// in the vault.aad: envelope. resealMigrate walks the table, detects
|
|
647
|
+
// it's already migrated, and skips it — succeeding with reason:null.
|
|
648
|
+
var dataDir = nodeFs.mkdtempSync(nodePath.join(nodeOs.tmpdir(), "idemp-reseal-"));
|
|
649
|
+
try {
|
|
650
|
+
if (typeof vault._resetForTest === "function") vault._resetForTest();
|
|
651
|
+
cryptoField.clearForTest();
|
|
652
|
+
await vault.init({ dataDir: dataDir, mode: "plaintext" });
|
|
653
|
+
|
|
654
|
+
var db = _mockDb();
|
|
655
|
+
var store = b.middleware.idempotencyKey.dbStore({
|
|
656
|
+
db: db, tableName: "_t_reseal_aad", hashKeys: false, seal: true, aad: true,
|
|
657
|
+
});
|
|
658
|
+
check("resealMigrate: seal + aad enabled when vault ready",
|
|
659
|
+
store._sealEnabled === true && store._aadOn === true);
|
|
660
|
+
|
|
661
|
+
store.set("k1", {
|
|
662
|
+
fingerprint: "fp",
|
|
663
|
+
statusCode: 200,
|
|
664
|
+
headers: { "x-a": "1" },
|
|
665
|
+
body: Buffer.from('{"ok":true}').toString("base64"),
|
|
666
|
+
}, 60000);
|
|
667
|
+
check("resealMigrate: fresh row is written in the vault.aad: envelope",
|
|
668
|
+
typeof db._data.get("k1").headers === "string" &&
|
|
669
|
+
db._data.get("k1").headers.indexOf("vault.aad:") === 0);
|
|
670
|
+
|
|
671
|
+
var info = b.middleware.idempotencyKey.resealMigrate(store);
|
|
672
|
+
check("resealMigrate: already-AAD row is skipped, migration succeeds",
|
|
673
|
+
info.migrated === 0 && info.skipped === 1 && info.reason === null);
|
|
674
|
+
|
|
675
|
+
// The row still round-trips after the walk (no corruption).
|
|
676
|
+
var v = store.get("k1");
|
|
677
|
+
check("resealMigrate: row still readable after the walk",
|
|
678
|
+
v && v.fingerprint === "fp" && v.headers["x-a"] === "1");
|
|
679
|
+
} finally {
|
|
680
|
+
if (typeof vault._resetForTest === "function") vault._resetForTest();
|
|
681
|
+
cryptoField.clearForTest();
|
|
682
|
+
try { nodeFs.rmSync(dataDir, { recursive: true, force: true }); } catch (_e) { /* best-effort */ }
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// ---- config-time validation throws (entry-point tier) ----
|
|
687
|
+
|
|
688
|
+
function testMemoryStoreBadMaxEntries() {
|
|
689
|
+
function expectCode(label, fn, code) {
|
|
690
|
+
var threw = null;
|
|
691
|
+
try { fn(); } catch (e) { threw = e; }
|
|
692
|
+
check(label, threw && (threw.code || "").indexOf(code) !== -1);
|
|
693
|
+
}
|
|
694
|
+
expectCode("memoryStore: negative maxEntries refused",
|
|
695
|
+
function () { b.middleware.idempotencyKey.memoryStore({ maxEntries: -1 }); },
|
|
696
|
+
"idempotency/bad-max-entries");
|
|
697
|
+
expectCode("memoryStore: non-integer maxEntries refused",
|
|
698
|
+
function () { b.middleware.idempotencyKey.memoryStore({ maxEntries: 1.5 }); },
|
|
699
|
+
"idempotency/bad-max-entries");
|
|
700
|
+
expectCode("memoryStore: Infinity maxEntries refused",
|
|
701
|
+
function () { b.middleware.idempotencyKey.memoryStore({ maxEntries: Infinity }); },
|
|
702
|
+
"idempotency/bad-max-entries");
|
|
703
|
+
expectCode("memoryStore: string maxEntries refused",
|
|
704
|
+
function () { b.middleware.idempotencyKey.memoryStore({ maxEntries: "10" }); },
|
|
705
|
+
"idempotency/bad-max-entries");
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
function testCreateBadNumericOpts() {
|
|
709
|
+
function expectCode(label, fn, code) {
|
|
710
|
+
var threw = null;
|
|
711
|
+
try { fn(); } catch (e) { threw = e; }
|
|
712
|
+
check(label, threw && (threw.code || "").indexOf(code) !== -1);
|
|
713
|
+
}
|
|
714
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
715
|
+
expectCode("create: negative ttlMs refused",
|
|
716
|
+
function () { b.middleware.idempotencyKey({ store: store, ttlMs: -5 }); },
|
|
717
|
+
"idempotency/bad-ttl");
|
|
718
|
+
expectCode("create: Infinity ttlMs refused",
|
|
719
|
+
function () { b.middleware.idempotencyKey({ store: store, ttlMs: Infinity }); },
|
|
720
|
+
"idempotency/bad-ttl");
|
|
721
|
+
expectCode("create: non-integer maxBodyBytes refused",
|
|
722
|
+
function () { b.middleware.idempotencyKey({ store: store, maxBodyBytes: 1.2 }); },
|
|
723
|
+
"idempotency/bad-max-body");
|
|
724
|
+
expectCode("create: bad scopeFn type refused",
|
|
725
|
+
function () { b.middleware.idempotencyKey({ store: store, scopeFn: "nope" }); },
|
|
726
|
+
"idempotency/bad-scope-fn");
|
|
727
|
+
expectCode("create: unknown bodyFingerprintFallback refused",
|
|
728
|
+
function () { b.middleware.idempotencyKey({ store: store, bodyFingerprintFallback: "sometimes" }); },
|
|
729
|
+
"idempotency/bad-body-fingerprint-fallback");
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// ---- key-shape adversarial branches ----
|
|
733
|
+
|
|
734
|
+
function testKeyTooLong() {
|
|
735
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
736
|
+
var mw = b.middleware.idempotencyKey({ store: store });
|
|
737
|
+
var longKey = new Array(257).join("a"); // 256 chars, > KEY_MAX_LEN (255)
|
|
738
|
+
var req = _mockReq("POST", "/x", longKey);
|
|
739
|
+
req._rawBody = Buffer.from("{}");
|
|
740
|
+
var res = _mockRes();
|
|
741
|
+
var nextCalled = false;
|
|
742
|
+
mw(req, res, function () { nextCalled = true; });
|
|
743
|
+
check("bad-key over-length → 400, no next()",
|
|
744
|
+
!nextCalled && res._statusCode() === 400);
|
|
745
|
+
var body = JSON.parse(res._getBody());
|
|
746
|
+
check("bad-key over-length problem type",
|
|
747
|
+
/\/idempotency\/bad-key$/.test(body.type));
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
function testArrayKeyHeaderUsesFirst() {
|
|
751
|
+
// A repeated Idempotency-Key header arrives as an array; the
|
|
752
|
+
// middleware uses the first element as the cache key.
|
|
753
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
754
|
+
var mw = b.middleware.idempotencyKey({ store: store, ttlMs: 60000 });
|
|
755
|
+
|
|
756
|
+
var req1 = _mockReq("POST", "/x", "placeholder");
|
|
757
|
+
req1.headers["idempotency-key"] = ["arr-key-1", "arr-key-2"];
|
|
758
|
+
req1._rawBody = Buffer.from('{"a":1}');
|
|
759
|
+
var res1 = _mockRes();
|
|
760
|
+
var next1 = false;
|
|
761
|
+
mw(req1, res1, function () { next1 = true; });
|
|
762
|
+
check("array key: first request is a miss (handler runs)", next1 === true);
|
|
763
|
+
res1.statusCode = 201;
|
|
764
|
+
res1.end("created");
|
|
765
|
+
|
|
766
|
+
// A single-value header equal to the FIRST array element must replay
|
|
767
|
+
// the cached response — proving key[0] was the slot key.
|
|
768
|
+
var req2 = _mockReq("POST", "/x", "arr-key-1");
|
|
769
|
+
req2._rawBody = Buffer.from('{"a":1}');
|
|
770
|
+
var res2 = _mockRes();
|
|
771
|
+
var next2 = false;
|
|
772
|
+
mw(req2, res2, function () { next2 = true; });
|
|
773
|
+
check("array key: replay keyed on first element",
|
|
774
|
+
!next2 && res2._statusCode() === 201 && res2._getBody() === "created");
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
// ---- custom methods / headerName ----
|
|
778
|
+
|
|
779
|
+
function testCustomMethodsSkipsUnlisted() {
|
|
780
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
781
|
+
var mw = b.middleware.idempotencyKey({ store: store, methods: ["post"] });
|
|
782
|
+
// PUT is NOT in the operator-narrowed method set → pass-through.
|
|
783
|
+
var req = _mockReq("PUT", "/x", "k-put");
|
|
784
|
+
req._rawBody = Buffer.from("{}");
|
|
785
|
+
var res = _mockRes();
|
|
786
|
+
var nextCalled = false;
|
|
787
|
+
mw(req, res, function () { nextCalled = true; });
|
|
788
|
+
check("custom methods: PUT not listed → pass-through next()", nextCalled === true);
|
|
789
|
+
check("custom methods: nothing cached for unlisted method", store._size() === 0);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
function testCustomHeaderName() {
|
|
793
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
794
|
+
var mw = b.middleware.idempotencyKey({ store: store, headerName: "X-Idem", ttlMs: 60000 });
|
|
795
|
+
|
|
796
|
+
var req1 = _mockReq("POST", "/x");
|
|
797
|
+
req1.headers["x-idem"] = "custom-hdr-1";
|
|
798
|
+
req1._rawBody = Buffer.from('{"a":1}');
|
|
799
|
+
var res1 = _mockRes();
|
|
800
|
+
var next1 = false;
|
|
801
|
+
mw(req1, res1, function () { next1 = true; });
|
|
802
|
+
check("custom headerName: read from operator header (miss)", next1 === true);
|
|
803
|
+
res1.statusCode = 200;
|
|
804
|
+
res1.end("via-custom-header");
|
|
805
|
+
|
|
806
|
+
var req2 = _mockReq("POST", "/x");
|
|
807
|
+
req2.headers["x-idem"] = "custom-hdr-1";
|
|
808
|
+
req2._rawBody = Buffer.from('{"a":1}');
|
|
809
|
+
var res2 = _mockRes();
|
|
810
|
+
var next2 = false;
|
|
811
|
+
mw(req2, res2, function () { next2 = true; });
|
|
812
|
+
check("custom headerName: replays on the operator header",
|
|
813
|
+
!next2 && res2._getBody() === "via-custom-header");
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
// ---- bodyFingerprintFallback branches (real middleware run) ----
|
|
817
|
+
|
|
818
|
+
function testDenyFallbackRefusesMissingBody() {
|
|
819
|
+
// Default fallback is "deny": a body-bearing POST that arrives with
|
|
820
|
+
// neither a parsed body nor a raw-body buffer is refused with HTTP
|
|
821
|
+
// 400 idempotency/missing-body-fingerprint (draft §4.3 protection —
|
|
822
|
+
// silent method+path degrade would false-replay different bodies).
|
|
823
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
824
|
+
var mw = b.middleware.idempotencyKey({ store: store });
|
|
825
|
+
var req = _mockReq("POST", "/pay", "k-nobody"); // no body, no _rawBody
|
|
826
|
+
var res = _mockRes();
|
|
827
|
+
var nextCalled = false;
|
|
828
|
+
mw(req, res, function () { nextCalled = true; });
|
|
829
|
+
check("deny fallback: missing body → 400, no next()",
|
|
830
|
+
!nextCalled && res._statusCode() === 400);
|
|
831
|
+
var body = JSON.parse(res._getBody());
|
|
832
|
+
check("deny fallback: missing-body-fingerprint problem type",
|
|
833
|
+
/\/idempotency\/missing-body-fingerprint$/.test(body.type));
|
|
834
|
+
check("deny fallback: nothing cached", store._size() === 0);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
function testMethodPathOnlyFallbackAllows() {
|
|
838
|
+
// Operator opts into the pre-0.9.58 behavior: a bodyless POST is
|
|
839
|
+
// allowed through (fingerprint degrades to method+path), and a
|
|
840
|
+
// subsequent identical request replays.
|
|
841
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
842
|
+
var mw = b.middleware.idempotencyKey({
|
|
843
|
+
store: store, ttlMs: 60000, bodyFingerprintFallback: "method-path-only",
|
|
844
|
+
});
|
|
845
|
+
var req1 = _mockReq("POST", "/ping", "k-mpo");
|
|
846
|
+
var res1 = _mockRes();
|
|
847
|
+
var next1 = false;
|
|
848
|
+
mw(req1, res1, function () { next1 = true; });
|
|
849
|
+
check("method-path-only: bodyless POST allowed through (miss)", next1 === true);
|
|
850
|
+
res1.statusCode = 202;
|
|
851
|
+
res1.end("accepted");
|
|
852
|
+
|
|
853
|
+
var req2 = _mockReq("POST", "/ping", "k-mpo");
|
|
854
|
+
var res2 = _mockRes();
|
|
855
|
+
var next2 = false;
|
|
856
|
+
mw(req2, res2, function () { next2 = true; });
|
|
857
|
+
check("method-path-only: identical bodyless POST replays",
|
|
858
|
+
!next2 && res2._statusCode() === 202 && res2._getBody() === "accepted");
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
// ---- default (non-hook) body extraction branches ----
|
|
862
|
+
|
|
863
|
+
function testObjectBodyDefaultPath() {
|
|
864
|
+
// No bodyFingerprint hook: an already-parsed object body is
|
|
865
|
+
// JSON-stringified for a stable fingerprint.
|
|
866
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
867
|
+
var mw = b.middleware.idempotencyKey({ store: store, ttlMs: 60000 });
|
|
868
|
+
|
|
869
|
+
var req1 = _mockReq("POST", "/o", "k-obj", { amount: 100 });
|
|
870
|
+
var res1 = _mockRes();
|
|
871
|
+
var next1 = false;
|
|
872
|
+
mw(req1, res1, function () { next1 = true; });
|
|
873
|
+
check("object body: first request is a miss", next1 === true);
|
|
874
|
+
res1.end("obj-ok");
|
|
875
|
+
|
|
876
|
+
// Same object → replay.
|
|
877
|
+
var req2 = _mockReq("POST", "/o", "k-obj", { amount: 100 });
|
|
878
|
+
var res2 = _mockRes();
|
|
879
|
+
var next2 = false;
|
|
880
|
+
mw(req2, res2, function () { next2 = true; });
|
|
881
|
+
check("object body: identical object replays", !next2 && res2._getBody() === "obj-ok");
|
|
882
|
+
|
|
883
|
+
// Different object → 422 mismatch.
|
|
884
|
+
var req3 = _mockReq("POST", "/o", "k-obj", { amount: 999 });
|
|
885
|
+
var res3 = _mockRes();
|
|
886
|
+
var next3 = false;
|
|
887
|
+
mw(req3, res3, function () { next3 = true; });
|
|
888
|
+
check("object body: different object → 422 mismatch",
|
|
889
|
+
!next3 && res3._statusCode() === 422);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
function testCircularObjectBodyDenied() {
|
|
893
|
+
// A non-serializable (circular) body cannot be fingerprinted; the
|
|
894
|
+
// default-path JSON.stringify throws, bodyBytes becomes null, and
|
|
895
|
+
// the deny fallback refuses with 400.
|
|
896
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
897
|
+
var mw = b.middleware.idempotencyKey({ store: store });
|
|
898
|
+
var circ = {};
|
|
899
|
+
circ.self = circ;
|
|
900
|
+
var req = _mockReq("POST", "/c", "k-circ", circ);
|
|
901
|
+
var res = _mockRes();
|
|
902
|
+
var nextCalled = false;
|
|
903
|
+
mw(req, res, function () { nextCalled = true; });
|
|
904
|
+
check("circular body: unserializable body → 400 deny, no next()",
|
|
905
|
+
!nextCalled && res._statusCode() === 400);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// ---- bodyFingerprint hook return-type + throw branches ----
|
|
909
|
+
|
|
910
|
+
function testBodyFingerprintHookReturnTypes() {
|
|
911
|
+
// Buffer and object hook returns both produce stable fingerprints.
|
|
912
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
913
|
+
var bufMw = b.middleware.idempotencyKey({
|
|
914
|
+
store: store, ttlMs: 60000,
|
|
915
|
+
bodyFingerprint: function () { return Buffer.from("fixed-buffer-fp"); },
|
|
916
|
+
});
|
|
917
|
+
var r1 = _mockReq("POST", "/b", "k-buf");
|
|
918
|
+
var s1 = _mockRes();
|
|
919
|
+
bufMw(r1, s1, function () {});
|
|
920
|
+
s1.end("buf-ok");
|
|
921
|
+
var r2 = _mockReq("POST", "/b", "k-buf");
|
|
922
|
+
var s2 = _mockRes();
|
|
923
|
+
var n2 = false;
|
|
924
|
+
bufMw(r2, s2, function () { n2 = true; });
|
|
925
|
+
check("hook Buffer return: replay on stable buffer fingerprint",
|
|
926
|
+
!n2 && s2._getBody() === "buf-ok");
|
|
927
|
+
|
|
928
|
+
var store2 = b.middleware.idempotencyKey.memoryStore();
|
|
929
|
+
var objMw = b.middleware.idempotencyKey({
|
|
930
|
+
store: store2, ttlMs: 60000,
|
|
931
|
+
bodyFingerprint: function (req) { return req.body || null; },
|
|
932
|
+
});
|
|
933
|
+
var r3 = _mockReq("POST", "/j", "k-objhook", { k: 1 });
|
|
934
|
+
var s3 = _mockRes();
|
|
935
|
+
objMw(r3, s3, function () {});
|
|
936
|
+
s3.end("objhook-ok");
|
|
937
|
+
var r4 = _mockReq("POST", "/j", "k-objhook", { k: 1 });
|
|
938
|
+
var s4 = _mockRes();
|
|
939
|
+
var n4 = false;
|
|
940
|
+
objMw(r4, s4, function () { n4 = true; });
|
|
941
|
+
check("hook object return: replay on JSON-stringified fingerprint",
|
|
942
|
+
!n4 && s4._getBody() === "objhook-ok");
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
function testBodyFingerprintHookThrows() {
|
|
946
|
+
// A throwing hook is caught (audit warning), bodyBytes becomes null.
|
|
947
|
+
// For DELETE (not in the POST/PUT/PATCH deny check) the request still
|
|
948
|
+
// proceeds on a method+path fingerprint.
|
|
949
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
950
|
+
var mw = b.middleware.idempotencyKey({
|
|
951
|
+
store: store, ttlMs: 60000,
|
|
952
|
+
bodyFingerprint: function () { throw new Error("hook boom"); },
|
|
953
|
+
});
|
|
954
|
+
var req = _mockReq("DELETE", "/resource/1", "k-hookthrow");
|
|
955
|
+
var res = _mockRes();
|
|
956
|
+
var nextCalled = false;
|
|
957
|
+
mw(req, res, function () { nextCalled = true; });
|
|
958
|
+
check("hook throws on DELETE: caught, request proceeds (next runs)",
|
|
959
|
+
nextCalled === true && res._statusCode() !== 400);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
function testDeleteMissThenReplay() {
|
|
963
|
+
// DELETE is a default method but is exempt from the body-fingerprint
|
|
964
|
+
// deny check; a bodyless DELETE caches + replays on method+path.
|
|
965
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
966
|
+
var mw = b.middleware.idempotencyKey({ store: store, ttlMs: 60000 });
|
|
967
|
+
var req1 = _mockReq("DELETE", "/resource/9", "k-del");
|
|
968
|
+
var res1 = _mockRes();
|
|
969
|
+
var next1 = false;
|
|
970
|
+
mw(req1, res1, function () { next1 = true; });
|
|
971
|
+
check("DELETE: first request handled (not pass-through)", next1 === true);
|
|
972
|
+
res1.statusCode = 204;
|
|
973
|
+
res1.end("");
|
|
974
|
+
check("DELETE: response cached", store._size() === 1);
|
|
975
|
+
|
|
976
|
+
var req2 = _mockReq("DELETE", "/resource/9", "k-del");
|
|
977
|
+
var res2 = _mockRes();
|
|
978
|
+
var next2 = false;
|
|
979
|
+
mw(req2, res2, function () { next2 = true; });
|
|
980
|
+
check("DELETE: identical request replays cached 204",
|
|
981
|
+
!next2 && res2._statusCode() === 204);
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
// ---- store fault-tolerance (get/set throw) ----
|
|
985
|
+
|
|
986
|
+
function testStoreReadFailureTreatedAsMiss() {
|
|
987
|
+
var store = {
|
|
988
|
+
get: function () { throw new Error("read exploded"); },
|
|
989
|
+
set: function () {},
|
|
990
|
+
delete: function () {},
|
|
991
|
+
};
|
|
992
|
+
var mw = b.middleware.idempotencyKey({ store: store });
|
|
993
|
+
var req = _mockReq("POST", "/x", "k-readfail");
|
|
994
|
+
req._rawBody = Buffer.from("{}");
|
|
995
|
+
var res = _mockRes();
|
|
996
|
+
var nextCalled = false;
|
|
997
|
+
var threw = false;
|
|
998
|
+
try { mw(req, res, function () { nextCalled = true; }); }
|
|
999
|
+
catch (_e) { threw = true; }
|
|
1000
|
+
check("store read failure: no throw escapes the middleware", threw === false);
|
|
1001
|
+
check("store read failure: treated as miss, handler runs", nextCalled === true);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
function testStoreWriteFailureDoesNotBreakResponse() {
|
|
1005
|
+
var store = {
|
|
1006
|
+
get: function () { return null; },
|
|
1007
|
+
set: function () { throw new Error("write exploded"); },
|
|
1008
|
+
delete: function () {},
|
|
1009
|
+
};
|
|
1010
|
+
var mw = b.middleware.idempotencyKey({ store: store });
|
|
1011
|
+
var req = _mockReq("POST", "/x", "k-writefail");
|
|
1012
|
+
req._rawBody = Buffer.from("{}");
|
|
1013
|
+
var res = _mockRes();
|
|
1014
|
+
var threw = false;
|
|
1015
|
+
mw(req, res, function () {});
|
|
1016
|
+
try { res.statusCode = 200; res.end("still works"); }
|
|
1017
|
+
catch (_e) { threw = true; }
|
|
1018
|
+
check("store write failure: response completes without throwing", threw === false);
|
|
1019
|
+
check("store write failure: handler body still written", res._getBody() === "still works");
|
|
1020
|
+
check("store write failure: response ended", res._ended() === true);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
// ---- response-capture edge branches ----
|
|
1024
|
+
|
|
1025
|
+
function testBodyTooLargeNotCached() {
|
|
1026
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
1027
|
+
var mw = b.middleware.idempotencyKey({ store: store, maxBodyBytes: 4 });
|
|
1028
|
+
var req = _mockReq("POST", "/big", "k-big");
|
|
1029
|
+
req._rawBody = Buffer.from("{}");
|
|
1030
|
+
var res = _mockRes();
|
|
1031
|
+
mw(req, res, function () {});
|
|
1032
|
+
res.statusCode = 200;
|
|
1033
|
+
res.end("abcdefgh"); // 8 bytes > maxBodyBytes (4)
|
|
1034
|
+
check("body-too-large: oversized response NOT cached", store._size() === 0);
|
|
1035
|
+
check("body-too-large: response still delivered to client",
|
|
1036
|
+
res._getBody() === "abcdefgh" && res._ended() === true);
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
function testStreamingWriteCaptureReplays() {
|
|
1040
|
+
// Handler streams via res.write(...) then res.end() with no final
|
|
1041
|
+
// chunk; the write-wrapper captures the streamed bytes and replays
|
|
1042
|
+
// the concatenation on the retry.
|
|
1043
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
1044
|
+
var mw = b.middleware.idempotencyKey({ store: store, ttlMs: 60000 });
|
|
1045
|
+
var req1 = _mockReq("POST", "/stream", "k-stream");
|
|
1046
|
+
req1._rawBody = Buffer.from("{}");
|
|
1047
|
+
var res1 = _mockRes();
|
|
1048
|
+
mw(req1, res1, function () {
|
|
1049
|
+
res1.statusCode = 200;
|
|
1050
|
+
res1.write("part1-");
|
|
1051
|
+
res1.write("part2");
|
|
1052
|
+
res1.end();
|
|
1053
|
+
});
|
|
1054
|
+
check("streaming capture: full body assembled from writes",
|
|
1055
|
+
res1._getBody() === "part1-part2");
|
|
1056
|
+
check("streaming capture: cached", store._size() === 1);
|
|
1057
|
+
|
|
1058
|
+
var req2 = _mockReq("POST", "/stream", "k-stream");
|
|
1059
|
+
req2._rawBody = Buffer.from("{}");
|
|
1060
|
+
var res2 = _mockRes();
|
|
1061
|
+
var next2 = false;
|
|
1062
|
+
mw(req2, res2, function () { next2 = true; });
|
|
1063
|
+
check("streaming capture: retry replays the concatenated body",
|
|
1064
|
+
!next2 && res2._getBody() === "part1-part2");
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
function testReplaySkipsThrowingSetHeader() {
|
|
1068
|
+
// On replay, an operator-restricted header whose setHeader() throws is
|
|
1069
|
+
// skipped without aborting the replay — status + body still restored.
|
|
1070
|
+
var store = b.middleware.idempotencyKey.memoryStore();
|
|
1071
|
+
var mw = b.middleware.idempotencyKey({ store: store, ttlMs: 60000 });
|
|
1072
|
+
var req1 = _mockReq("POST", "/h", "k-hdrthrow");
|
|
1073
|
+
req1._rawBody = Buffer.from("{}");
|
|
1074
|
+
var res1 = _mockRes();
|
|
1075
|
+
mw(req1, res1, function () {
|
|
1076
|
+
res1.statusCode = 200;
|
|
1077
|
+
res1.setHeader("X-Test", "v");
|
|
1078
|
+
res1.end("hdr-body");
|
|
1079
|
+
});
|
|
1080
|
+
|
|
1081
|
+
var req2 = _mockReq("POST", "/h", "k-hdrthrow");
|
|
1082
|
+
req2._rawBody = Buffer.from("{}");
|
|
1083
|
+
var res2 = _mockRes();
|
|
1084
|
+
res2.setHeader = function () { throw new Error("restricted header"); };
|
|
1085
|
+
var next2 = false;
|
|
1086
|
+
var threw = false;
|
|
1087
|
+
try { mw(req2, res2, function () { next2 = true; }); }
|
|
1088
|
+
catch (_e) { threw = true; }
|
|
1089
|
+
check("replay setHeader throw: no throw escapes replay", threw === false);
|
|
1090
|
+
check("replay setHeader throw: handler not re-invoked", next2 === false);
|
|
1091
|
+
check("replay setHeader throw: status + body still restored",
|
|
1092
|
+
res2._statusCode() === 200 && res2._getBody() === "hdr-body" && res2._ended() === true);
|
|
1093
|
+
}
|
|
1094
|
+
|
|
622
1095
|
async function run() {
|
|
623
1096
|
testSurface();
|
|
624
1097
|
testBadOpts();
|
|
1098
|
+
testMemoryStoreBadMaxEntries();
|
|
1099
|
+
testCreateBadNumericOpts();
|
|
1100
|
+
testKeyTooLong();
|
|
1101
|
+
testArrayKeyHeaderUsesFirst();
|
|
1102
|
+
testCustomMethodsSkipsUnlisted();
|
|
1103
|
+
testCustomHeaderName();
|
|
1104
|
+
testDenyFallbackRefusesMissingBody();
|
|
1105
|
+
testMethodPathOnlyFallbackAllows();
|
|
1106
|
+
testObjectBodyDefaultPath();
|
|
1107
|
+
testCircularObjectBodyDenied();
|
|
1108
|
+
testBodyFingerprintHookReturnTypes();
|
|
1109
|
+
testBodyFingerprintHookThrows();
|
|
1110
|
+
testDeleteMissThenReplay();
|
|
1111
|
+
testStoreReadFailureTreatedAsMiss();
|
|
1112
|
+
testStoreWriteFailureDoesNotBreakResponse();
|
|
1113
|
+
testBodyTooLargeNotCached();
|
|
1114
|
+
testStreamingWriteCaptureReplays();
|
|
1115
|
+
testReplaySkipsThrowingSetHeader();
|
|
625
1116
|
testMethodSkipsGet();
|
|
626
1117
|
testMissingKeyDefault();
|
|
627
1118
|
testMissingKeyRequired();
|
|
@@ -646,6 +1137,9 @@ async function run() {
|
|
|
646
1137
|
testDbStoreSealedRowAcrossProcessesNotDeleted();
|
|
647
1138
|
testDbStoreCorruptHeadersDeletedWhenNotSealed();
|
|
648
1139
|
await testDbStoreSealRoundTripWithVault();
|
|
1140
|
+
testResealMigrateInMemoryStoreUnsupported();
|
|
1141
|
+
testResealMigrateSealDisabled();
|
|
1142
|
+
await testResealMigrateAlreadyAadSealed();
|
|
649
1143
|
}
|
|
650
1144
|
|
|
651
1145
|
module.exports = { run: run };
|
|
@@ -66,6 +66,36 @@ function run() {
|
|
|
66
66
|
check("pre-filter then expandIpv6Hex parses ::1",
|
|
67
67
|
ip.looksLikeIPv6Hex("::1") && ip.expandIpv6Hex("::1") === "00000000000000000000000000000001");
|
|
68
68
|
|
|
69
|
+
// ---- RFC 4291 §2.2: '::' abbreviates ONE OR MORE all-zero groups ----
|
|
70
|
+
// A '::' adjacent to a full 8 explicit groups compresses ZERO groups, which
|
|
71
|
+
// is malformed IPv6 text — net.isIP rejects all of these. The expander must
|
|
72
|
+
// too (return null), or it diverges from the kernel/peer parser on a whole
|
|
73
|
+
// input class. Covers trailing / leading / interior placements.
|
|
74
|
+
["1:2:3:4:5:6:7:8::", "::1:2:3:4:5:6:7:8", "1:2:3:4:5:6:7::8",
|
|
75
|
+
"1:2:3:4::5:6:7:8", "0:0:0:0:0:0:0:0::"]
|
|
76
|
+
.forEach(function (s) {
|
|
77
|
+
check("expandIpv6Hex rejects zero-group '::' " + JSON.stringify(s), ip.expandIpv6Hex(s) === null);
|
|
78
|
+
check("expandIpv6Groups rejects zero-group '::' " + JSON.stringify(s), ip.expandIpv6Groups(s) === null);
|
|
79
|
+
});
|
|
80
|
+
// A '::' compressing at least one group stays valid (the fix must not
|
|
81
|
+
// over-reject the legitimate abbreviation).
|
|
82
|
+
check("expandIpv6Hex accepts one-group '::' 1:2:3:4:5:6:7::",
|
|
83
|
+
ip.expandIpv6Hex("1:2:3:4:5:6:7::") === "00010002000300040005000600070000");
|
|
84
|
+
check("expandIpv6Hex accepts one-group '::' ::1:2:3:4:5:6:7",
|
|
85
|
+
ip.expandIpv6Hex("::1:2:3:4:5:6:7") === "00000001000200030004000500060007");
|
|
86
|
+
check("expandIpv6Hex accepts all-zero ::", ip.expandIpv6Hex("::") === "00000000000000000000000000000000");
|
|
87
|
+
|
|
88
|
+
// ---- Embedded IPv4 tail is a STRICT dotted-quad (matches net.isIP) ----
|
|
89
|
+
// A leading-zero octet in the ::ffff: / dual-stack tail is octal-ambiguous
|
|
90
|
+
// and rejected by net.isIP; the expander reuses the canonical strict isIPv4
|
|
91
|
+
// so the two validators don't diverge. >255 octets are likewise refused.
|
|
92
|
+
["::ffff:01.2.3.4", "::ffff:1.2.3.04", "::ffff:010.0.0.7", "::ffff:256.0.0.1"]
|
|
93
|
+
.forEach(function (s) {
|
|
94
|
+
check("expandIpv6Hex rejects loose IPv4 tail " + JSON.stringify(s), ip.expandIpv6Hex(s) === null);
|
|
95
|
+
});
|
|
96
|
+
check("expandIpv6Hex accepts strict IPv4-mapped ::ffff:192.0.2.1",
|
|
97
|
+
ip.expandIpv6Hex("::ffff:192.0.2.1") === "00000000000000000000ffffc0000201");
|
|
98
|
+
|
|
69
99
|
// ---- regression: existing helpers unchanged ----
|
|
70
100
|
check("isIPv4Shape loose still true for 999.0.0.0", ip.isIPv4Shape("999.0.0.0") === true);
|
|
71
101
|
check("isIPv4Shape false for non-dotted", ip.isIPv4Shape("notip") === false);
|