@blamejs/blamejs-shop 0.5.11 → 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 +4 -0
- package/SECURITY.md +6 -1
- package/lib/admin.js +56 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/operator-sessions.js +68 -5
- 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
|
@@ -16,6 +16,9 @@ var check = helpers.check;
|
|
|
16
16
|
var b = helpers.b;
|
|
17
17
|
var { setupTestDb, teardownTestDb } = require("../helpers/db");
|
|
18
18
|
|
|
19
|
+
// pubsub caps channel names at 1 KiB (lib/pubsub.js _MAX_CHANNEL_LEN).
|
|
20
|
+
var C_KIB = 1024;
|
|
21
|
+
|
|
19
22
|
async function testSurface() {
|
|
20
23
|
check("b.pubsub exposed", typeof b.pubsub === "object");
|
|
21
24
|
check("b.pubsub.create is fn", typeof b.pubsub.create === "function");
|
|
@@ -260,6 +263,285 @@ async function testCacheInvalidationFanOut() {
|
|
|
260
263
|
await ps.close();
|
|
261
264
|
}
|
|
262
265
|
|
|
266
|
+
// A minimal in-process custom backend implementing the documented
|
|
267
|
+
// { publishRemote, start, stop } contract (plus optional subscribeRemote
|
|
268
|
+
// / unsubscribeRemote). It captures the remote-message callback so the
|
|
269
|
+
// test can inject cross-node deliveries, and records every remote call so
|
|
270
|
+
// ref-counting and scoping are observable. No external broker involved.
|
|
271
|
+
function makeCaptureBackend(cfg) {
|
|
272
|
+
cfg = cfg || {};
|
|
273
|
+
var state = {
|
|
274
|
+
started: false, stopped: false, onRemote: null,
|
|
275
|
+
published: [], subscribed: [], unsubscribed: [],
|
|
276
|
+
};
|
|
277
|
+
var backend = {
|
|
278
|
+
start: function (onRemote) { state.started = true; state.onRemote = onRemote; },
|
|
279
|
+
stop: function () { state.stopped = true; },
|
|
280
|
+
publishRemote: async function (scopedChannel, payload) {
|
|
281
|
+
if (cfg.throwOnPublish) throw new Error("publishRemote boom");
|
|
282
|
+
state.published.push({ channel: scopedChannel, payload: payload });
|
|
283
|
+
return cfg.publishRemoteReturn;
|
|
284
|
+
},
|
|
285
|
+
subscribeRemote: async function (scopedChannel, isPattern) {
|
|
286
|
+
if (cfg.throwOnSubscribe) throw new Error("subscribeRemote boom");
|
|
287
|
+
state.subscribed.push({ channel: scopedChannel, isPattern: isPattern });
|
|
288
|
+
},
|
|
289
|
+
unsubscribeRemote: async function (scopedChannel, isPattern) {
|
|
290
|
+
state.unsubscribed.push({ channel: scopedChannel, isPattern: isPattern });
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
return { backend: backend, state: state };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async function testSingleSegmentPatternMatchesDottedChannel() {
|
|
297
|
+
// The flagship documented pattern: '*' matches ONE '.'-delimited
|
|
298
|
+
// segment inside a dotted channel. Driven through the real
|
|
299
|
+
// subscribePattern → publish consumer path, not just the matcher.
|
|
300
|
+
var ps = b.pubsub.create();
|
|
301
|
+
var hits = [];
|
|
302
|
+
ps.subscribePattern("orders.*.created", function (_p, ev) { hits.push(ev.channel); });
|
|
303
|
+
ps.subscribePattern("a.*.b.*.c", function (_p, ev) { hits.push(ev.channel); });
|
|
304
|
+
|
|
305
|
+
await ps.publish("orders.eu.created", null); // must match (one segment)
|
|
306
|
+
await ps.publish("orders.eu.us.created", null); // must NOT (two segments)
|
|
307
|
+
await ps.publish("a.X.b.Y.c", null); // two single-segment wildcards
|
|
308
|
+
check("single-* pattern matches dotted channel", hits.indexOf("orders.eu.created") !== -1);
|
|
309
|
+
check("single-* pattern rejects two-segment span", hits.indexOf("orders.eu.us.created") === -1);
|
|
310
|
+
check("multi single-* pattern matches", hits.indexOf("a.X.b.Y.c") !== -1);
|
|
311
|
+
await ps.close();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
async function testMatcherEdgeBranches() {
|
|
315
|
+
var ps = b.pubsub.create();
|
|
316
|
+
var m = ps._matchPatternForTest;
|
|
317
|
+
check("exact equality without wildcard matches", m("a.b.c", "a.b.c") === true);
|
|
318
|
+
check("no-wildcard non-equal pattern rejects", m("a.b.c", "a.b.d") === false);
|
|
319
|
+
check("'**' suffix matches any tail", m("audit.**", "audit.x.y.z") === true);
|
|
320
|
+
check("empty middle segment matches '*'", m("x.*.y", "x..y") === true);
|
|
321
|
+
check("non-string channel rejected", m("a.*", 12345) === false);
|
|
322
|
+
|
|
323
|
+
// Channel/pattern length bound (1 KiB) short-circuits to false.
|
|
324
|
+
var huge = "a".repeat(C_KIB + 8);
|
|
325
|
+
check("over-length channel rejected", m("a*", huge) === false);
|
|
326
|
+
check("over-length pattern rejected", m(huge + "*", "short") === false);
|
|
327
|
+
await ps.close();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
async function testInputValidation() {
|
|
331
|
+
var ps = b.pubsub.create();
|
|
332
|
+
function threw(fn) { try { fn(); return null; } catch (e) { return e; } }
|
|
333
|
+
|
|
334
|
+
check("subscribe non-string channel throws BAD_OPT",
|
|
335
|
+
(threw(function () { ps.subscribe(42, function () {}); }) || {}).code === "BAD_OPT");
|
|
336
|
+
check("subscribe empty channel throws BAD_OPT",
|
|
337
|
+
(threw(function () { ps.subscribe("", function () {}); }) || {}).code === "BAD_OPT");
|
|
338
|
+
check("subscribe non-function handler throws BAD_OPT",
|
|
339
|
+
(threw(function () { ps.subscribe("c", "nope"); }) || {}).code === "BAD_OPT");
|
|
340
|
+
check("subscribePattern empty pattern throws BAD_OPT",
|
|
341
|
+
(threw(function () { ps.subscribePattern("", function () {}); }) || {}).code === "BAD_OPT");
|
|
342
|
+
check("subscribePattern non-function handler throws BAD_OPT",
|
|
343
|
+
(threw(function () { ps.subscribePattern("a.*", 7); }) || {}).code === "BAD_OPT");
|
|
344
|
+
|
|
345
|
+
var pubErr = null;
|
|
346
|
+
try { await ps.publish(null, {}); } catch (e) { pubErr = e; }
|
|
347
|
+
check("publish non-string channel throws BAD_OPT", pubErr && pubErr.code === "BAD_OPT");
|
|
348
|
+
var pubErr2 = null;
|
|
349
|
+
try { await ps.publish("", {}); } catch (e) { pubErr2 = e; }
|
|
350
|
+
check("publish empty channel throws BAD_OPT", pubErr2 && pubErr2.code === "BAD_OPT");
|
|
351
|
+
await ps.close();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
async function testPatternHandlerErrorIsolation() {
|
|
355
|
+
// A throwing PATTERN handler must not abort dispatch to sibling
|
|
356
|
+
// handlers (exact or pattern) for the same channel.
|
|
357
|
+
var ps = b.pubsub.create();
|
|
358
|
+
var exactSeen = 0, patternSeen = 0;
|
|
359
|
+
ps.subscribePattern("c.*", function () { throw new Error("pattern boom"); });
|
|
360
|
+
ps.subscribePattern("c.*", function () { patternSeen++; });
|
|
361
|
+
ps.subscribe("c.x", function () { exactSeen++; });
|
|
362
|
+
|
|
363
|
+
await ps.publish("c.x", null);
|
|
364
|
+
check("throwing pattern handler did not block sibling pattern", patternSeen === 1);
|
|
365
|
+
check("throwing pattern handler did not block exact handler", exactSeen === 1);
|
|
366
|
+
await ps.close();
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
async function testUnsubscribeEdgeCases() {
|
|
370
|
+
var ps = b.pubsub.create();
|
|
371
|
+
// No-op branches: falsy / non-object / unknown token.
|
|
372
|
+
ps.unsubscribe(null);
|
|
373
|
+
ps.unsubscribe(undefined);
|
|
374
|
+
ps.unsubscribe("not-an-object");
|
|
375
|
+
ps.unsubscribe({ channel: "ghost", isPattern: false }); // never subscribed
|
|
376
|
+
check("unsubscribe garbage tokens are safe no-ops", ps._state().exactChannels === 0);
|
|
377
|
+
|
|
378
|
+
var seen = 0;
|
|
379
|
+
var pat = ps.subscribePattern("p.*", function () { seen++; });
|
|
380
|
+
check("pattern subscribe reflected in _state", ps._state().patternCount === 1);
|
|
381
|
+
ps.unsubscribe(pat);
|
|
382
|
+
ps.unsubscribe(pat); // double-unsubscribe: second is a no-op
|
|
383
|
+
await ps.publish("p.x", null);
|
|
384
|
+
check("pattern unsubscribe stops dispatch", seen === 0);
|
|
385
|
+
check("pattern unsubscribe clears _state", ps._state().patternCount === 0);
|
|
386
|
+
|
|
387
|
+
var seen2 = 0;
|
|
388
|
+
var ex = ps.subscribe("e1", function () { seen2++; });
|
|
389
|
+
check("exact channel present in _state", ps._state().exactChannels === 1);
|
|
390
|
+
ps.unsubscribe(ex);
|
|
391
|
+
check("last-handler unsubscribe drops the channel map entry", ps._state().exactChannels === 0);
|
|
392
|
+
await ps.publish("e1", null);
|
|
393
|
+
check("exact unsubscribe stops dispatch", seen2 === 0);
|
|
394
|
+
await ps.close();
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
async function testBackendResolution() {
|
|
398
|
+
function threw(fn) { try { fn(); return null; } catch (e) { return e; } }
|
|
399
|
+
check("unknown backend string throws UNKNOWN_BACKEND",
|
|
400
|
+
(threw(function () { b.pubsub.create({ backend: "bogus" }); }) || {}).code === "UNKNOWN_BACKEND");
|
|
401
|
+
check("custom backend missing methods throws BAD_BACKEND",
|
|
402
|
+
(threw(function () { b.pubsub.create({ backend: { publishRemote: function () {} } }); }) || {}).code === "BAD_BACKEND");
|
|
403
|
+
|
|
404
|
+
var cap = makeCaptureBackend();
|
|
405
|
+
var ps = b.pubsub.create({ backend: cap.backend });
|
|
406
|
+
check("custom backend name is 'custom'", ps.backend() === "custom");
|
|
407
|
+
check("custom backend start() invoked with remote callback",
|
|
408
|
+
cap.state.started === true && typeof cap.state.onRemote === "function");
|
|
409
|
+
await ps.close();
|
|
410
|
+
check("custom backend stop() invoked on close", cap.state.stopped === true);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
async function testCustomBackendPublishRemote() {
|
|
414
|
+
// remote count derives from publishRemote's return: {remote:N} → N;
|
|
415
|
+
// anything non-{remote:finite} → 1.
|
|
416
|
+
async function remoteCountFor(ret) {
|
|
417
|
+
var cap = makeCaptureBackend({ publishRemoteReturn: ret });
|
|
418
|
+
var ps = b.pubsub.create({ backend: cap.backend });
|
|
419
|
+
var seenLocal = 0;
|
|
420
|
+
ps.subscribe("c1", function () { seenLocal++; });
|
|
421
|
+
var rv = await ps.publish("c1", { k: 1 });
|
|
422
|
+
check("local dispatch happens regardless of backend", seenLocal === 1 && rv.local === 1);
|
|
423
|
+
check("publishRemote received the (scoped) channel + payload",
|
|
424
|
+
cap.state.published.length === 1 &&
|
|
425
|
+
cap.state.published[0].channel === "c1" &&
|
|
426
|
+
cap.state.published[0].payload.k === 1);
|
|
427
|
+
await ps.close();
|
|
428
|
+
return rv.remote;
|
|
429
|
+
}
|
|
430
|
+
check("remote count from {remote:3}", (await remoteCountFor({ remote: 3 })) === 3);
|
|
431
|
+
check("remote count defaults to 1 on undefined return", (await remoteCountFor(undefined)) === 1);
|
|
432
|
+
check("remote count defaults to 1 on non-object return", (await remoteCountFor("nope")) === 1);
|
|
433
|
+
check("remote count defaults to 1 on {remote:NaN}", (await remoteCountFor({ remote: NaN })) === 1);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
async function testCustomBackendPublishRemoteThrows() {
|
|
437
|
+
var cap = makeCaptureBackend({ throwOnPublish: true });
|
|
438
|
+
var ps = b.pubsub.create({ backend: cap.backend, audit: true });
|
|
439
|
+
var seen = 0;
|
|
440
|
+
ps.subscribe("c1", function () { seen++; });
|
|
441
|
+
var err = null;
|
|
442
|
+
try { await ps.publish("c1", { k: 1 }); } catch (e) { err = e; }
|
|
443
|
+
check("publish rejects when publishRemote throws", err && /publishRemote boom/.test(err.message));
|
|
444
|
+
check("local dispatch still ran before the remote failure", seen === 1);
|
|
445
|
+
await ps.close();
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
async function testTopicPrefixScopingAndRemoteInbound() {
|
|
449
|
+
var cap = makeCaptureBackend({ publishRemoteReturn: { remote: 1 } });
|
|
450
|
+
var ps = b.pubsub.create({ backend: cap.backend, topicPrefix: "svc" });
|
|
451
|
+
var seen = [];
|
|
452
|
+
ps.subscribe("orders", function (payload, ev) { seen.push({ p: payload, ev: ev }); });
|
|
453
|
+
|
|
454
|
+
await ps.publish("orders", { id: 1 });
|
|
455
|
+
check("publishRemote gets the topic-prefixed channel",
|
|
456
|
+
cap.state.published.length === 1 && cap.state.published[0].channel === "svc:orders");
|
|
457
|
+
|
|
458
|
+
// Inbound remote deliveries via the captured callback (scoped channel).
|
|
459
|
+
cap.state.onRemote("svc:orders", JSON.stringify({ id: 2 }), {});
|
|
460
|
+
cap.state.onRemote("svc:orders", Buffer.from(JSON.stringify({ id: 3 }), "utf8"), {});
|
|
461
|
+
cap.state.onRemote("svc:orders", { id: 4 }, {}); // object passthrough
|
|
462
|
+
check("remote string payload parsed + unscoped + dispatched",
|
|
463
|
+
seen.length === 4 && seen[1].p.id === 2 && seen[1].ev.channel === "orders");
|
|
464
|
+
check("remote source tagged 'remote'", seen[1].ev.source === "remote");
|
|
465
|
+
check("remote Buffer payload parsed", seen[2].p.id === 3);
|
|
466
|
+
check("remote object payload passed through", seen[3].p.id === 4);
|
|
467
|
+
|
|
468
|
+
// Malformed remote JSON drops silently — no dispatch, no throw.
|
|
469
|
+
cap.state.onRemote("svc:orders", "{not-valid-json", {});
|
|
470
|
+
check("malformed remote payload dropped silently", seen.length === 4);
|
|
471
|
+
await ps.close();
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
async function testRemotePatternDelivery() {
|
|
475
|
+
var cap = makeCaptureBackend();
|
|
476
|
+
var ps = b.pubsub.create({ backend: cap.backend });
|
|
477
|
+
var hits = [];
|
|
478
|
+
ps.subscribePattern("orders.*.created", function (_p, ev) { hits.push(ev.channel); });
|
|
479
|
+
cap.state.onRemote("orders.eu.created", JSON.stringify({ id: 1 }), {});
|
|
480
|
+
check("remote message dispatches to matching pattern handler",
|
|
481
|
+
hits.length === 1 && hits[0] === "orders.eu.created");
|
|
482
|
+
await ps.close();
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
async function testRemoteRefCounting() {
|
|
486
|
+
var cap = makeCaptureBackend();
|
|
487
|
+
var ps = b.pubsub.create({ backend: cap.backend });
|
|
488
|
+
var t1 = ps.subscribe("c1", function () {});
|
|
489
|
+
var t2 = ps.subscribe("c1", function () {});
|
|
490
|
+
// subscribeRemote is fire-and-forget; only the FIRST local handler for a
|
|
491
|
+
// scoped channel triggers a single remote subscribe.
|
|
492
|
+
await helpers.waitUntil(function () { return cap.state.subscribed.length >= 1; },
|
|
493
|
+
{ label: "pubsub: first subscribe triggers one remote subscribeRemote" });
|
|
494
|
+
check("only one remote subscribe for two local handlers",
|
|
495
|
+
cap.state.subscribed.length === 1 && cap.state.subscribed[0].channel === "c1");
|
|
496
|
+
|
|
497
|
+
ps.unsubscribe(t1);
|
|
498
|
+
check("remote unsubscribe not yet called while a handler remains",
|
|
499
|
+
cap.state.unsubscribed.length === 0);
|
|
500
|
+
ps.unsubscribe(t2);
|
|
501
|
+
await helpers.waitUntil(function () { return cap.state.unsubscribed.length >= 1; },
|
|
502
|
+
{ label: "pubsub: last unsubscribe triggers one remote unsubscribeRemote" });
|
|
503
|
+
check("remote unsubscribe fires when last local handler goes away",
|
|
504
|
+
cap.state.unsubscribed.length === 1 && cap.state.unsubscribed[0].channel === "c1");
|
|
505
|
+
await ps.close();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
async function testSubscribeRemoteFailureSwallowed() {
|
|
509
|
+
// A rejecting subscribeRemote must not surface synchronously from
|
|
510
|
+
// subscribe(); local dispatch keeps working.
|
|
511
|
+
var cap = makeCaptureBackend({ throwOnSubscribe: true });
|
|
512
|
+
var ps = b.pubsub.create({ backend: cap.backend });
|
|
513
|
+
var seen = 0;
|
|
514
|
+
var err = null;
|
|
515
|
+
try { ps.subscribe("c1", function () { seen++; }); } catch (e) { err = e; }
|
|
516
|
+
check("subscribe does not throw when subscribeRemote rejects", err === null);
|
|
517
|
+
await ps.publish("c1", null);
|
|
518
|
+
check("local dispatch still works after remote-subscribe failure", seen === 1);
|
|
519
|
+
await ps.close();
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
async function testCloseIdempotentAndState() {
|
|
523
|
+
var cap = makeCaptureBackend();
|
|
524
|
+
var ps = b.pubsub.create({ backend: cap.backend });
|
|
525
|
+
ps.subscribe("c1", function () {});
|
|
526
|
+
ps.subscribePattern("p.*", function () {});
|
|
527
|
+
var st = ps._state();
|
|
528
|
+
check("_state reports backend name", st.backend === "custom");
|
|
529
|
+
check("_state reports exact + pattern counts", st.exactChannels === 1 && st.patternCount === 1);
|
|
530
|
+
check("_state reports not-closed", st.closed === false);
|
|
531
|
+
|
|
532
|
+
await ps.close();
|
|
533
|
+
await ps.close(); // idempotent — second close is a no-op, no throw
|
|
534
|
+
check("_state reports closed after close", ps._state().closed === true);
|
|
535
|
+
check("close cleared subscription maps", ps._state().exactChannels === 0 && ps._state().patternCount === 0);
|
|
536
|
+
|
|
537
|
+
var perr = null;
|
|
538
|
+
try { await ps.publish("c1", null); } catch (e) { perr = e; }
|
|
539
|
+
check("publish after close throws CLOSED", perr && perr.code === "CLOSED");
|
|
540
|
+
var serr = null;
|
|
541
|
+
try { ps.subscribePattern("x.*", function () {}); } catch (e) { serr = e; }
|
|
542
|
+
check("subscribePattern after close throws CLOSED", serr && serr.code === "CLOSED");
|
|
543
|
+
}
|
|
544
|
+
|
|
263
545
|
async function run() {
|
|
264
546
|
await testSurface();
|
|
265
547
|
await testLocalSubscribePublish();
|
|
@@ -267,6 +549,19 @@ async function run() {
|
|
|
267
549
|
await testHandlerErrorIsolation();
|
|
268
550
|
await testTopicPrefixIsolation();
|
|
269
551
|
await testPatternSubscribe();
|
|
552
|
+
await testSingleSegmentPatternMatchesDottedChannel();
|
|
553
|
+
await testMatcherEdgeBranches();
|
|
554
|
+
await testInputValidation();
|
|
555
|
+
await testPatternHandlerErrorIsolation();
|
|
556
|
+
await testUnsubscribeEdgeCases();
|
|
557
|
+
await testBackendResolution();
|
|
558
|
+
await testCustomBackendPublishRemote();
|
|
559
|
+
await testCustomBackendPublishRemoteThrows();
|
|
560
|
+
await testTopicPrefixScopingAndRemoteInbound();
|
|
561
|
+
await testRemotePatternDelivery();
|
|
562
|
+
await testRemoteRefCounting();
|
|
563
|
+
await testSubscribeRemoteFailureSwallowed();
|
|
564
|
+
await testCloseIdempotentAndState();
|
|
270
565
|
await testClosedRejectsPublishSubscribe();
|
|
271
566
|
await testClusterNumericConfigValidation();
|
|
272
567
|
await testClusterFanOut();
|
|
@@ -69,6 +69,41 @@ async function testRepeatCronReEnqueuesAfterComplete() {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
// A cron-repeat re-enqueue must preserve the operator's maxAttempts. The
|
|
73
|
+
// re-enqueue already carries priority / classification / traceId forward;
|
|
74
|
+
// dropping maxAttempts silently resets a fail-fast cron job (maxAttempts: 2)
|
|
75
|
+
// to the queue default (5) on every occurrence, so the operator's retry
|
|
76
|
+
// budget quietly stops holding after the first firing.
|
|
77
|
+
async function testRepeatPreservesMaxAttempts() {
|
|
78
|
+
var tmpDir = _tmp();
|
|
79
|
+
await setupTestDb(tmpDir);
|
|
80
|
+
try {
|
|
81
|
+
b.queue.init({ backends: { primary: { protocol: "local" } } });
|
|
82
|
+
|
|
83
|
+
await b.queue.enqueue("cron-max", { tag: "loop" },
|
|
84
|
+
{ repeat: { cron: "* * * * *" }, maxAttempts: 3 });
|
|
85
|
+
|
|
86
|
+
var seen = 0;
|
|
87
|
+
var consumer = b.queue.consume("cron-max",
|
|
88
|
+
async function () { seen++; },
|
|
89
|
+
{ concurrency: 1, pollIntervalMs: 25, fastPollMs: 5 });
|
|
90
|
+
await helpers.waitUntil(function () { return seen >= 1; }, {
|
|
91
|
+
timeoutMs: 3000, label: "queue cron-max: consumer saw the job",
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
var pending = await b.db.from("_blamejs_jobs")
|
|
95
|
+
.where({ queueName: "cron-max", status: "pending" }).all();
|
|
96
|
+
check("repeat: a follow-up pending row was scheduled", pending.length === 1);
|
|
97
|
+
check("repeat: follow-up preserves the operator's maxAttempts (not the default 5)",
|
|
98
|
+
Number(pending[0].maxAttempts) === 3);
|
|
99
|
+
|
|
100
|
+
consumer.cancel();
|
|
101
|
+
} finally {
|
|
102
|
+
try { await b.queue.shutdown({ timeoutMs: 500 }); } catch (_e) {}
|
|
103
|
+
await teardownTestDb(tmpDir);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
72
107
|
async function testRepeatStopsOnFinalFailure() {
|
|
73
108
|
var tmpDir = _tmp();
|
|
74
109
|
await setupTestDb(tmpDir);
|
|
@@ -388,6 +423,7 @@ async function run() {
|
|
|
388
423
|
await testPatchFlowDepsDoesNotReparkReleasedChild();
|
|
389
424
|
await testFlowSurface();
|
|
390
425
|
await testRepeatCronReEnqueuesAfterComplete();
|
|
426
|
+
await testRepeatPreservesMaxAttempts();
|
|
391
427
|
await testRepeatStopsOnFinalFailure();
|
|
392
428
|
await testEnqueueRoundTripsAvailableAt();
|
|
393
429
|
await testFlowLinearChain();
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (c) blamejs contributors
|
|
3
|
+
"use strict";
|
|
4
|
+
/**
|
|
5
|
+
* queue.bootFromEnv — env-driven queue init mirroring
|
|
6
|
+
* network.bootFromEnv. Reads BLAMEJS_QUEUE_* from a supplied fixture env
|
|
7
|
+
* and wires a single `default` backend; idempotent; throws INVALID_CONFIG
|
|
8
|
+
* on an unknown protocol or a redis selection with no URL.
|
|
9
|
+
*
|
|
10
|
+
* Run standalone: `node test/layer-0-primitives/queue.test.js`
|
|
11
|
+
* Or via smoke: `node test/smoke.js`
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
var helpers = require("../helpers");
|
|
15
|
+
var b = helpers.b;
|
|
16
|
+
var check = helpers.check;
|
|
17
|
+
|
|
18
|
+
function testBootFromEnvRejectsUnknownProtocol() {
|
|
19
|
+
b.queue._resetForTest();
|
|
20
|
+
var threw = null;
|
|
21
|
+
try { b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "wibble" } }); } catch (e) { threw = e; }
|
|
22
|
+
check("queue.bootFromEnv rejects an unknown protocol", threw && threw.code === "INVALID_CONFIG");
|
|
23
|
+
// The failed boot left the queue uninitialized (the throw was pre-init).
|
|
24
|
+
var listThrew = null;
|
|
25
|
+
try { b.queue.listBackends(); } catch (e) { listThrew = e; }
|
|
26
|
+
check("queue stays uninitialized after a rejected boot",
|
|
27
|
+
listThrew && listThrew.code === "NOT_INITIALIZED");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function testBootFromEnvRedisRequiresUrl() {
|
|
31
|
+
b.queue._resetForTest();
|
|
32
|
+
var threw = null;
|
|
33
|
+
try { b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "redis" } }); } catch (e) { threw = e; }
|
|
34
|
+
check("queue.bootFromEnv redis without URL throws INVALID_CONFIG",
|
|
35
|
+
threw && threw.code === "INVALID_CONFIG");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function testBootFromEnvLocalDefault() {
|
|
39
|
+
b.queue._resetForTest();
|
|
40
|
+
try {
|
|
41
|
+
b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "local" } });
|
|
42
|
+
var backends = b.queue.listBackends();
|
|
43
|
+
check("queue.bootFromEnv local wires exactly one backend", backends.length === 1);
|
|
44
|
+
check("queue.bootFromEnv local backend is named 'default' with protocol 'local'",
|
|
45
|
+
backends[0].name === "default" && backends[0].protocol === "local");
|
|
46
|
+
|
|
47
|
+
// Idempotent — a second boot after init is a no-op.
|
|
48
|
+
b.queue.bootFromEnv({ env: { BLAMEJS_QUEUE_PROTOCOL: "local" } });
|
|
49
|
+
check("queue.bootFromEnv is idempotent after init",
|
|
50
|
+
b.queue.listBackends().length === 1);
|
|
51
|
+
} finally {
|
|
52
|
+
b.queue._resetForTest();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function testBootFromEnvDefaultsToLocal() {
|
|
57
|
+
b.queue._resetForTest();
|
|
58
|
+
try {
|
|
59
|
+
// No BLAMEJS_QUEUE_PROTOCOL → defaults to the local protocol.
|
|
60
|
+
b.queue.bootFromEnv({ env: {} });
|
|
61
|
+
var backends = b.queue.listBackends();
|
|
62
|
+
check("queue.bootFromEnv defaults to the local protocol when unset",
|
|
63
|
+
backends.length === 1 && backends[0].protocol === "local");
|
|
64
|
+
} finally {
|
|
65
|
+
b.queue._resetForTest();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function run() {
|
|
70
|
+
testBootFromEnvRejectsUnknownProtocol();
|
|
71
|
+
testBootFromEnvRedisRequiresUrl();
|
|
72
|
+
testBootFromEnvLocalDefault();
|
|
73
|
+
testBootFromEnvDefaultsToLocal();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
module.exports = { run: run };
|
|
77
|
+
|
|
78
|
+
if (require.main === module) {
|
|
79
|
+
run().then(
|
|
80
|
+
function () { console.log("[queue] OK — " + helpers.getChecks() + " checks passed"); },
|
|
81
|
+
function (e) { console.error("FAIL:", e); process.exit(1); }
|
|
82
|
+
);
|
|
83
|
+
}
|
|
@@ -104,6 +104,40 @@ async function run() {
|
|
|
104
104
|
catch (e) { threwMode = e; }
|
|
105
105
|
check("create: bad ipKeyMode refused", threwMode !== null && /ipKeyMode/.test(threwMode.message));
|
|
106
106
|
|
|
107
|
+
// scope:"per-route" must key on the route PATH only — never the query
|
|
108
|
+
// string. When req.pathname is absent (a raw http.IncomingMessage handed
|
|
109
|
+
// to the middleware directly, before b.router populates pathname) the key
|
|
110
|
+
// used req.url verbatim, so rotating a throwaway query param minted a fresh
|
|
111
|
+
// per-route bucket per request and defeated the limit — the same bucket-
|
|
112
|
+
// rotation evasion class as the XFF / low-64 cases above. Every sibling
|
|
113
|
+
// guard (request-log / require-auth / network-allowlist) already strips the
|
|
114
|
+
// query with `(req.url||"").split("?")[0]`; rate-limit must too.
|
|
115
|
+
function _rawReq(url) {
|
|
116
|
+
// No pathname — the shape a bare Node req has before the router runs.
|
|
117
|
+
return { url: url, method: "POST",
|
|
118
|
+
socket: { remoteAddress: "198.51.100.7" }, headers: {}, requestId: "r" };
|
|
119
|
+
}
|
|
120
|
+
var routeMw = b.middleware.rateLimit({
|
|
121
|
+
backend: "memory", algorithm: "fixed-window", max: 1,
|
|
122
|
+
windowMs: b.constants.TIME.hours(1), scope: "per-route",
|
|
123
|
+
});
|
|
124
|
+
var q1 = await _runMw(routeMw, _rawReq("/api/pay?nonce=1"));
|
|
125
|
+
var q2 = await _runMw(routeMw, _rawReq("/api/pay?nonce=2"));
|
|
126
|
+
var q3 = await _runMw(routeMw, _rawReq("/api/pay?nonce=3"));
|
|
127
|
+
check("per-route: first request to the route allowed", q1.next === true);
|
|
128
|
+
check("per-route: query-string rotation hits the SAME route bucket (blocked)",
|
|
129
|
+
q2.next === false && q3.next === false);
|
|
130
|
+
|
|
131
|
+
// The fix strips the query, not the path: distinct route paths stay distinct.
|
|
132
|
+
var routeMw2 = b.middleware.rateLimit({
|
|
133
|
+
backend: "memory", algorithm: "fixed-window", max: 1,
|
|
134
|
+
windowMs: b.constants.TIME.hours(1), scope: "per-route",
|
|
135
|
+
});
|
|
136
|
+
var r1 = await _runMw(routeMw2, _rawReq("/api/pay"));
|
|
137
|
+
var r2 = await _runMw(routeMw2, _rawReq("/api/refund"));
|
|
138
|
+
check("per-route: distinct route paths keep distinct buckets",
|
|
139
|
+
r1.next === true && r2.next === true);
|
|
140
|
+
|
|
107
141
|
console.log("[rate-limit-xff-spoofing] OK — " + helpers.getChecks() + " checks passed");
|
|
108
142
|
}
|
|
109
143
|
|