@blamejs/blamejs-shop 0.5.12 → 0.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/vendor/MANIFEST.json +632 -416
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +21 -10
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +30 -9
- package/lib/vendor/blamejs/.github/dependabot.yml +8 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +7 -2
- package/lib/vendor/blamejs/.github/workflows/ci.yml +21 -21
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +4 -4
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +7 -7
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +3 -3
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +1 -1
- package/lib/vendor/blamejs/.gitignore +2 -0
- package/lib/vendor/blamejs/CHANGELOG.md +122 -0
- package/lib/vendor/blamejs/NOTICE +26 -1
- package/lib/vendor/blamejs/SECURITY.md +1 -1
- package/lib/vendor/blamejs/api-snapshot.json +207 -5
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +29 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +1 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +31 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +109 -0
- package/lib/vendor/blamejs/examples/wiki/nginx.conf +106 -0
- package/lib/vendor/blamejs/examples/wiki/package-lock.json +1 -1
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +92 -0
- package/lib/vendor/blamejs/fuzz/asn1-der.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/cms-codec.fuzz.js +17 -0
- package/lib/vendor/blamejs/fuzz/link-header.fuzz.js +18 -0
- package/lib/vendor/blamejs/index.js +6 -0
- package/lib/vendor/blamejs/lib/a2a.js +4 -4
- package/lib/vendor/blamejs/lib/agent-idempotency.js +18 -2
- package/lib/vendor/blamejs/lib/agent-saga.js +36 -8
- package/lib/vendor/blamejs/lib/agent-snapshot.js +63 -6
- package/lib/vendor/blamejs/lib/app-shutdown.js +23 -20
- package/lib/vendor/blamejs/lib/archive-read.js +8 -0
- package/lib/vendor/blamejs/lib/archive-tar.js +12 -2
- package/lib/vendor/blamejs/lib/arg-parser.js +49 -5
- package/lib/vendor/blamejs/lib/asn1-der.js +12 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +47 -1
- package/lib/vendor/blamejs/lib/audit.js +71 -8
- package/lib/vendor/blamejs/lib/auth/ciba.js +14 -2
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +58 -47
- package/lib/vendor/blamejs/lib/auth/jwt.js +34 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +90 -13
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +20 -17
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +214 -23
- package/lib/vendor/blamejs/lib/auth/saml.js +38 -20
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +10 -4
- package/lib/vendor/blamejs/lib/backup/bundle.js +13 -3
- package/lib/vendor/blamejs/lib/backup/index.js +16 -5
- package/lib/vendor/blamejs/lib/backup/manifest.js +18 -5
- package/lib/vendor/blamejs/lib/base32.js +21 -0
- package/lib/vendor/blamejs/lib/break-glass.js +19 -10
- package/lib/vendor/blamejs/lib/bundler.js +5 -1
- package/lib/vendor/blamejs/lib/cache-status.js +3 -7
- package/lib/vendor/blamejs/lib/calendar.js +21 -1
- package/lib/vendor/blamejs/lib/cbor.js +12 -1
- package/lib/vendor/blamejs/lib/cert.js +29 -11
- package/lib/vendor/blamejs/lib/cli.js +94 -24
- package/lib/vendor/blamejs/lib/cloud-events.js +2 -2
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +13 -3
- package/lib/vendor/blamejs/lib/codepoint-class.js +85 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +8 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +19 -4
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +6 -8
- package/lib/vendor/blamejs/lib/content-credentials.js +1 -1
- package/lib/vendor/blamejs/lib/content-digest.js +2 -1
- package/lib/vendor/blamejs/lib/cookies.js +13 -3
- package/lib/vendor/blamejs/lib/cose.js +31 -16
- package/lib/vendor/blamejs/lib/crypto-field.js +32 -0
- package/lib/vendor/blamejs/lib/crypto-oprf.js +11 -2
- package/lib/vendor/blamejs/lib/crypto-xwing.js +22 -4
- package/lib/vendor/blamejs/lib/crypto.js +314 -19
- package/lib/vendor/blamejs/lib/csp.js +11 -3
- package/lib/vendor/blamejs/lib/daemon.js +270 -24
- package/lib/vendor/blamejs/lib/dark-patterns.js +5 -2
- package/lib/vendor/blamejs/lib/db-declare-view.js +2 -2
- package/lib/vendor/blamejs/lib/db-query.js +34 -7
- package/lib/vendor/blamejs/lib/db.js +18 -6
- package/lib/vendor/blamejs/lib/dbsc.js +17 -0
- package/lib/vendor/blamejs/lib/dev.js +21 -2
- package/lib/vendor/blamejs/lib/dsr.js +157 -102
- package/lib/vendor/blamejs/lib/external-db.js +41 -2
- package/lib/vendor/blamejs/lib/file-upload.js +25 -7
- package/lib/vendor/blamejs/lib/flag-providers.js +27 -15
- package/lib/vendor/blamejs/lib/forms.js +113 -27
- package/lib/vendor/blamejs/lib/gate-contract.js +23 -10
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +8 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +1 -1
- package/lib/vendor/blamejs/lib/guard-archive.js +2 -2
- package/lib/vendor/blamejs/lib/guard-cidr.js +27 -1
- package/lib/vendor/blamejs/lib/guard-graphql.js +30 -11
- package/lib/vendor/blamejs/lib/guard-html.js +26 -53
- package/lib/vendor/blamejs/lib/guard-image.js +24 -5
- package/lib/vendor/blamejs/lib/guard-imap-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-jmap.js +19 -3
- package/lib/vendor/blamejs/lib/guard-jwt.js +18 -2
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +2 -2
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-markdown.js +11 -24
- package/lib/vendor/blamejs/lib/guard-pdf.js +18 -2
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +10 -2
- package/lib/vendor/blamejs/lib/guard-regex.js +8 -5
- package/lib/vendor/blamejs/lib/guard-svg.js +31 -32
- package/lib/vendor/blamejs/lib/guard-time.js +1 -1
- package/lib/vendor/blamejs/lib/guard-uuid.js +2 -2
- package/lib/vendor/blamejs/lib/html-balance.js +3 -3
- package/lib/vendor/blamejs/lib/http-client-cache.js +82 -4
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +16 -1
- package/lib/vendor/blamejs/lib/http-client.js +39 -7
- package/lib/vendor/blamejs/lib/http-message-signature.js +35 -1
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +31 -6
- package/lib/vendor/blamejs/lib/i18n.js +35 -21
- package/lib/vendor/blamejs/lib/incident-report.js +8 -1
- package/lib/vendor/blamejs/lib/ip-utils.js +11 -1
- package/lib/vendor/blamejs/lib/json-path.js +23 -1
- package/lib/vendor/blamejs/lib/jwk.js +20 -3
- package/lib/vendor/blamejs/lib/link-header.js +2 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +5 -1
- package/lib/vendor/blamejs/lib/log-stream.js +8 -3
- package/lib/vendor/blamejs/lib/mail-auth.js +123 -22
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-bounce.js +8 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +46 -10
- package/lib/vendor/blamejs/lib/mail-dav.js +22 -3
- package/lib/vendor/blamejs/lib/mail-dkim.js +96 -30
- package/lib/vendor/blamejs/lib/mail-helo.js +6 -1
- package/lib/vendor/blamejs/lib/mail-scan.js +23 -16
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +34 -8
- package/lib/vendor/blamejs/lib/mail-server-imap.js +3 -4
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +7 -11
- package/lib/vendor/blamejs/lib/mail-server-mx.js +93 -7
- package/lib/vendor/blamejs/lib/mail-server-registry.js +8 -2
- package/lib/vendor/blamejs/lib/mail.js +15 -5
- package/lib/vendor/blamejs/lib/metrics.js +268 -63
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +7 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +19 -4
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +5 -9
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +40 -8
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +24 -10
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -5
- package/lib/vendor/blamejs/lib/middleware/index.js +6 -1
- package/lib/vendor/blamejs/lib/middleware/nel.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +12 -1
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +6 -2
- package/lib/vendor/blamejs/lib/mtls-ca.js +18 -2
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +11 -1
- package/lib/vendor/blamejs/lib/network-dns.js +21 -2
- package/lib/vendor/blamejs/lib/network-tls.js +69 -7
- package/lib/vendor/blamejs/lib/nonce-store.js +9 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +7 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +31 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +1 -1
- package/lib/vendor/blamejs/lib/outbox.js +1 -1
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +9 -1
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +10 -1
- package/lib/vendor/blamejs/lib/permissions.js +6 -3
- package/lib/vendor/blamejs/lib/pid-probe.js +55 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +8 -1
- package/lib/vendor/blamejs/lib/pqc-software.js +3 -3
- package/lib/vendor/blamejs/lib/pubsub.js +20 -9
- package/lib/vendor/blamejs/lib/queue-local.js +8 -1
- package/lib/vendor/blamejs/lib/queue-redis.js +5 -0
- package/lib/vendor/blamejs/lib/redact.js +54 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +10 -2
- package/lib/vendor/blamejs/lib/restore.js +19 -0
- package/lib/vendor/blamejs/lib/retention.js +12 -4
- package/lib/vendor/blamejs/lib/router.js +60 -6
- package/lib/vendor/blamejs/lib/safe-buffer.js +69 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +8 -2
- package/lib/vendor/blamejs/lib/safe-dns.js +25 -20
- package/lib/vendor/blamejs/lib/safe-ical.js +7 -3
- package/lib/vendor/blamejs/lib/safe-mime.js +12 -1
- package/lib/vendor/blamejs/lib/safe-object.js +80 -0
- package/lib/vendor/blamejs/lib/safe-path.js +52 -4
- package/lib/vendor/blamejs/lib/safe-redirect.js +10 -2
- package/lib/vendor/blamejs/lib/safe-schema.js +4 -1
- package/lib/vendor/blamejs/lib/safe-sieve.js +33 -1
- package/lib/vendor/blamejs/lib/safe-sql.js +88 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +7 -3
- package/lib/vendor/blamejs/lib/scheduler.js +8 -1
- package/lib/vendor/blamejs/lib/security-assert.js +6 -6
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +74 -27
- package/lib/vendor/blamejs/lib/self-update.js +517 -87
- package/lib/vendor/blamejs/lib/server-timing.js +2 -4
- package/lib/vendor/blamejs/lib/session.js +34 -12
- package/lib/vendor/blamejs/lib/sql.js +15 -1
- package/lib/vendor/blamejs/lib/ssrf-guard.js +52 -0
- package/lib/vendor/blamejs/lib/static.js +55 -13
- package/lib/vendor/blamejs/lib/storage.js +8 -2
- package/lib/vendor/blamejs/lib/subject.js +6 -1
- package/lib/vendor/blamejs/lib/tenant-quota.js +52 -13
- package/lib/vendor/blamejs/lib/tls-exporter.js +3 -3
- package/lib/vendor/blamejs/lib/tsa.js +34 -13
- package/lib/vendor/blamejs/lib/uri-template.js +8 -1
- package/lib/vendor/blamejs/lib/vault/index.js +13 -0
- package/lib/vendor/blamejs/lib/vc.js +44 -5
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +26 -26
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +792 -1
- package/lib/vendor/blamejs/lib/vendor/noble-curves.cjs +3443 -1
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +2737 -1
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +39550 -13
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +55 -53
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5551 -5554
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +22459 -32
- package/lib/vendor/blamejs/lib/watcher.js +89 -17
- package/lib/vendor/blamejs/lib/webhook-dispatcher.js +25 -3
- package/lib/vendor/blamejs/lib/webhook.js +12 -2
- package/lib/vendor/blamejs/lib/ws-client.js +32 -1
- package/lib/vendor/blamejs/lib/xml-c14n.js +29 -1
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +1 -1
- package/lib/vendor/blamejs/package-lock.json +2 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.x.json +1462 -0
- package/lib/vendor/blamejs/release-notes/v0.17.0.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.1.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.10.json +30 -0
- package/lib/vendor/blamejs/release-notes/v0.17.11.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.12.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.13.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.17.14.json +40 -0
- package/lib/vendor/blamejs/release-notes/v0.17.15.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.16.json +27 -0
- package/lib/vendor/blamejs/release-notes/v0.17.17.json +31 -0
- package/lib/vendor/blamejs/release-notes/v0.17.18.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.19.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.2.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.20.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.21.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.22.json +18 -0
- package/lib/vendor/blamejs/release-notes/v0.17.3.json +43 -0
- package/lib/vendor/blamejs/release-notes/v0.17.4.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.5.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.6.json +26 -0
- package/lib/vendor/blamejs/release-notes/v0.17.7.json +35 -0
- package/lib/vendor/blamejs/release-notes/v0.17.8.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.17.9.json +26 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +4 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +293 -9
- package/lib/vendor/blamejs/socket.yml +94 -0
- package/lib/vendor/blamejs/test/00-primitives.js +605 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +12 -9
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +90 -1
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +122 -1
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +30 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +29 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-mysql.test.js +479 -0
- package/lib/vendor/blamejs/test/integration/dsr-cluster-pg.test.js +487 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +313 -5
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +80 -0
- package/lib/vendor/blamejs/test/integration/openid-federation-chain.test.js +275 -0
- package/lib/vendor/blamejs/test/integration/webhook-dispatcher-pg.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +1649 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +33 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +60 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +128 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-adapters.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-read.test.js +628 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-tar-read.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-wrap.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +15 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-anchor.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-tools.test.js +624 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit.test.js +769 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth.test.js +1697 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oid4vp.test.js +495 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password.test.js +500 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml.test.js +1809 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-status-list.test.js +243 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index.test.js +2226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/base32.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +693 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +603 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +557 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/case-insensitive-security-token-guard.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cbor.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +843 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba-authreqid-binding.test.js +77 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ciba.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli.test.js +2790 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster-lease-renewal-ttl.test.js +114 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cluster.test.js +1032 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +739 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/codepoint-class.test.js +8 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +194 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-lifecycle-proto-key.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +254 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +613 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/cookies.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cose.test.js +407 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-adversarial.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +10 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +24 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-oprf.test.js +17 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-spki-pin.test.js +183 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-xwing.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto.test.js +345 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +48 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +459 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +19 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query.test.js +1019 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db.test.js +1621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +462 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dnssec.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-verify.test.js +562 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +901 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +561 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db.test.js +1214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +46 -20
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +147 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +907 -38
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload.test.js +1135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forms.test.js +747 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gate-contract.test.js +1855 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-auth.test.js +117 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-cidr.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-domain.test.js +422 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-gate-disposition-coverage.test.js → guard-gate-disposition.test.js} +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-graphql.test.js +340 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-image.test.js +519 -45
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-imap-command.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jmap.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jsonpath.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-jwt.test.js +436 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +25 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +16 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mime.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-oauth.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pdf.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-regex.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-shell.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{guard-sql-coverage.test.js → guard-sql.test.js} +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-template.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-time.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-uuid.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache-authorization.test.js +347 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +908 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client.test.js +2874 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +643 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +1153 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +494 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ip-utils.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jsdoc-example-execution.test.js +177 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-path.test.js +103 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-schema.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwk.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +276 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream.test.js +241 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +2136 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +759 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +811 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +401 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +751 -8
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +864 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +830 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +635 -86
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +686 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +778 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +1438 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +449 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +773 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +623 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +13 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +877 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +326 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +242 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +1596 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +440 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics.test.js +1230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-assetlinks.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-body-parser.test.js +1169 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-bot-disclose.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-cookies.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-gpc.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-headers.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-host-allowlist.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-require-content-type.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{middleware-tus-upload-coverage.test.js → middleware-tus-upload.test.js} +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-web-app-manifest.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-crl-fingerprint-only.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +1727 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/network-nts.test.js +699 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy.test.js +1181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +1876 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nonce-store-enforce-replay-nonboolean.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ntp-check.test.js +122 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +378 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oid4vci.test.js +1016 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openid-federation.test.js +946 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox.test.js +818 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/own-property-membership-guards.test.js +109 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-safe-toml.test.js +543 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/{parsers-safe-yaml-coverage.test.js → parsers-safe-yaml.test.js} +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +649 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +524 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +22 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-xff-spoofing.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact.test.js +1031 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-bound-key.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/restore-empty-manifest-wipe.test.js +154 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention.test.js +600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-host-path-injection.test.js +231 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router.test.js +1277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer-linear-scans.test.js +14 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-buffer.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +28 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +245 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ini.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-json.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +518 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-object.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-schema.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sql.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +26 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler.test.js +157 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +396 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +930 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +755 -82
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +1053 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-strict-binding-missing-failclosed.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +636 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-offset-without-limit.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +1190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +850 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage.test.js +621 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/subject.test.js +47 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/template.test.js +582 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +587 -25
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +11 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tsa.test.js +524 -63
- package/lib/vendor/blamejs/test/layer-0-primitives/uri-template.test.js +27 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-rotate.test.js +866 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vc.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook-dispatcher.test.js +388 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket.test.js +1294 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +629 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/xml-c14n-attr-normalization.test.js +164 -0
- package/lib/vendor/blamejs/test/smoke.js +2 -0
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.16.0.json +0 -44
- package/lib/vendor/blamejs/release-notes/v0.16.1.json +0 -36
- package/lib/vendor/blamejs/release-notes/v0.16.2.json +0 -71
- package/lib/vendor/blamejs/release-notes/v0.16.3.json +0 -71
- package/lib/vendor/blamejs/test/layer-0-primitives/acme-coverage.test.js +0 -441
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-oauth-coverage.test.js +0 -482
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-saml-coverage.test.js +0 -671
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-index-coverage.test.js +0 -690
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-coverage.test.js +0 -238
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials-coverage.test.js +0 -319
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain-coverage.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth-coverage.test.js +0 -437
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-coverage.test.js +0 -443
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-coverage.test.js +0 -395
- package/lib/vendor/blamejs/test/layer-0-primitives/network-smtp-policy-coverage.test.js +0 -565
- package/lib/vendor/blamejs/test/layer-0-primitives/router-coverage.test.js +0 -592
- package/lib/vendor/blamejs/test/layer-0-primitives/sql-coverage.test.js +0 -422
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +0 -573
|
@@ -16,6 +16,7 @@ var path = helpers.path;
|
|
|
16
16
|
var check = helpers.check;
|
|
17
17
|
var setupTestDb = helpers.setupTestDb;
|
|
18
18
|
var teardownTestDb = helpers.teardownTestDb;
|
|
19
|
+
var waitUntil = helpers.waitUntil;
|
|
19
20
|
|
|
20
21
|
// ---- Surface ----
|
|
21
22
|
|
|
@@ -875,6 +876,580 @@ async function testValidationNewOpts() {
|
|
|
875
876
|
check("validation: rejects non-bool slidingTtl", threw);
|
|
876
877
|
}
|
|
877
878
|
|
|
879
|
+
// ---- Uncovered-branch coverage: config-time validation ----
|
|
880
|
+
|
|
881
|
+
async function testInfinityCapsAccepted() {
|
|
882
|
+
// maxEntries: Infinity and maxBytes: Infinity take the early-return
|
|
883
|
+
// branch in the validators (uncapped memory backend).
|
|
884
|
+
var c1 = b.cache.create({ namespace: "inf-entries", maxEntries: Infinity });
|
|
885
|
+
await c1.set("k", "v");
|
|
886
|
+
check("maxEntries: Infinity accepted (uncapped)", (await c1.get("k")) === "v");
|
|
887
|
+
await c1.close();
|
|
888
|
+
|
|
889
|
+
var c2 = b.cache.create({ namespace: "inf-bytes", maxBytes: Infinity });
|
|
890
|
+
await c2.set("k", "v");
|
|
891
|
+
check("maxBytes: Infinity accepted (uncapped)", (await c2.get("k")) === "v");
|
|
892
|
+
await c2.close();
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
async function testInvalidBackendString() {
|
|
896
|
+
var threwBogus = false;
|
|
897
|
+
try { b.cache.create({ namespace: "n", backend: "postgres-cache" }); }
|
|
898
|
+
catch (_e) { threwBogus = true; }
|
|
899
|
+
check("create() with unrecognized backend string throws", threwBogus);
|
|
900
|
+
|
|
901
|
+
// backend: "redis" with an empty-string redisUrl trips the length===0
|
|
902
|
+
// arm of the redisUrl guard (distinct from the missing-url arm).
|
|
903
|
+
var threwEmptyUrl = false;
|
|
904
|
+
try { b.cache.create({ namespace: "n", backend: "redis", redisUrl: "" }); }
|
|
905
|
+
catch (_e) { threwEmptyUrl = true; }
|
|
906
|
+
check("create() backend='redis' with empty redisUrl throws", threwEmptyUrl);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
async function testDefaultSizeOfVariants() {
|
|
910
|
+
// No custom sizeOf → the framework's _defaultSizeOf runs on every set().
|
|
911
|
+
// Drive the null/undefined, Buffer, and JSON-unserializable arms that the
|
|
912
|
+
// existing number/object/string cases never reach.
|
|
913
|
+
var c = b.cache.create({ namespace: "sizeof-default" });
|
|
914
|
+
await c.set("nul", null);
|
|
915
|
+
await c.set("buf", Buffer.from("hello"));
|
|
916
|
+
await c.set("big", { n: 10n }); // JSON.stringify throws on BigInt → catch → 0
|
|
917
|
+
check("default sizeOf: null value stored (0 bytes arm)", (await c.get("nul")) === null);
|
|
918
|
+
check("default sizeOf: Buffer value stored (length arm)", Buffer.isBuffer(await c.get("buf")));
|
|
919
|
+
check("default sizeOf: JSON-unserializable value stored (catch arm)",
|
|
920
|
+
(await c.get("big")).n === 10n);
|
|
921
|
+
// bytes() reflects: null=0, Buffer("hello")=5, bigint-object=0 → total 5.
|
|
922
|
+
check("default sizeOf: bytes() totals the finite arms only", (await c.bytes()) === 5);
|
|
923
|
+
await c.close();
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
// ---- Uncovered-branch coverage: memory has() lazy expiry ----
|
|
927
|
+
|
|
928
|
+
async function testHasExpiredEvicts() {
|
|
929
|
+
var clk = b.testing.fakeClock(1_000_000);
|
|
930
|
+
var captured = [];
|
|
931
|
+
var c = b.cache.create({
|
|
932
|
+
namespace: "has-expired",
|
|
933
|
+
ttlMs: 100,
|
|
934
|
+
clock: clk.now,
|
|
935
|
+
observability: { event: function (n, _v, l) { captured.push({ n: n, l: l }); } },
|
|
936
|
+
});
|
|
937
|
+
await c.set("k", "v");
|
|
938
|
+
clk.advance(200); // past ttl
|
|
939
|
+
check("has() on expired key returns false + lazy-evicts", (await c.has("k")) === false);
|
|
940
|
+
check("has() lazy-evict emits cache.eviction.expired",
|
|
941
|
+
captured.filter(function (e) { return e.n === "cache.eviction.expired"; }).length >= 1);
|
|
942
|
+
// The entry is physically gone now.
|
|
943
|
+
check("has() lazy-evict removed the entry", (await c.size()) === 0);
|
|
944
|
+
await c.close();
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
// ---- Uncovered-branch coverage: backend-error catch on every method ----
|
|
948
|
+
|
|
949
|
+
async function testBackendErrorAllMethods() {
|
|
950
|
+
var audit = b.testing.captureAudit();
|
|
951
|
+
var codedErr = function () { var e = new Error("backend down"); e.code = "ECONNREFUSED"; return e; };
|
|
952
|
+
var reject = function () { return Promise.reject(codedErr()); };
|
|
953
|
+
var failing = {
|
|
954
|
+
// required surface
|
|
955
|
+
get: reject,
|
|
956
|
+
set: reject,
|
|
957
|
+
del: reject,
|
|
958
|
+
clear: reject,
|
|
959
|
+
size: reject,
|
|
960
|
+
close: function () { return Promise.resolve(); },
|
|
961
|
+
// optional surface — present so the wrapper forwards (rather than
|
|
962
|
+
// falling back), letting the cache method's own catch fire.
|
|
963
|
+
has: reject,
|
|
964
|
+
bytes: reject,
|
|
965
|
+
invalidateTag: reject,
|
|
966
|
+
getTags: reject,
|
|
967
|
+
};
|
|
968
|
+
var c = b.cache.create({ namespace: "fail-all", backend: failing, audit: audit });
|
|
969
|
+
|
|
970
|
+
async function expectThrow(label, fn) {
|
|
971
|
+
var threw = false;
|
|
972
|
+
try { await fn(); } catch (_e) { threw = true; }
|
|
973
|
+
check(label, threw);
|
|
974
|
+
}
|
|
975
|
+
await expectThrow("get() propagates backend error", function () { return c.get("k"); });
|
|
976
|
+
await expectThrow("set() propagates backend error", function () { return c.set("k", "v"); });
|
|
977
|
+
await expectThrow("del() propagates backend error", function () { return c.del("k"); });
|
|
978
|
+
await expectThrow("has() propagates backend error", function () { return c.has("k"); });
|
|
979
|
+
await expectThrow("clear() propagates backend error", function () { return c.clear(); });
|
|
980
|
+
await expectThrow("size() propagates backend error", function () { return c.size(); });
|
|
981
|
+
await expectThrow("bytes() propagates backend error", function () { return c.bytes(); });
|
|
982
|
+
await expectThrow("invalidateTag() propagates backend error", function () { return c.invalidateTag("t"); });
|
|
983
|
+
await expectThrow("getTags() propagates backend error", function () { return c.getTags("k"); });
|
|
984
|
+
await expectThrow("wrap() propagates backend get error", function () { return c.wrap("k", function () { return "x"; }); });
|
|
985
|
+
|
|
986
|
+
var failedAudits = audit.byAction("cache.backend.failed");
|
|
987
|
+
check("every failing method emits a cache.backend.failed audit", failedAudits.length >= 10);
|
|
988
|
+
// The error's own .code rides in the audit metadata (the err.code arm).
|
|
989
|
+
check("backend.failed audit carries the backend error code",
|
|
990
|
+
failedAudits.some(function (e) { return e.metadata && e.metadata.code === "ECONNREFUSED"; }));
|
|
991
|
+
await c.close();
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
async function testUpdateMutatorThrows() {
|
|
995
|
+
// A mutatorFn that throws surfaces through backend.update as a backend
|
|
996
|
+
// error — driving cache.update's catch (emit + audit + rethrow).
|
|
997
|
+
var audit = b.testing.captureAudit();
|
|
998
|
+
var c = b.cache.create({ namespace: "upd-throw", audit: audit });
|
|
999
|
+
var threw = false;
|
|
1000
|
+
try {
|
|
1001
|
+
await c.update("k", function () { throw new Error("mutator boom"); });
|
|
1002
|
+
} catch (_e) { threw = true; }
|
|
1003
|
+
check("update() rethrows a throwing mutator", threw);
|
|
1004
|
+
check("update() throwing mutator emits cache.backend.failed audit",
|
|
1005
|
+
audit.byAction("cache.backend.failed").length === 1);
|
|
1006
|
+
await c.close();
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
// ---- Uncovered-branch coverage: custom-backend optional-method fallbacks ----
|
|
1010
|
+
|
|
1011
|
+
async function testCustomBackendOptionalFallbacks() {
|
|
1012
|
+
// A custom backend that implements ONLY the required surface. The
|
|
1013
|
+
// wrapper synthesizes has (get-and-coerce), bytes (0), invalidateTag
|
|
1014
|
+
// (0), getTags (null).
|
|
1015
|
+
var store = new Map();
|
|
1016
|
+
var minimal = {
|
|
1017
|
+
get: function (k) { return Promise.resolve(store.get(k)); },
|
|
1018
|
+
set: function (k, v) { store.set(k, v); return Promise.resolve(); },
|
|
1019
|
+
del: function (k) { var ex = store.has(k); store.delete(k); return Promise.resolve(ex); },
|
|
1020
|
+
clear: function () { var n = store.size; store.clear(); return Promise.resolve(n); },
|
|
1021
|
+
size: function () { return Promise.resolve(store.size); },
|
|
1022
|
+
close: function () { return Promise.resolve(); },
|
|
1023
|
+
};
|
|
1024
|
+
var c = b.cache.create({ namespace: "custom-min", backend: minimal });
|
|
1025
|
+
await c.set("present", "v");
|
|
1026
|
+
check("custom has() falls back to get-and-coerce (present → true)", (await c.has("present")) === true);
|
|
1027
|
+
check("custom has() falls back to get-and-coerce (absent → false)", (await c.has("absent")) === false);
|
|
1028
|
+
check("custom bytes() falls back to 0", (await c.bytes()) === 0);
|
|
1029
|
+
check("custom invalidateTag() falls back to 0", (await c.invalidateTag("t")) === 0);
|
|
1030
|
+
check("custom getTags() falls back to null", (await c.getTags("present")) === null);
|
|
1031
|
+
await c.close();
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
async function testSealRejectedOnNonCluster() {
|
|
1035
|
+
var c = b.cache.create({ namespace: "seal-mem" });
|
|
1036
|
+
var threwSet = false;
|
|
1037
|
+
try { await c.set("k", "v", { seal: true }); } catch (_e) { threwSet = true; }
|
|
1038
|
+
check("set(seal:true) on memory backend throws (cluster-only feature)", threwSet);
|
|
1039
|
+
|
|
1040
|
+
var threwUpd = false;
|
|
1041
|
+
try { await c.update("k", function () { return { value: "v" }; }, { seal: true }); }
|
|
1042
|
+
catch (_e) { threwUpd = true; }
|
|
1043
|
+
check("update(seal:true) on memory backend throws (cluster-only feature)", threwUpd);
|
|
1044
|
+
await c.close();
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
async function testUpdateUnsupportedAndBadMutator() {
|
|
1048
|
+
// Custom backend has no atomic update → cache.update throws UNSUPPORTED.
|
|
1049
|
+
var store = new Map();
|
|
1050
|
+
var minimal = {
|
|
1051
|
+
get: function (k) { return Promise.resolve(store.get(k)); },
|
|
1052
|
+
set: function (k, v) { store.set(k, v); return Promise.resolve(); },
|
|
1053
|
+
del: function (k) { store.delete(k); return Promise.resolve(true); },
|
|
1054
|
+
clear: function () { store.clear(); return Promise.resolve(0); },
|
|
1055
|
+
size: function () { return Promise.resolve(store.size); },
|
|
1056
|
+
close: function () { return Promise.resolve(); },
|
|
1057
|
+
};
|
|
1058
|
+
var cCustom = b.cache.create({ namespace: "upd-unsupported", backend: minimal });
|
|
1059
|
+
var threwUnsupported = false;
|
|
1060
|
+
try { await cCustom.update("k", function () { return { value: 1 }; }); }
|
|
1061
|
+
catch (_e) { threwUnsupported = true; }
|
|
1062
|
+
check("update() on a custom backend without update throws UNSUPPORTED", threwUnsupported);
|
|
1063
|
+
await cCustom.close();
|
|
1064
|
+
|
|
1065
|
+
// Non-function mutator → BAD_OPT (guarded before backend dispatch).
|
|
1066
|
+
var cMem = b.cache.create({ namespace: "upd-badmutator" });
|
|
1067
|
+
var threwBadMutator = false;
|
|
1068
|
+
try { await cMem.update("k", "not-a-function"); } catch (_e) { threwBadMutator = true; }
|
|
1069
|
+
check("update() with non-function mutator throws", threwBadMutator);
|
|
1070
|
+
await cMem.close();
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
async function testInvalidateTagBadArg() {
|
|
1074
|
+
var c = b.cache.create({ namespace: "tag-badarg" });
|
|
1075
|
+
var threwNonString = false;
|
|
1076
|
+
try { await c.invalidateTag(42); } catch (_e) { threwNonString = true; }
|
|
1077
|
+
check("invalidateTag(non-string) throws", threwNonString);
|
|
1078
|
+
|
|
1079
|
+
var threwEmpty = false;
|
|
1080
|
+
try { await c.invalidateTag(""); } catch (_e) { threwEmpty = true; }
|
|
1081
|
+
check("invalidateTag('') throws", threwEmpty);
|
|
1082
|
+
await c.close();
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
async function testUpdateMemoryExpiresAtDecision() {
|
|
1086
|
+
// A committing decision may pin the written value's absolute expiry via
|
|
1087
|
+
// { value, expiresAt } — the branch distinct from the { value, ttlMs }
|
|
1088
|
+
// case the existing update test drives.
|
|
1089
|
+
var nowMs = 6_000_000;
|
|
1090
|
+
var c = b.cache.create({ namespace: "upd-expiresat", clock: function () { return nowMs; } });
|
|
1091
|
+
await c.update("k", function () { return { value: "pinned", expiresAt: nowMs + 50 }; });
|
|
1092
|
+
check("update decision.expiresAt honored (before expiry)", (await c.get("k")) === "pinned");
|
|
1093
|
+
nowMs += 100;
|
|
1094
|
+
check("update decision.expiresAt honored (after expiry)", (await c.get("k")) === undefined);
|
|
1095
|
+
await c.close();
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
async function testObservabilitySinkThrowsSwallowed() {
|
|
1099
|
+
// The hot-path observability sink is drop-silent: a throwing operator
|
|
1100
|
+
// sink must not surface to the caller.
|
|
1101
|
+
var c = b.cache.create({
|
|
1102
|
+
namespace: "obs-throw",
|
|
1103
|
+
observability: { event: function () { throw new Error("sink boom"); } },
|
|
1104
|
+
});
|
|
1105
|
+
var surfaced = false;
|
|
1106
|
+
try {
|
|
1107
|
+
await c.set("k", "v");
|
|
1108
|
+
await c.get("k");
|
|
1109
|
+
} catch (_e) { surfaced = true; }
|
|
1110
|
+
check("throwing observability sink is swallowed (drop-silent)", surfaced === false);
|
|
1111
|
+
await c.close();
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
// ---- Uncovered-branch coverage: SWR internals ----
|
|
1115
|
+
|
|
1116
|
+
async function testSwrInfinityTtl() {
|
|
1117
|
+
// SWR write path with an Infinity ttl: hard-TTL stays Infinity, no soft
|
|
1118
|
+
// expiry is tracked (the else arm), entry never goes stale.
|
|
1119
|
+
var nowMs = 1_700_000_000_000;
|
|
1120
|
+
var c = b.cache.create({
|
|
1121
|
+
namespace: "swr-inf",
|
|
1122
|
+
ttlMs: b.constants.TIME.minutes(5),
|
|
1123
|
+
staleWhileRevalidate: true,
|
|
1124
|
+
clock: function () { return nowMs; },
|
|
1125
|
+
});
|
|
1126
|
+
var calls = 0;
|
|
1127
|
+
var fn = function () { calls++; return "v"; };
|
|
1128
|
+
await c.wrap("k", fn, { ttlMs: Infinity });
|
|
1129
|
+
nowMs += b.constants.TIME.days(365);
|
|
1130
|
+
var again = await c.wrap("k", fn, { ttlMs: Infinity });
|
|
1131
|
+
check("SWR Infinity ttl: value never goes stale (no recompute)",
|
|
1132
|
+
again === "v" && calls === 1);
|
|
1133
|
+
await c.close();
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
async function testSwrBackgroundRefreshFailure() {
|
|
1137
|
+
// Past soft TTL, the background refresh runs fn again; when that fn
|
|
1138
|
+
// rejects, the stale value was already served and the failure surfaces
|
|
1139
|
+
// only via cache.refresh.failed observability.
|
|
1140
|
+
var nowMs = 1_700_000_000_000;
|
|
1141
|
+
var captured = [];
|
|
1142
|
+
var c = b.cache.create({
|
|
1143
|
+
namespace: "swr-refresh-fail",
|
|
1144
|
+
ttlMs: 100,
|
|
1145
|
+
staleWhileRevalidate: true,
|
|
1146
|
+
clock: function () { return nowMs; },
|
|
1147
|
+
observability: { event: function (n, _v, l) { captured.push({ n: n, l: l }); } },
|
|
1148
|
+
});
|
|
1149
|
+
var mode = "ok";
|
|
1150
|
+
var fn = function () {
|
|
1151
|
+
if (mode === "boom") return Promise.reject(new Error("refresh failed"));
|
|
1152
|
+
return Promise.resolve("fresh");
|
|
1153
|
+
};
|
|
1154
|
+
var first = await c.wrap("k", fn);
|
|
1155
|
+
check("SWR refresh-fail: first call computes fresh", first === "fresh");
|
|
1156
|
+
|
|
1157
|
+
nowMs += 150; // past soft (100), before hard (200)
|
|
1158
|
+
mode = "boom";
|
|
1159
|
+
var stale = await c.wrap("k", fn); // serves stale + kicks background refresh
|
|
1160
|
+
check("SWR refresh-fail: serves stale while refreshing", stale === "fresh");
|
|
1161
|
+
|
|
1162
|
+
await waitUntil(function () {
|
|
1163
|
+
return captured.filter(function (e) { return e.n === "cache.refresh.failed"; }).length >= 1;
|
|
1164
|
+
}, { timeoutMs: 4000, label: "swr background refresh failure emitted" });
|
|
1165
|
+
check("SWR refresh-fail: emits cache.refresh.failed on background error",
|
|
1166
|
+
captured.filter(function (e) { return e.n === "cache.refresh.failed"; }).length >= 1);
|
|
1167
|
+
await c.close();
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
async function testSwrWriteFailure() {
|
|
1171
|
+
// Under SWR, a miss computes the value then persists it through
|
|
1172
|
+
// _writeWithSwr; when that backend.set rejects, the failure is captured
|
|
1173
|
+
// via observability + audit and does not fail the wrap.
|
|
1174
|
+
var audit = b.testing.captureAudit();
|
|
1175
|
+
var readOnlyBackend = {
|
|
1176
|
+
get: function () { return Promise.resolve(undefined); }, // always a miss
|
|
1177
|
+
set: function () { return Promise.reject(new Error("read-only")); },
|
|
1178
|
+
del: function () { return Promise.resolve(false); },
|
|
1179
|
+
clear: function () { return Promise.resolve(0); },
|
|
1180
|
+
size: function () { return Promise.resolve(0); },
|
|
1181
|
+
close: function () { return Promise.resolve(); },
|
|
1182
|
+
};
|
|
1183
|
+
var c = b.cache.create({
|
|
1184
|
+
namespace: "swr-write-fail",
|
|
1185
|
+
backend: readOnlyBackend,
|
|
1186
|
+
audit: audit,
|
|
1187
|
+
staleWhileRevalidate: true,
|
|
1188
|
+
ttlMs: 100,
|
|
1189
|
+
});
|
|
1190
|
+
var v = await c.wrap("k", function () { return "computed"; });
|
|
1191
|
+
check("SWR write-fail: wrap returns computed value despite failed set", v === "computed");
|
|
1192
|
+
await waitUntil(function () { return audit.byAction("cache.backend.failed").length >= 1; },
|
|
1193
|
+
{ timeoutMs: 4000, label: "SWR _writeWithSwr set failure audited" });
|
|
1194
|
+
check("SWR write-fail: failed persist emits cache.backend.failed audit",
|
|
1195
|
+
audit.byAction("cache.backend.failed").length >= 1);
|
|
1196
|
+
await c.close();
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
async function testRedisBackendConstructs() {
|
|
1200
|
+
// The redis backend wires through cache-redis with a lazy connect, so
|
|
1201
|
+
// building + closing the instance is network-free (no op ever fires).
|
|
1202
|
+
// This exercises the create() redis-backend resolution branch without a
|
|
1203
|
+
// live server.
|
|
1204
|
+
var c = b.cache.create({
|
|
1205
|
+
namespace: "redis-construct",
|
|
1206
|
+
backend: "redis",
|
|
1207
|
+
redisUrl: "redis://127.0.0.1:6390/0",
|
|
1208
|
+
});
|
|
1209
|
+
check("redis backend: instance exposes get/set/close",
|
|
1210
|
+
typeof c.get === "function" && typeof c.set === "function" && typeof c.close === "function");
|
|
1211
|
+
check("redis backend: resolved as a custom-wrapped backend", c._backend && c._backend.name === "custom");
|
|
1212
|
+
await c.close(); // never connected — close is a no-op teardown
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
async function testWrapSetFailureNonSwr() {
|
|
1216
|
+
// Non-SWR wrap: a miss computes the value, then the backend.set rejects.
|
|
1217
|
+
// The wrap still resolves to the computed value (failed write doesn't
|
|
1218
|
+
// fail the wrap) but emits cache.backend.failed.
|
|
1219
|
+
var audit = b.testing.captureAudit();
|
|
1220
|
+
var readOnlyBackend = {
|
|
1221
|
+
get: function () { return Promise.resolve(undefined); }, // always a miss
|
|
1222
|
+
set: function () { return Promise.reject(new Error("read-only")); },
|
|
1223
|
+
del: function () { return Promise.resolve(false); },
|
|
1224
|
+
clear: function () { return Promise.resolve(0); },
|
|
1225
|
+
size: function () { return Promise.resolve(0); },
|
|
1226
|
+
close: function () { return Promise.resolve(); },
|
|
1227
|
+
};
|
|
1228
|
+
var c = b.cache.create({ namespace: "wrap-set-fail", backend: readOnlyBackend, audit: audit });
|
|
1229
|
+
var v = await c.wrap("k", function () { return "computed"; });
|
|
1230
|
+
check("wrap: computed value returned despite failed backend write", v === "computed");
|
|
1231
|
+
check("wrap: failed backend write emits cache.backend.failed audit",
|
|
1232
|
+
audit.byAction("cache.backend.failed").length >= 1);
|
|
1233
|
+
await c.close();
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
// ---- Uncovered-branch coverage: cross-node invalidation via pubsub ----
|
|
1237
|
+
|
|
1238
|
+
async function testMemoryInfinityWriteArms() {
|
|
1239
|
+
// The Infinity-lifetime arm of set / update / wrap expiry resolution
|
|
1240
|
+
// (expiresAt = Infinity rather than clock()+ttlMs), plus getTags on an
|
|
1241
|
+
// entry stored without any tags (the empty-array arm).
|
|
1242
|
+
var c = b.cache.create({ namespace: "inf-arms", ttlMs: 100 });
|
|
1243
|
+
await c.set("s", "v", { ttlMs: Infinity });
|
|
1244
|
+
check("set(ttlMs:Infinity): getTags on an untagged entry returns []",
|
|
1245
|
+
Array.isArray(await c.getTags("s")) && (await c.getTags("s")).length === 0);
|
|
1246
|
+
|
|
1247
|
+
await c.update("u", function () { return { value: 1 }; }, { ttlMs: Infinity });
|
|
1248
|
+
check("update(ttlMs:Infinity): value written", (await c.get("u")) === 1);
|
|
1249
|
+
|
|
1250
|
+
var w = await c.wrap("w", function () { return "computed"; }, { ttlMs: Infinity });
|
|
1251
|
+
check("wrap(ttlMs:Infinity): value computed + cached", w === "computed" && (await c.get("w")) === "computed");
|
|
1252
|
+
await c.close();
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
async function testClusterInfinityAndEmptyClear() {
|
|
1256
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-cache-infclu-"));
|
|
1257
|
+
try {
|
|
1258
|
+
await setupTestDb(tmpDir);
|
|
1259
|
+
var c = b.cache.create({ namespace: "cb-inf", backend: "cluster", ttlMs: 100 });
|
|
1260
|
+
// clear() over an empty namespace: rowCount is falsy → the `|| 0` arm.
|
|
1261
|
+
check("cluster clear on empty namespace returns 0", (await c.clear()) === 0);
|
|
1262
|
+
|
|
1263
|
+
await c.set("s", { forever: true }, { ttlMs: Infinity }); // storedExpires = MAX_SAFE arm
|
|
1264
|
+
check("cluster set(ttlMs:Infinity): value round-trips", (await c.get("s")).forever === true);
|
|
1265
|
+
|
|
1266
|
+
await c.update("u", function () { return { value: "kept" }; }, { ttlMs: Infinity });
|
|
1267
|
+
check("cluster update(ttlMs:Infinity): value written", (await c.get("u")) === "kept");
|
|
1268
|
+
await c.close();
|
|
1269
|
+
} finally {
|
|
1270
|
+
await teardownTestDb(tmpDir);
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
async function testInvalidationPubsubBadShape() {
|
|
1275
|
+
var threw = false;
|
|
1276
|
+
try {
|
|
1277
|
+
b.cache.create({ namespace: "bad-ps", invalidationPubsub: { publish: function () {} } });
|
|
1278
|
+
} catch (_e) { threw = true; }
|
|
1279
|
+
check("create() rejects an invalidationPubsub missing subscribe/unsubscribe", threw);
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
async function testInvalidationPubsubCrossNode() {
|
|
1283
|
+
var ps = b.pubsub.create({ backend: "local" });
|
|
1284
|
+
// Two memory-backed instances sharing one namespace + pubsub simulate two
|
|
1285
|
+
// nodes: a mutation on one mirrors to the other's local store.
|
|
1286
|
+
var nodeA = b.cache.create({ namespace: "xnode", invalidationPubsub: ps });
|
|
1287
|
+
var nodeB = b.cache.create({ namespace: "xnode", invalidationPubsub: ps });
|
|
1288
|
+
try {
|
|
1289
|
+
// del propagation
|
|
1290
|
+
await nodeB.set("k", "v");
|
|
1291
|
+
await nodeA.del("k");
|
|
1292
|
+
await waitUntil(async function () { return (await nodeB.get("k")) === undefined; },
|
|
1293
|
+
{ timeoutMs: 4000, label: "cross-node del propagates to nodeB" });
|
|
1294
|
+
check("cross-node del propagates", (await nodeB.get("k")) === undefined);
|
|
1295
|
+
|
|
1296
|
+
// tag propagation
|
|
1297
|
+
await nodeB.set("t1", "v", { tags: ["grp"] });
|
|
1298
|
+
await nodeA.invalidateTag("grp");
|
|
1299
|
+
await waitUntil(async function () { return (await nodeB.get("t1")) === undefined; },
|
|
1300
|
+
{ timeoutMs: 4000, label: "cross-node invalidateTag propagates to nodeB" });
|
|
1301
|
+
check("cross-node invalidateTag propagates", (await nodeB.get("t1")) === undefined);
|
|
1302
|
+
|
|
1303
|
+
// clear propagation
|
|
1304
|
+
await nodeB.set("c1", "v");
|
|
1305
|
+
await nodeB.set("c2", "v");
|
|
1306
|
+
await nodeA.clear();
|
|
1307
|
+
await waitUntil(async function () { return (await nodeB.size()) === 0; },
|
|
1308
|
+
{ timeoutMs: 4000, label: "cross-node clear propagates to nodeB" });
|
|
1309
|
+
check("cross-node clear propagates", (await nodeB.size()) === 0);
|
|
1310
|
+
} finally {
|
|
1311
|
+
await nodeA.close(); // exercises the pubsub unsubscribe-on-close path
|
|
1312
|
+
await nodeB.close();
|
|
1313
|
+
if (ps.close) await ps.close();
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
// ---- Uncovered-branch coverage: cluster sliding TTL / seal / sweep ----
|
|
1318
|
+
|
|
1319
|
+
async function testClusterSlidingTtl() {
|
|
1320
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-cache-slide-"));
|
|
1321
|
+
try {
|
|
1322
|
+
await setupTestDb(tmpDir);
|
|
1323
|
+
var nowMs = 2_000_000;
|
|
1324
|
+
var c = b.cache.create({
|
|
1325
|
+
namespace: "cb-slide",
|
|
1326
|
+
backend: "cluster",
|
|
1327
|
+
ttlMs: 100,
|
|
1328
|
+
slidingTtl: true,
|
|
1329
|
+
clock: function () { return nowMs; },
|
|
1330
|
+
});
|
|
1331
|
+
await c.set("k", "v"); // expiresAt = 2_000_100
|
|
1332
|
+
nowMs += 80; // clock 2_000_080
|
|
1333
|
+
// This read fires the best-effort sliding extension: expiresAt →
|
|
1334
|
+
// 2_000_080 + 100 = 2_000_180 (a fire-and-forget UPDATE).
|
|
1335
|
+
check("cluster sliding: read before original expiry returns", (await c.get("k")) === "v");
|
|
1336
|
+
// Advance PAST the original 100ms expiry but before the extended one.
|
|
1337
|
+
// has() (a non-mutating select honoring expiresAt) becomes true only
|
|
1338
|
+
// once the extension UPDATE has committed — a deterministic signal that
|
|
1339
|
+
// the slide landed, with no lazy-purge / re-slide side effects.
|
|
1340
|
+
nowMs = 2_000_150;
|
|
1341
|
+
await waitUntil(async function () { return (await c.has("k")) === true; },
|
|
1342
|
+
{ timeoutMs: 2000, label: "cluster sliding extension committed past original ttl" });
|
|
1343
|
+
check("cluster sliding: read after original ttl still returns (extended)",
|
|
1344
|
+
(await c.get("k")) === "v");
|
|
1345
|
+
await c.close();
|
|
1346
|
+
} finally {
|
|
1347
|
+
await teardownTestDb(tmpDir);
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
async function testClusterSealAndUpdateLifetimes() {
|
|
1352
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-cache-seal-"));
|
|
1353
|
+
try {
|
|
1354
|
+
await setupTestDb(tmpDir);
|
|
1355
|
+
var nowMs = 3_000_000;
|
|
1356
|
+
var c = b.cache.create({
|
|
1357
|
+
namespace: "cb-seal",
|
|
1358
|
+
backend: "cluster",
|
|
1359
|
+
ttlMs: b.constants.TIME.minutes(5),
|
|
1360
|
+
clock: function () { return nowMs; },
|
|
1361
|
+
});
|
|
1362
|
+
// Sealed write + sealed read (marker-prefix encode/decode path).
|
|
1363
|
+
await c.set("s", { secret: "top" }, { seal: true });
|
|
1364
|
+
check("cluster seal: sealed value round-trips", (await c.get("s")).secret === "top");
|
|
1365
|
+
|
|
1366
|
+
// Atomic update over the sealed row: reads+unseals current, reseals new.
|
|
1367
|
+
var r = await c.update("s", function (cur) {
|
|
1368
|
+
return { value: { secret: (cur && cur.secret) + "!" }, seal: true };
|
|
1369
|
+
}, { seal: true });
|
|
1370
|
+
check("cluster seal: update over sealed row reseals",
|
|
1371
|
+
r.updated === true && (await c.get("s")).secret === "top!");
|
|
1372
|
+
|
|
1373
|
+
// update decision that pins the written value's own lifetime.
|
|
1374
|
+
await c.update("ttlkey", function () { return { value: "short", ttlMs: 100 }; });
|
|
1375
|
+
check("cluster update decision.ttlMs: present before expiry", (await c.get("ttlkey")) === "short");
|
|
1376
|
+
|
|
1377
|
+
await c.update("expkey", function () { return { value: "pinned", expiresAt: nowMs + 100 }; });
|
|
1378
|
+
check("cluster update decision.expiresAt: present before expiry", (await c.get("expkey")) === "pinned");
|
|
1379
|
+
|
|
1380
|
+
nowMs += 200;
|
|
1381
|
+
check("cluster update decision.ttlMs: expired after advance", (await c.get("ttlkey")) === undefined);
|
|
1382
|
+
check("cluster update decision.expiresAt: expired after advance", (await c.get("expkey")) === undefined);
|
|
1383
|
+
await c.close();
|
|
1384
|
+
} finally {
|
|
1385
|
+
await teardownTestDb(tmpDir);
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
async function testClusterBytesReturnsZero() {
|
|
1390
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-cache-bytes-"));
|
|
1391
|
+
try {
|
|
1392
|
+
await setupTestDb(tmpDir);
|
|
1393
|
+
var c = b.cache.create({ namespace: "cb-bytes", backend: "cluster" });
|
|
1394
|
+
// The cluster backend does not track byte accounting → bytes() → 0.
|
|
1395
|
+
check("cluster bytes() returns 0 (no byte accounting)", (await c.bytes()) === 0);
|
|
1396
|
+
await c.close();
|
|
1397
|
+
} finally {
|
|
1398
|
+
await teardownTestDb(tmpDir);
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
async function testMemorySweepTimerFires() {
|
|
1403
|
+
// The periodic sweep purges expired entries and emits one
|
|
1404
|
+
// cache.eviction.expired per purged key. Uses the real timer (minimum
|
|
1405
|
+
// 1000ms cadence) with real wall-clock TTL so entries are expired when
|
|
1406
|
+
// the sweep runs; polls the observability signal.
|
|
1407
|
+
var captured = [];
|
|
1408
|
+
var c = b.cache.create({
|
|
1409
|
+
namespace: "mem-sweep",
|
|
1410
|
+
ttlMs: 100, // real-clock 100ms — expired well before first sweep
|
|
1411
|
+
sweepIntervalMs: 1000,
|
|
1412
|
+
observability: { event: function (n, _v, l) { captured.push({ n: n, l: l }); } },
|
|
1413
|
+
});
|
|
1414
|
+
try {
|
|
1415
|
+
await c.set("a", 1);
|
|
1416
|
+
await c.set("b", 2);
|
|
1417
|
+
// Do NOT read — let the sweep timer, not lazy purge, do the eviction.
|
|
1418
|
+
await waitUntil(function () {
|
|
1419
|
+
return captured.filter(function (e) { return e.n === "cache.eviction.expired"; }).length >= 2;
|
|
1420
|
+
}, { timeoutMs: 5000, label: "memory sweep timer purges expired entries" });
|
|
1421
|
+
check("memory sweep timer emits cache.eviction.expired for purged entries",
|
|
1422
|
+
captured.filter(function (e) { return e.n === "cache.eviction.expired"; }).length >= 2);
|
|
1423
|
+
} finally {
|
|
1424
|
+
await c.close();
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
async function testClusterSweepTimerFires() {
|
|
1429
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "blamejs-cache-sweep-"));
|
|
1430
|
+
try {
|
|
1431
|
+
await setupTestDb(tmpDir);
|
|
1432
|
+
var c = b.cache.create({
|
|
1433
|
+
namespace: "cb-sweep",
|
|
1434
|
+
backend: "cluster",
|
|
1435
|
+
ttlMs: 100, // real-clock 100ms
|
|
1436
|
+
sweepIntervalMs: 1000,
|
|
1437
|
+
});
|
|
1438
|
+
// Tag rows are read without an expiry filter, so getTags keeps returning
|
|
1439
|
+
// the tag until the sweep physically deletes the junction row — a clean
|
|
1440
|
+
// signal that the sweep DELETE (not lazy purge) ran.
|
|
1441
|
+
await c.set("k", "v", { tags: ["swept"] });
|
|
1442
|
+
check("cluster sweep: tag present before sweep", (await c.getTags("k")).length === 1);
|
|
1443
|
+
await waitUntil(async function () { return (await c.getTags("k")).length === 0; },
|
|
1444
|
+
{ timeoutMs: 5000, label: "cluster sweep timer deletes expired rows + tags" });
|
|
1445
|
+
check("cluster sweep timer deletes expired rows + their tag rows",
|
|
1446
|
+
(await c.getTags("k")).length === 0);
|
|
1447
|
+
await c.close();
|
|
1448
|
+
} finally {
|
|
1449
|
+
await teardownTestDb(tmpDir);
|
|
1450
|
+
}
|
|
1451
|
+
}
|
|
1452
|
+
|
|
878
1453
|
async function run() {
|
|
879
1454
|
await testSurface();
|
|
880
1455
|
await testValidation();
|
|
@@ -919,6 +1494,34 @@ async function run() {
|
|
|
919
1494
|
await testTagsValidateFormat();
|
|
920
1495
|
await testInvalidateTagAuditEmit();
|
|
921
1496
|
await testInvalidateTagOnCluster();
|
|
1497
|
+
|
|
1498
|
+
// Uncovered-branch coverage sweep
|
|
1499
|
+
await testInfinityCapsAccepted();
|
|
1500
|
+
await testInvalidBackendString();
|
|
1501
|
+
await testDefaultSizeOfVariants();
|
|
1502
|
+
await testHasExpiredEvicts();
|
|
1503
|
+
await testBackendErrorAllMethods();
|
|
1504
|
+
await testUpdateMutatorThrows();
|
|
1505
|
+
await testCustomBackendOptionalFallbacks();
|
|
1506
|
+
await testSealRejectedOnNonCluster();
|
|
1507
|
+
await testUpdateUnsupportedAndBadMutator();
|
|
1508
|
+
await testInvalidateTagBadArg();
|
|
1509
|
+
await testUpdateMemoryExpiresAtDecision();
|
|
1510
|
+
await testObservabilitySinkThrowsSwallowed();
|
|
1511
|
+
await testSwrInfinityTtl();
|
|
1512
|
+
await testSwrBackgroundRefreshFailure();
|
|
1513
|
+
await testSwrWriteFailure();
|
|
1514
|
+
await testRedisBackendConstructs();
|
|
1515
|
+
await testWrapSetFailureNonSwr();
|
|
1516
|
+
await testMemoryInfinityWriteArms();
|
|
1517
|
+
await testClusterInfinityAndEmptyClear();
|
|
1518
|
+
await testInvalidationPubsubBadShape();
|
|
1519
|
+
await testInvalidationPubsubCrossNode();
|
|
1520
|
+
await testClusterSlidingTtl();
|
|
1521
|
+
await testClusterSealAndUpdateLifetimes();
|
|
1522
|
+
await testClusterBytesReturnsZero();
|
|
1523
|
+
await testMemorySweepTimerFires();
|
|
1524
|
+
await testClusterSweepTimerFires();
|
|
922
1525
|
}
|
|
923
1526
|
|
|
924
1527
|
module.exports = { run: run };
|