@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
|
@@ -116,6 +116,7 @@ var bCrypto = require("./crypto");
|
|
|
116
116
|
var lazyRequire = require("./lazy-require");
|
|
117
117
|
var validateOpts = require("./validate-opts");
|
|
118
118
|
var safeSql = require("./safe-sql");
|
|
119
|
+
var sql = require("./sql");
|
|
119
120
|
var safeJson = require("./safe-json");
|
|
120
121
|
var boundedMap = require("./bounded-map");
|
|
121
122
|
var { defineClass } = require("./framework-error");
|
|
@@ -124,6 +125,13 @@ var DsrError = defineClass("DsrError", { alwaysPermanent: true });
|
|
|
124
125
|
|
|
125
126
|
var audit = lazyRequire(function () { return require("./audit"); });
|
|
126
127
|
var observability = lazyRequire(function () { return require("./observability"); });
|
|
128
|
+
|
|
129
|
+
// A vaulted store AEAD-seals + base64-encodes the payload before binding it
|
|
130
|
+
// (~4/3 expansion), and the bound cell must fit b.sql's 64 MiB per-value
|
|
131
|
+
// ceiling. Cap the plaintext at an expansion-safe size — leave a KiB for the
|
|
132
|
+
// vault nonce / tag / prefix — so the sealed cell binds through b.sql; a
|
|
133
|
+
// plaintext store keeps the full read ceiling (safeJson.ABSOLUTE_MAX_BYTES).
|
|
134
|
+
var VAULTED_SEAL_SAFE_MAX_BYTES = Math.floor(safeJson.ABSOLUTE_MAX_BYTES * 3 / 4) - C.BYTES.kib(1);
|
|
127
135
|
// cryptoField + vault lazy-required: dbTicketStore seals subject PII + the
|
|
128
136
|
// full ticket payload at rest so a GDPR Art 17 erasure leaves no
|
|
129
137
|
// decryptable copy. Lazy so the module loads in vault-less / test-tooling
|
|
@@ -912,8 +920,18 @@ function memoryTicketStore() {
|
|
|
912
920
|
var t = entry[1];
|
|
913
921
|
if (filter.status && t.status !== filter.status) continue;
|
|
914
922
|
if (filter.subject) {
|
|
915
|
-
|
|
916
|
-
|
|
923
|
+
// Fail closed: a subject filter must match on at least one of the
|
|
924
|
+
// store's indexable keys (email / subjectId). A subject carrying
|
|
925
|
+
// none of them — phone-only, alias-only, or an empty object —
|
|
926
|
+
// matches NOTHING, never every ticket. Fail-open here would make
|
|
927
|
+
// listBySubject leak other subjects' tickets and the erasure
|
|
928
|
+
// purge (list-by-subject → delete) destroy them.
|
|
929
|
+
var subj = filter.subject;
|
|
930
|
+
var tSubj = t.subject || {};
|
|
931
|
+
var applied = false;
|
|
932
|
+
if (subj.email) { applied = true; if (tSubj.email !== subj.email) continue; }
|
|
933
|
+
if (subj.subjectId) { applied = true; if (tSubj.subjectId !== subj.subjectId) continue; }
|
|
934
|
+
if (!applied) continue;
|
|
917
935
|
}
|
|
918
936
|
out.push(Object.assign({}, t));
|
|
919
937
|
}
|
|
@@ -1027,9 +1045,15 @@ function dbTicketStore(opts) {
|
|
|
1027
1045
|
validateOpts.requireMethods(db, ["runSql", "prepare"],
|
|
1028
1046
|
"dbTicketStore: opts.db (b.db-shaped handle)", DsrError, "dsr/bad-db");
|
|
1029
1047
|
var tableRaw = opts.table || "dsr_tickets";
|
|
1048
|
+
// b.sql builder opts for the DML below — quoteName quotes the operator-
|
|
1049
|
+
// supplied table name exactly as db.from() does (reserved words, schema-
|
|
1050
|
+
// qualified "schema.table"), so the store composes b.sql instead of
|
|
1051
|
+
// hand-rolling identifier quoting. DDL (CREATE/ALTER) stays hand-rolled —
|
|
1052
|
+
// b.sql is a DML builder, not a schema tool.
|
|
1053
|
+
var SQL_OPTS = { dialect: "sqlite", quoteName: true };
|
|
1030
1054
|
var qTable, qEmailIdx, qStatusIdx;
|
|
1031
1055
|
try {
|
|
1032
|
-
qTable = safeSql.quoteIdentifier(tableRaw, "sqlite");
|
|
1056
|
+
qTable = safeSql.quoteIdentifier(tableRaw, "sqlite", { allowReserved: true }); // parity with b.db.from() (the _idx names below are suffix-derived — can't be a bare keyword)
|
|
1033
1057
|
qEmailIdx = safeSql.quoteIdentifier(tableRaw + "_email_idx", "sqlite");
|
|
1034
1058
|
qStatusIdx = safeSql.quoteIdentifier(tableRaw + "_status_idx", "sqlite");
|
|
1035
1059
|
} catch (sqlErr) {
|
|
@@ -1109,32 +1133,57 @@ function dbTicketStore(opts) {
|
|
|
1109
1133
|
// selected) and cheap (an empty scan) once migrated.
|
|
1110
1134
|
if (vault().isInitialized()) {
|
|
1111
1135
|
_ensureDsrSealTable();
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1136
|
+
// The grouped-OR predicate has no operator input; it is a fixed
|
|
1137
|
+
// structural condition, so it rides through b.sql's whereRaw escape
|
|
1138
|
+
// (allow:hand-rolled-sql — a static, param-free legacy-detection filter
|
|
1139
|
+
// b.sql's structured where() cannot express as one OR-of-ANDs group).
|
|
1140
|
+
var legacySel = sql.select(tableRaw, SQL_OPTS)
|
|
1141
|
+
.columns(["id", "subject_id", "subject_email", "subject_phone", "payload"])
|
|
1142
|
+
.whereRaw("(subject_email IS NOT NULL AND subject_email_hash IS NULL) OR (subject_id IS NOT NULL AND subject_id_hash IS NULL)")
|
|
1143
|
+
.toSql();
|
|
1144
|
+
var legacyStmt = db.prepare(legacySel.sql);
|
|
1145
|
+
var legacyRows = legacyStmt.all.apply(legacyStmt, legacySel.params);
|
|
1116
1146
|
for (var bi = 0; bi < (legacyRows || []).length; bi++) {
|
|
1117
1147
|
var lrow = legacyRows[bi];
|
|
1118
1148
|
var lEmailDerived = cryptoField().computeDerived(DSR_SEAL_TABLE, "subject_email", lrow.subject_email);
|
|
1119
1149
|
var lIdDerived = cryptoField().computeDerived(DSR_SEAL_TABLE, "subject_id", lrow.subject_id);
|
|
1120
|
-
|
|
1150
|
+
// A legacy plaintext payload above the expansion-safe cap cannot be
|
|
1151
|
+
// sealed (its sealed form would exceed b.sql's per-value ceiling). The
|
|
1152
|
+
// row must still become findable + erasable, so ALWAYS seal the (small)
|
|
1153
|
+
// subject columns and populate the derived hashes — otherwise, in
|
|
1154
|
+
// vaulted mode, _subjectConds filters only on the hash columns and
|
|
1155
|
+
// list({ subject }) / the erasure purge would never see this prior
|
|
1156
|
+
// ticket, leaving its PII un-erasable. When the payload is over-cap,
|
|
1157
|
+
// keep it plaintext (still ≤ the read ceiling, so it binds; it is
|
|
1158
|
+
// DB-encrypted at rest and removed when the row is erased) and surface
|
|
1159
|
+
// it so the operator can chunk-migrate it.
|
|
1160
|
+
var payloadTooBig = Buffer.byteLength(String(lrow.payload == null ? "" : lrow.payload), "utf8") > VAULTED_SEAL_SAFE_MAX_BYTES;
|
|
1161
|
+
if (payloadTooBig) {
|
|
1162
|
+
try {
|
|
1163
|
+
observability().safeEvent("dsr.backfill.payload_left_plaintext", 1, { table: tableRaw });
|
|
1164
|
+
} catch (_e) { /* drop-silent */ }
|
|
1165
|
+
}
|
|
1166
|
+
// Omit the payload from the seal input when it is over-cap — sealRow
|
|
1167
|
+
// skips absent fields, so only the subject columns are sealed and the
|
|
1168
|
+
// plaintext payload is written back below.
|
|
1169
|
+
var lSealInput = {
|
|
1121
1170
|
id: lrow.id,
|
|
1122
1171
|
subject_id: lrow.subject_id,
|
|
1123
1172
|
subject_email: lrow.subject_email,
|
|
1124
1173
|
subject_phone: lrow.subject_phone,
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1174
|
+
};
|
|
1175
|
+
if (!payloadTooBig) lSealInput.payload = lrow.payload;
|
|
1176
|
+
var lSealed = cryptoField().sealRow(DSR_SEAL_TABLE, lSealInput);
|
|
1177
|
+
var lUpd = sql.update(tableRaw, SQL_OPTS).set({
|
|
1178
|
+
subject_id: lSealed.subject_id,
|
|
1179
|
+
subject_email: lSealed.subject_email,
|
|
1180
|
+
subject_phone: lSealed.subject_phone,
|
|
1181
|
+
payload: payloadTooBig ? lrow.payload : lSealed.payload,
|
|
1182
|
+
subject_email_hash: lEmailDerived ? lEmailDerived.value : null,
|
|
1183
|
+
subject_id_hash: lIdDerived ? lIdDerived.value : null,
|
|
1184
|
+
}).where("id", "=", lrow.id).toSql();
|
|
1185
|
+
var lUpdStmt = db.prepare(lUpd.sql);
|
|
1186
|
+
lUpdStmt.run.apply(lUpdStmt, lUpd.params);
|
|
1138
1187
|
}
|
|
1139
1188
|
}
|
|
1140
1189
|
}
|
|
@@ -1146,15 +1195,23 @@ function dbTicketStore(opts) {
|
|
|
1146
1195
|
// it stores plaintext (matching the agent-* fallback).
|
|
1147
1196
|
function _sealColumns(id, ticket) {
|
|
1148
1197
|
// The payload column is read back through safeJson.parse, whose hard
|
|
1149
|
-
// ceiling (safeJson.ABSOLUTE_MAX_BYTES) caps what any read can accept
|
|
1150
|
-
//
|
|
1151
|
-
//
|
|
1152
|
-
//
|
|
1198
|
+
// ceiling (safeJson.ABSOLUTE_MAX_BYTES) caps what any read can accept, so
|
|
1199
|
+
// the plaintext must not exceed it on write either. When a vault is
|
|
1200
|
+
// configured the payload is AEAD-sealed and base64-encoded before it is
|
|
1201
|
+
// bound, which expands it ~4/3; the bound (sealed) cell must still fit the
|
|
1202
|
+
// query builder's per-value binding ceiling (b.sql's MAX_PARAM_BYTES, the
|
|
1203
|
+
// same 64 MiB). Cap the plaintext at an expansion-safe size when vaulted so
|
|
1204
|
+
// an oversized ticket is refused here with the store's own error rather
|
|
1205
|
+
// than a SqlBuilderError deep in the insert — and route large exports to
|
|
1206
|
+
// chunked storage rather than binding one giant sealed cell.
|
|
1153
1207
|
var serializedPayload = JSON.stringify(ticket);
|
|
1154
|
-
|
|
1208
|
+
var vaulted = vault().isInitialized();
|
|
1209
|
+
var maxPlaintextBytes = vaulted ? VAULTED_SEAL_SAFE_MAX_BYTES : safeJson.ABSOLUTE_MAX_BYTES;
|
|
1210
|
+
if (Buffer.byteLength(serializedPayload, "utf8") > maxPlaintextBytes) {
|
|
1155
1211
|
throw new DsrError("dsr/ticket-too-large",
|
|
1156
|
-
"_sealColumns: ticket " + id + " payload exceeds the " +
|
|
1157
|
-
|
|
1212
|
+
"_sealColumns: ticket " + id + " payload exceeds the " + maxPlaintextBytes +
|
|
1213
|
+
"-byte store limit" +
|
|
1214
|
+
(vaulted ? " (sealing expands it; store large exports via chunked storage)" : ""));
|
|
1158
1215
|
}
|
|
1159
1216
|
var row = {
|
|
1160
1217
|
id: id,
|
|
@@ -1205,16 +1262,18 @@ function dbTicketStore(opts) {
|
|
|
1205
1262
|
{ key: "email", plainCol: "subject_email", sealField: "subject_email", hashCol: "subject_email_hash", param: "$email" },
|
|
1206
1263
|
{ key: "subjectId", plainCol: "subject_id", sealField: "subject_id", hashCol: "subject_id_hash", param: "$sid" },
|
|
1207
1264
|
];
|
|
1208
|
-
|
|
1265
|
+
// AND the subject-match predicate(s) onto a b.sql select builder.
|
|
1266
|
+
function _subjectConds(filter, qb) {
|
|
1209
1267
|
if (!filter.subject) return;
|
|
1210
1268
|
var vaulted = vault().isInitialized();
|
|
1211
1269
|
if (vaulted) _ensureDsrSealTable();
|
|
1270
|
+
var appliedAny = false;
|
|
1212
1271
|
SUBJECT_FILTER_SPEC.forEach(function (spec) {
|
|
1213
1272
|
var supplied = filter.subject[spec.key];
|
|
1214
1273
|
if (!supplied) return;
|
|
1215
1274
|
if (!vaulted) {
|
|
1216
|
-
|
|
1217
|
-
|
|
1275
|
+
qb.where(spec.plainCol, "=", supplied);
|
|
1276
|
+
appliedAny = true;
|
|
1218
1277
|
return;
|
|
1219
1278
|
}
|
|
1220
1279
|
// Vaulted: match BOTH the active keyed-MAC digest AND the legacy
|
|
@@ -1226,111 +1285,107 @@ function dbTicketStore(opts) {
|
|
|
1226
1285
|
var cand = cryptoField().lookupHashCandidates(DSR_SEAL_TABLE, spec.sealField, supplied);
|
|
1227
1286
|
var values = cand && cand.values ? cand.values : [];
|
|
1228
1287
|
if (values.length === 0) return;
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
params[p] = v;
|
|
1232
|
-
return p;
|
|
1233
|
-
});
|
|
1234
|
-
conds.push(spec.hashCol + " IN (" + placeholders.join(", ") + ")");
|
|
1288
|
+
qb.whereIn(spec.hashCol, values);
|
|
1289
|
+
appliedAny = true;
|
|
1235
1290
|
});
|
|
1291
|
+
// Fail closed: a subject filter that produced no usable predicate — a
|
|
1292
|
+
// phone-only / alias-only / empty subject, or a vaulted key with no hash
|
|
1293
|
+
// candidates — must match NOTHING, not every row. Without this, list({
|
|
1294
|
+
// subject }) degrades to a full-table scan and both listBySubject (leak)
|
|
1295
|
+
// and the erasure-completion purge (cross-subject delete) touch every
|
|
1296
|
+
// subject's tickets.
|
|
1297
|
+
if (!appliedAny) qb.whereRaw("1 = 0");
|
|
1236
1298
|
}
|
|
1237
1299
|
|
|
1238
1300
|
return {
|
|
1239
1301
|
insert: async function (ticket) {
|
|
1240
1302
|
var cols = _sealColumns(ticket.id, ticket);
|
|
1241
|
-
var
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
$processedAt: ticket.processedAt || null,
|
|
1260
|
-
$verLevel: ticket.verificationLevel || null,
|
|
1261
|
-
$posture: ticket.posture || null,
|
|
1262
|
-
$payload: cols.$payload,
|
|
1263
|
-
});
|
|
1303
|
+
var built = sql.insert(tableRaw, SQL_OPTS).values({
|
|
1304
|
+
id: ticket.id,
|
|
1305
|
+
type: ticket.type,
|
|
1306
|
+
status: ticket.status,
|
|
1307
|
+
subject_id: cols.$sid,
|
|
1308
|
+
subject_email: cols.$email,
|
|
1309
|
+
subject_phone: cols.$phone,
|
|
1310
|
+
subject_email_hash: cols.$emailHash,
|
|
1311
|
+
subject_id_hash: cols.$idHash,
|
|
1312
|
+
submitted_at: ticket.submittedAt,
|
|
1313
|
+
deadline_at: ticket.deadlineAt,
|
|
1314
|
+
processed_at: ticket.processedAt || null,
|
|
1315
|
+
verification_level: ticket.verificationLevel || null,
|
|
1316
|
+
posture: ticket.posture || null,
|
|
1317
|
+
payload: cols.$payload,
|
|
1318
|
+
}).toSql();
|
|
1319
|
+
var stmt = db.prepare(built.sql);
|
|
1320
|
+
stmt.run.apply(stmt, built.params);
|
|
1264
1321
|
},
|
|
1265
1322
|
get: async function (id) {
|
|
1266
|
-
var
|
|
1267
|
-
|
|
1323
|
+
var built = sql.select(tableRaw, SQL_OPTS).columns(["id", "payload"]).where("id", "=", id).toSql();
|
|
1324
|
+
var stmt = db.prepare(built.sql);
|
|
1325
|
+
var rows = stmt.all.apply(stmt, built.params);
|
|
1268
1326
|
if (!rows || rows.length === 0) return null;
|
|
1269
1327
|
return safeJson.parse(_unsealPayload(rows[0].payload, rows[0].id), { maxBytes: safeJson.ABSOLUTE_MAX_BYTES });
|
|
1270
1328
|
},
|
|
1271
1329
|
list: async function (filter) {
|
|
1272
1330
|
filter = filter || {};
|
|
1273
|
-
var
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
_subjectConds(filter, conds, params);
|
|
1281
|
-
if (conds.length > 0) sql += " WHERE " + conds.join(" AND ");
|
|
1282
|
-
sql += " ORDER BY submitted_at DESC";
|
|
1283
|
-
var rows = db.prepare(sql).all(params);
|
|
1331
|
+
var qb = sql.select(tableRaw, SQL_OPTS).columns(["id", "payload"]);
|
|
1332
|
+
if (filter.status) qb.where("status", "=", filter.status);
|
|
1333
|
+
_subjectConds(filter, qb);
|
|
1334
|
+
qb.orderBy("submitted_at", "DESC");
|
|
1335
|
+
var built = qb.toSql();
|
|
1336
|
+
var stmt = db.prepare(built.sql);
|
|
1337
|
+
var rows = stmt.all.apply(stmt, built.params);
|
|
1284
1338
|
return rows.map(function (r) { return safeJson.parse(_unsealPayload(r.payload, r.id), { maxBytes: safeJson.ABSOLUTE_MAX_BYTES }); });
|
|
1285
1339
|
},
|
|
1286
1340
|
update: async function (id, ticket) {
|
|
1287
1341
|
var cols = _sealColumns(id, ticket);
|
|
1288
|
-
var
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
$submittedAt: ticket.submittedAt,
|
|
1306
|
-
$deadlineAt: ticket.deadlineAt,
|
|
1307
|
-
$processedAt: ticket.processedAt || null,
|
|
1308
|
-
$verLevel: ticket.verificationLevel || null,
|
|
1309
|
-
$posture: ticket.posture || null,
|
|
1310
|
-
$payload: cols.$payload,
|
|
1311
|
-
});
|
|
1342
|
+
var built = sql.update(tableRaw, SQL_OPTS).set({
|
|
1343
|
+
type: ticket.type,
|
|
1344
|
+
status: ticket.status,
|
|
1345
|
+
subject_id: cols.$sid,
|
|
1346
|
+
subject_email: cols.$email,
|
|
1347
|
+
subject_phone: cols.$phone,
|
|
1348
|
+
subject_email_hash: cols.$emailHash,
|
|
1349
|
+
subject_id_hash: cols.$idHash,
|
|
1350
|
+
submitted_at: ticket.submittedAt,
|
|
1351
|
+
deadline_at: ticket.deadlineAt,
|
|
1352
|
+
processed_at: ticket.processedAt || null,
|
|
1353
|
+
verification_level: ticket.verificationLevel || null,
|
|
1354
|
+
posture: ticket.posture || null,
|
|
1355
|
+
payload: cols.$payload,
|
|
1356
|
+
}).where("id", "=", id).toSql();
|
|
1357
|
+
var stmt = db.prepare(built.sql);
|
|
1358
|
+
var info = stmt.run.apply(stmt, built.params);
|
|
1312
1359
|
if (info && info.changes === 0) {
|
|
1313
1360
|
throw new DsrError("dsr/ticket-not-found",
|
|
1314
1361
|
"dbTicketStore: ticket " + id + " not found for update");
|
|
1315
1362
|
}
|
|
1316
1363
|
},
|
|
1317
1364
|
delete: async function (id) {
|
|
1318
|
-
var
|
|
1365
|
+
var built = sql.delete(tableRaw, SQL_OPTS).where("id", "=", id).toSql();
|
|
1366
|
+
var stmt = db.prepare(built.sql);
|
|
1367
|
+
var info = stmt.run.apply(stmt, built.params);
|
|
1319
1368
|
return !!(info && info.changes > 0);
|
|
1320
1369
|
},
|
|
1321
1370
|
purgeExpired: async function (asOfMs) {
|
|
1322
1371
|
// Bulk-delete tickets in terminal states whose retentionUntil
|
|
1323
1372
|
// is in the past. Returns the number of rows removed.
|
|
1324
1373
|
var asOf = (typeof asOfMs === "number" && isFinite(asOfMs)) ? asOfMs : Date.now();
|
|
1325
|
-
var
|
|
1326
|
-
|
|
1374
|
+
var selBuilt = sql.select(tableRaw, SQL_OPTS).columns(["id", "payload"])
|
|
1375
|
+
.whereIn("status", ["completed", "partially_completed", "cancelled", "rejected", "expired"])
|
|
1376
|
+
.toSql();
|
|
1377
|
+
var selStmt = db.prepare(selBuilt.sql);
|
|
1378
|
+
var rows = selStmt.all.apply(selStmt, selBuilt.params);
|
|
1327
1379
|
var purged = 0;
|
|
1328
|
-
var del = db.prepare("DELETE FROM " + qTable + " WHERE id = $id");
|
|
1329
1380
|
for (var i = 0; i < rows.length; i++) {
|
|
1330
1381
|
try {
|
|
1331
1382
|
var t = safeJson.parse(_unsealPayload(rows[i].payload, rows[i].id), { maxBytes: safeJson.ABSOLUTE_MAX_BYTES });
|
|
1332
1383
|
if (t.retentionUntil && t.retentionUntil < asOf) {
|
|
1333
|
-
|
|
1384
|
+
// The delete SQL string is identical every iteration, so db.prepare
|
|
1385
|
+
// returns the same cached statement — composing per-row is free.
|
|
1386
|
+
var dBuilt = sql.delete(tableRaw, SQL_OPTS).where("id", "=", rows[i].id).toSql();
|
|
1387
|
+
var dStmt = db.prepare(dBuilt.sql);
|
|
1388
|
+
dStmt.run.apply(dStmt, dBuilt.params);
|
|
1334
1389
|
purged += 1;
|
|
1335
1390
|
}
|
|
1336
1391
|
} catch (_e) { /* malformed payload — leave it */ }
|
|
@@ -381,6 +381,18 @@ var _ROW_RETURNING_CLASS = Object.freeze({ SELECT: true, READ_INFO: true });
|
|
|
381
381
|
|
|
382
382
|
function statementReturnsRows(sql) {
|
|
383
383
|
if (typeof sql !== "string" || sql.length === 0) return false;
|
|
384
|
+
// EXPLAIN — with or without ANALYZE, wrapping any inner statement —
|
|
385
|
+
// always returns a plan row set to the caller: `EXPLAIN ANALYZE INSERT`
|
|
386
|
+
// executes the write AND yields the plan. That is the row-set question,
|
|
387
|
+
// orthogonal to the residency gate's read/write class (where a plain
|
|
388
|
+
// EXPLAIN is a read and EXPLAIN ANALYZE <write> is a write). An EXPLAIN
|
|
389
|
+
// prefix that does not resolve (no inner statement, unbalanced option
|
|
390
|
+
// parens, unterminated span) stays fail-closed false so the .all()/.run()
|
|
391
|
+
// chooser never mis-routes an unparseable statement.
|
|
392
|
+
var m = _STATEMENT_CLASS_RE.exec(sql);
|
|
393
|
+
if (m && m[1].toUpperCase() === "EXPLAIN") {
|
|
394
|
+
return _explainResolve(sql, m.index + m[0].length) !== null;
|
|
395
|
+
}
|
|
384
396
|
if (_ROW_RETURNING_CLASS[_classifyStatement(sql)] === true) return true;
|
|
385
397
|
return _hasTopLevelReturning(sql);
|
|
386
398
|
}
|
|
@@ -637,11 +649,24 @@ class Pool {
|
|
|
637
649
|
}
|
|
638
650
|
|
|
639
651
|
_reapIdle() {
|
|
652
|
+
// Reap idle clients past idleTimeoutMs, but honor `min` as a floor on
|
|
653
|
+
// idle clients: retain at least `min` warm connections even when they
|
|
654
|
+
// have all gone idle past the timeout, so a quiet period does not drain
|
|
655
|
+
// the pool below its configured warm floor. The freshest entries sit at
|
|
656
|
+
// the end of the idle stack (release() pushes, acquire() pops), so the
|
|
657
|
+
// stalest expired clients are reaped first and the floor keeps the most
|
|
658
|
+
// recently used. min:0 opts out of the floor (reap every expired idle).
|
|
659
|
+
var min = (typeof this.config.min === "number" && isFinite(this.config.min) && this.config.min > 0)
|
|
660
|
+
? this.config.min : 0;
|
|
661
|
+
var reapable = this.idle.length - min;
|
|
662
|
+
if (reapable <= 0) return; // at or below the floor — keep every idle client warm
|
|
640
663
|
var now = Date.now();
|
|
641
664
|
var keep = [];
|
|
665
|
+
var reaped = 0;
|
|
642
666
|
var self = this;
|
|
643
667
|
this.idle.forEach(function (entry) {
|
|
644
|
-
if ((now - entry.lastUsedAt) >= self.config.idleTimeoutMs) {
|
|
668
|
+
if (reaped < reapable && (now - entry.lastUsedAt) >= self.config.idleTimeoutMs) {
|
|
669
|
+
reaped += 1;
|
|
645
670
|
Promise.resolve().then(function () { return self.close(entry.client); }).catch(function () {});
|
|
646
671
|
} else {
|
|
647
672
|
keep.push(entry);
|
|
@@ -907,7 +932,21 @@ function init(opts) {
|
|
|
907
932
|
};
|
|
908
933
|
}
|
|
909
934
|
|
|
910
|
-
defaultBackend
|
|
935
|
+
// defaultBackend — when supplied it must name a REGISTERED backend, so a
|
|
936
|
+
// typo surfaces as a typed config-time error at init() rather than as an
|
|
937
|
+
// opaque TypeError when the first query dereferences a missing pool.
|
|
938
|
+
// Omitted → the first declared backend (declaration order).
|
|
939
|
+
if (opts.defaultBackend !== undefined && opts.defaultBackend !== null) {
|
|
940
|
+
validateOpts.requireNonEmptyString(opts.defaultBackend, "defaultBackend", ExternalDbError, "INVALID_CONFIG");
|
|
941
|
+
if (!Object.prototype.hasOwnProperty.call(backends, opts.defaultBackend)) {
|
|
942
|
+
throw _err("INVALID_CONFIG",
|
|
943
|
+
"defaultBackend: no backend named '" + opts.defaultBackend + "' " +
|
|
944
|
+
"(declared backends: " + Object.keys(backends).join(", ") + ")", true);
|
|
945
|
+
}
|
|
946
|
+
defaultBackend = opts.defaultBackend;
|
|
947
|
+
} else {
|
|
948
|
+
defaultBackend = Object.keys(backends)[0];
|
|
949
|
+
}
|
|
911
950
|
|
|
912
951
|
// dbRoleBackends — request-time role → backend mapping. Each role name
|
|
913
952
|
// validates as a SQL identifier at init (matches the dbRoleFor
|
|
@@ -1191,7 +1191,11 @@ function create(opts) {
|
|
|
1191
1191
|
}
|
|
1192
1192
|
}
|
|
1193
1193
|
// Run one gate; throws on refuse / gate-error, mutates bodyBuffer on
|
|
1194
|
-
// sanitize so a later gate sees the cleaned bytes.
|
|
1194
|
+
// sanitize so a later gate sees the cleaned bytes. When a gate replaces
|
|
1195
|
+
// the payload, the integrity descriptor (sha3/size) handed to onFinalize
|
|
1196
|
+
// and recorded in the audit must be recomputed over the DELIVERED bytes,
|
|
1197
|
+
// not the pre-sanitize original — flagged here, recomputed after the loop.
|
|
1198
|
+
var contentSanitized = false;
|
|
1195
1199
|
var _runContentSafetyGate = async function (gate, gateExt) {
|
|
1196
1200
|
var safetyDecision;
|
|
1197
1201
|
try {
|
|
@@ -1229,6 +1233,7 @@ function create(opts) {
|
|
|
1229
1233
|
if (safetyDecision.action === "sanitize" && safetyDecision.sanitized) {
|
|
1230
1234
|
bodyBuffer = safetyDecision.sanitized;
|
|
1231
1235
|
bodyStream = null;
|
|
1236
|
+
contentSanitized = true;
|
|
1232
1237
|
}
|
|
1233
1238
|
};
|
|
1234
1239
|
var ranAnyGate = false;
|
|
@@ -1271,6 +1276,19 @@ function create(opts) {
|
|
|
1271
1276
|
verified.totalBytes);
|
|
1272
1277
|
}
|
|
1273
1278
|
|
|
1279
|
+
// A content-safety gate that returned "sanitize" replaced the payload, so
|
|
1280
|
+
// the integrity descriptor handed to onFinalize + recorded in the audit
|
|
1281
|
+
// must describe the bytes actually DELIVERED — an operator storing
|
|
1282
|
+
// info.sha3 as the integrity / dedup key of the stored (sanitized) bytes
|
|
1283
|
+
// would otherwise get a hash that does not match what they store. When no
|
|
1284
|
+
// sanitize ran, the reassembly digest already describes the delivered bytes.
|
|
1285
|
+
var deliveredSha3 = verified.totalHashHex;
|
|
1286
|
+
var deliveredSize = verified.totalBytes;
|
|
1287
|
+
if (contentSanitized && bodyBuffer) {
|
|
1288
|
+
deliveredSha3 = require("node:crypto").createHash("sha3-512").update(bodyBuffer).digest("hex");
|
|
1289
|
+
deliveredSize = bodyBuffer.length;
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1274
1292
|
// Hand to operator's onFinalize.
|
|
1275
1293
|
var rv;
|
|
1276
1294
|
try {
|
|
@@ -1279,13 +1297,13 @@ function create(opts) {
|
|
|
1279
1297
|
uploadId: uploadId,
|
|
1280
1298
|
body: bodyBuffer,
|
|
1281
1299
|
stream: bodyStream,
|
|
1282
|
-
sha3:
|
|
1283
|
-
size:
|
|
1300
|
+
sha3: deliveredSha3,
|
|
1301
|
+
size: deliveredSize,
|
|
1284
1302
|
actor: actor,
|
|
1285
1303
|
metadata: meta.metadata,
|
|
1286
1304
|
});
|
|
1287
1305
|
} else {
|
|
1288
|
-
rv = { ok: true, sha3:
|
|
1306
|
+
rv = { ok: true, sha3: deliveredSha3, size: deliveredSize };
|
|
1289
1307
|
}
|
|
1290
1308
|
} catch (e) {
|
|
1291
1309
|
_emitObs("fileUpload.finalize_failure", 1);
|
|
@@ -1294,7 +1312,7 @@ function create(opts) {
|
|
|
1294
1312
|
resource: { kind: "fileUpload", id: uploadId },
|
|
1295
1313
|
outcome: "failure",
|
|
1296
1314
|
reason: "onfinalize-threw",
|
|
1297
|
-
metadata: { size:
|
|
1315
|
+
metadata: { size: deliveredSize, sha3: deliveredSha3,
|
|
1298
1316
|
error: (e && e.message) || String(e) },
|
|
1299
1317
|
});
|
|
1300
1318
|
throw e;
|
|
@@ -1305,12 +1323,12 @@ function create(opts) {
|
|
|
1305
1323
|
catch (_e) { /* best-effort */ }
|
|
1306
1324
|
|
|
1307
1325
|
_emitObs("fileUpload.finalize_success", 1);
|
|
1308
|
-
_emitObs("fileUpload.finalize_bytes",
|
|
1326
|
+
_emitObs("fileUpload.finalize_bytes", deliveredSize);
|
|
1309
1327
|
_emitAudit("fileUpload.finalize", {
|
|
1310
1328
|
actor: requestHelpers.extractActorContext(actor),
|
|
1311
1329
|
resource: { kind: "fileUpload", id: uploadId },
|
|
1312
1330
|
outcome: "success",
|
|
1313
|
-
metadata: { size:
|
|
1331
|
+
metadata: { size: deliveredSize, sha3: deliveredSha3,
|
|
1314
1332
|
mode: useStream ? "stream" : "buffer" },
|
|
1315
1333
|
});
|
|
1316
1334
|
|
|
@@ -127,7 +127,7 @@ function memory(opts) {
|
|
|
127
127
|
|
|
128
128
|
function localFile(opts) {
|
|
129
129
|
opts = opts || {};
|
|
130
|
-
validateOpts(opts, ["path", "watch"], "flag.providers.localFile");
|
|
130
|
+
validateOpts(opts, ["path", "watch", "_watch"], "flag.providers.localFile");
|
|
131
131
|
validateOpts.requireNonEmptyString(opts.path,
|
|
132
132
|
"providers.localFile: path", FlagError, "flag/bad-provider");
|
|
133
133
|
var raw;
|
|
@@ -157,22 +157,34 @@ function localFile(opts) {
|
|
|
157
157
|
var provider = _makeProvider("local-file", parsed.flags);
|
|
158
158
|
provider._path = opts.path;
|
|
159
159
|
if (opts.watch === true) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
160
|
+
// Re-read the flags from disk on a file change. Drop-silent on the hot
|
|
161
|
+
// path: a mid-write / transiently-invalid file must not throw out of the
|
|
162
|
+
// watcher callback.
|
|
163
|
+
var reload = function () {
|
|
164
|
+
try {
|
|
165
|
+
var nextRaw = atomicFile.fdSafeReadSync(opts.path, { maxBytes: C.BYTES.mib(1), encoding: "utf8" });
|
|
166
|
+
var nextParsed = safeJson.parse(nextRaw, { maxBytes: C.BYTES.mib(1) });
|
|
167
|
+
if (nextParsed && nextParsed.flags) {
|
|
168
|
+
for (var k in nextParsed.flags) {
|
|
169
|
+
if (Object.prototype.hasOwnProperty.call(nextParsed.flags, k)) {
|
|
170
|
+
_validateFlagSpec(k, nextParsed.flags[k]);
|
|
170
171
|
}
|
|
171
|
-
provider._replace(nextParsed.flags);
|
|
172
172
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
173
|
+
provider._replace(nextParsed.flags);
|
|
174
|
+
}
|
|
175
|
+
} catch (_e) { /* drop-silent on hot-path reload */ }
|
|
176
|
+
};
|
|
177
|
+
// Test seam: a fake watcher (opts._watch) lets a test drive reload
|
|
178
|
+
// deterministically. The default STAT-POLLS the file (StatWatcher), NOT
|
|
179
|
+
// fs.watch: fs.watch aborts libuv — an uncatchable src/win/fs-event.c
|
|
180
|
+
// assertion — when opts.path resolves through a Windows 8.3 short-name
|
|
181
|
+
// component (e.g. a path under C:\Users\SOMEUS~1\...). StatWatcher never
|
|
182
|
+
// opens a directory-change handle, so it is immune to the path form; a ~1s
|
|
183
|
+
// poll is ample latency for a feature-flag hot reload.
|
|
184
|
+
var watchFn = opts._watch || function (p, onChange) {
|
|
185
|
+
nodeFs.watchFile(p, { persistent: false, interval: C.TIME.seconds(1) }, function () { onChange(); });
|
|
186
|
+
};
|
|
187
|
+
try { watchFn(opts.path, reload); } catch (_w) { /* watch unavailable - non-fatal */ }
|
|
176
188
|
}
|
|
177
189
|
return provider;
|
|
178
190
|
}
|