@blamejs/blamejs-shop 0.4.30 → 0.4.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/lib/asset-manifest.json +1 -1
- package/lib/checkout.js +8 -0
- package/lib/order.js +71 -11
- package/lib/vendor/MANIFEST.json +392 -278
- package/lib/vendor/blamejs/.github/workflows/ci.yml +34 -3
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +21 -4
- package/lib/vendor/blamejs/.gitignore +6 -0
- package/lib/vendor/blamejs/CHANGELOG.md +26 -0
- package/lib/vendor/blamejs/MIGRATING.md +43 -0
- package/lib/vendor/blamejs/README.md +8 -6
- package/lib/vendor/blamejs/SECURITY.md +19 -3
- package/lib/vendor/blamejs/api-snapshot.json +2190 -664
- package/lib/vendor/blamejs/docker/caddy/localstack.Caddyfile +19 -0
- package/lib/vendor/blamejs/docker/init/generate-certs.sh +1 -1
- package/lib/vendor/blamejs/docker/otel/config.yaml +42 -0
- package/lib/vendor/blamejs/docker/otel/export/.gitkeep +0 -0
- package/lib/vendor/blamejs/docker/postgres/initdb/10-replication.sh +15 -0
- package/lib/vendor/blamejs/docker/postgres/replica-entrypoint.sh +38 -0
- package/lib/vendor/blamejs/docker/toxiproxy/toxiproxy.json +14 -0
- package/lib/vendor/blamejs/docker-compose.test.yml +209 -0
- package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +132 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +221 -61
- package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +144 -9
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +99 -0
- package/lib/vendor/blamejs/fuzz/guard-sql.fuzz.js +36 -0
- package/lib/vendor/blamejs/index.js +4 -0
- package/lib/vendor/blamejs/lib/agent-envelope-mac.js +104 -0
- package/lib/vendor/blamejs/lib/agent-event-bus.js +105 -4
- package/lib/vendor/blamejs/lib/agent-posture-chain.js +8 -42
- package/lib/vendor/blamejs/lib/ai-content-detect.js +9 -10
- package/lib/vendor/blamejs/lib/api-key.js +158 -77
- package/lib/vendor/blamejs/lib/atomic-file.js +62 -4
- package/lib/vendor/blamejs/lib/audit-chain.js +47 -11
- package/lib/vendor/blamejs/lib/audit-sign.js +77 -2
- package/lib/vendor/blamejs/lib/audit-tools.js +79 -51
- package/lib/vendor/blamejs/lib/audit.js +259 -123
- package/lib/vendor/blamejs/lib/auth/oauth.js +53 -9
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +108 -47
- package/lib/vendor/blamejs/lib/auth/saml.js +6 -8
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +31 -5
- package/lib/vendor/blamejs/lib/backup/index.js +45 -10
- package/lib/vendor/blamejs/lib/break-glass.js +355 -147
- package/lib/vendor/blamejs/lib/cache.js +174 -105
- package/lib/vendor/blamejs/lib/chain-writer.js +38 -16
- package/lib/vendor/blamejs/lib/cli.js +19 -14
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +130 -104
- package/lib/vendor/blamejs/lib/cluster-storage.js +119 -22
- package/lib/vendor/blamejs/lib/cluster.js +119 -71
- package/lib/vendor/blamejs/lib/codepoint-class.js +23 -0
- package/lib/vendor/blamejs/lib/compliance.js +206 -4
- package/lib/vendor/blamejs/lib/consent.js +82 -29
- package/lib/vendor/blamejs/lib/constants.js +27 -11
- package/lib/vendor/blamejs/lib/crypto-field.js +916 -156
- package/lib/vendor/blamejs/lib/db-declare-row-policy.js +35 -22
- package/lib/vendor/blamejs/lib/db-file-lifecycle.js +3 -2
- package/lib/vendor/blamejs/lib/db-query.js +882 -260
- package/lib/vendor/blamejs/lib/db-schema.js +228 -44
- package/lib/vendor/blamejs/lib/db.js +249 -99
- package/lib/vendor/blamejs/lib/dsr.js +385 -55
- package/lib/vendor/blamejs/lib/error-page.js +14 -1
- package/lib/vendor/blamejs/lib/external-db-migrate.js +239 -137
- package/lib/vendor/blamejs/lib/external-db.js +549 -34
- package/lib/vendor/blamejs/lib/file-upload.js +52 -7
- package/lib/vendor/blamejs/lib/framework-error.js +20 -1
- package/lib/vendor/blamejs/lib/framework-files.js +73 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +695 -394
- package/lib/vendor/blamejs/lib/gate-contract.js +659 -1
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +26 -44
- package/lib/vendor/blamejs/lib/guard-all.js +1 -0
- package/lib/vendor/blamejs/lib/guard-auth.js +42 -112
- package/lib/vendor/blamejs/lib/guard-cidr.js +33 -154
- package/lib/vendor/blamejs/lib/guard-csv.js +46 -113
- package/lib/vendor/blamejs/lib/guard-domain.js +34 -157
- package/lib/vendor/blamejs/lib/guard-dsn.js +27 -43
- package/lib/vendor/blamejs/lib/guard-email.js +47 -69
- package/lib/vendor/blamejs/lib/guard-envelope.js +19 -32
- package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +24 -42
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +25 -43
- package/lib/vendor/blamejs/lib/guard-filename.js +42 -106
- package/lib/vendor/blamejs/lib/guard-graphql.js +42 -123
- package/lib/vendor/blamejs/lib/guard-html.js +53 -108
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +24 -42
- package/lib/vendor/blamejs/lib/guard-image.js +46 -103
- package/lib/vendor/blamejs/lib/guard-imap-command.js +18 -32
- package/lib/vendor/blamejs/lib/guard-jmap.js +16 -30
- package/lib/vendor/blamejs/lib/guard-json.js +38 -108
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +38 -171
- package/lib/vendor/blamejs/lib/guard-jwt.js +49 -179
- package/lib/vendor/blamejs/lib/guard-list-id.js +25 -41
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +27 -43
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +24 -42
- package/lib/vendor/blamejs/lib/guard-mail-move.js +26 -44
- package/lib/vendor/blamejs/lib/guard-mail-query.js +28 -46
- package/lib/vendor/blamejs/lib/guard-mail-reply.js +24 -42
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +24 -42
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +17 -31
- package/lib/vendor/blamejs/lib/guard-markdown.js +37 -104
- package/lib/vendor/blamejs/lib/guard-message-id.js +26 -45
- package/lib/vendor/blamejs/lib/guard-mime.js +39 -151
- package/lib/vendor/blamejs/lib/guard-oauth.js +54 -135
- package/lib/vendor/blamejs/lib/guard-pdf.js +45 -101
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +21 -31
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +24 -42
- package/lib/vendor/blamejs/lib/guard-regex.js +33 -107
- package/lib/vendor/blamejs/lib/guard-saga-config.js +24 -42
- package/lib/vendor/blamejs/lib/guard-shell.js +42 -172
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +48 -54
- package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +24 -42
- package/lib/vendor/blamejs/lib/guard-sql.js +1491 -0
- package/lib/vendor/blamejs/lib/guard-stream-args.js +24 -43
- package/lib/vendor/blamejs/lib/guard-svg.js +47 -65
- package/lib/vendor/blamejs/lib/guard-template.js +35 -172
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +26 -45
- package/lib/vendor/blamejs/lib/guard-time.js +32 -154
- package/lib/vendor/blamejs/lib/guard-trace-context.js +25 -44
- package/lib/vendor/blamejs/lib/guard-uuid.js +32 -153
- package/lib/vendor/blamejs/lib/guard-xml.js +38 -113
- package/lib/vendor/blamejs/lib/guard-yaml.js +51 -163
- package/lib/vendor/blamejs/lib/http-client.js +37 -9
- package/lib/vendor/blamejs/lib/inbox.js +120 -107
- package/lib/vendor/blamejs/lib/legal-hold.js +121 -50
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +47 -31
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +32 -18
- package/lib/vendor/blamejs/lib/mail-auth.js +236 -0
- package/lib/vendor/blamejs/lib/mail-crypto-smime.js +2 -6
- package/lib/vendor/blamejs/lib/mail-dkim.js +1 -0
- package/lib/vendor/blamejs/lib/mail-greylist.js +2 -6
- package/lib/vendor/blamejs/lib/mail-helo.js +2 -6
- package/lib/vendor/blamejs/lib/mail-journal.js +85 -64
- package/lib/vendor/blamejs/lib/mail-rbl.js +2 -6
- package/lib/vendor/blamejs/lib/mail-scan.js +2 -6
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +117 -12
- package/lib/vendor/blamejs/lib/mail-server-mx.js +276 -7
- package/lib/vendor/blamejs/lib/mail-spam-score.js +2 -6
- package/lib/vendor/blamejs/lib/mail-store.js +293 -154
- package/lib/vendor/blamejs/lib/mail.js +8 -4
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +71 -25
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +19 -8
- package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -1
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +17 -7
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +75 -51
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +102 -32
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +21 -5
- package/lib/vendor/blamejs/lib/migrations.js +108 -66
- package/lib/vendor/blamejs/lib/network-heartbeat.js +7 -0
- package/lib/vendor/blamejs/lib/network-proxy.js +24 -1
- package/lib/vendor/blamejs/lib/nonce-store.js +31 -9
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +9 -4
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +57 -3
- package/lib/vendor/blamejs/lib/object-store/gcs.js +4 -1
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +5 -2
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +38 -6
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +9 -1
- package/lib/vendor/blamejs/lib/observability.js +124 -0
- package/lib/vendor/blamejs/lib/otel-export.js +12 -3
- package/lib/vendor/blamejs/lib/outbox.js +184 -83
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +47 -7
- package/lib/vendor/blamejs/lib/pqc-agent.js +44 -0
- package/lib/vendor/blamejs/lib/pubsub-cluster.js +42 -20
- package/lib/vendor/blamejs/lib/queue-local.js +225 -140
- package/lib/vendor/blamejs/lib/queue-redis.js +9 -1
- package/lib/vendor/blamejs/lib/queue-sqs.js +6 -0
- package/lib/vendor/blamejs/lib/queue.js +7 -0
- package/lib/vendor/blamejs/lib/redact.js +68 -11
- package/lib/vendor/blamejs/lib/redis-client.js +160 -31
- package/lib/vendor/blamejs/lib/request-helpers.js +7 -0
- package/lib/vendor/blamejs/lib/retention.js +101 -40
- package/lib/vendor/blamejs/lib/router.js +212 -5
- package/lib/vendor/blamejs/lib/safe-dns.js +29 -45
- package/lib/vendor/blamejs/lib/safe-ical.js +18 -33
- package/lib/vendor/blamejs/lib/safe-icap.js +27 -43
- package/lib/vendor/blamejs/lib/safe-sieve.js +21 -40
- package/lib/vendor/blamejs/lib/safe-sql.js +212 -3
- package/lib/vendor/blamejs/lib/safe-url.js +170 -3
- package/lib/vendor/blamejs/lib/safe-vcard.js +18 -33
- package/lib/vendor/blamejs/lib/scheduler.js +35 -12
- package/lib/vendor/blamejs/lib/seeders.js +122 -74
- package/lib/vendor/blamejs/lib/session-stores.js +42 -14
- package/lib/vendor/blamejs/lib/session.js +175 -77
- package/lib/vendor/blamejs/lib/sql.js +3842 -0
- package/lib/vendor/blamejs/lib/sse.js +26 -0
- package/lib/vendor/blamejs/lib/ssrf-guard.js +151 -4
- package/lib/vendor/blamejs/lib/static.js +177 -34
- package/lib/vendor/blamejs/lib/subject.js +96 -49
- package/lib/vendor/blamejs/lib/vault/index.js +3 -2
- package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +3 -2
- package/lib/vendor/blamejs/lib/vault/rotate.js +168 -108
- package/lib/vendor/blamejs/lib/vault-aad.js +6 -0
- package/lib/vendor/blamejs/lib/vendor-data.js +2 -0
- package/lib/vendor/blamejs/lib/websocket.js +35 -5
- package/lib/vendor/blamejs/lib/worker-pool.js +11 -0
- package/lib/vendor/blamejs/package.json +2 -2
- package/lib/vendor/blamejs/release-notes/v0.14.x.json +1503 -0
- package/lib/vendor/blamejs/release-notes/v0.15.0.json +77 -0
- package/lib/vendor/blamejs/release-notes/v0.15.1.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.15.2.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.15.3.json +39 -0
- package/lib/vendor/blamejs/release-notes/v0.15.4.json +39 -0
- package/lib/vendor/blamejs/release-notes/v0.15.5.json +22 -0
- package/lib/vendor/blamejs/release-notes/v0.15.6.json +59 -0
- package/lib/vendor/blamejs/scripts/check-services.js +21 -0
- package/lib/vendor/blamejs/scripts/gen-migrating.js +51 -0
- package/lib/vendor/blamejs/scripts/release.js +398 -38
- package/lib/vendor/blamejs/test/00-primitives.js +117 -0
- package/lib/vendor/blamejs/test/10-state.js +140 -14
- package/lib/vendor/blamejs/test/20-db.js +65 -2
- package/lib/vendor/blamejs/test/helpers/db.js +9 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +27 -15
- package/lib/vendor/blamejs/test/helpers/services.js +21 -0
- package/lib/vendor/blamejs/test/integration/audit-actor-binding-pg.test.js +246 -0
- package/lib/vendor/blamejs/test/integration/audit-chain-external-db.test.js +517 -0
- package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +639 -0
- package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +832 -0
- package/lib/vendor/blamejs/test/integration/backup-restore-objectstore.test.js +453 -0
- package/lib/vendor/blamejs/test/integration/data-layer-cluster-mysql.test.js +649 -0
- package/lib/vendor/blamejs/test/integration/data-layer-cluster-pg.test.js +770 -0
- package/lib/vendor/blamejs/test/integration/data-layer-mysql-privacy.test.js +630 -0
- package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +610 -0
- package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +577 -0
- package/lib/vendor/blamejs/test/integration/data-layer-postgres.test.js +771 -0
- package/lib/vendor/blamejs/test/integration/db-layer-mysql.test.js +549 -0
- package/lib/vendor/blamejs/test/integration/db-layer-postgres.test.js +598 -0
- package/lib/vendor/blamejs/test/integration/distributed-scheduler-fencing-pg.test.js +602 -0
- package/lib/vendor/blamejs/test/integration/external-db-postgres.test.js +576 -0
- package/lib/vendor/blamejs/test/integration/framework-schema-mysql.test.js +353 -0
- package/lib/vendor/blamejs/test/integration/log-stream-cloudwatch.test.js +224 -0
- package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +142 -17
- package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +25 -10
- package/lib/vendor/blamejs/test/integration/object-store-azure.test.js +101 -0
- package/lib/vendor/blamejs/test/integration/object-store-gcs.test.js +239 -0
- package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +35 -16
- package/lib/vendor/blamejs/test/integration/object-store-worm-lock.test.js +291 -0
- package/lib/vendor/blamejs/test/integration/pubsub.test.js +14 -0
- package/lib/vendor/blamejs/test/integration/queue-sqs.test.js +322 -0
- package/lib/vendor/blamejs/test/integration/redis-reconnect-toxiproxy.test.js +300 -0
- package/lib/vendor/blamejs/test/integration/sql-fts5-catalog-sqlite.test.js +154 -0
- package/lib/vendor/blamejs/test/integration/tls-classical-downgrade-audit.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +175 -12
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-exclusive-temp.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-checkpoint-false-rollback.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-query-self-log.test.js +126 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-safeemit-redacts-secrets.test.js +196 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-signing-key-rotation.test.js +197 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-verifybundle-tamper.test.js +209 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-key-encoding.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-residency-posture.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-scheduletest-drill.test.js +318 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +233 -7
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +1120 -14
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +229 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +24 -7
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-dual-read-migrate.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-per-row-key.test.js +350 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-unseal-rate-cap.test.js +27 -9
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-upgrade-dialect.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-interop-oracles.test.js +392 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csrf-protect.test.js +159 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-column-gate.test.js +180 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +5 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-sealed-field-in.test.js +101 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-schema-drift.test.js +38 -5
- package/lib/vendor/blamejs/test/layer-0-primitives/db-schema-reconcile-emittable.test.js +127 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-stream-and-payload-shape.test.js +267 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/defineguard-default-gate-posture-caps.test.js +30 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-replaystore-required.test.js +46 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +218 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/erase-posture-vacuum.test.js +210 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +4 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +48 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +237 -5
- package/lib/vendor/blamejs/test/layer-0-primitives/fetch-metadata.test.js +20 -9
- package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +193 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +90 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +10 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +15 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +146 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +189 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +3 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +123 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +207 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +43 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otlp-attr-redaction.test.js +101 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/outbox-inflight-reaper.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey-real-vectors.test.js +429 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +21 -11
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-byo-db.test.js +40 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +83 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +113 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention-dryrun-no-vacuum.test.js +99 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-use-path-scope.test.js +255 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-canonicalize.test.js +309 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-xml.test.js +143 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/saml-subjectconfirmation-notonorafter.test.js +287 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc-ecdsa-p1363.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +31 -4
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +45 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +49 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +595 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sse-backpressure.test.js +91 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +194 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket-extension-header.test.js +88 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool-recycle-race.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-5-integration/external-db-residency.test.js +638 -0
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +21 -0
- package/lib/vendor/blamejs/test/smoke.js +79 -21
- package/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.14.0.json +0 -43
- package/lib/vendor/blamejs/release-notes/v0.14.1.json +0 -60
- package/lib/vendor/blamejs/release-notes/v0.14.10.json +0 -54
- package/lib/vendor/blamejs/release-notes/v0.14.11.json +0 -72
- package/lib/vendor/blamejs/release-notes/v0.14.12.json +0 -95
- package/lib/vendor/blamejs/release-notes/v0.14.13.json +0 -52
- package/lib/vendor/blamejs/release-notes/v0.14.14.json +0 -31
- package/lib/vendor/blamejs/release-notes/v0.14.16.json +0 -45
- package/lib/vendor/blamejs/release-notes/v0.14.17.json +0 -57
- package/lib/vendor/blamejs/release-notes/v0.14.18.json +0 -127
- package/lib/vendor/blamejs/release-notes/v0.14.19.json +0 -61
- package/lib/vendor/blamejs/release-notes/v0.14.2.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.20.json +0 -73
- package/lib/vendor/blamejs/release-notes/v0.14.21.json +0 -98
- package/lib/vendor/blamejs/release-notes/v0.14.22.json +0 -91
- package/lib/vendor/blamejs/release-notes/v0.14.3.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.4.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.5.json +0 -18
- package/lib/vendor/blamejs/release-notes/v0.14.6.json +0 -60
- package/lib/vendor/blamejs/release-notes/v0.14.7.json +0 -77
- package/lib/vendor/blamejs/release-notes/v0.14.8.json +0 -27
- package/lib/vendor/blamejs/release-notes/v0.14.9.json +0 -40
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
|
|
64
64
|
var C = require("./constants");
|
|
65
65
|
var { defineClass } = require("./framework-error");
|
|
66
|
+
var gateContract = require("./gate-contract");
|
|
66
67
|
|
|
67
68
|
var SafeVcardError = defineClass("SafeVcardError", { alwaysPermanent: true });
|
|
68
69
|
|
|
@@ -90,12 +91,7 @@ var PROFILES = Object.freeze({
|
|
|
90
91
|
}),
|
|
91
92
|
});
|
|
92
93
|
|
|
93
|
-
var COMPLIANCE_POSTURES =
|
|
94
|
-
hipaa: "strict",
|
|
95
|
-
"pci-dss": "strict",
|
|
96
|
-
gdpr: "strict",
|
|
97
|
-
soc2: "strict",
|
|
98
|
-
});
|
|
94
|
+
var COMPLIANCE_POSTURES = gateContract.ALL_STRICT_POSTURES;
|
|
99
95
|
|
|
100
96
|
// Property-name allowlist per RFC 6350 §6 (vCard 4.0 property
|
|
101
97
|
// registry) + RFC 2426 §3 (legacy 3.0 properties retained for
|
|
@@ -217,24 +213,6 @@ function parse(text, opts) {
|
|
|
217
213
|
return { vcards: vcards };
|
|
218
214
|
}
|
|
219
215
|
|
|
220
|
-
/**
|
|
221
|
-
* @primitive b.safeVcard.compliancePosture
|
|
222
|
-
* @signature b.safeVcard.compliancePosture(name)
|
|
223
|
-
* @since 0.9.81
|
|
224
|
-
* @status stable
|
|
225
|
-
* @related b.safeVcard.parse
|
|
226
|
-
*
|
|
227
|
-
* Map a compliance-posture name to its profile. Returns the profile
|
|
228
|
-
* string for a known posture, `null` for unknown names.
|
|
229
|
-
*
|
|
230
|
-
* @example
|
|
231
|
-
* b.safeVcard.compliancePosture("hipaa"); // -> "strict"
|
|
232
|
-
* b.safeVcard.compliancePosture("loose"); // -> null
|
|
233
|
-
*/
|
|
234
|
-
function compliancePosture(name) {
|
|
235
|
-
return COMPLIANCE_POSTURES[name] || null;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
216
|
// ---- Internal ----
|
|
239
217
|
|
|
240
218
|
function _resolveCaps(opts) {
|
|
@@ -462,12 +440,19 @@ function _preview(s) {
|
|
|
462
440
|
return s.length > 64 ? s.slice(0, 64) + "..." : s; // log-preview length cap
|
|
463
441
|
}
|
|
464
442
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
443
|
+
// compliancePosture is assembled by gateContract.defineParser below; its
|
|
444
|
+
// wiki section renders from the single-sourced @abiTemplate (defineParser)
|
|
445
|
+
// block in gate-contract.js, instantiated for this guard by the page
|
|
446
|
+
// generator.
|
|
447
|
+
module.exports = gateContract.defineParser({
|
|
448
|
+
name: "vcard",
|
|
449
|
+
entry: parse,
|
|
450
|
+
entryName: "parse",
|
|
451
|
+
errorClass: SafeVcardError,
|
|
452
|
+
profiles: PROFILES,
|
|
453
|
+
postures: COMPLIANCE_POSTURES,
|
|
454
|
+
extra: {
|
|
455
|
+
KNOWN_PROPERTIES: KNOWN_PROPERTIES,
|
|
456
|
+
EMBED_PROPERTIES: EMBED_PROPERTIES,
|
|
457
|
+
},
|
|
458
|
+
});
|
|
@@ -43,6 +43,7 @@ var lazyRequire = require("./lazy-require");
|
|
|
43
43
|
var audit = lazyRequire(function () { return require("./audit"); });
|
|
44
44
|
var log = lazyRequire(function () { return require("./log").boot("scheduler"); });
|
|
45
45
|
var clusterStorage = require("./cluster-storage");
|
|
46
|
+
var sql = require("./sql");
|
|
46
47
|
var validateOpts = require("./validate-opts");
|
|
47
48
|
var C = require("./constants");
|
|
48
49
|
var { SchedulerError } = require("./framework-error");
|
|
@@ -51,6 +52,18 @@ var DEFAULT_MAX_JOB_MS = C.TIME.minutes(10);
|
|
|
51
52
|
var DEFAULT_TICK_RETENTION_MS = C.TIME.days(7);
|
|
52
53
|
var DEFAULT_TICK_PRUNE_INTERVAL_MS = C.TIME.minutes(1);
|
|
53
54
|
|
|
55
|
+
// b.sql opts for every _blamejs_scheduler_ticks statement: thread the ACTIVE
|
|
56
|
+
// backend dialect (clusterStorage.dialect() — "sqlite" single-node,
|
|
57
|
+
// "postgres" | "mysql" in cluster mode) so the emitted identifier quoting +
|
|
58
|
+
// dialect idioms (ON CONFLICT DO NOTHING vs the MySQL no-op fold) match the
|
|
59
|
+
// backend the SQL dispatches to. Defaulting to "sqlite" works on Postgres
|
|
60
|
+
// only by accident (both double-quote identifiers) and emits the wrong
|
|
61
|
+
// quoting on MySQL. clusterStorage.execute still rewrites the bare table name
|
|
62
|
+
// + translates `?` placeholders at dispatch; this controls only the builder-
|
|
63
|
+
// side quoting + idiom selection. The table name stays BARE (no quoteName)
|
|
64
|
+
// so clusterStorage's prefix rewrite still fires.
|
|
65
|
+
function _ticksSqlOpts() { return { dialect: clusterStorage.dialect() }; }
|
|
66
|
+
|
|
54
67
|
// ---- Cron parsing ----
|
|
55
68
|
|
|
56
69
|
var CRON_SHORTHANDS = {
|
|
@@ -497,7 +510,7 @@ function create(opts) {
|
|
|
497
510
|
task.nextRun = Date.now() + spec.every;
|
|
498
511
|
}
|
|
499
512
|
task.exprDesc = "every " + spec.every + "ms" +
|
|
500
|
-
(spec.baseline ? "
|
|
513
|
+
(spec.baseline ? " anchored " + spec.baseline : "") +
|
|
501
514
|
(tz ? " " + tz : "");
|
|
502
515
|
}
|
|
503
516
|
|
|
@@ -562,13 +575,23 @@ function create(opts) {
|
|
|
562
575
|
var tickKey = task.name + ":" + nominalRun;
|
|
563
576
|
var claimedBy = (typeof clusterInstance.currentNodeId === "function")
|
|
564
577
|
? clusterInstance.currentNodeId() : "unknown";
|
|
565
|
-
clusterStorage
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
[tickKey,
|
|
571
|
-
|
|
578
|
+
// BARE logical table name — clusterStorage rewrites _blamejs_scheduler_ticks
|
|
579
|
+
// to the configured prefix and placeholderizes the ? markers. The
|
|
580
|
+
// PRIMARY KEY race on tickKey deduplicates the split-brain window; the
|
|
581
|
+
// loser's ON CONFLICT DO NOTHING reports zero rowCount and skips.
|
|
582
|
+
var claimBuilt = sql.upsert("_blamejs_scheduler_ticks", _ticksSqlOpts()) // allow:hand-rolled-sql — bare logical name for clusterStorage rewrite
|
|
583
|
+
.columns(["tickKey", "name", "scheduledAtUnix", "claimedAtUnix", "claimedBy"])
|
|
584
|
+
.values({
|
|
585
|
+
tickKey: tickKey,
|
|
586
|
+
name: task.name,
|
|
587
|
+
scheduledAtUnix: nominalRun,
|
|
588
|
+
claimedAtUnix: Date.now(),
|
|
589
|
+
claimedBy: claimedBy,
|
|
590
|
+
})
|
|
591
|
+
.onConflict(["tickKey"])
|
|
592
|
+
.doNothing()
|
|
593
|
+
.toSql();
|
|
594
|
+
clusterStorage.execute(claimBuilt.sql, claimBuilt.params).then(function (result) {
|
|
572
595
|
var won = (result && result.rowCount > 0);
|
|
573
596
|
if (won) {
|
|
574
597
|
_runFire(task);
|
|
@@ -604,10 +627,10 @@ function create(opts) {
|
|
|
604
627
|
var threshold = Date.now() - (
|
|
605
628
|
typeof olderThanMs === "number" ? olderThanMs : tickRetentionMs
|
|
606
629
|
);
|
|
607
|
-
var
|
|
608
|
-
"
|
|
609
|
-
|
|
610
|
-
);
|
|
630
|
+
var pruneBuilt = sql.delete("_blamejs_scheduler_ticks", _ticksSqlOpts()) // allow:hand-rolled-sql — bare logical name for clusterStorage rewrite
|
|
631
|
+
.where("scheduledAtUnix", "<", threshold)
|
|
632
|
+
.toSql();
|
|
633
|
+
var result = await clusterStorage.execute(pruneBuilt.sql, pruneBuilt.params);
|
|
611
634
|
var removed = (result && result.rowCount) || 0;
|
|
612
635
|
if (removed > 0) {
|
|
613
636
|
_emit("system.scheduler.tick.pruned", {
|
|
@@ -58,10 +58,13 @@ var nodePath = require("node:path");
|
|
|
58
58
|
var atomicFile = require("./atomic-file");
|
|
59
59
|
var C = require("./constants");
|
|
60
60
|
var dbSchema = require("./db-schema");
|
|
61
|
+
var frameworkSchema = require("./framework-schema");
|
|
61
62
|
var lazyRequire = require("./lazy-require");
|
|
62
63
|
var { boot } = require("./log");
|
|
63
64
|
var migrationFiles = require("./migration-files");
|
|
64
65
|
var requestHelpers = require("./request-helpers");
|
|
66
|
+
var safeSql = require("./safe-sql");
|
|
67
|
+
var sql = require("./sql");
|
|
65
68
|
var validateOpts = require("./validate-opts");
|
|
66
69
|
var { SeederError } = require("./framework-error");
|
|
67
70
|
|
|
@@ -72,13 +75,29 @@ var observability = lazyRequire(function () { return require("./observability");
|
|
|
72
75
|
|
|
73
76
|
var _err = SeederError.factory;
|
|
74
77
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
var
|
|
81
|
-
var
|
|
78
|
+
// Logical framework-table names, resolved to the configured prefix via
|
|
79
|
+
// frameworkSchema.tableName at every call site. These run against the
|
|
80
|
+
// local node:sqlite handle directly (no clusterStorage rewrite in the
|
|
81
|
+
// path), so b.sql is built with quoteName: true on the resolved name —
|
|
82
|
+
// the `"name"` identifier form the single-node path always prepares.
|
|
83
|
+
var SEEDERS_TABLE = "_blamejs_seeders"; // allow:hand-rolled-sql — logical name declaration; physical name + prefix resolve via frameworkSchema.tableName below
|
|
84
|
+
var LOCK_TABLE = "_blamejs_seeders_lock"; // allow:hand-rolled-sql — logical name declaration; physical name + prefix resolve via frameworkSchema.tableName below
|
|
85
|
+
|
|
86
|
+
// b.sql opts for the local single-node handle: the resolved table name,
|
|
87
|
+
// quoted by construction. tableName() applies the configurable prefix
|
|
88
|
+
// (byte-identical to the literal under the default _blamejs_ prefix).
|
|
89
|
+
function _seedersTable() { return frameworkSchema.tableName(SEEDERS_TABLE); }
|
|
90
|
+
function _lockTable() { return frameworkSchema.tableName(LOCK_TABLE); }
|
|
91
|
+
// b.sql opts resolved from the handle's dialect (sqlite by default; an
|
|
92
|
+
// operator's own Postgres / MySQL handle declares `handle.dialect`).
|
|
93
|
+
// quoteName forces the resolved framework name to quote. The
|
|
94
|
+
// handle-dialect / opts / key-text-type resolution is shared with
|
|
95
|
+
// db-schema's reconciler + migrations.js, so it is composed from db-schema
|
|
96
|
+
// rather than re-derived here. The historical default (sqlite) is
|
|
97
|
+
// byte-identical for every local-handle caller.
|
|
98
|
+
var _handleDialect = dbSchema.handleDialect;
|
|
99
|
+
var _sqlOpts = dbSchema.sqlOpts;
|
|
100
|
+
var _keyTextType = dbSchema.keyTextType;
|
|
82
101
|
|
|
83
102
|
// Filename grammar: leading numeric prefix (any width), '-', non-empty
|
|
84
103
|
// body of [A-Za-z0-9_-], '.js'. Same shape as migrations to avoid
|
|
@@ -279,48 +298,63 @@ function _ensureTables(db) {
|
|
|
279
298
|
// Both _blamejs_seeders + _blamejs_seeders_lock are part of
|
|
280
299
|
// FRAMEWORK_SCHEMA so db.js creates them at boot. The CREATE IF NOT
|
|
281
300
|
// EXISTS here is defensive for tests that hand-seed a fresh
|
|
282
|
-
// node:sqlite Database without going through b.db.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
"
|
|
298
|
-
|
|
299
|
-
);
|
|
301
|
+
// node:sqlite Database without going through b.db. Built through b.sql
|
|
302
|
+
// so the identifiers quote by construction (composite PK + the single-
|
|
303
|
+
// row CHECK fence on the lock table mirror db.js's FRAMEWORK_SCHEMA).
|
|
304
|
+
// env + name are the composite PRIMARY KEY, so both take the key-safe
|
|
305
|
+
// text type (VARCHAR on mysql, TEXT elsewhere). The lock's scope CHECK
|
|
306
|
+
// quotes the column under the handle dialect (backtick on mysql); lockedAt
|
|
307
|
+
// is ms-epoch (`int` → BIGINT on Postgres/MySQL, INTEGER on SQLite).
|
|
308
|
+
var dialect = _handleDialect(db);
|
|
309
|
+
var kt = _keyTextType(db);
|
|
310
|
+
var scopeCheck = "CHECK (" + safeSql.quoteIdentifier("scope", dialect, { allowReserved: true }) + " = 'lock')";
|
|
311
|
+
var seedersDdl = sql.createTable(_seedersTable(), [
|
|
312
|
+
{ name: "env", type: kt, notNull: true },
|
|
313
|
+
{ name: "name", type: kt, notNull: true },
|
|
314
|
+
{ name: "description", type: "text" },
|
|
315
|
+
{ name: "appliedAt", type: "text", notNull: true },
|
|
316
|
+
{ name: "rerunnable", type: "int", notNull: true, default: 0 },
|
|
317
|
+
], { quoteName: true, primaryKey: ["env", "name"], dialect: dialect });
|
|
318
|
+
_runSql(db, seedersDdl.sql);
|
|
319
|
+
var lockDdl = sql.createTable(_lockTable(), [
|
|
320
|
+
{ name: "scope", type: kt, primaryKey: true, constraints: scopeCheck },
|
|
321
|
+
{ name: "lockedAt", type: "int", notNull: true },
|
|
322
|
+
{ name: "lockedBy", type: "text", notNull: true },
|
|
323
|
+
], { quoteName: true, dialect: dialect });
|
|
324
|
+
_runSql(db, lockDdl.sql);
|
|
300
325
|
}
|
|
301
326
|
|
|
302
327
|
function _lockHolderId() {
|
|
303
328
|
return String(process.pid) + "@" + (require("node:os").hostname() || "unknown");
|
|
304
329
|
}
|
|
305
330
|
|
|
331
|
+
// b.sql-built statements for the single advisory-lock row. Each binds
|
|
332
|
+
// every value as a placeholder (the constant scope "lock" included) and
|
|
333
|
+
// quotes the resolved table name by construction.
|
|
334
|
+
function _lockInsertSql(db, nowMs, holder) {
|
|
335
|
+
return sql.insert(_lockTable(), _sqlOpts(db))
|
|
336
|
+
.values({ scope: "lock", lockedAt: nowMs, lockedBy: holder }).toSql();
|
|
337
|
+
}
|
|
338
|
+
|
|
306
339
|
function _acquireLock(db, lockStaleAfterMs, clock) {
|
|
307
340
|
var holder = _lockHolderId();
|
|
308
341
|
var nowMs = clock();
|
|
309
342
|
try {
|
|
310
|
-
db
|
|
311
|
-
|
|
312
|
-
|
|
343
|
+
var ins = _lockInsertSql(db, nowMs, holder);
|
|
344
|
+
var insStmt = db.prepare(ins.sql);
|
|
345
|
+
insStmt.run.apply(insStmt, ins.params);
|
|
313
346
|
return holder;
|
|
314
347
|
} catch (_e) {
|
|
315
|
-
var
|
|
316
|
-
"
|
|
317
|
-
|
|
348
|
+
var selBuilt = sql.select(_lockTable(), _sqlOpts(db))
|
|
349
|
+
.columns(["lockedAt", "lockedBy"]).where("scope", "lock").toSql();
|
|
350
|
+
var selStmt = db.prepare(selBuilt.sql);
|
|
351
|
+
var existing = selStmt.get.apply(selStmt, selBuilt.params);
|
|
318
352
|
if (!existing) {
|
|
319
353
|
// Race window between INSERT failure and SELECT — try once more.
|
|
320
354
|
try {
|
|
321
|
-
db
|
|
322
|
-
|
|
323
|
-
|
|
355
|
+
var ins2 = _lockInsertSql(db, nowMs, holder);
|
|
356
|
+
var ins2Stmt = db.prepare(ins2.sql);
|
|
357
|
+
ins2Stmt.run.apply(ins2Stmt, ins2.params);
|
|
324
358
|
return holder;
|
|
325
359
|
} catch (e2) {
|
|
326
360
|
throw _err("LOCK_BUSY",
|
|
@@ -329,23 +363,32 @@ function _acquireLock(db, lockStaleAfterMs, clock) {
|
|
|
329
363
|
}
|
|
330
364
|
var ageMs = nowMs - Number(existing.lockedAt);
|
|
331
365
|
if (lockStaleAfterMs > 0 && ageMs > lockStaleAfterMs) {
|
|
332
|
-
|
|
366
|
+
// Force-replace the stale lock atomically. The transaction boundary
|
|
367
|
+
// is dialect-aware: only SQLite has the `BEGIN IMMEDIATE`
|
|
368
|
+
// write-lock-up-front form — Postgres + MySQL reject the `IMMEDIATE`
|
|
369
|
+
// keyword, so the shared runInTransaction helper emits a plain
|
|
370
|
+
// portable `BEGIN`/`COMMIT`/`ROLLBACK` there.
|
|
371
|
+
var lockMode = _handleDialect(db) === "sqlite" ? "IMMEDIATE" : null;
|
|
333
372
|
try {
|
|
334
|
-
|
|
335
|
-
.
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
373
|
+
return dbSchema.runInTransaction(db, function () {
|
|
374
|
+
var delBuilt = sql.delete(_lockTable(), _sqlOpts(db))
|
|
375
|
+
.where("scope", "lock").where("lockedAt", existing.lockedAt).toSql();
|
|
376
|
+
var delStmt = db.prepare(delBuilt.sql);
|
|
377
|
+
delStmt.run.apply(delStmt, delBuilt.params);
|
|
378
|
+
var insForce = _lockInsertSql(db, nowMs, holder);
|
|
379
|
+
var insForceStmt = db.prepare(insForce.sql);
|
|
380
|
+
insForceStmt.run.apply(insForceStmt, insForce.params);
|
|
381
|
+
return holder;
|
|
382
|
+
}, {
|
|
383
|
+
lockMode: lockMode,
|
|
384
|
+
onRollbackFail: function (rollbackErr) {
|
|
385
|
+
log.debug("rollback-failed", {
|
|
386
|
+
op: "lock-stale-replace",
|
|
387
|
+
error: rollbackErr && rollbackErr.message,
|
|
388
|
+
});
|
|
389
|
+
},
|
|
390
|
+
});
|
|
341
391
|
} catch (forceErr) {
|
|
342
|
-
try { _runSql(db, "ROLLBACK"); }
|
|
343
|
-
catch (rollbackErr) {
|
|
344
|
-
log.debug("rollback-failed", {
|
|
345
|
-
op: "lock-stale-replace",
|
|
346
|
-
error: rollbackErr && rollbackErr.message,
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
392
|
throw _err("LOCK_STALE_REPLACE_FAILED",
|
|
350
393
|
"seeders: could not replace stale lock: " +
|
|
351
394
|
((forceErr && forceErr.message) || String(forceErr)));
|
|
@@ -359,9 +402,10 @@ function _acquireLock(db, lockStaleAfterMs, clock) {
|
|
|
359
402
|
|
|
360
403
|
function _releaseLock(db, holder) {
|
|
361
404
|
try {
|
|
362
|
-
|
|
363
|
-
"
|
|
364
|
-
|
|
405
|
+
var built = sql.delete(_lockTable(), _sqlOpts(db))
|
|
406
|
+
.where("scope", "lock").where("lockedBy", holder).toSql();
|
|
407
|
+
var stmt = db.prepare(built.sql);
|
|
408
|
+
stmt.run.apply(stmt, built.params);
|
|
365
409
|
} catch (_e) { /* best-effort */ }
|
|
366
410
|
}
|
|
367
411
|
|
|
@@ -406,10 +450,13 @@ function create(opts) {
|
|
|
406
450
|
}
|
|
407
451
|
|
|
408
452
|
function _appliedRows(db, env) {
|
|
409
|
-
|
|
410
|
-
"
|
|
411
|
-
"
|
|
412
|
-
|
|
453
|
+
var built = sql.select(_seedersTable(), _sqlOpts(db))
|
|
454
|
+
.columns(["name", "description", "appliedAt", "rerunnable"])
|
|
455
|
+
.where("env", env)
|
|
456
|
+
.orderBy("appliedAt", "asc").orderBy("name", "asc")
|
|
457
|
+
.toSql();
|
|
458
|
+
var stmt = db.prepare(built.sql);
|
|
459
|
+
return stmt.all.apply(stmt, built.params);
|
|
413
460
|
}
|
|
414
461
|
|
|
415
462
|
function status(callerOpts) {
|
|
@@ -469,8 +516,11 @@ function create(opts) {
|
|
|
469
516
|
|
|
470
517
|
var holder = _acquireLock(db, lockStaleAfterMs, clock);
|
|
471
518
|
try {
|
|
519
|
+
var appliedSelBuilt = sql.select(_seedersTable(), _sqlOpts(db))
|
|
520
|
+
.columns(["name"]).where("env", env).toSql();
|
|
521
|
+
var appliedSelStmt = db.prepare(appliedSelBuilt.sql);
|
|
472
522
|
var appliedSet = new Set(
|
|
473
|
-
|
|
523
|
+
appliedSelStmt.all.apply(appliedSelStmt, appliedSelBuilt.params)
|
|
474
524
|
.map(function (r) { return r.name; })
|
|
475
525
|
);
|
|
476
526
|
|
|
@@ -503,27 +553,25 @@ function create(opts) {
|
|
|
503
553
|
_runSql(db, "BEGIN");
|
|
504
554
|
try {
|
|
505
555
|
await mod.run(db, ctx);
|
|
556
|
+
var nowIso = new Date(clock()).toISOString();
|
|
557
|
+
var writeBuilt;
|
|
506
558
|
if (alreadyApplied && mod.rerunnable) {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
"
|
|
511
|
-
).run(new Date(clock()).toISOString(), mod.description || "",
|
|
512
|
-
mod.rerunnable ? 1 : 0, env, name);
|
|
559
|
+
writeBuilt = sql.update(_seedersTable(), _sqlOpts(db))
|
|
560
|
+
.set({ appliedAt: nowIso, description: mod.description || "",
|
|
561
|
+
rerunnable: mod.rerunnable ? 1 : 0 })
|
|
562
|
+
.where("env", env).where("name", name).toSql();
|
|
513
563
|
} else if (alreadyApplied && force) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
"
|
|
517
|
-
" WHERE env = ? AND name = ?"
|
|
518
|
-
).run(new Date(clock()).toISOString(), mod.description || "",
|
|
519
|
-
env, name);
|
|
564
|
+
writeBuilt = sql.update(_seedersTable(), _sqlOpts(db))
|
|
565
|
+
.set({ appliedAt: nowIso, description: mod.description || "" })
|
|
566
|
+
.where("env", env).where("name", name).toSql();
|
|
520
567
|
} else {
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
new Date(clock()).toISOString(), mod.rerunnable ? 1 : 0);
|
|
568
|
+
writeBuilt = sql.insert(_seedersTable(), _sqlOpts(db))
|
|
569
|
+
.values({ env: env, name: name, description: mod.description || "",
|
|
570
|
+
appliedAt: nowIso, rerunnable: mod.rerunnable ? 1 : 0 })
|
|
571
|
+
.toSql();
|
|
526
572
|
}
|
|
573
|
+
var writeStmt = db.prepare(writeBuilt.sql);
|
|
574
|
+
writeStmt.run.apply(writeStmt, writeBuilt.params);
|
|
527
575
|
_runSql(db, "COMMIT");
|
|
528
576
|
} catch (e) {
|
|
529
577
|
try { _runSql(db, "ROLLBACK"); }
|
|
@@ -37,22 +37,50 @@
|
|
|
37
37
|
* b.session.useStore(sessionStore);
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
|
+
var frameworkSchema = require("./framework-schema");
|
|
40
41
|
var localDbThin = require("./local-db-thin");
|
|
42
|
+
var sql = require("./sql");
|
|
41
43
|
var validateOpts = require("./validate-opts");
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
45
|
+
// Logical session-table name — resolved through frameworkSchema.tableName
|
|
46
|
+
// so a configured table prefix (b.frameworkSchema.setTablePrefix) is
|
|
47
|
+
// honored. This isolated localDbThin file owns its own schema; the name
|
|
48
|
+
// must agree with the main-DB / cluster-mode session table b.session
|
|
49
|
+
// reads + the sealedFields registry key (db.js registers under the
|
|
50
|
+
// logical name).
|
|
51
|
+
var SESSION_LOGICAL = "_blamejs_sessions"; // allow:hand-rolled-sql — canonical logical table-name declaration
|
|
52
|
+
|
|
53
|
+
// b.sql opts for this adapter's schema DDL + every statement b.session
|
|
54
|
+
// builds against it. The localDbThin backend is a dedicated node:sqlite
|
|
55
|
+
// file (always sqlite, independent of cluster mode — see local-db-thin.js),
|
|
56
|
+
// so the dialect is the literal "sqlite": this store NEVER dispatches to an
|
|
57
|
+
// external Postgres / MySQL backend. Making the dialect explicit (rather than
|
|
58
|
+
// leaning on b.sql's "sqlite" default) keeps the quoting intent documented +
|
|
59
|
+
// matches the cluster-routed data-layer files threading
|
|
60
|
+
// clusterStorage.dialect() through the same opts seam.
|
|
61
|
+
var SQL_OPTS = { dialect: "sqlite" };
|
|
62
|
+
|
|
63
|
+
// CREATE TABLE + the two session-side indexes (userIdHash for
|
|
64
|
+
// destroyAllForUser, expiresAt for purgeExpired), built through b.sql so
|
|
65
|
+
// every identifier is quoted by construction and the table name resolves
|
|
66
|
+
// through the configurable prefix. DDL binds no values, so each builder
|
|
67
|
+
// returns { sql } only; the statements are joined for the adapter's
|
|
68
|
+
// schemaSql.
|
|
69
|
+
function _sessionSchemaSql() {
|
|
70
|
+
var table = frameworkSchema.tableName(SESSION_LOGICAL);
|
|
71
|
+
var create = sql.createTable(table, [
|
|
72
|
+
{ name: "sidHash", type: "text", primaryKey: true },
|
|
73
|
+
{ name: "userId", type: "text" },
|
|
74
|
+
{ name: "userIdHash", type: "text" },
|
|
75
|
+
{ name: "data", type: "text" },
|
|
76
|
+
{ name: "createdAt", type: "int" },
|
|
77
|
+
{ name: "expiresAt", type: "int" },
|
|
78
|
+
{ name: "lastActivity", type: "int" },
|
|
79
|
+
], SQL_OPTS).sql;
|
|
80
|
+
var idxUser = sql.createIndex(table + "_userIdHash_idx", table, ["userIdHash"], SQL_OPTS).sql;
|
|
81
|
+
var idxExp = sql.createIndex(table + "_expiresAt_idx", table, ["expiresAt"], SQL_OPTS).sql;
|
|
82
|
+
return [create + ";", idxUser + ";", idxExp + ";"].join("\n");
|
|
83
|
+
}
|
|
56
84
|
|
|
57
85
|
/**
|
|
58
86
|
* @primitive b.session.stores.localDbThin
|
|
@@ -99,7 +127,7 @@ function localDbThinStore(opts) {
|
|
|
99
127
|
// logging out every user; operators wanting clear-on-corrupt opt in.
|
|
100
128
|
var handle = localDbThin.thin({
|
|
101
129
|
file: opts.file,
|
|
102
|
-
schemaSql:
|
|
130
|
+
schemaSql: _sessionSchemaSql(),
|
|
103
131
|
recovery: opts.recovery || "refuse",
|
|
104
132
|
pragmas: opts.pragmas,
|
|
105
133
|
audit: opts.audit !== false,
|