@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
|
@@ -153,17 +153,20 @@ function _makeFakeMysqlDriver() {
|
|
|
153
153
|
return { rows: [], affectedRows: 1 };
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
// UPDATE _blamejs_leader SET `
|
|
157
|
-
// WHERE `scope` = ? AND `nodeId` = ? AND `leaseId` = ?
|
|
158
|
-
// The
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
|
|
156
|
+
// UPDATE _blamejs_leader SET `acquiredAt` = ?, `expiresAt` = ?,
|
|
157
|
+
// `endpoint` = ? WHERE `scope` = ? AND `nodeId` = ? AND `leaseId` = ?
|
|
158
|
+
// (renew). The renewal slides acquiredAt forward alongside expiresAt
|
|
159
|
+
// so the lease span stays the configured TTL. b.sql binds the SET
|
|
160
|
+
// values first (acquiredAt=params[0], expiresAt=params[1],
|
|
161
|
+
// endpoint=params[2]) then the WHERE (scope=params[3]='leader',
|
|
162
|
+
// nodeId=params[4], leaseId=params[5]).
|
|
163
|
+
var renewMatch = /^UPDATE _blamejs_leader SET[\s\S]*`?acquiredAt`? = \?[\s\S]*`?expiresAt`? = \?[\s\S]*`?endpoint`? = \?[\s\S]*WHERE `?scope`? = \? AND `?nodeId`? = \? AND `?leaseId`? = \?/i.test(t);
|
|
162
164
|
if (renewMatch) {
|
|
163
165
|
var r = rows._blamejs_leader;
|
|
164
|
-
if (r && r.nodeId === params[
|
|
165
|
-
r.
|
|
166
|
-
r.
|
|
166
|
+
if (r && r.nodeId === params[4] && r.leaseId === params[5]) {
|
|
167
|
+
r.acquiredAt = params[0];
|
|
168
|
+
r.expiresAt = params[1];
|
|
169
|
+
r.endpoint = params[2];
|
|
167
170
|
return { rows: [], affectedRows: 1 };
|
|
168
171
|
}
|
|
169
172
|
return { rows: [], affectedRows: 0 };
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
* lib/chain-writer.js — _insertRow / counter primer / tip read on MySQL
|
|
14
14
|
* lib/break-glass.js — policy.set/get/list (ON DUPLICATE KEY UPSERT) +
|
|
15
15
|
* grant + unsealRow consume (the backtick-quoted
|
|
16
|
-
* rowsConsumed increment), routed to live MySQL
|
|
16
|
+
* rowsConsumed increment), routed to live MySQL,
|
|
17
|
+
* including the concurrent double-claim refusal on
|
|
18
|
+
* a 1-row grant (affected-row-count claim across
|
|
19
|
+
* separate autocommit connections)
|
|
17
20
|
* lib/crypto-field.js — a K_row (vault.row:) sealed cell stored as TEXT in
|
|
18
21
|
* MySQL and read back + derived-hash dual-read
|
|
19
22
|
*
|
|
@@ -296,6 +299,7 @@ async function run() {
|
|
|
296
299
|
await _testCoercionFidelity();
|
|
297
300
|
await _testAuditToolsBundle(tmpDir);
|
|
298
301
|
await _testBreakGlass();
|
|
302
|
+
await _testBreakGlassConcurrentDoubleClaim();
|
|
299
303
|
await _testCryptoFieldKRowRoundTrip();
|
|
300
304
|
await _testDerivedHashDualRead();
|
|
301
305
|
await _testTamperDetection();
|
|
@@ -524,6 +528,91 @@ async function _testBreakGlass() {
|
|
|
524
528
|
Array.isArray(active) && active.length === 0);
|
|
525
529
|
}
|
|
526
530
|
|
|
531
|
+
// ====================================================================
|
|
532
|
+
// 5b. break-glass concurrent double-claim — TWO in-flight unsealRow calls
|
|
533
|
+
// redeeming the SAME 1-row grant against DIFFERENT rows must admit
|
|
534
|
+
// exactly ONE on live MySQL. The claim is the single-statement atomic
|
|
535
|
+
// UPDATE ... SET rowsConsumed = rowsConsumed + 1 WHERE rowsConsumed <
|
|
536
|
+
// maxRowsPerGrant, and the AFFECTED-ROW COUNT (ROW_COUNT() read in the
|
|
537
|
+
// SAME shim invocation as the DML — connection-consistent) is the
|
|
538
|
+
// per-caller win/lose signal. On this per-statement shim every
|
|
539
|
+
// statement is its own real MySQL connection and autocommit
|
|
540
|
+
// transaction — exactly the shape the claim must survive: unlike the
|
|
541
|
+
// FOR-UPDATE-SKIP-LOCKED lease flows (whose cross-statement locks the
|
|
542
|
+
// stateless shim cannot hold), the claim holds no lock across
|
|
543
|
+
// statements, so the shim exercises it faithfully. The two callers
|
|
544
|
+
// advance in lockstep (identical await chains launched in the same
|
|
545
|
+
// tick; every shim statement is synchronous, so neither caller can
|
|
546
|
+
// run its whole flow before the other's first read) — both pre-flight
|
|
547
|
+
// grant reads observe rowsConsumed = 0, then the two claim UPDATEs
|
|
548
|
+
// land as two separate transactions and InnoDB re-evaluates the
|
|
549
|
+
// loser's WHERE against the winner's committed increment: 0 affected
|
|
550
|
+
// rows. (A held-lock barrier like the Postgres file's is impossible
|
|
551
|
+
// here: a blocked UPDATE inside the execFileSync shim would freeze
|
|
552
|
+
// the event loop against the lock we'd need to release.) Inferring
|
|
553
|
+
// the claim from a re-read of rowsConsumed instead admits BOTH
|
|
554
|
+
// callers (the winner's increment is visible to the loser's re-read),
|
|
555
|
+
// unsealing two regulated records under a maxRowsPerGrant:1 grant.
|
|
556
|
+
// ====================================================================
|
|
557
|
+
async function _testBreakGlassConcurrentDoubleClaim() {
|
|
558
|
+
// A second glass-locked row so the two redemptions target DIFFERENT
|
|
559
|
+
// rows — a same-row retry can't mask a double-spend.
|
|
560
|
+
var patient2 = b.cryptoField.sealRow("patients", {
|
|
561
|
+
_id: "patient-002", mrn: "MRN-2", ssn: "987-65-4321",
|
|
562
|
+
residency: "eu", notes: "type 2 diabetes",
|
|
563
|
+
});
|
|
564
|
+
await b.clusterStorage.execute(
|
|
565
|
+
"INSERT INTO `patients` (`_id`,`mrn`,`ssn`,`residency`,`notes`) VALUES (?,?,?,?,?)",
|
|
566
|
+
[patient2._id, patient2.mrn, patient2.ssn, patient2.residency, patient2.notes]);
|
|
567
|
+
|
|
568
|
+
// Fresh 1-row grant — the policy from the previous section already pins
|
|
569
|
+
// maxRowsPerGrant: 1 (row-by-row auth).
|
|
570
|
+
var totpSecret = b.auth.totp.generateSecret();
|
|
571
|
+
var nowMs = Date.now();
|
|
572
|
+
var code = b.auth.totp.generate(totpSecret, { now: nowMs });
|
|
573
|
+
var req = {
|
|
574
|
+
user: { id: "dr-house", scopes: [] }, socket: { remoteAddress: "127.0.0.1" },
|
|
575
|
+
headers: { "user-agent": "test-agent" }, method: "POST", url: "/admin/break-glass",
|
|
576
|
+
};
|
|
577
|
+
var handle = await b.breakGlass.grant({
|
|
578
|
+
req: req, table: "patients", columns: ["ssn"],
|
|
579
|
+
reason: "ER admit disambiguating two candidate records",
|
|
580
|
+
factor: { type: "totp", secret: totpSecret, code: code, now: nowMs },
|
|
581
|
+
});
|
|
582
|
+
check("break-glass double-claim (mysql): fresh 1-row grant minted (rowsRemaining 1)",
|
|
583
|
+
handle && handle.rowsRemaining === 1);
|
|
584
|
+
|
|
585
|
+
var results = await Promise.allSettled([
|
|
586
|
+
b.breakGlass.unsealRow(handle, "patients", "patient-001"),
|
|
587
|
+
b.breakGlass.unsealRow(handle, "patients", "patient-002"),
|
|
588
|
+
]);
|
|
589
|
+
var ok = results.filter(function (r) { return r.status === "fulfilled"; });
|
|
590
|
+
var bad = results.filter(function (r) { return r.status === "rejected"; });
|
|
591
|
+
check("break-glass double-claim (mysql): exactly ONE of two concurrent unseals " +
|
|
592
|
+
"succeeded under the 1-row grant on live MySQL",
|
|
593
|
+
ok.length === 1 && bad.length === 1);
|
|
594
|
+
check("break-glass double-claim (mysql): the winner decrypted its glass-locked ssn",
|
|
595
|
+
ok.length === 1 &&
|
|
596
|
+
(ok[0].value.ssn === "123-45-6789" || ok[0].value.ssn === "987-65-4321"));
|
|
597
|
+
var loser = bad.length === 1 ? bad[0].reason : null;
|
|
598
|
+
check("break-glass double-claim (mysql): the loser is refused as grant-exhausted",
|
|
599
|
+
loser !== null && /breakglass\/grant-exhausted/.test(String((loser && loser.code) || "")));
|
|
600
|
+
// The loser must lose AT THE ATOMIC CLAIM ("exhausted by a concurrent
|
|
601
|
+
// read" — 0 affected rows), NOT at the pre-flight counter check ("has
|
|
602
|
+
// consumed all ... allowed rows") — the pre-flight path never raced. A
|
|
603
|
+
// re-read-based claim admits both callers and neither message appears.
|
|
604
|
+
check("break-glass double-claim (mysql): the loser was refused by the affected-" +
|
|
605
|
+
"row-count claim, not the pre-flight check [loser: " +
|
|
606
|
+
String(loser && loser.message) + "]",
|
|
607
|
+
loser !== null &&
|
|
608
|
+
/exhausted by a concurrent read/.test(String((loser && loser.message) || "")));
|
|
609
|
+
|
|
610
|
+
check("break-glass double-claim (mysql): rowsConsumed on MySQL is exactly 1 — " +
|
|
611
|
+
"the 1-row grant was spent once, not twice",
|
|
612
|
+
Number(_scalar("SELECT `rowsConsumed` FROM `_blamejs_break_glass_grants` " +
|
|
613
|
+
"WHERE `_id` = '" + handle.id + "'")) === 1);
|
|
614
|
+
}
|
|
615
|
+
|
|
527
616
|
// ====================================================================
|
|
528
617
|
// 6. crypto-field K_row (vault.row:) sealed cell stored on MySQL + read
|
|
529
618
|
// back, proving the typed codec survives a real TEXT round-trip. The
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
* lib/chain-writer.js — _insertRow / counter primer / tip read on a real
|
|
13
13
|
* backend
|
|
14
14
|
* lib/break-glass.js — policy.set/get/list + grant + unsealRow consume,
|
|
15
|
-
* all routed through clusterStorage to live Postgres
|
|
15
|
+
* all routed through clusterStorage to live Postgres,
|
|
16
|
+
* including the concurrent double-claim refusal on a
|
|
17
|
+
* 1-row grant (affected-row-count claim under real
|
|
18
|
+
* row locking on two parallel sessions)
|
|
16
19
|
* lib/crypto-field.js — a K_row (vault.row:) sealed cell stored as TEXT in
|
|
17
20
|
* Postgres and read back, proving the typed codec
|
|
18
21
|
* (Buffer/object) survives a real round-trip
|
|
@@ -341,6 +344,7 @@ async function run() {
|
|
|
341
344
|
await _testCoercionFidelity(liveQueryAll);
|
|
342
345
|
await _testAuditToolsBundleAndPurge(tmpDir);
|
|
343
346
|
await _testBreakGlass();
|
|
347
|
+
await _testBreakGlassConcurrentDoubleClaim(driver);
|
|
344
348
|
await _testCryptoFieldKRowRoundTrip(liveQueryAll);
|
|
345
349
|
await _testTamperDetection();
|
|
346
350
|
|
|
@@ -708,6 +712,123 @@ async function _testBreakGlass() {
|
|
|
708
712
|
exhaustedErr && /exhausted/i.test((exhaustedErr.code || "") + (exhaustedErr.message || "")));
|
|
709
713
|
}
|
|
710
714
|
|
|
715
|
+
// ====================================================================
|
|
716
|
+
// 5b. break-glass concurrent double-claim — TWO in-flight unsealRow calls
|
|
717
|
+
// redeeming the SAME 1-row grant against DIFFERENT rows must admit
|
|
718
|
+
// exactly ONE. The claim is the atomic UPDATE ... SET rowsConsumed =
|
|
719
|
+
// rowsConsumed + 1 WHERE rowsConsumed < maxRowsPerGrant, and the
|
|
720
|
+
// AFFECTED-ROW COUNT is the per-caller win/lose signal — under real
|
|
721
|
+
// Postgres row locking, on two SEPARATE pooled psql sessions
|
|
722
|
+
// (concurrency the single-connection node:sqlite layer-0 run cannot
|
|
723
|
+
// produce). A dedicated holder session takes FOR UPDATE on the grant
|
|
724
|
+
// row so BOTH claim UPDATEs park behind it while both callers'
|
|
725
|
+
// pre-flight reads (MVCC snapshot reads — not blocked) observe
|
|
726
|
+
// rowsConsumed = 0; releasing the lock lets Postgres serialize the
|
|
727
|
+
// two UPDATEs — the loser re-evaluates its WHERE against the winner's
|
|
728
|
+
// committed increment and changes 0 rows. Inferring the claim from a
|
|
729
|
+
// re-read of rowsConsumed instead admits BOTH callers (the winner's
|
|
730
|
+
// increment is visible to the loser's re-read), unsealing two
|
|
731
|
+
// regulated records under a maxRowsPerGrant:1 grant.
|
|
732
|
+
// ====================================================================
|
|
733
|
+
async function _testBreakGlassConcurrentDoubleClaim(driver) {
|
|
734
|
+
// A second glass-locked row so the two redemptions target DIFFERENT
|
|
735
|
+
// rows — a same-row retry can't mask a double-spend.
|
|
736
|
+
var patient2 = b.cryptoField.sealRow("patients", {
|
|
737
|
+
_id: "patient-002", mrn: "MRN-2", ssn: "987-65-4321",
|
|
738
|
+
residency: "eu", notes: "type 2 diabetes",
|
|
739
|
+
});
|
|
740
|
+
await b.clusterStorage.execute(
|
|
741
|
+
'INSERT INTO patients ("_id","mrn","ssn","residency","notes") VALUES (?,?,?,?,?)',
|
|
742
|
+
[patient2._id, patient2.mrn, patient2.ssn, patient2.residency, patient2.notes]);
|
|
743
|
+
|
|
744
|
+
// Fresh 1-row grant — the policy from the previous section already pins
|
|
745
|
+
// maxRowsPerGrant: 1 (row-by-row auth).
|
|
746
|
+
var totpSecret = b.auth.totp.generateSecret();
|
|
747
|
+
var nowMs = Date.now();
|
|
748
|
+
var code = b.auth.totp.generate(totpSecret, { now: nowMs });
|
|
749
|
+
var req = {
|
|
750
|
+
user: { id: "dr-house", scopes: [] },
|
|
751
|
+
socket: { remoteAddress: "127.0.0.1" },
|
|
752
|
+
headers: { "user-agent": "test-agent" },
|
|
753
|
+
method: "POST",
|
|
754
|
+
url: "/admin/break-glass",
|
|
755
|
+
};
|
|
756
|
+
var handle = await b.breakGlass.grant({
|
|
757
|
+
req: req,
|
|
758
|
+
table: "patients",
|
|
759
|
+
columns: ["ssn"],
|
|
760
|
+
reason: "ER admit disambiguating two candidate records",
|
|
761
|
+
factor: { type: "totp", secret: totpSecret, code: code, now: nowMs },
|
|
762
|
+
});
|
|
763
|
+
check("break-glass double-claim: fresh 1-row grant minted (rowsRemaining 1)",
|
|
764
|
+
handle && handle.rowsRemaining === 1);
|
|
765
|
+
|
|
766
|
+
// Hold the grant row's lock from a dedicated raw session so BOTH claim
|
|
767
|
+
// UPDATEs park behind it — removing every timing assumption: neither
|
|
768
|
+
// caller can win the slot before both have reached the atomic claim.
|
|
769
|
+
var holder = await driver.connect();
|
|
770
|
+
var race = null;
|
|
771
|
+
try {
|
|
772
|
+
await driver.query(holder, "BEGIN", []);
|
|
773
|
+
var locked = await driver.query(holder,
|
|
774
|
+
'SELECT "_id" FROM _blamejs_break_glass_grants ' +
|
|
775
|
+
"WHERE \"_id\" = '" + handle.id + "' FOR UPDATE", []);
|
|
776
|
+
check("break-glass double-claim: holder session locked the grant row",
|
|
777
|
+
locked.rows.length === 1);
|
|
778
|
+
|
|
779
|
+
race = Promise.allSettled([
|
|
780
|
+
b.breakGlass.unsealRow(handle, "patients", "patient-001"),
|
|
781
|
+
b.breakGlass.unsealRow(handle, "patients", "patient-002"),
|
|
782
|
+
]);
|
|
783
|
+
|
|
784
|
+
// Both claim UPDATEs must be observed BLOCKED on the held row lock —
|
|
785
|
+
// the proof that both callers passed the pre-flight counter check and
|
|
786
|
+
// committed to the atomic claim before either could win.
|
|
787
|
+
await helpers.waitUntil(function () {
|
|
788
|
+
var n = _psql(
|
|
789
|
+
"SELECT count(*) AS n FROM pg_stat_activity " +
|
|
790
|
+
"WHERE wait_event_type = 'Lock' " +
|
|
791
|
+
"AND query LIKE 'UPDATE%_blamejs_break_glass_grants%';").trim();
|
|
792
|
+
return Number(n) >= 2;
|
|
793
|
+
}, {
|
|
794
|
+
timeoutMs: 15000,
|
|
795
|
+
label: "break-glass double-claim: both claim UPDATEs blocked on the held grant-row lock",
|
|
796
|
+
});
|
|
797
|
+
} finally {
|
|
798
|
+
try { await driver.query(holder, "COMMIT", []); } catch (_e) { /* best effort */ }
|
|
799
|
+
try { await driver.close(holder); } catch (_e) { /* best effort */ }
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
var results = await race;
|
|
803
|
+
var ok = results.filter(function (r) { return r.status === "fulfilled"; });
|
|
804
|
+
var bad = results.filter(function (r) { return r.status === "rejected"; });
|
|
805
|
+
check("break-glass double-claim: exactly ONE of two concurrent unseals " +
|
|
806
|
+
"succeeded under the 1-row grant on live Postgres",
|
|
807
|
+
ok.length === 1 && bad.length === 1);
|
|
808
|
+
check("break-glass double-claim: the winner decrypted its glass-locked ssn",
|
|
809
|
+
ok.length === 1 &&
|
|
810
|
+
(ok[0].value.ssn === "123-45-6789" || ok[0].value.ssn === "987-65-4321"));
|
|
811
|
+
var loser = bad.length === 1 ? bad[0].reason : null;
|
|
812
|
+
check("break-glass double-claim: the loser is refused as grant-exhausted",
|
|
813
|
+
loser !== null &&
|
|
814
|
+
/breakglass\/grant-exhausted/.test(String((loser && loser.code) || "")));
|
|
815
|
+
// The loser must lose AT THE ATOMIC CLAIM ("exhausted by a concurrent
|
|
816
|
+
// read" — 0 affected rows), NOT at the pre-flight counter check ("has
|
|
817
|
+
// consumed all ... allowed rows") — the pre-flight path never raced. A
|
|
818
|
+
// re-read-based claim admits both callers and neither message appears.
|
|
819
|
+
check("break-glass double-claim: the loser was refused by the affected-" +
|
|
820
|
+
"row-count claim, not the pre-flight check [loser: " +
|
|
821
|
+
String(loser && loser.message) + "]",
|
|
822
|
+
loser !== null &&
|
|
823
|
+
/exhausted by a concurrent read/.test(String((loser && loser.message) || "")));
|
|
824
|
+
|
|
825
|
+
var spent = _psql('SELECT "rowsConsumed" FROM _blamejs_break_glass_grants ' +
|
|
826
|
+
"WHERE \"_id\" = '" + handle.id + "';");
|
|
827
|
+
check("break-glass double-claim: rowsConsumed on Postgres is exactly 1 — " +
|
|
828
|
+
"the 1-row grant was spent once, not twice",
|
|
829
|
+
spent.trim() === "1");
|
|
830
|
+
}
|
|
831
|
+
|
|
711
832
|
// ====================================================================
|
|
712
833
|
// 6. crypto-field K_row (vault.row:) sealed cell stored on Postgres + read
|
|
713
834
|
// back, proving the typed codec (Buffer / object / string) survives a
|
|
@@ -312,6 +312,7 @@ async function run() {
|
|
|
312
312
|
await _section("session", _testSession);
|
|
313
313
|
await _section("nonce", _testNonceCluster);
|
|
314
314
|
await _section("rate-limit", _testRateLimitCluster);
|
|
315
|
+
await _section("sql-offset", _testOffsetWithoutLimit);
|
|
315
316
|
} finally {
|
|
316
317
|
try { await b.cluster.shutdown(); } catch (_e) {}
|
|
317
318
|
b.cluster._resetForTest();
|
|
@@ -609,6 +610,35 @@ async function _testRateLimitCluster() {
|
|
|
609
610
|
if (typeof backend.close === "function") backend.close();
|
|
610
611
|
}
|
|
611
612
|
|
|
613
|
+
// ======================================================================
|
|
614
|
+
// b.sql offset-without-limit sentinel on real MySQL.
|
|
615
|
+
// A SELECT with .offset(n) and no .limit() emits the max-unsigned-
|
|
616
|
+
// BIGINT LIMIT sentinel (`LIMIT 18446744073709551615 OFFSET n`) for the
|
|
617
|
+
// mysql dialect — MySQL rejects a bare OFFSET as a syntax error, so the
|
|
618
|
+
// sentinel is what makes offset-without-limit run at all. Layer-0 only
|
|
619
|
+
// string-asserts the mysql emission and executes it live on sqlite;
|
|
620
|
+
// this PREPARES and RUNS the emitted statement on the live server and
|
|
621
|
+
// asserts it returns exactly the rows after the offset.
|
|
622
|
+
// ======================================================================
|
|
623
|
+
async function _testOffsetWithoutLimit() {
|
|
624
|
+
_execMysql("DROP TABLE IF EXISTS `dl_mysql_offset`");
|
|
625
|
+
_execMysql("CREATE TABLE `dl_mysql_offset` (`a` BIGINT NOT NULL)");
|
|
626
|
+
_execMysql("INSERT INTO `dl_mysql_offset` VALUES (1),(2),(3),(4),(5)");
|
|
627
|
+
try {
|
|
628
|
+
var built = b.sql.select("dl_mysql_offset", { dialect: "mysql", quoteName: true })
|
|
629
|
+
.columns(["a"]).orderBy("a").offset(2).toSql();
|
|
630
|
+
softCheck("sql-offset(mysql): offset-without-limit emits the max-BIGINT LIMIT sentinel",
|
|
631
|
+
built.sql.indexOf("LIMIT 18446744073709551615 OFFSET 2") !== -1);
|
|
632
|
+
var res = await b.externalDb.query(built.sql, built.params, { backend: "ops" });
|
|
633
|
+
var got = (res.rows || []).map(function (r) { return Number(r.a); });
|
|
634
|
+
softCheck("sql-offset(mysql): the emitted offset-only SELECT runs on real MySQL " +
|
|
635
|
+
"(a bare OFFSET is a syntax error there) and returns exactly the rows after the offset",
|
|
636
|
+
JSON.stringify(got) === JSON.stringify([3, 4, 5]));
|
|
637
|
+
} finally {
|
|
638
|
+
_execMysql("DROP TABLE IF EXISTS `dl_mysql_offset`");
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
612
642
|
module.exports = { run: run };
|
|
613
643
|
|
|
614
644
|
if (require.main === module) {
|
|
@@ -316,6 +316,7 @@ async function run() {
|
|
|
316
316
|
await _section("cache", _testCacheCluster);
|
|
317
317
|
await _section("nonce", _testNonceCluster);
|
|
318
318
|
await _section("rate-limit", _testRateLimitCluster);
|
|
319
|
+
await _section("sql-offset", _testOffsetWithoutLimit);
|
|
319
320
|
} finally {
|
|
320
321
|
try { await b.cluster.shutdown(); } catch (_e) {}
|
|
321
322
|
b.cluster._resetForTest();
|
|
@@ -569,6 +570,34 @@ async function _testRateLimitCluster() {
|
|
|
569
570
|
if (typeof backend.close === "function") backend.close();
|
|
570
571
|
}
|
|
571
572
|
|
|
573
|
+
// ======================================================================
|
|
574
|
+
// b.sql offset-without-limit sentinel on real Postgres.
|
|
575
|
+
// A SELECT with .offset(n) and no .limit() emits `LIMIT ALL OFFSET n`
|
|
576
|
+
// for the postgres dialect (one query text across every backend).
|
|
577
|
+
// Layer-0 only string-asserts the postgres emission and executes it
|
|
578
|
+
// live on sqlite; this PREPARES and RUNS the emitted statement on the
|
|
579
|
+
// live server and asserts it returns exactly the rows after the offset
|
|
580
|
+
// — proving the LIMIT ALL sentinel is real Postgres syntax.
|
|
581
|
+
// ======================================================================
|
|
582
|
+
async function _testOffsetWithoutLimit() {
|
|
583
|
+
_psql('DROP TABLE IF EXISTS "dl_pg_offset";');
|
|
584
|
+
_psql('CREATE TABLE "dl_pg_offset" ("a" INTEGER NOT NULL);\n' +
|
|
585
|
+
'INSERT INTO "dl_pg_offset" VALUES (1),(2),(3),(4),(5);');
|
|
586
|
+
try {
|
|
587
|
+
var built = b.sql.select("dl_pg_offset", { dialect: "postgres", quoteName: true })
|
|
588
|
+
.columns(["a"]).orderBy("a").offset(2).toSql();
|
|
589
|
+
softCheck("sql-offset(pg): offset-without-limit emits the LIMIT ALL sentinel",
|
|
590
|
+
built.sql.indexOf("LIMIT ALL OFFSET 2") !== -1);
|
|
591
|
+
var res = await b.externalDb.query(built.sql, built.params, { backend: "ops" });
|
|
592
|
+
var got = (res.rows || []).map(function (r) { return Number(r.a); });
|
|
593
|
+
softCheck("sql-offset(pg): the emitted offset-only SELECT runs on real Postgres " +
|
|
594
|
+
"and returns exactly the rows after the offset",
|
|
595
|
+
JSON.stringify(got) === JSON.stringify([3, 4, 5]));
|
|
596
|
+
} finally {
|
|
597
|
+
_psql('DROP TABLE IF EXISTS "dl_pg_offset";');
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
572
601
|
module.exports = { run: run };
|
|
573
602
|
|
|
574
603
|
if (require.main === module) {
|