@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.
- package/CHANGELOG.md +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/sales-tax-filings.js +143 -0
- 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
|
@@ -145,12 +145,33 @@ async function _runAll() {
|
|
|
145
145
|
await testEventTypeAndWildcardMatching();
|
|
146
146
|
await testTransientFailureBacksOff();
|
|
147
147
|
await testThrownTransportErrorBacksOff();
|
|
148
|
+
await testTransientDnsRevalidationRetries();
|
|
149
|
+
await testPermanentDnsRevalidationDeadLetters();
|
|
150
|
+
await testDeliveryTimeSsrfRebindDeadLetters();
|
|
148
151
|
await testMysqlSchemaNoPartialIndex();
|
|
149
152
|
await testInlineDeliveryNotDoubleClaimed();
|
|
150
153
|
await testPostgresClaimUsesSkipLockedDisjoint();
|
|
151
154
|
await testMaxAttemptsDeadLetters();
|
|
152
155
|
await testDlqReplay();
|
|
153
156
|
await testDeliveriesRetry();
|
|
157
|
+
// ---- error / edge / adversarial branch coverage ----
|
|
158
|
+
await testDispatcherOptsValidation();
|
|
159
|
+
await testBadTableNameRejected();
|
|
160
|
+
await testRegisterEventTypesValidation();
|
|
161
|
+
await testDispatchInputValidation();
|
|
162
|
+
await testDispatchNoSubscribers();
|
|
163
|
+
await testDispatchStringAndBufferPayload();
|
|
164
|
+
await testRemoveEndpoint();
|
|
165
|
+
await testRetryUnknownDeliveryId();
|
|
166
|
+
await testDeliveryEndpointRemovedDeadLetters();
|
|
167
|
+
await testGetUnknownDeliveryReturnsNull();
|
|
168
|
+
await testDefaultOptionsConstructAndDeliver();
|
|
169
|
+
await testBackoffCappedAtMax();
|
|
170
|
+
await testDisabledEndpointSkipped();
|
|
171
|
+
await testCustomSignatureHeader();
|
|
172
|
+
await testDeclareSchemaPostgresExplicitXdb();
|
|
173
|
+
await testReapStaleInflight();
|
|
174
|
+
await testListDeliveriesFilters();
|
|
154
175
|
}
|
|
155
176
|
|
|
156
177
|
function _newDispatcher(xdb, transport, extra) {
|
|
@@ -304,6 +325,80 @@ async function testThrownTransportErrorBacksOff() {
|
|
|
304
325
|
check("thrown transport error not dead-lettered", res.deliveries[0].dead !== true);
|
|
305
326
|
}
|
|
306
327
|
|
|
328
|
+
async function testTransientDnsRevalidationRetries() {
|
|
329
|
+
// The delivery-time SSRF re-validation resolves the destination host. A
|
|
330
|
+
// TRANSIENT resolver fault (EAI_AGAIN) during that lookup must be treated as
|
|
331
|
+
// transient — rescheduled — NOT dead-lettered. Regression: the re-validation
|
|
332
|
+
// catch marked EVERY throw permanent, so a DNS blip dead-lettered a delivery.
|
|
333
|
+
var xdb = _sqliteExternalDb();
|
|
334
|
+
var HOST_URL = "https://hook.example.test/hooks";
|
|
335
|
+
var calls = 0;
|
|
336
|
+
var dnsLookup = function (host) {
|
|
337
|
+
calls += 1;
|
|
338
|
+
if (calls === 1) return Promise.resolve([{ address: "93.184.216.34", family: 4 }]); // register: public
|
|
339
|
+
var e = new Error("getaddrinfo EAI_AGAIN " + host); e.code = "EAI_AGAIN"; // deliver: transient
|
|
340
|
+
return Promise.reject(e);
|
|
341
|
+
};
|
|
342
|
+
var wd = _newDispatcher(xdb, _stubTransport(), { dnsLookup: dnsLookup });
|
|
343
|
+
await wd.declareSchema();
|
|
344
|
+
await wd.registerEndpoint({ endpointId: "td", url: HOST_URL, eventTypes: ["e"], secret: "s" });
|
|
345
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
346
|
+
check("transient DNS in SSRF re-validation not delivered", res.delivered === 0 && res.failed === 1);
|
|
347
|
+
check("transient DNS not dead-lettered", res.deliveries[0].dead !== true);
|
|
348
|
+
var rows = await wd.deliveries.list({ endpointId: "td" });
|
|
349
|
+
check("transient DNS delivery stays pending for retry", rows.length === 1 && rows[0].status === "pending");
|
|
350
|
+
check("transient DNS resolver error recorded", /EAI_AGAIN/.test(rows[0].lastError || ""));
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function testPermanentDnsRevalidationDeadLetters() {
|
|
354
|
+
// A PERMANENT resolver failure at the SSRF re-check — a host with no
|
|
355
|
+
// addresses / a removed DNS record — carries the framework DnsError verdict
|
|
356
|
+
// err.permanent === true. It must dead-letter immediately, NOT burn every
|
|
357
|
+
// retry attempt on a name that will never resolve. (Distinct from a transient
|
|
358
|
+
// DNS blip, which retries.)
|
|
359
|
+
var xdb = _sqliteExternalDb();
|
|
360
|
+
var HOST_URL = "https://gone.example.test/hooks";
|
|
361
|
+
var calls = 0;
|
|
362
|
+
var dnsLookup = function (host) {
|
|
363
|
+
calls += 1;
|
|
364
|
+
if (calls === 1) return Promise.resolve([{ address: "93.184.216.34", family: 4 }]); // register: public
|
|
365
|
+
var e = new Error("dns lookup of '" + host + "' returned no addresses"); // deliver: permanent
|
|
366
|
+
e.code = "dns/no-result"; e.permanent = true;
|
|
367
|
+
return Promise.reject(e);
|
|
368
|
+
};
|
|
369
|
+
var wd = _newDispatcher(xdb, _stubTransport(), { dnsLookup: dnsLookup });
|
|
370
|
+
await wd.declareSchema();
|
|
371
|
+
await wd.registerEndpoint({ endpointId: "gone", url: HOST_URL, eventTypes: ["e"], secret: "s" });
|
|
372
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
373
|
+
check("permanent DNS failure not delivered", res.delivered === 0 && res.failed === 1);
|
|
374
|
+
check("permanent DNS failure is dead-lettered (not retried)", res.deliveries[0].dead === true);
|
|
375
|
+
var rows = await wd.deliveries.list({ endpointId: "gone" });
|
|
376
|
+
check("permanent DNS delivery status is dead", rows.length === 1 && rows[0].status === "dead");
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
async function testDeliveryTimeSsrfRebindDeadLetters() {
|
|
380
|
+
// The control: a destination that was public at registration but REBINDS to a
|
|
381
|
+
// loopback IP by delivery time is a genuine SSRF refusal — PERMANENT — and is
|
|
382
|
+
// dead-lettered immediately (a WebhookDispatcherError, not a raw resolver fault).
|
|
383
|
+
var xdb = _sqliteExternalDb();
|
|
384
|
+
var HOST_URL = "https://hook.example.test/hooks";
|
|
385
|
+
var calls = 0;
|
|
386
|
+
var dnsLookup = function () {
|
|
387
|
+
calls += 1;
|
|
388
|
+
if (calls === 1) return Promise.resolve([{ address: "93.184.216.34", family: 4 }]); // register: public
|
|
389
|
+
return Promise.resolve([{ address: "127.0.0.1", family: 4 }]); // deliver: rebound internal
|
|
390
|
+
};
|
|
391
|
+
var wd = _newDispatcher(xdb, _stubTransport(), { dnsLookup: dnsLookup });
|
|
392
|
+
await wd.declareSchema();
|
|
393
|
+
await wd.registerEndpoint({ endpointId: "rb", url: HOST_URL, eventTypes: ["e"], secret: "s" });
|
|
394
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
395
|
+
check("SSRF-rebind at delivery not delivered", res.delivered === 0 && res.failed === 1);
|
|
396
|
+
check("SSRF-rebind at delivery is dead-lettered (permanent)", res.deliveries[0].dead === true);
|
|
397
|
+
var rows = await wd.deliveries.list({ endpointId: "rb" });
|
|
398
|
+
check("SSRF-rebind delivery status is dead", rows.length === 1 && rows[0].status === "dead");
|
|
399
|
+
check("SSRF-refused error recorded", /ssrf-refused|resolves to/.test(rows[0].lastError || ""));
|
|
400
|
+
}
|
|
401
|
+
|
|
307
402
|
async function testMysqlSchemaNoPartialIndex() {
|
|
308
403
|
// MySQL has no partial indexes; sql.createIndex refuses `where` on mysql, so
|
|
309
404
|
// declareSchema must emit a NON-partial index there or it throws on boot.
|
|
@@ -441,6 +536,299 @@ async function testDeliveriesRetry() {
|
|
|
441
536
|
check("retried delivery now delivered", after.status === "delivered");
|
|
442
537
|
}
|
|
443
538
|
|
|
539
|
+
// ---- opts / construction validation (the validateOpts.shape + table-name gate) ----
|
|
540
|
+
async function testDispatcherOptsValidation() {
|
|
541
|
+
var xdb = _sqliteExternalDb();
|
|
542
|
+
var missingDb = false, badMax = false, infMax = false, unknownOpt = false;
|
|
543
|
+
try { b.webhook.dispatcher({}); }
|
|
544
|
+
catch (e) { missingDb = e.code === "webhook-dispatcher/bad-opts"; }
|
|
545
|
+
try { b.webhook.dispatcher({ externalDb: xdb, httpRequest: _stubTransport(), maxAttempts: -5 }); }
|
|
546
|
+
catch (e) { badMax = e.code === "webhook-dispatcher/bad-opts"; }
|
|
547
|
+
try { b.webhook.dispatcher({ externalDb: xdb, httpRequest: _stubTransport(), maxAttempts: Infinity }); }
|
|
548
|
+
catch (e) { infMax = e.code === "webhook-dispatcher/bad-opts"; }
|
|
549
|
+
try { b.webhook.dispatcher({ externalDb: xdb, httpRequest: _stubTransport(), bogusOpt: 1 }); }
|
|
550
|
+
catch (e) { unknownOpt = e.code === "webhook-dispatcher/bad-opts"; }
|
|
551
|
+
check("dispatcher throws on missing externalDb", missingDb);
|
|
552
|
+
check("dispatcher throws on negative maxAttempts", badMax);
|
|
553
|
+
check("dispatcher throws on non-finite maxAttempts", infMax);
|
|
554
|
+
check("dispatcher throws on an unknown opt (exhaustive shape)", unknownOpt);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
async function testBadTableNameRejected() {
|
|
558
|
+
var xdb = _sqliteExternalDb();
|
|
559
|
+
// An injection-bearing table name is refused at construction by
|
|
560
|
+
// safeSql.quoteIdentifier (parity with b.db.from()).
|
|
561
|
+
var endpointsThrew = false, deliveriesThrew = false;
|
|
562
|
+
try { _newDispatcher(xdb, _stubTransport(), { endpointsTable: "bad name; DROP TABLE x" }); }
|
|
563
|
+
catch (_e) { endpointsThrew = true; }
|
|
564
|
+
try { _newDispatcher(xdb, _stubTransport(), { deliveriesTable: "evil\"; --" }); }
|
|
565
|
+
catch (_e) { deliveriesThrew = true; }
|
|
566
|
+
check("bad endpointsTable name rejected at construction", endpointsThrew);
|
|
567
|
+
check("bad deliveriesTable name rejected at construction", deliveriesThrew);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
async function testRegisterEventTypesValidation() {
|
|
571
|
+
var xdb = _sqliteExternalDb();
|
|
572
|
+
var wd = _newDispatcher(xdb, _stubTransport());
|
|
573
|
+
await wd.declareSchema();
|
|
574
|
+
var emptyThrew = false, missingThrew = false;
|
|
575
|
+
try { await wd.registerEndpoint({ endpointId: "e1", url: PUBLIC_URL, eventTypes: [], secret: "s" }); }
|
|
576
|
+
catch (e) { emptyThrew = e.code === "webhook-dispatcher/bad-opts"; }
|
|
577
|
+
try { await wd.registerEndpoint({ endpointId: "e2", url: PUBLIC_URL, secret: "s" }); }
|
|
578
|
+
catch (e) { missingThrew = e.code === "webhook-dispatcher/bad-opts"; }
|
|
579
|
+
check("registerEndpoint refuses empty eventTypes array", emptyThrew);
|
|
580
|
+
check("registerEndpoint refuses missing eventTypes", missingThrew);
|
|
581
|
+
// Neither bad call should have written a row.
|
|
582
|
+
var eps = await wd.listEndpoints();
|
|
583
|
+
check("no endpoint persisted after eventTypes rejection", eps.length === 0);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
async function testDispatchInputValidation() {
|
|
587
|
+
var xdb = _sqliteExternalDb();
|
|
588
|
+
var wd = _newDispatcher(xdb, _stubTransport());
|
|
589
|
+
await wd.declareSchema();
|
|
590
|
+
var emptyEventThrew = false, nullPayloadThrew = false, undefPayloadThrew = false;
|
|
591
|
+
try { await wd.dispatch("", { n: 1 }); }
|
|
592
|
+
catch (e) { emptyEventThrew = e.code === "webhook-dispatcher/bad-opts"; }
|
|
593
|
+
try { await wd.dispatch("e", null); }
|
|
594
|
+
catch (e) { nullPayloadThrew = e.code === "webhook-dispatcher/bad-opts"; }
|
|
595
|
+
try { await wd.dispatch("e", undefined); }
|
|
596
|
+
catch (e) { undefPayloadThrew = e.code === "webhook-dispatcher/bad-opts"; }
|
|
597
|
+
check("dispatch refuses empty eventType", emptyEventThrew);
|
|
598
|
+
check("dispatch refuses null payload", nullPayloadThrew);
|
|
599
|
+
check("dispatch refuses undefined payload", undefPayloadThrew);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
async function testDispatchNoSubscribers() {
|
|
603
|
+
var xdb = _sqliteExternalDb();
|
|
604
|
+
var transport = _stubTransport();
|
|
605
|
+
var wd = _newDispatcher(xdb, transport);
|
|
606
|
+
await wd.declareSchema();
|
|
607
|
+
await wd.registerEndpoint({ endpointId: "sub", url: PUBLIC_URL, eventTypes: ["subscribed.only"], secret: "s" });
|
|
608
|
+
var res = await wd.dispatch("nobody.listening", { n: 1 });
|
|
609
|
+
check("dispatch with no subscribers delivers nothing", res.delivered === 0 && res.failed === 0);
|
|
610
|
+
check("dispatch with no subscribers has an empty deliveries list", res.deliveries.length === 0);
|
|
611
|
+
check("no delivery row written for an unsubscribed event", transport.calls.length === 0);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
async function testDispatchStringAndBufferPayload() {
|
|
615
|
+
var xdb = _sqliteExternalDb();
|
|
616
|
+
var transport = _stubTransport();
|
|
617
|
+
var wd = _newDispatcher(xdb, transport);
|
|
618
|
+
await wd.declareSchema();
|
|
619
|
+
await wd.registerEndpoint({ endpointId: "raw", url: PUBLIC_URL, eventTypes: ["s", "b"], secret: "s" });
|
|
620
|
+
await wd.dispatch("s", "already-a-string-body");
|
|
621
|
+
check("string payload passed through verbatim (not re-serialized)",
|
|
622
|
+
transport.calls.length === 1 && transport.calls[0].body === "already-a-string-body");
|
|
623
|
+
await wd.dispatch("b", Buffer.from("buffer-bytes-body", "utf8"));
|
|
624
|
+
check("Buffer payload coerced to its utf8 string",
|
|
625
|
+
transport.calls.length === 2 && transport.calls[1].body === "buffer-bytes-body");
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
async function testRemoveEndpoint() {
|
|
629
|
+
var xdb = _sqliteExternalDb();
|
|
630
|
+
var transport = _stubTransport();
|
|
631
|
+
var wd = _newDispatcher(xdb, transport);
|
|
632
|
+
await wd.declareSchema();
|
|
633
|
+
await wd.registerEndpoint({ endpointId: "keep", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
634
|
+
await wd.registerEndpoint({ endpointId: "remove", url: PUBLIC_URL2, eventTypes: ["e"], secret: "s" });
|
|
635
|
+
var rm = await wd.removeEndpoint("remove");
|
|
636
|
+
check("removeEndpoint reports removed", rm && rm.removed === true && rm.endpointId === "remove");
|
|
637
|
+
var eps = await wd.listEndpoints();
|
|
638
|
+
check("removed endpoint no longer listed",
|
|
639
|
+
eps.length === 1 && eps[0].endpointId === "keep");
|
|
640
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
641
|
+
check("removed endpoint no longer receives dispatch", res.delivered === 1);
|
|
642
|
+
// Validation: empty endpointId is refused.
|
|
643
|
+
var idThrew = false;
|
|
644
|
+
try { await wd.removeEndpoint(""); }
|
|
645
|
+
catch (e) { idThrew = e.code === "webhook-dispatcher/bad-opts"; }
|
|
646
|
+
check("removeEndpoint refuses empty endpointId", idThrew);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
async function testRetryUnknownDeliveryId() {
|
|
650
|
+
var xdb = _sqliteExternalDb();
|
|
651
|
+
var wd = _newDispatcher(xdb, _stubTransport());
|
|
652
|
+
await wd.declareSchema();
|
|
653
|
+
var res = await wd.deliveries.retry("deadbeefdeadbeefdeadbeefdeadbeef");
|
|
654
|
+
check("retry of an unknown delivery id fails softly (row not found)",
|
|
655
|
+
res && res.ok === false && res.error === "delivery row not found");
|
|
656
|
+
// Empty id is a hard validation throw.
|
|
657
|
+
var threw = false;
|
|
658
|
+
try { await wd.deliveries.retry(""); }
|
|
659
|
+
catch (e) { threw = e.code === "webhook-dispatcher/bad-opts"; }
|
|
660
|
+
check("retry refuses empty delivery id", threw);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
async function testDeliveryEndpointRemovedDeadLetters() {
|
|
664
|
+
// A delivery whose endpoint was removed between dispatch and re-attempt can
|
|
665
|
+
// never sign (no secret) — it is dead-lettered as "endpoint no longer
|
|
666
|
+
// registered", not retried forever.
|
|
667
|
+
var xdb = _sqliteExternalDb();
|
|
668
|
+
var transport = _stubTransport();
|
|
669
|
+
var wd = _newDispatcher(xdb, transport);
|
|
670
|
+
await wd.declareSchema();
|
|
671
|
+
await wd.registerEndpoint({ endpointId: "gone2", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
672
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
673
|
+
var deliveryId = res.deliveries[0].deliveryId;
|
|
674
|
+
await wd.removeEndpoint("gone2");
|
|
675
|
+
var retryRes = await wd.deliveries.retry(deliveryId);
|
|
676
|
+
check("delivery whose endpoint was removed is dead-lettered", retryRes.dead === true);
|
|
677
|
+
var row = await wd.deliveries.get(deliveryId);
|
|
678
|
+
check("removed-endpoint delivery status is dead", row && row.status === "dead");
|
|
679
|
+
check("removed-endpoint delivery records the reason",
|
|
680
|
+
/endpoint no longer registered/.test(row.lastError || ""));
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
async function testGetUnknownDeliveryReturnsNull() {
|
|
684
|
+
var xdb = _sqliteExternalDb();
|
|
685
|
+
var wd = _newDispatcher(xdb, _stubTransport());
|
|
686
|
+
await wd.declareSchema();
|
|
687
|
+
var got = await wd.deliveries.get("00000000000000000000000000000000");
|
|
688
|
+
check("deliveries.get returns null for an unknown id", got === null);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
async function testDefaultOptionsConstructAndDeliver() {
|
|
692
|
+
// Construct with ONLY the required externalDb + an injected transport — every
|
|
693
|
+
// other opt (maxAttempts / batchSize / claimReclaimMs / retryBackoff /
|
|
694
|
+
// signatureHeader / allowedProtocols / now) falls to its default.
|
|
695
|
+
var xdb = _sqliteExternalDb();
|
|
696
|
+
var transport = _stubTransport();
|
|
697
|
+
var wd = b.webhook.dispatcher({ externalDb: xdb, httpRequest: transport });
|
|
698
|
+
await wd.declareSchema();
|
|
699
|
+
await wd.registerEndpoint({ endpointId: "def", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
700
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
701
|
+
check("dispatcher built with all-default opts delivers", res.delivered === 1);
|
|
702
|
+
var sigHeader = transport.calls[0].headers["Webhook-Signature"];
|
|
703
|
+
check("default signatureHeader is the framework default (Webhook-Signature)",
|
|
704
|
+
typeof sigHeader === "string" && sigHeader.length > 0);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
async function testBackoffCappedAtMax() {
|
|
708
|
+
// initialMs (10s) exceeds maxMs (5s), so the very first reschedule must clamp
|
|
709
|
+
// the backoff to maxMs — exercising the `ms > backoffMax` cap branch.
|
|
710
|
+
var now = 1700000000000;
|
|
711
|
+
var clock = function () { return now; };
|
|
712
|
+
var xdb = _sqliteExternalDb();
|
|
713
|
+
var transport = _stubTransport();
|
|
714
|
+
transport.setStatus(503);
|
|
715
|
+
var wd = b.webhook.dispatcher({
|
|
716
|
+
externalDb: xdb, httpRequest: transport, maxAttempts: 5,
|
|
717
|
+
retryBackoff: { initialMs: 10000, maxMs: 5000, factor: 2 }, now: clock,
|
|
718
|
+
});
|
|
719
|
+
await wd.declareSchema();
|
|
720
|
+
await wd.registerEndpoint({ endpointId: "cap", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
721
|
+
await wd.dispatch("e", { n: 1 });
|
|
722
|
+
var rows = await wd.deliveries.list({ endpointId: "cap" });
|
|
723
|
+
var expected = new Date(now + 5000).toISOString();
|
|
724
|
+
check("backoff is clamped to maxMs, not initialMs*factor^n",
|
|
725
|
+
rows.length === 1 && rows[0].nextAttemptAt === expected);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
async function testDisabledEndpointSkipped() {
|
|
729
|
+
// A disabled endpoint (disabled=1) is filtered out of the fan-out AND
|
|
730
|
+
// surfaced as disabled:true by listEndpoints (_isTruthy on the integer flag).
|
|
731
|
+
var xdb = _sqliteExternalDb();
|
|
732
|
+
var transport = _stubTransport();
|
|
733
|
+
var wd = _newDispatcher(xdb, transport);
|
|
734
|
+
await wd.declareSchema();
|
|
735
|
+
await wd.registerEndpoint({ endpointId: "dis", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
736
|
+
xdb._raw.prepare("UPDATE " + tableName("webhook_endpoints") +
|
|
737
|
+
" SET disabled = 1 WHERE endpoint_id = ?").run("dis");
|
|
738
|
+
var eps = await wd.listEndpoints();
|
|
739
|
+
check("listEndpoints reports the endpoint as disabled",
|
|
740
|
+
eps.length === 1 && eps[0].disabled === true);
|
|
741
|
+
var res = await wd.dispatch("e", { n: 1 });
|
|
742
|
+
check("a disabled endpoint receives no delivery",
|
|
743
|
+
res.delivered === 0 && res.failed === 0 && transport.calls.length === 0);
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
async function testCustomSignatureHeader() {
|
|
747
|
+
// A custom signatureHeader opt is forwarded to b.webhook.signer, so the POSTed
|
|
748
|
+
// request carries the operator's header name instead of the default.
|
|
749
|
+
var xdb = _sqliteExternalDb();
|
|
750
|
+
var transport = _stubTransport();
|
|
751
|
+
var wd = _newDispatcher(xdb, transport, { signatureHeader: "X-Partner-Signature" });
|
|
752
|
+
await wd.declareSchema();
|
|
753
|
+
await wd.registerEndpoint({ endpointId: "csh", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
754
|
+
await wd.dispatch("e", { n: 1 });
|
|
755
|
+
var h = transport.calls[0].headers;
|
|
756
|
+
check("custom signatureHeader name is emitted", typeof h["X-Partner-Signature"] === "string");
|
|
757
|
+
check("default Webhook-Signature header absent under a custom header",
|
|
758
|
+
h["Webhook-Signature"] === undefined);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
async function testDeclareSchemaPostgresExplicitXdb() {
|
|
762
|
+
// declareSchema(xdb) with an explicit Postgres target: exercises the
|
|
763
|
+
// `xdb || externalDb` xdb branch AND the postgres TIMESTAMPTZ + partial-index
|
|
764
|
+
// (WHERE status='pending') branches — the complement of the mysql schema test.
|
|
765
|
+
var xdb = _sqliteExternalDb();
|
|
766
|
+
var wd = _newDispatcher(xdb, _stubTransport());
|
|
767
|
+
var sqls = [];
|
|
768
|
+
var pgTarget = {
|
|
769
|
+
dialect: "postgres",
|
|
770
|
+
query: async function (s) { sqls.push(s); return { rows: [] }; },
|
|
771
|
+
transaction: async function (fn) { return fn(this); },
|
|
772
|
+
};
|
|
773
|
+
await wd.declareSchema(pgTarget);
|
|
774
|
+
var joined = sqls.join(" || ");
|
|
775
|
+
check("postgres schema uses TIMESTAMPTZ timestamps", /TIMESTAMPTZ/i.test(joined));
|
|
776
|
+
var idxSql = sqls.filter(function (s) { return /_pending_idx/i.test(s); }).join(" || ");
|
|
777
|
+
check("postgres pending index is partial (WHERE status = 'pending')",
|
|
778
|
+
/where\s+status\s*=\s*'pending'/i.test(idxSql));
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
async function testReapStaleInflight() {
|
|
782
|
+
// A worker that claimed a delivery (status 'in-flight') then crashed strands
|
|
783
|
+
// the row. processRetries()'s reaper flips it back to 'pending' once the lease
|
|
784
|
+
// (claimReclaimMs) expires; a FRESHLY-claimed in-flight row is NOT reaped.
|
|
785
|
+
var now = 1700000000000;
|
|
786
|
+
var clock = function () { return now; };
|
|
787
|
+
var xdb = _sqliteExternalDb();
|
|
788
|
+
var transport = _stubTransport();
|
|
789
|
+
transport.setStatus(503);
|
|
790
|
+
var wd = b.webhook.dispatcher({
|
|
791
|
+
externalDb: xdb, httpRequest: transport, maxAttempts: 5,
|
|
792
|
+
retryBackoff: { initialMs: 1000, maxMs: 5000, factor: 2 }, now: clock,
|
|
793
|
+
});
|
|
794
|
+
await wd.declareSchema();
|
|
795
|
+
await wd.registerEndpoint({ endpointId: "reap", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
796
|
+
var d1 = (await wd.dispatch("e", { n: 1 })).deliveries[0].deliveryId; // → pending
|
|
797
|
+
var d2 = (await wd.dispatch("e", { n: 2 })).deliveries[0].deliveryId; // → pending
|
|
798
|
+
var tenMinMs = 600000; // well past the 5-min default claimReclaimMs lease
|
|
799
|
+
var staleIso = new Date(now - tenMinMs).toISOString();
|
|
800
|
+
var freshIso = new Date(now).toISOString();
|
|
801
|
+
var dueIso = new Date(now - tenMinMs).toISOString();
|
|
802
|
+
var upd = "UPDATE " + tableName("webhook_deliveries") +
|
|
803
|
+
" SET status = 'in-flight', claimed_at = ?, next_attempt_at = ? WHERE delivery_id = ?";
|
|
804
|
+
xdb._raw.prepare(upd).run(staleIso, dueIso, d1); // stranded past the lease
|
|
805
|
+
xdb._raw.prepare(upd).run(freshIso, dueIso, d2); // just claimed — still owned
|
|
806
|
+
transport.setStatus(200);
|
|
807
|
+
var res = await wd.processRetries();
|
|
808
|
+
check("only the stale in-flight row is reaped + re-attempted", res.attempted === 1 && res.delivered === 1);
|
|
809
|
+
var r1 = await wd.deliveries.get(d1);
|
|
810
|
+
var r2 = await wd.deliveries.get(d2);
|
|
811
|
+
check("reaped delivery is now delivered", r1 && r1.status === "delivered");
|
|
812
|
+
check("freshly-claimed delivery is left in-flight (not reaped)", r2 && r2.status === "in-flight");
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
async function testListDeliveriesFilters() {
|
|
816
|
+
// Drive the endpointId + status + explicit limit filter branches of
|
|
817
|
+
// deliveries.list in one pass.
|
|
818
|
+
var xdb = _sqliteExternalDb();
|
|
819
|
+
var transport = _stubTransport();
|
|
820
|
+
var wd = _newDispatcher(xdb, transport);
|
|
821
|
+
await wd.declareSchema();
|
|
822
|
+
await wd.registerEndpoint({ endpointId: "f1", url: PUBLIC_URL, eventTypes: ["e"], secret: "s" });
|
|
823
|
+
await wd.registerEndpoint({ endpointId: "f2", url: PUBLIC_URL2, eventTypes: ["e"], secret: "s" });
|
|
824
|
+
await wd.dispatch("e", { n: 1 }); // both delivered (200)
|
|
825
|
+
var f1 = await wd.deliveries.list({ endpointId: "f1", status: "delivered", limit: 10 });
|
|
826
|
+
check("list filters by endpointId + status + explicit limit",
|
|
827
|
+
f1.length === 1 && f1[0].endpointId === "f1" && f1[0].status === "delivered");
|
|
828
|
+
var all = await wd.deliveries.list();
|
|
829
|
+
check("list with no filter returns every delivery", all.length === 2);
|
|
830
|
+
}
|
|
831
|
+
|
|
444
832
|
module.exports = { run: run };
|
|
445
833
|
|
|
446
834
|
if (require.main === module) {
|