@blamejs/blamejs-shop 0.0.44
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 +87 -0
- package/LICENSE +17 -0
- package/README.md +117 -0
- package/SECURITY.md +139 -0
- package/lib/admin.js +952 -0
- package/lib/analytics.js +267 -0
- package/lib/cart.js +279 -0
- package/lib/catalog-import.js +344 -0
- package/lib/catalog.js +769 -0
- package/lib/checkout.js +320 -0
- package/lib/config.js +151 -0
- package/lib/customers.js +322 -0
- package/lib/email.js +242 -0
- package/lib/externaldb-d1.js +283 -0
- package/lib/index.js +57 -0
- package/lib/inventory-alerts.js +198 -0
- package/lib/newsletter.js +142 -0
- package/lib/order.js +380 -0
- package/lib/payment.js +318 -0
- package/lib/pricing.js +185 -0
- package/lib/r2-bridge.js +169 -0
- package/lib/shipping.js +185 -0
- package/lib/storefront.js +2160 -0
- package/lib/subscriptions.js +410 -0
- package/lib/tax.js +161 -0
- package/lib/theme.js +194 -0
- package/lib/vendor/MANIFEST.json +19 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/Dockerfile +23 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/build.sh +34 -0
- package/lib/vendor/blamejs/.clusterfuzzlite/project.yaml +16 -0
- package/lib/vendor/blamejs/.dockerignore +45 -0
- package/lib/vendor/blamejs/.gitattributes +42 -0
- package/lib/vendor/blamejs/.github/CODEOWNERS +4 -0
- package/lib/vendor/blamejs/.github/FUNDING.yml +2 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/bug_report.md +58 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/lib/vendor/blamejs/.github/ISSUE_TEMPLATE/feature_request.md +99 -0
- package/lib/vendor/blamejs/.github/PULL_REQUEST_TEMPLATE.md +77 -0
- package/lib/vendor/blamejs/.github/dependabot.yml +37 -0
- package/lib/vendor/blamejs/.github/workflows/actions-lint.yml +148 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_batch.yml +107 -0
- package/lib/vendor/blamejs/.github/workflows/cflite_pr.yml +122 -0
- package/lib/vendor/blamejs/.github/workflows/ci.yml +511 -0
- package/lib/vendor/blamejs/.github/workflows/codeql.yml +50 -0
- package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +655 -0
- package/lib/vendor/blamejs/.github/workflows/release-container.yml +406 -0
- package/lib/vendor/blamejs/.github/workflows/scorecard.yml +101 -0
- package/lib/vendor/blamejs/.github/workflows/sha-to-tag-verify.yml +134 -0
- package/lib/vendor/blamejs/.gitignore +102 -0
- package/lib/vendor/blamejs/.gitleaks.toml +166 -0
- package/lib/vendor/blamejs/.hadolint.yaml +18 -0
- package/lib/vendor/blamejs/.npmrc +5 -0
- package/lib/vendor/blamejs/.pinact.yaml +17 -0
- package/lib/vendor/blamejs/ARCHITECTURE.md +158 -0
- package/lib/vendor/blamejs/CHANGELOG.md +1351 -0
- package/lib/vendor/blamejs/CODE_OF_CONDUCT.md +86 -0
- package/lib/vendor/blamejs/CONTRIBUTING.md +156 -0
- package/lib/vendor/blamejs/GOVERNANCE.md +201 -0
- package/lib/vendor/blamejs/LICENSE +201 -0
- package/lib/vendor/blamejs/LTS-CALENDAR.md +29 -0
- package/lib/vendor/blamejs/MIGRATING.md +29 -0
- package/lib/vendor/blamejs/NOTICE +81 -0
- package/lib/vendor/blamejs/README.md +304 -0
- package/lib/vendor/blamejs/SECURITY.md +432 -0
- package/lib/vendor/blamejs/api-snapshot.json +48709 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.png +0 -0
- package/lib/vendor/blamejs/assets/BlameJS_Logo.svg +129 -0
- package/lib/vendor/blamejs/bench/README.md +77 -0
- package/lib/vendor/blamejs/bench/_helpers.js +70 -0
- package/lib/vendor/blamejs/bench/baseline.json +183 -0
- package/lib/vendor/blamejs/bench/crypto-hash.bench.js +19 -0
- package/lib/vendor/blamejs/bench/crypto-symmetric.bench.js +28 -0
- package/lib/vendor/blamejs/bench/run.js +140 -0
- package/lib/vendor/blamejs/bench/safe-json.bench.js +31 -0
- package/lib/vendor/blamejs/bin/blamejs.js +13 -0
- package/lib/vendor/blamejs/docker/caddy/Caddyfile +46 -0
- package/lib/vendor/blamejs/docker/coredns/Corefile +37 -0
- package/lib/vendor/blamejs/docker/haproxy/haproxy.cfg +52 -0
- package/lib/vendor/blamejs/docker/init/generate-certs.sh +118 -0
- package/lib/vendor/blamejs/docker/keycloak/realm-blamejs-test.json +87 -0
- package/lib/vendor/blamejs/docker/mitmproxy/config.yaml +16 -0
- package/lib/vendor/blamejs/docker/mongo/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/mysql/my.cnf +12 -0
- package/lib/vendor/blamejs/docker/nats/nats.conf +33 -0
- package/lib/vendor/blamejs/docker/postgres/init-tls.sh +17 -0
- package/lib/vendor/blamejs/docker/postgres/postgresql.conf +18 -0
- package/lib/vendor/blamejs/docker/rabbitmq/rabbitmq.conf +18 -0
- package/lib/vendor/blamejs/docker/redis/redis.conf +15 -0
- package/lib/vendor/blamejs/docker/squid/squid.conf +24 -0
- package/lib/vendor/blamejs/docker/syslog/syslog-ng.conf +34 -0
- package/lib/vendor/blamejs/docker-compose.test.yml +545 -0
- package/lib/vendor/blamejs/docs/cis-postgres-crosswalk.md +102 -0
- package/lib/vendor/blamejs/docs/cis-sqlite-equivalent.md +92 -0
- package/lib/vendor/blamejs/eslint.config.mjs +204 -0
- package/lib/vendor/blamejs/examples/wiki/Caddyfile +40 -0
- package/lib/vendor/blamejs/examples/wiki/DEPLOY.md +218 -0
- package/lib/vendor/blamejs/examples/wiki/Dockerfile +120 -0
- package/lib/vendor/blamejs/examples/wiki/README.md +157 -0
- package/lib/vendor/blamejs/examples/wiki/cli-snapshot.json +250 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.prod.yml +231 -0
- package/lib/vendor/blamejs/examples/wiki/docker-compose.yml +166 -0
- package/lib/vendor/blamejs/examples/wiki/env-snapshot.json +217 -0
- package/lib/vendor/blamejs/examples/wiki/lib/auto-site-entries.js +139 -0
- package/lib/vendor/blamejs/examples/wiki/lib/build-app.js +555 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-cli.js +507 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-env-vars.js +435 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-errors.js +282 -0
- package/lib/vendor/blamejs/examples/wiki/lib/harvest-vendored-deps.js +321 -0
- package/lib/vendor/blamejs/examples/wiki/lib/nav.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/lib/opts-resolver.js +75 -0
- package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +508 -0
- package/lib/vendor/blamejs/examples/wiki/lib/section.js +276 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +587 -0
- package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +318 -0
- package/lib/vendor/blamejs/examples/wiki/lib/symbol-index.js +122 -0
- package/lib/vendor/blamejs/examples/wiki/migrations/0001-pages-schema.js +74 -0
- package/lib/vendor/blamejs/examples/wiki/package.json +18 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.png +0 -0
- package/lib/vendor/blamejs/examples/wiki/public/img/blamejs-logo.svg +129 -0
- package/lib/vendor/blamejs/examples/wiki/public/robots.txt +5 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/MANIFEST.json +30 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.css +1 -0
- package/lib/vendor/blamejs/examples/wiki/public/vendor/prism.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/public/wiki.css +1250 -0
- package/lib/vendor/blamejs/examples/wiki/routes/admin.js +366 -0
- package/lib/vendor/blamejs/examples/wiki/routes/integration.js +230 -0
- package/lib/vendor/blamejs/examples/wiki/routes/pages.js +266 -0
- package/lib/vendor/blamejs/examples/wiki/scripts/backfill-module-metadata.js +214 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/0001-default-pages.js +35 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/_index.js +34 -0
- package/lib/vendor/blamejs/examples/wiki/seeders/prod/pages/api.js +76 -0
- package/lib/vendor/blamejs/examples/wiki/server.js +129 -0
- package/lib/vendor/blamejs/examples/wiki/site.config.js +197 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/README.md +38 -0
- package/lib/vendor/blamejs/examples/wiki/snippets/auth/password-hash.example.js +15 -0
- package/lib/vendor/blamejs/examples/wiki/src/editor.js +103 -0
- package/lib/vendor/blamejs/examples/wiki/src/wiki.js +349 -0
- package/lib/vendor/blamejs/examples/wiki/test/AUDIT.md +155 -0
- package/lib/vendor/blamejs/examples/wiki/test/codebase-patterns.test.js +594 -0
- package/lib/vendor/blamejs/examples/wiki/test/e2e.js +741 -0
- package/lib/vendor/blamejs/examples/wiki/test/find-missing-pages.js +254 -0
- package/lib/vendor/blamejs/examples/wiki/test/integration.js +391 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-cli-snapshot.js +379 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-env-snapshot.js +346 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-nav-coverage.js +212 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-site-coverage.js +252 -0
- package/lib/vendor/blamejs/examples/wiki/test/validate-source-comment-blocks.js +107 -0
- package/lib/vendor/blamejs/examples/wiki/views/_layout.html +115 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/api-keys.html +51 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/dashboard.html +22 -0
- package/lib/vendor/blamejs/examples/wiki/views/admin/edit.html +17 -0
- package/lib/vendor/blamejs/examples/wiki/views/home.html +85 -0
- package/lib/vendor/blamejs/examples/wiki/views/login.html +18 -0
- package/lib/vendor/blamejs/examples/wiki/views/page.html +5 -0
- package/lib/vendor/blamejs/examples/wiki/views/partials/nav.html +13 -0
- package/lib/vendor/blamejs/examples/wiki/views/search.html +19 -0
- package/lib/vendor/blamejs/examples/wiki/wiki.config.js +15 -0
- package/lib/vendor/blamejs/fuzz/README.md +137 -0
- package/lib/vendor/blamejs/fuzz/_expected.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-agent-registry.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-csv.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/01-basic.csv +3 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/02-formula.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-csv_seed_corpus/03-hyperlink.csv +1 -0
- package/lib/vendor/blamejs/fuzz/guard-dsn.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-email.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-email_seed_corpus/01-basic.eml +5 -0
- package/lib/vendor/blamejs/fuzz/guard-envelope.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-payload.fuzz.js +24 -0
- package/lib/vendor/blamejs/fuzz/guard-event-bus-topic.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-html.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/01-basic.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/02-script.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/03-event.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-html_seed_corpus/04-jsurl.html +1 -0
- package/lib/vendor/blamejs/fuzz/guard-idempotency-key.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-imap-command.fuzz.js +35 -0
- package/lib/vendor/blamejs/fuzz/guard-jmap.fuzz.js +41 -0
- package/lib/vendor/blamejs/fuzz/guard-json.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/01-basic.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/02-proto.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/03-dupkey.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/04-nan.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-json_seed_corpus/05-bom.json +1 -0
- package/lib/vendor/blamejs/fuzz/guard-list-id.fuzz.js +21 -0
- package/lib/vendor/blamejs/fuzz/guard-list-unsubscribe.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-compose.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-move.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-query.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-reply.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-mail-sieve.fuzz.js +36 -0
- package/lib/vendor/blamejs/fuzz/guard-managesieve-command.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/01-basic.md +2 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/02-jsurl.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-markdown_seed_corpus/03-jsimg.md +1 -0
- package/lib/vendor/blamejs/fuzz/guard-message-id.fuzz.js +26 -0
- package/lib/vendor/blamejs/fuzz/guard-pop3-command.fuzz.js +23 -0
- package/lib/vendor/blamejs/fuzz/guard-posture-chain.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-saga-config.fuzz.js +32 -0
- package/lib/vendor/blamejs/fuzz/guard-smtp-command.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/guard-snapshot-envelope.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-stream-args.fuzz.js +22 -0
- package/lib/vendor/blamejs/fuzz/guard-svg.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/01-basic.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-svg_seed_corpus/02-script.svg +1 -0
- package/lib/vendor/blamejs/fuzz/guard-tenant-id.fuzz.js +20 -0
- package/lib/vendor/blamejs/fuzz/guard-trace-context.fuzz.js +30 -0
- package/lib/vendor/blamejs/fuzz/guard-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-xml_seed_corpus/02-xxe.xml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/01-basic.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/02-anchor.yaml +2 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/03-norway.yaml +1 -0
- package/lib/vendor/blamejs/fuzz/guard-yaml_seed_corpus/04-multidoc.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-ini_seed_corpus/01-basic.ini +2 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-toml_seed_corpus/01-basic.toml +4 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-xml_seed_corpus/01-basic.xml +1 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/parsers__safe-yaml_seed_corpus/01-basic.yaml +4 -0
- package/lib/vendor/blamejs/fuzz/safe-decompress.fuzz.js +49 -0
- package/lib/vendor/blamejs/fuzz/safe-dns.fuzz.js +29 -0
- package/lib/vendor/blamejs/fuzz/safe-ical.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-icap.fuzz.js +42 -0
- package/lib/vendor/blamejs/fuzz/safe-json.fuzz.js +25 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/01-object.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/02-array.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/03-string.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/04-proto.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-json_seed_corpus/05-deep.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/02-filter.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/03-deepscan.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-jsonpath_seed_corpus/04-slice.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-mime.fuzz.js +27 -0
- package/lib/vendor/blamejs/fuzz/safe-mount-info.fuzz.js +33 -0
- package/lib/vendor/blamejs/fuzz/safe-sieve.fuzz.js +28 -0
- package/lib/vendor/blamejs/fuzz/safe-smtp.fuzz.js +64 -0
- package/lib/vendor/blamejs/fuzz/safe-url.fuzz.js +16 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/01-basic.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/02-userinfo.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/03-dangerous.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/04-data.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/05-ipv6.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-url_seed_corpus/06-idn.txt +1 -0
- package/lib/vendor/blamejs/fuzz/safe-vcard.fuzz.js +16 -0
- package/lib/vendor/blamejs/index.js +678 -0
- package/lib/vendor/blamejs/keys/release-pqc-pub.json +7 -0
- package/lib/vendor/blamejs/lib/_test/crypto-fixtures.js +67 -0
- package/lib/vendor/blamejs/lib/a2a-tasks.js +598 -0
- package/lib/vendor/blamejs/lib/a2a.js +407 -0
- package/lib/vendor/blamejs/lib/acme.js +1448 -0
- package/lib/vendor/blamejs/lib/agent-audit.js +45 -0
- package/lib/vendor/blamejs/lib/agent-event-bus.js +382 -0
- package/lib/vendor/blamejs/lib/agent-idempotency.js +497 -0
- package/lib/vendor/blamejs/lib/agent-orchestrator.js +717 -0
- package/lib/vendor/blamejs/lib/agent-posture-chain.js +366 -0
- package/lib/vendor/blamejs/lib/agent-saga.js +321 -0
- package/lib/vendor/blamejs/lib/agent-snapshot.js +676 -0
- package/lib/vendor/blamejs/lib/agent-stream.js +269 -0
- package/lib/vendor/blamejs/lib/agent-tenant.js +632 -0
- package/lib/vendor/blamejs/lib/agent-trace.js +281 -0
- package/lib/vendor/blamejs/lib/ai-adverse-decision.js +184 -0
- package/lib/vendor/blamejs/lib/ai-content-detect.js +268 -0
- package/lib/vendor/blamejs/lib/ai-input.js +201 -0
- package/lib/vendor/blamejs/lib/ai-model-manifest.js +363 -0
- package/lib/vendor/blamejs/lib/ai-pref.js +340 -0
- package/lib/vendor/blamejs/lib/api-key.js +721 -0
- package/lib/vendor/blamejs/lib/api-snapshot.js +458 -0
- package/lib/vendor/blamejs/lib/app-shutdown.js +557 -0
- package/lib/vendor/blamejs/lib/app.js +365 -0
- package/lib/vendor/blamejs/lib/archive.js +547 -0
- package/lib/vendor/blamejs/lib/arg-parser.js +697 -0
- package/lib/vendor/blamejs/lib/argon2-builtin.js +173 -0
- package/lib/vendor/blamejs/lib/asn1-der.js +424 -0
- package/lib/vendor/blamejs/lib/asyncapi-bindings.js +160 -0
- package/lib/vendor/blamejs/lib/asyncapi-traits.js +143 -0
- package/lib/vendor/blamejs/lib/asyncapi.js +575 -0
- package/lib/vendor/blamejs/lib/atomic-file.js +1023 -0
- package/lib/vendor/blamejs/lib/audit-chain.js +266 -0
- package/lib/vendor/blamejs/lib/audit-daily-review.js +389 -0
- package/lib/vendor/blamejs/lib/audit-sign.js +751 -0
- package/lib/vendor/blamejs/lib/audit-tools.js +1113 -0
- package/lib/vendor/blamejs/lib/audit.js +1671 -0
- package/lib/vendor/blamejs/lib/auth/aal.js +169 -0
- package/lib/vendor/blamejs/lib/auth/access-lock.js +220 -0
- package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +265 -0
- package/lib/vendor/blamejs/lib/auth/ato-kill-switch.js +112 -0
- package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +111 -0
- package/lib/vendor/blamejs/lib/auth/bot-challenge.js +573 -0
- package/lib/vendor/blamejs/lib/auth/ciba.js +637 -0
- package/lib/vendor/blamejs/lib/auth/dpop.js +516 -0
- package/lib/vendor/blamejs/lib/auth/elevation-grant.js +306 -0
- package/lib/vendor/blamejs/lib/auth/fal.js +229 -0
- package/lib/vendor/blamejs/lib/auth/fido-mds3.js +681 -0
- package/lib/vendor/blamejs/lib/auth/jwt-external.js +519 -0
- package/lib/vendor/blamejs/lib/auth/jwt.js +430 -0
- package/lib/vendor/blamejs/lib/auth/lockout.js +449 -0
- package/lib/vendor/blamejs/lib/auth/oauth.js +2141 -0
- package/lib/vendor/blamejs/lib/auth/oid4vci.js +657 -0
- package/lib/vendor/blamejs/lib/auth/oid4vp.js +531 -0
- package/lib/vendor/blamejs/lib/auth/openid-federation.js +600 -0
- package/lib/vendor/blamejs/lib/auth/passkey.js +676 -0
- package/lib/vendor/blamejs/lib/auth/password.js +693 -0
- package/lib/vendor/blamejs/lib/auth/saml.js +2109 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-disclosure.js +95 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-holder.js +225 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc-issuer.js +197 -0
- package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +728 -0
- package/lib/vendor/blamejs/lib/auth/status-list.js +272 -0
- package/lib/vendor/blamejs/lib/auth/step-up-policy.js +335 -0
- package/lib/vendor/blamejs/lib/auth/step-up.js +454 -0
- package/lib/vendor/blamejs/lib/auth-bot-challenge.js +505 -0
- package/lib/vendor/blamejs/lib/auth-header.js +148 -0
- package/lib/vendor/blamejs/lib/backup/bundle.js +265 -0
- package/lib/vendor/blamejs/lib/backup/crypto.js +176 -0
- package/lib/vendor/blamejs/lib/backup/index.js +1001 -0
- package/lib/vendor/blamejs/lib/backup/manifest.js +443 -0
- package/lib/vendor/blamejs/lib/boot-gates.js +174 -0
- package/lib/vendor/blamejs/lib/breach-deadline.js +272 -0
- package/lib/vendor/blamejs/lib/break-glass.js +1753 -0
- package/lib/vendor/blamejs/lib/budr.js +205 -0
- package/lib/vendor/blamejs/lib/bundler.js +461 -0
- package/lib/vendor/blamejs/lib/cache-redis.js +256 -0
- package/lib/vendor/blamejs/lib/cache-status.js +288 -0
- package/lib/vendor/blamejs/lib/cache.js +1331 -0
- package/lib/vendor/blamejs/lib/calendar.js +1240 -0
- package/lib/vendor/blamejs/lib/canonical-json.js +143 -0
- package/lib/vendor/blamejs/lib/cdn-cache-control.js +473 -0
- package/lib/vendor/blamejs/lib/cert.js +763 -0
- package/lib/vendor/blamejs/lib/chain-writer.js +259 -0
- package/lib/vendor/blamejs/lib/circuit-breaker.js +101 -0
- package/lib/vendor/blamejs/lib/cli-helpers.js +237 -0
- package/lib/vendor/blamejs/lib/cli.js +2328 -0
- package/lib/vendor/blamejs/lib/client-hints.js +318 -0
- package/lib/vendor/blamejs/lib/cloud-events.js +277 -0
- package/lib/vendor/blamejs/lib/cluster-provider-db.js +317 -0
- package/lib/vendor/blamejs/lib/cluster-storage.js +351 -0
- package/lib/vendor/blamejs/lib/cluster.js +1017 -0
- package/lib/vendor/blamejs/lib/cms-codec.js +826 -0
- package/lib/vendor/blamejs/lib/codepoint-class.js +262 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-logging.js +190 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-prohibited.js +205 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-risk.js +189 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act-transparency.js +200 -0
- package/lib/vendor/blamejs/lib/compliance-ai-act.js +821 -0
- package/lib/vendor/blamejs/lib/compliance-eaa.js +204 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-aliases.js +167 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fetcher.js +206 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions-fuzzy.js +297 -0
- package/lib/vendor/blamejs/lib/compliance-sanctions.js +569 -0
- package/lib/vendor/blamejs/lib/compliance.js +1558 -0
- package/lib/vendor/blamejs/lib/config-drift.js +426 -0
- package/lib/vendor/blamejs/lib/config.js +446 -0
- package/lib/vendor/blamejs/lib/consent.js +369 -0
- package/lib/vendor/blamejs/lib/constants.js +209 -0
- package/lib/vendor/blamejs/lib/content-credentials.js +704 -0
- package/lib/vendor/blamejs/lib/cookies.js +560 -0
- package/lib/vendor/blamejs/lib/cra-report.js +299 -0
- package/lib/vendor/blamejs/lib/credential-hash.js +394 -0
- package/lib/vendor/blamejs/lib/crypto-field.js +1017 -0
- package/lib/vendor/blamejs/lib/crypto-hpke-pq.js +187 -0
- package/lib/vendor/blamejs/lib/crypto-hpke.js +256 -0
- package/lib/vendor/blamejs/lib/crypto.js +1908 -0
- package/lib/vendor/blamejs/lib/csp.js +271 -0
- package/lib/vendor/blamejs/lib/csv.js +418 -0
- package/lib/vendor/blamejs/lib/daemon.js +481 -0
- package/lib/vendor/blamejs/lib/dark-patterns.js +488 -0
- package/lib/vendor/blamejs/lib/data-act.js +328 -0
- package/lib/vendor/blamejs/lib/db-collection.js +587 -0
- package/lib/vendor/blamejs/lib/db-declare-row-policy.js +267 -0
- package/lib/vendor/blamejs/lib/db-declare-view.js +420 -0
- package/lib/vendor/blamejs/lib/db-file-lifecycle.js +333 -0
- package/lib/vendor/blamejs/lib/db-query.js +802 -0
- package/lib/vendor/blamejs/lib/db-role-context.js +50 -0
- package/lib/vendor/blamejs/lib/db-schema.js +322 -0
- package/lib/vendor/blamejs/lib/db.js +3111 -0
- package/lib/vendor/blamejs/lib/dbsc.js +299 -0
- package/lib/vendor/blamejs/lib/ddl-change-control.js +523 -0
- package/lib/vendor/blamejs/lib/deprecate.js +377 -0
- package/lib/vendor/blamejs/lib/dev.js +405 -0
- package/lib/vendor/blamejs/lib/dora.js +402 -0
- package/lib/vendor/blamejs/lib/dr-runbook.js +368 -0
- package/lib/vendor/blamejs/lib/dsr.js +1188 -0
- package/lib/vendor/blamejs/lib/dual-control.js +526 -0
- package/lib/vendor/blamejs/lib/early-hints.js +212 -0
- package/lib/vendor/blamejs/lib/error-page.js +420 -0
- package/lib/vendor/blamejs/lib/events.js +214 -0
- package/lib/vendor/blamejs/lib/external-db-migrate.js +659 -0
- package/lib/vendor/blamejs/lib/external-db.js +1877 -0
- package/lib/vendor/blamejs/lib/fapi2.js +394 -0
- package/lib/vendor/blamejs/lib/fda-21cfr11.js +395 -0
- package/lib/vendor/blamejs/lib/fdx.js +370 -0
- package/lib/vendor/blamejs/lib/fedcm.js +264 -0
- package/lib/vendor/blamejs/lib/file-type.js +360 -0
- package/lib/vendor/blamejs/lib/file-upload.js +1256 -0
- package/lib/vendor/blamejs/lib/flag-cache.js +136 -0
- package/lib/vendor/blamejs/lib/flag-evaluation-context.js +135 -0
- package/lib/vendor/blamejs/lib/flag-providers.js +279 -0
- package/lib/vendor/blamejs/lib/flag-targeting.js +210 -0
- package/lib/vendor/blamejs/lib/flag.js +346 -0
- package/lib/vendor/blamejs/lib/forms.js +525 -0
- package/lib/vendor/blamejs/lib/framework-error.js +724 -0
- package/lib/vendor/blamejs/lib/framework-schema.js +845 -0
- package/lib/vendor/blamejs/lib/framework-sha1-hibp.js +34 -0
- package/lib/vendor/blamejs/lib/fsm.js +469 -0
- package/lib/vendor/blamejs/lib/gate-contract.js +1661 -0
- package/lib/vendor/blamejs/lib/gdpr-ropa.js +261 -0
- package/lib/vendor/blamejs/lib/graphql-federation.js +234 -0
- package/lib/vendor/blamejs/lib/guard-agent-registry.js +179 -0
- package/lib/vendor/blamejs/lib/guard-all.js +555 -0
- package/lib/vendor/blamejs/lib/guard-archive.js +901 -0
- package/lib/vendor/blamejs/lib/guard-auth.js +451 -0
- package/lib/vendor/blamejs/lib/guard-cidr.js +676 -0
- package/lib/vendor/blamejs/lib/guard-csv.js +1176 -0
- package/lib/vendor/blamejs/lib/guard-domain.js +814 -0
- package/lib/vendor/blamejs/lib/guard-dsn.js +382 -0
- package/lib/vendor/blamejs/lib/guard-email.js +951 -0
- package/lib/vendor/blamejs/lib/guard-envelope.js +294 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +217 -0
- package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +150 -0
- package/lib/vendor/blamejs/lib/guard-filename.js +956 -0
- package/lib/vendor/blamejs/lib/guard-graphql.js +731 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-aria.js +164 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-forms.js +144 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tables.js +154 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag-tagwalk.js +44 -0
- package/lib/vendor/blamejs/lib/guard-html-wcag.js +470 -0
- package/lib/vendor/blamejs/lib/guard-html.js +1209 -0
- package/lib/vendor/blamejs/lib/guard-idempotency-key.js +151 -0
- package/lib/vendor/blamejs/lib/guard-image.js +584 -0
- package/lib/vendor/blamejs/lib/guard-imap-command.js +337 -0
- package/lib/vendor/blamejs/lib/guard-jmap.js +321 -0
- package/lib/vendor/blamejs/lib/guard-json.js +935 -0
- package/lib/vendor/blamejs/lib/guard-jsonpath.js +512 -0
- package/lib/vendor/blamejs/lib/guard-jwt.js +772 -0
- package/lib/vendor/blamejs/lib/guard-list-id.js +318 -0
- package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +412 -0
- package/lib/vendor/blamejs/lib/guard-mail-compose.js +282 -0
- package/lib/vendor/blamejs/lib/guard-mail-move.js +202 -0
- package/lib/vendor/blamejs/lib/guard-mail-query.js +310 -0
- package/lib/vendor/blamejs/lib/guard-mail-reply.js +172 -0
- package/lib/vendor/blamejs/lib/guard-mail-sieve.js +207 -0
- package/lib/vendor/blamejs/lib/guard-managesieve-command.js +566 -0
- package/lib/vendor/blamejs/lib/guard-markdown.js +768 -0
- package/lib/vendor/blamejs/lib/guard-message-id.js +267 -0
- package/lib/vendor/blamejs/lib/guard-mime.js +609 -0
- package/lib/vendor/blamejs/lib/guard-oauth.js +650 -0
- package/lib/vendor/blamejs/lib/guard-pdf.js +569 -0
- package/lib/vendor/blamejs/lib/guard-pop3-command.js +317 -0
- package/lib/vendor/blamejs/lib/guard-posture-chain.js +201 -0
- package/lib/vendor/blamejs/lib/guard-regex.js +632 -0
- package/lib/vendor/blamejs/lib/guard-saga-config.js +157 -0
- package/lib/vendor/blamejs/lib/guard-shell.js +522 -0
- package/lib/vendor/blamejs/lib/guard-smtp-command.js +594 -0
- package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +168 -0
- package/lib/vendor/blamejs/lib/guard-stream-args.js +166 -0
- package/lib/vendor/blamejs/lib/guard-svg.js +1163 -0
- package/lib/vendor/blamejs/lib/guard-template.js +490 -0
- package/lib/vendor/blamejs/lib/guard-tenant-id.js +138 -0
- package/lib/vendor/blamejs/lib/guard-time.js +586 -0
- package/lib/vendor/blamejs/lib/guard-trace-context.js +172 -0
- package/lib/vendor/blamejs/lib/guard-uuid.js +548 -0
- package/lib/vendor/blamejs/lib/guard-xml.js +666 -0
- package/lib/vendor/blamejs/lib/guard-yaml.js +726 -0
- package/lib/vendor/blamejs/lib/hal.js +125 -0
- package/lib/vendor/blamejs/lib/handlers.js +350 -0
- package/lib/vendor/blamejs/lib/honeytoken.js +168 -0
- package/lib/vendor/blamejs/lib/html-balance.js +347 -0
- package/lib/vendor/blamejs/lib/http-client-cache.js +923 -0
- package/lib/vendor/blamejs/lib/http-client-cookie-jar.js +519 -0
- package/lib/vendor/blamejs/lib/http-client.js +2152 -0
- package/lib/vendor/blamejs/lib/http-message-signature.js +589 -0
- package/lib/vendor/blamejs/lib/http2-teardown.js +34 -0
- package/lib/vendor/blamejs/lib/i18n-messageformat.js +398 -0
- package/lib/vendor/blamejs/lib/i18n.js +931 -0
- package/lib/vendor/blamejs/lib/iab-mspa.js +257 -0
- package/lib/vendor/blamejs/lib/iab-tcf.js +461 -0
- package/lib/vendor/blamejs/lib/importmap-integrity.js +90 -0
- package/lib/vendor/blamejs/lib/inbox.js +435 -0
- package/lib/vendor/blamejs/lib/incident-report.js +314 -0
- package/lib/vendor/blamejs/lib/ip-utils.js +102 -0
- package/lib/vendor/blamejs/lib/jobs.js +185 -0
- package/lib/vendor/blamejs/lib/jose-jwe-experimental.js +228 -0
- package/lib/vendor/blamejs/lib/jsonapi.js +230 -0
- package/lib/vendor/blamejs/lib/keychain.js +865 -0
- package/lib/vendor/blamejs/lib/lazy-require.js +48 -0
- package/lib/vendor/blamejs/lib/legal-hold.js +374 -0
- package/lib/vendor/blamejs/lib/local-db-thin.js +321 -0
- package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +369 -0
- package/lib/vendor/blamejs/lib/log-stream-local.js +146 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp-grpc.js +410 -0
- package/lib/vendor/blamejs/lib/log-stream-otlp.js +286 -0
- package/lib/vendor/blamejs/lib/log-stream-syslog.js +310 -0
- package/lib/vendor/blamejs/lib/log-stream-webhook.js +199 -0
- package/lib/vendor/blamejs/lib/log-stream.js +584 -0
- package/lib/vendor/blamejs/lib/log.js +625 -0
- package/lib/vendor/blamejs/lib/lro.js +200 -0
- package/lib/vendor/blamejs/lib/mail-agent.js +786 -0
- package/lib/vendor/blamejs/lib/mail-arc-sign.js +417 -0
- package/lib/vendor/blamejs/lib/mail-arf.js +343 -0
- package/lib/vendor/blamejs/lib/mail-auth.js +2144 -0
- package/lib/vendor/blamejs/lib/mail-bimi.js +1047 -0
- package/lib/vendor/blamejs/lib/mail-bounce.js +955 -0
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +1286 -0
- package/lib/vendor/blamejs/lib/mail-crypto-smime.js +789 -0
- package/lib/vendor/blamejs/lib/mail-crypto.js +108 -0
- package/lib/vendor/blamejs/lib/mail-dav.js +1224 -0
- package/lib/vendor/blamejs/lib/mail-deploy.js +1119 -0
- package/lib/vendor/blamejs/lib/mail-dkim.js +1250 -0
- package/lib/vendor/blamejs/lib/mail-greylist.js +448 -0
- package/lib/vendor/blamejs/lib/mail-helo.js +473 -0
- package/lib/vendor/blamejs/lib/mail-journal.js +435 -0
- package/lib/vendor/blamejs/lib/mail-mdn.js +424 -0
- package/lib/vendor/blamejs/lib/mail-rbl.js +392 -0
- package/lib/vendor/blamejs/lib/mail-require-tls.js +198 -0
- package/lib/vendor/blamejs/lib/mail-scan.js +502 -0
- package/lib/vendor/blamejs/lib/mail-send-deliver.js +629 -0
- package/lib/vendor/blamejs/lib/mail-server-imap.js +1858 -0
- package/lib/vendor/blamejs/lib/mail-server-jmap.js +1565 -0
- package/lib/vendor/blamejs/lib/mail-server-managesieve.js +908 -0
- package/lib/vendor/blamejs/lib/mail-server-mx.js +969 -0
- package/lib/vendor/blamejs/lib/mail-server-pop3.js +915 -0
- package/lib/vendor/blamejs/lib/mail-server-rate-limit.js +315 -0
- package/lib/vendor/blamejs/lib/mail-server-registry.js +378 -0
- package/lib/vendor/blamejs/lib/mail-server-submission.js +1396 -0
- package/lib/vendor/blamejs/lib/mail-server-tls.js +445 -0
- package/lib/vendor/blamejs/lib/mail-sieve.js +557 -0
- package/lib/vendor/blamejs/lib/mail-spam-score.js +284 -0
- package/lib/vendor/blamejs/lib/mail-srs.js +248 -0
- package/lib/vendor/blamejs/lib/mail-store-fts.js +394 -0
- package/lib/vendor/blamejs/lib/mail-store.js +929 -0
- package/lib/vendor/blamejs/lib/mail-unsubscribe.js +400 -0
- package/lib/vendor/blamejs/lib/mail.js +1971 -0
- package/lib/vendor/blamejs/lib/mcp-tool-registry.js +473 -0
- package/lib/vendor/blamejs/lib/mcp.js +950 -0
- package/lib/vendor/blamejs/lib/metrics.js +1503 -0
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/ai-act-disclosure.js +203 -0
- package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +981 -0
- package/lib/vendor/blamejs/lib/middleware/assetlinks.js +137 -0
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +171 -0
- package/lib/vendor/blamejs/lib/middleware/attach-user.js +220 -0
- package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +293 -0
- package/lib/vendor/blamejs/lib/middleware/body-parser.js +1519 -0
- package/lib/vendor/blamejs/lib/middleware/bot-disclose.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/bot-guard.js +217 -0
- package/lib/vendor/blamejs/lib/middleware/clear-site-data.js +122 -0
- package/lib/vendor/blamejs/lib/middleware/compose-pipeline.js +355 -0
- package/lib/vendor/blamejs/lib/middleware/compression.js +489 -0
- package/lib/vendor/blamejs/lib/middleware/cookies.js +130 -0
- package/lib/vendor/blamejs/lib/middleware/cors.js +386 -0
- package/lib/vendor/blamejs/lib/middleware/csp-nonce.js +388 -0
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +499 -0
- package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +243 -0
- package/lib/vendor/blamejs/lib/middleware/db-role-for.js +304 -0
- package/lib/vendor/blamejs/lib/middleware/dpop.js +402 -0
- package/lib/vendor/blamejs/lib/middleware/error-handler.js +69 -0
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +168 -0
- package/lib/vendor/blamejs/lib/middleware/flag-context.js +110 -0
- package/lib/vendor/blamejs/lib/middleware/gpc.js +153 -0
- package/lib/vendor/blamejs/lib/middleware/headers.js +242 -0
- package/lib/vendor/blamejs/lib/middleware/health.js +438 -0
- package/lib/vendor/blamejs/lib/middleware/host-allowlist.js +189 -0
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +964 -0
- package/lib/vendor/blamejs/lib/middleware/index.js +183 -0
- package/lib/vendor/blamejs/lib/middleware/nel.js +214 -0
- package/lib/vendor/blamejs/lib/middleware/network-allowlist.js +237 -0
- package/lib/vendor/blamejs/lib/middleware/no-cache.js +106 -0
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +177 -0
- package/lib/vendor/blamejs/lib/middleware/protected-resource-metadata.js +277 -0
- package/lib/vendor/blamejs/lib/middleware/rate-limit.js +556 -0
- package/lib/vendor/blamejs/lib/middleware/request-id.js +79 -0
- package/lib/vendor/blamejs/lib/middleware/request-log.js +205 -0
- package/lib/vendor/blamejs/lib/middleware/require-aal.js +138 -0
- package/lib/vendor/blamejs/lib/middleware/require-auth.js +144 -0
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +290 -0
- package/lib/vendor/blamejs/lib/middleware/require-content-type.js +113 -0
- package/lib/vendor/blamejs/lib/middleware/require-methods.js +97 -0
- package/lib/vendor/blamejs/lib/middleware/require-mtls.js +212 -0
- package/lib/vendor/blamejs/lib/middleware/require-step-up.js +226 -0
- package/lib/vendor/blamejs/lib/middleware/scim-server.js +375 -0
- package/lib/vendor/blamejs/lib/middleware/security-headers.js +285 -0
- package/lib/vendor/blamejs/lib/middleware/security-txt.js +170 -0
- package/lib/vendor/blamejs/lib/middleware/span-http-server.js +280 -0
- package/lib/vendor/blamejs/lib/middleware/speculation-rules.js +323 -0
- package/lib/vendor/blamejs/lib/middleware/sse.js +200 -0
- package/lib/vendor/blamejs/lib/middleware/trace-log-correlation.js +167 -0
- package/lib/vendor/blamejs/lib/middleware/trace-propagate.js +148 -0
- package/lib/vendor/blamejs/lib/middleware/tus-upload.js +749 -0
- package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +164 -0
- package/lib/vendor/blamejs/lib/migration-files.js +37 -0
- package/lib/vendor/blamejs/lib/migrations.js +385 -0
- package/lib/vendor/blamejs/lib/mime-parse.js +198 -0
- package/lib/vendor/blamejs/lib/money.js +699 -0
- package/lib/vendor/blamejs/lib/mtls-ca.js +572 -0
- package/lib/vendor/blamejs/lib/mtls-engine-default.js +501 -0
- package/lib/vendor/blamejs/lib/network-byte-quota.js +308 -0
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +533 -0
- package/lib/vendor/blamejs/lib/network-dns.js +1930 -0
- package/lib/vendor/blamejs/lib/network-heartbeat.js +425 -0
- package/lib/vendor/blamejs/lib/network-nts.js +574 -0
- package/lib/vendor/blamejs/lib/network-proxy.js +265 -0
- package/lib/vendor/blamejs/lib/network-smtp-policy.js +836 -0
- package/lib/vendor/blamejs/lib/network-tls.js +3126 -0
- package/lib/vendor/blamejs/lib/network.js +346 -0
- package/lib/vendor/blamejs/lib/nis2-report.js +181 -0
- package/lib/vendor/blamejs/lib/nist-crosswalk.js +293 -0
- package/lib/vendor/blamejs/lib/nonce-store.js +177 -0
- package/lib/vendor/blamejs/lib/notify.js +683 -0
- package/lib/vendor/blamejs/lib/ntp-check.js +458 -0
- package/lib/vendor/blamejs/lib/numeric-bounds.js +111 -0
- package/lib/vendor/blamejs/lib/numeric-checks.js +40 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +349 -0
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +488 -0
- package/lib/vendor/blamejs/lib/object-store/gcs-bucket-ops.js +351 -0
- package/lib/vendor/blamejs/lib/object-store/gcs.js +515 -0
- package/lib/vendor/blamejs/lib/object-store/http-put.js +153 -0
- package/lib/vendor/blamejs/lib/object-store/http-request.js +38 -0
- package/lib/vendor/blamejs/lib/object-store/index.js +197 -0
- package/lib/vendor/blamejs/lib/object-store/local.js +163 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +1133 -0
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +957 -0
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +420 -0
- package/lib/vendor/blamejs/lib/observability-tracer.js +395 -0
- package/lib/vendor/blamejs/lib/observability.js +720 -0
- package/lib/vendor/blamejs/lib/openapi-paths-builder.js +248 -0
- package/lib/vendor/blamejs/lib/openapi-schema-walk.js +192 -0
- package/lib/vendor/blamejs/lib/openapi-security.js +169 -0
- package/lib/vendor/blamejs/lib/openapi-yaml.js +154 -0
- package/lib/vendor/blamejs/lib/openapi.js +489 -0
- package/lib/vendor/blamejs/lib/otel-export.js +278 -0
- package/lib/vendor/blamejs/lib/outbox.js +547 -0
- package/lib/vendor/blamejs/lib/pagination.js +542 -0
- package/lib/vendor/blamejs/lib/parsers/index.js +91 -0
- package/lib/vendor/blamejs/lib/parsers/safe-env.js +642 -0
- package/lib/vendor/blamejs/lib/parsers/safe-ini.js +293 -0
- package/lib/vendor/blamejs/lib/parsers/safe-toml.js +784 -0
- package/lib/vendor/blamejs/lib/parsers/safe-xml.js +390 -0
- package/lib/vendor/blamejs/lib/parsers/safe-yaml.js +1015 -0
- package/lib/vendor/blamejs/lib/permissions.js +793 -0
- package/lib/vendor/blamejs/lib/pick.js +105 -0
- package/lib/vendor/blamejs/lib/pqc-agent.js +351 -0
- package/lib/vendor/blamejs/lib/pqc-gate.js +279 -0
- package/lib/vendor/blamejs/lib/pqc-software.js +271 -0
- package/lib/vendor/blamejs/lib/problem-details.js +482 -0
- package/lib/vendor/blamejs/lib/process-spawn.js +196 -0
- package/lib/vendor/blamejs/lib/promise-pool.js +162 -0
- package/lib/vendor/blamejs/lib/protobuf-encoder.js +190 -0
- package/lib/vendor/blamejs/lib/protocol-dispatcher.js +161 -0
- package/lib/vendor/blamejs/lib/public-suffix.js +403 -0
- package/lib/vendor/blamejs/lib/pubsub-cluster.js +154 -0
- package/lib/vendor/blamejs/lib/pubsub-redis.js +167 -0
- package/lib/vendor/blamejs/lib/pubsub.js +463 -0
- package/lib/vendor/blamejs/lib/queue-local.js +476 -0
- package/lib/vendor/blamejs/lib/queue-redis.js +745 -0
- package/lib/vendor/blamejs/lib/queue-sqs.js +319 -0
- package/lib/vendor/blamejs/lib/queue.js +1016 -0
- package/lib/vendor/blamejs/lib/redact.js +1007 -0
- package/lib/vendor/blamejs/lib/redis-client.js +520 -0
- package/lib/vendor/blamejs/lib/render.js +285 -0
- package/lib/vendor/blamejs/lib/request-helpers.js +767 -0
- package/lib/vendor/blamejs/lib/resource-access-lock.js +116 -0
- package/lib/vendor/blamejs/lib/restore-bundle.js +340 -0
- package/lib/vendor/blamejs/lib/restore-rollback.js +365 -0
- package/lib/vendor/blamejs/lib/restore.js +409 -0
- package/lib/vendor/blamejs/lib/retention.js +640 -0
- package/lib/vendor/blamejs/lib/retry.js +523 -0
- package/lib/vendor/blamejs/lib/router.js +1289 -0
- package/lib/vendor/blamejs/lib/safe-async.js +1184 -0
- package/lib/vendor/blamejs/lib/safe-buffer.js +562 -0
- package/lib/vendor/blamejs/lib/safe-decompress.js +297 -0
- package/lib/vendor/blamejs/lib/safe-dns.js +665 -0
- package/lib/vendor/blamejs/lib/safe-ical.js +634 -0
- package/lib/vendor/blamejs/lib/safe-icap.js +502 -0
- package/lib/vendor/blamejs/lib/safe-json.js +946 -0
- package/lib/vendor/blamejs/lib/safe-jsonpath.js +285 -0
- package/lib/vendor/blamejs/lib/safe-mime.js +831 -0
- package/lib/vendor/blamejs/lib/safe-mount-info.js +306 -0
- package/lib/vendor/blamejs/lib/safe-path.js +254 -0
- package/lib/vendor/blamejs/lib/safe-redirect.js +106 -0
- package/lib/vendor/blamejs/lib/safe-schema.js +1810 -0
- package/lib/vendor/blamejs/lib/safe-sieve.js +684 -0
- package/lib/vendor/blamejs/lib/safe-smtp.js +185 -0
- package/lib/vendor/blamejs/lib/safe-sql.js +363 -0
- package/lib/vendor/blamejs/lib/safe-url.js +428 -0
- package/lib/vendor/blamejs/lib/safe-vcard.js +473 -0
- package/lib/vendor/blamejs/lib/sandbox-worker.js +135 -0
- package/lib/vendor/blamejs/lib/sandbox.js +358 -0
- package/lib/vendor/blamejs/lib/scheduler.js +827 -0
- package/lib/vendor/blamejs/lib/sd-notify.js +269 -0
- package/lib/vendor/blamejs/lib/sec-cyber.js +214 -0
- package/lib/vendor/blamejs/lib/security-assert.js +395 -0
- package/lib/vendor/blamejs/lib/seeders.js +620 -0
- package/lib/vendor/blamejs/lib/self-update-standalone-verifier.js +309 -0
- package/lib/vendor/blamejs/lib/self-update.js +804 -0
- package/lib/vendor/blamejs/lib/server-timing.js +174 -0
- package/lib/vendor/blamejs/lib/session-device-binding.js +431 -0
- package/lib/vendor/blamejs/lib/session-stores.js +138 -0
- package/lib/vendor/blamejs/lib/session.js +1162 -0
- package/lib/vendor/blamejs/lib/slug.js +381 -0
- package/lib/vendor/blamejs/lib/sse.js +349 -0
- package/lib/vendor/blamejs/lib/ssrf-guard.js +792 -0
- package/lib/vendor/blamejs/lib/standard-webhooks.js +183 -0
- package/lib/vendor/blamejs/lib/static.js +1249 -0
- package/lib/vendor/blamejs/lib/storage.js +1272 -0
- package/lib/vendor/blamejs/lib/stream-throttle.js +235 -0
- package/lib/vendor/blamejs/lib/structured-fields.js +244 -0
- package/lib/vendor/blamejs/lib/subject.js +667 -0
- package/lib/vendor/blamejs/lib/tcpa-10dlc.js +175 -0
- package/lib/vendor/blamejs/lib/template.js +931 -0
- package/lib/vendor/blamejs/lib/tenant-quota.js +545 -0
- package/lib/vendor/blamejs/lib/test-harness.js +275 -0
- package/lib/vendor/blamejs/lib/testing.js +1185 -0
- package/lib/vendor/blamejs/lib/time.js +578 -0
- package/lib/vendor/blamejs/lib/tls-exporter.js +239 -0
- package/lib/vendor/blamejs/lib/totp.js +318 -0
- package/lib/vendor/blamejs/lib/tracing.js +546 -0
- package/lib/vendor/blamejs/lib/uuid.js +207 -0
- package/lib/vendor/blamejs/lib/validate-opts.js +381 -0
- package/lib/vendor/blamejs/lib/vault/index.js +638 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +311 -0
- package/lib/vendor/blamejs/lib/vault/passphrase-source.js +198 -0
- package/lib/vendor/blamejs/lib/vault/rotate.js +803 -0
- package/lib/vendor/blamejs/lib/vault/seal-pem-file.js +471 -0
- package/lib/vendor/blamejs/lib/vault/wrap.js +296 -0
- package/lib/vendor/blamejs/lib/vault-aad.js +259 -0
- package/lib/vendor/blamejs/lib/vendor/.vendor-data-pubkey +4 -0
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +161 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.data.js +68 -0
- package/lib/vendor/blamejs/lib/vendor/bimi-trust-anchors.pem +33 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.data.js +1325 -0
- package/lib/vendor/blamejs/lib/vendor/common-passwords-top-10000.txt +10002 -0
- package/lib/vendor/blamejs/lib/vendor/noble-ciphers.cjs +9 -0
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +18 -0
- package/lib/vendor/blamejs/lib/vendor/pki.cjs +181 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.dat +16382 -0
- package/lib/vendor/blamejs/lib/vendor/public-suffix-list.data.js +5881 -0
- package/lib/vendor/blamejs/lib/vendor/simplewebauthn-server.cjs +328 -0
- package/lib/vendor/blamejs/lib/vendor/vendor-data-pubkey.js +16 -0
- package/lib/vendor/blamejs/lib/vendor-data.js +520 -0
- package/lib/vendor/blamejs/lib/vex.js +630 -0
- package/lib/vendor/blamejs/lib/watcher.js +608 -0
- package/lib/vendor/blamejs/lib/web-push-vapid.js +322 -0
- package/lib/vendor/blamejs/lib/webhook.js +977 -0
- package/lib/vendor/blamejs/lib/websocket-channels.js +327 -0
- package/lib/vendor/blamejs/lib/websocket.js +1561 -0
- package/lib/vendor/blamejs/lib/wiki-concepts.js +338 -0
- package/lib/vendor/blamejs/lib/worker-pool.js +464 -0
- package/lib/vendor/blamejs/lib/ws-client.js +978 -0
- package/lib/vendor/blamejs/lib/xml-c14n.js +506 -0
- package/lib/vendor/blamejs/memory/specs/node-26-map-getorinsert-migration.md +164 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/Dockerfile +19 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/README.md +88 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/build.sh +26 -0
- package/lib/vendor/blamejs/oss-fuzz/projects/blamejs/project.yaml +28 -0
- package/lib/vendor/blamejs/package.json +81 -0
- package/lib/vendor/blamejs/release-notes/v0.0.x.json +310 -0
- package/lib/vendor/blamejs/release-notes/v0.1.x.json +1798 -0
- package/lib/vendor/blamejs/release-notes/v0.10.x.json +1288 -0
- package/lib/vendor/blamejs/release-notes/v0.11.x.json +2551 -0
- package/lib/vendor/blamejs/release-notes/v0.12.0.json +64 -0
- package/lib/vendor/blamejs/release-notes/v0.12.1.json +32 -0
- package/lib/vendor/blamejs/release-notes/v0.12.2.json +45 -0
- package/lib/vendor/blamejs/release-notes/v0.2.x.json +706 -0
- package/lib/vendor/blamejs/release-notes/v0.3.x.json +786 -0
- package/lib/vendor/blamejs/release-notes/v0.4.x.json +588 -0
- package/lib/vendor/blamejs/release-notes/v0.5.x.json +390 -0
- package/lib/vendor/blamejs/release-notes/v0.6.x.json +1947 -0
- package/lib/vendor/blamejs/release-notes/v0.7.x.json +3811 -0
- package/lib/vendor/blamejs/release-notes/v0.8.x.json +3318 -0
- package/lib/vendor/blamejs/release-notes/v0.9.x.json +2257 -0
- package/lib/vendor/blamejs/scripts/build-vendored-sbom.js +325 -0
- package/lib/vendor/blamejs/scripts/check-api-snapshot.js +62 -0
- package/lib/vendor/blamejs/scripts/check-changelog-extract.js +108 -0
- package/lib/vendor/blamejs/scripts/check-pack-against-gitignore.js +83 -0
- package/lib/vendor/blamejs/scripts/check-services.js +483 -0
- package/lib/vendor/blamejs/scripts/check-vendor-currency.js +349 -0
- package/lib/vendor/blamejs/scripts/consolidate-release-notes.js +216 -0
- package/lib/vendor/blamejs/scripts/gen-migrating.js +275 -0
- package/lib/vendor/blamejs/scripts/generate-changelog-entry.js +577 -0
- package/lib/vendor/blamejs/scripts/generate-release-signing-key.js +79 -0
- package/lib/vendor/blamejs/scripts/publish-dep-confusion-placeholder.sh +101 -0
- package/lib/vendor/blamejs/scripts/refresh-api-snapshot.js +31 -0
- package/lib/vendor/blamejs/scripts/refresh-vendor-manifest.js +132 -0
- package/lib/vendor/blamejs/scripts/release.js +652 -0
- package/lib/vendor/blamejs/scripts/sha3-digest.js +62 -0
- package/lib/vendor/blamejs/scripts/sign-release-artifact.js +92 -0
- package/lib/vendor/blamejs/scripts/test-integration.js +181 -0
- package/lib/vendor/blamejs/scripts/test-wiki-integration.js +126 -0
- package/lib/vendor/blamejs/scripts/validate-source-comment-blocks.js +77 -0
- package/lib/vendor/blamejs/scripts/vendor-data-gen.js +186 -0
- package/lib/vendor/blamejs/scripts/vendor-data-keygen.js +101 -0
- package/lib/vendor/blamejs/scripts/vendor-update.sh +278 -0
- package/lib/vendor/blamejs/test/00-primitives.js +19075 -0
- package/lib/vendor/blamejs/test/10-state.js +622 -0
- package/lib/vendor/blamejs/test/20-db.js +561 -0
- package/lib/vendor/blamejs/test/30-chain.js +2110 -0
- package/lib/vendor/blamejs/test/40-consumers.js +2453 -0
- package/lib/vendor/blamejs/test/50-integration.js +486 -0
- package/lib/vendor/blamejs/test/_helpers.js +10 -0
- package/lib/vendor/blamejs/test/_smoke-worker.js +69 -0
- package/lib/vendor/blamejs/test/fixtures/exploit-corpus/corpus.json +368 -0
- package/lib/vendor/blamejs/test/fixtures/http-client-stream-payload.txt +2 -0
- package/lib/vendor/blamejs/test/fixtures/worker-pool/echo.js +52 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle-worker.js +24 -0
- package/lib/vendor/blamejs/test/helpers/_codebase-shingle.js +203 -0
- package/lib/vendor/blamejs/test/helpers/_shape-match.js +513 -0
- package/lib/vendor/blamejs/test/helpers/check.js +36 -0
- package/lib/vendor/blamejs/test/helpers/cluster.js +70 -0
- package/lib/vendor/blamejs/test/helpers/db.js +143 -0
- package/lib/vendor/blamejs/test/helpers/drivers.js +207 -0
- package/lib/vendor/blamejs/test/helpers/fs-watch.js +101 -0
- package/lib/vendor/blamejs/test/helpers/http.js +14 -0
- package/lib/vendor/blamejs/test/helpers/index.js +93 -0
- package/lib/vendor/blamejs/test/helpers/json-round-trip.js +120 -0
- package/lib/vendor/blamejs/test/helpers/mocks.js +20 -0
- package/lib/vendor/blamejs/test/helpers/otel.js +13 -0
- package/lib/vendor/blamejs/test/helpers/services.js +380 -0
- package/lib/vendor/blamejs/test/helpers/wait.js +206 -0
- package/lib/vendor/blamejs/test/integration/cache.test.js +235 -0
- package/lib/vendor/blamejs/test/integration/cluster-provider-mysql.test.js +174 -0
- package/lib/vendor/blamejs/test/integration/federation-auth.test.js +611 -0
- package/lib/vendor/blamejs/test/integration/http-client.test.js +129 -0
- package/lib/vendor/blamejs/test/integration/log-stream.test.js +219 -0
- package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +181 -0
- package/lib/vendor/blamejs/test/integration/mail-dkim.test.js +152 -0
- package/lib/vendor/blamejs/test/integration/mail-smtp.test.js +161 -0
- package/lib/vendor/blamejs/test/integration/mtls-ca.test.js +289 -0
- package/lib/vendor/blamejs/test/integration/network-dns.test.js +123 -0
- package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +101 -0
- package/lib/vendor/blamejs/test/integration/ntp-check.test.js +89 -0
- package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +403 -0
- package/lib/vendor/blamejs/test/integration/pqc-pkcs8-forward-compat.test.js +271 -0
- package/lib/vendor/blamejs/test/integration/pubsub.test.js +137 -0
- package/lib/vendor/blamejs/test/integration/queue-redis.test.js +352 -0
- package/lib/vendor/blamejs/test/integration/redis-client-tls.test.js +96 -0
- package/lib/vendor/blamejs/test/integration/ssrf-guard.test.js +98 -0
- package/lib/vendor/blamejs/test/integration/websocket-permessage-deflate.test.js +261 -0
- package/lib/vendor/blamejs/test/integration/ws-client-roundtrip.test.js +230 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a-tasks.test.js +211 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/access-lock.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/acme.test.js +219 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/age-gate.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-idempotency.test.js +262 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-orchestrator.test.js +390 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-posture-chain.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-saga.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-snapshot.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-stream.test.js +227 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-tenant.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/agent-trace.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-adverse-decision.test.js +44 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-content-detect.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-model-manifest.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +76 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/api-encrypt.test.js +1080 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/app-shutdown.test.js +311 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive-zip-stream.test.js +291 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/archive.test.js +140 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/arg-parser.test.js +267 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asn1-der.test.js +108 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/asyncapi.test.js +929 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-conflict-path.test.js +80 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-cve-defensive.test.js +176 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-daily-review.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-export-cadf.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-framework-namespaces.test.js +141 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-segregation.test.js +115 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-use-store.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge-verifier.test.js +485 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-bot-challenge.test.js +331 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-jwt-defenses.test.js +352 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-lockout.test.js +572 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/auth-password-audit.test.js +61 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-bucket-ops.test.js +258 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-manifest-signature.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/backup-worker.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bearer-auth.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-chunked-malformed.test.js +131 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/body-parser-smuggling.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/breach-deadline.test.js +38 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +861 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/bundler-engine.test.js +209 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache-status.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cache.test.js +871 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/calendar.test.js +891 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/canonical-json-jcs.test.js +43 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cdn-cache-control.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cert.test.js +550 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/clear-site-data.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-api-key.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-audit-verify-chain.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-backup.test.js +135 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-config-drift.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-erase.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-file-type.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-helpers.test.js +145 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-mtls.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-password.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-restore.test.js +160 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-retention.test.js +84 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-security.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cli-vault.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/client-hints.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cms-codec.test.js +237 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9600 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-ai-act.test.js +575 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-cascade.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-eaa.test.js +36 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance-sanctions.test.js +712 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config-drift.test.js +97 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/config.test.js +424 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cors.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/cra-report.test.js +31 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-base64url.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-envelope.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-files-parallel.test.js +193 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hash-stream.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke-pq.test.js +132 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-hpke.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-mlkem768-x25519.test.js +129 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-namespace-hash.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/crypto-random-int.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-builder.test.js +96 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-nonce.test.js +401 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csp-report.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/csv.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daemon.test.js +210 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/daily-byte-quota.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/data-act.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection-extensions.test.js +226 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-collection.test.js +136 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-init-extensions.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-query-extensions.test.js +191 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-role-for.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-vacuum.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ddl-change-control.test.js +184 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-row-policy.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/declare-view.test.js +303 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-dnssec-algorithm.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dns-null-mx.test.js +39 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dora.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +59 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr-state-rules.test.js +55 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +786 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/dual-control.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/early-hints.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/events.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/exploit-replay.test.js +243 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +181 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/external-db-routing.test.js +531 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fal.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fda-21cfr11.test.js +156 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fedcm-dbsc.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +434 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fido-mds3.test.js +432 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/file-type.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/flag.test.js +887 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/forensic-snapshot.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/fsm.test.js +375 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gcs-bucket-ops.test.js +321 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/gdpr-ropa.test.js +41 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +32 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-agent-registry.test.js +87 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-all.test.js +328 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-archive.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +694 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-dsn.test.js +296 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-email.test.js +234 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-envelope.test.js +192 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-payload.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-event-bus-topic.test.js +71 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-filename.test.js +386 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html-wcag.test.js +859 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-html.test.js +357 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-idempotency-key.test.js +92 -0
- 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 +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-json.test.js +317 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-id.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-list-unsubscribe.test.js +214 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-compose.test.js +111 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-move.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-query.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-reply.test.js +86 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-mail-sieve.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-managesieve-command.test.js +301 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-markdown.test.js +265 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-message-id.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-pop3-command.test.js +161 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-posture-chain.test.js +100 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-saga-config.test.js +79 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-smtp-command.test.js +269 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-snapshot-envelope.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-stream-args.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-svg.test.js +288 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-tenant-id.test.js +69 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-trace-context.test.js +102 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-xml.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/guard-yaml.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/hal.test.js +51 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/honeytoken.test.js +50 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/html-balance.test.js +37 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-cache.test.js +692 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/http-message-signature.test.js +225 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n-messageformat.test.js +203 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/i18n.test.js +991 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +63 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +73 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +612 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/importmap-integrity.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +166 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/incident-report.test.js +29 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jose-jwe-experimental.test.js +121 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-api.test.js +58 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/json-round-trip-helper.test.js +110 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/jwt-external.test.js +159 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/keychain.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +118 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/local-db-thin.test.js +150 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-cloudwatch.test.js +489 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp-grpc.test.js +207 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/log-stream-otlp.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/lro.test.js +65 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-agent.test.js +417 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-arf.test.js +208 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +910 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bimi.test.js +502 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-bounce.test.js +680 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-canspam.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp-experimental.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-pgp.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-crypto-smime.test.js +297 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dav.test.js +514 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy-tlsrpt.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-deploy.test.js +199 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-dkim.test.js +627 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-feedback-id.test.js +56 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-greylist.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-helo.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +217 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-mdn.test.js +334 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-rbl.test.js +271 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-require-tls.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-scan.test.js +215 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-send-deliver.test.js +336 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-imap.test.js +732 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +840 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-managesieve.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +285 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-pop3.test.js +74 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-rate-limit.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-registry.test.js +229 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-submission.test.js +394 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-tls.test.js +147 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-sieve.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-spam-score.test.js +204 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-srs.test.js +152 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store-fts.test.js +279 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +323 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail-unsubscribe.test.js +165 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mail.test.js +439 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp-tool-registry.test.js +202 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +155 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-shadow-registry.test.js +112 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/metrics-snapshot.test.js +224 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/middleware-compose-pipeline.test.js +278 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/money.test.js +376 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/mtls-ca-paths.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nel.test.js +200 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-allowlist.test.js +106 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-byte-quota.test.js +133 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns-resolver.test.js +372 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-dns.test.js +635 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-heartbeat-passive.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-build-options.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls-ct-inclusion.test.js +179 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network-tls.test.js +447 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/network.test.js +369 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nis2-report.test.js +21 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/nist-crosswalk.test.js +42 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/no-cache.test.js +98 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/notify.test.js +707 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/numeric-bounds.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +72 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability-tracing.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/observability.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/openapi.test.js +877 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pagination.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +216 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/passkey.test.js +324 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/permissions.test.js +546 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +153 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pqc-software.test.js +94 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/problem-details.test.js +195 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/process-spawn.test.js +62 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/promise-pool.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protected-resource-metadata.test.js +68 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protobuf-encoder.test.js +138 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/protocol-dispatcher.test.js +174 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/public-suffix.test.js +197 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/pubsub.test.js +232 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-dlq-extend-lease.test.js +178 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-flow-repeat.test.js +322 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-priority-rate-progress.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/queue-sqs.test.js +300 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-cluster.test.js +338 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/rate-limit-registry.test.js +75 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +246 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +130 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-helpers.test.js +335 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/request-log.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-auth-cache-control.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/require-mtls.test.js +34 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/resource-access-lock.test.js +52 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/retry.test.js +535 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-cross-origin-redirect.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/router-tls0rtt.test.js +128 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-loops.test.js +163 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-async-parallel.test.js +170 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-decompress.test.js +248 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-dns.test.js +451 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-ical.test.js +289 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-icap.test.js +206 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-jsonpath.test.js +104 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mime.test.js +339 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-mount-info.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-path.test.js +78 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-sieve.test.js +123 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-smtp.test.js +95 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-idn-homograph.test.js +77 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/safe-vcard.test.js +257 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/saml-slo.test.js +249 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sandbox.test.js +228 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-exactly-once.test.js +238 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/scim-server.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +700 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sd-notify.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sec-cyber.test.js +85 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-assert.test.js +107 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +175 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/seeders.test.js +816 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update-standalone-verifier.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/self-update.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/server-timing.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-device-binding.test.js +247 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +295 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/shape-match.test.js +142 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +952 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-multipart-sse.test.js +441 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/slug.test.js +330 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/smtp-policy.test.js +233 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/source-comment-blocks.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/speculation-rules.test.js +319 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +148 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +283 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/standard-webhooks.test.js +67 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +266 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/step-up.test.js +487 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-chunk-scratch.test.js +0 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/storage-presigned-url.test.js +773 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/stream-throttle.test.js +173 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/structured-fields.test.js +180 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +66 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +89 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-coverage.test.js +571 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/test-harness.test.js +190 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing-request.test.js +119 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/testing.test.js +522 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/time.test.js +151 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-exporter.test.js +168 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-ct.test.js +275 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-ocsp-verify.test.js +105 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-pinset-drift.test.js +35 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tls-preferred-groups.test.js +81 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/tracing.test.js +280 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/uuid.test.js +93 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-aad.test.js +277 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vault-seal-pem-file.test.js +252 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-data.test.js +149 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vendor-manifest.test.js +92 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/vex.test.js +661 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/watcher.test.js +308 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/web-push-vapid.test.js +144 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/webhook.test.js +674 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/websocket-channels.test.js +360 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool.test.js +302 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/ws-client.test.js +349 -0
- package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +717 -0
- package/lib/vendor/blamejs/test/layer-5-integration/bundler-output.test.js +444 -0
- package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +597 -0
- package/lib/vendor/blamejs/test/layer-5-integration/security-chaos.test.js +308 -0
- package/lib/vendor/blamejs/test/smoke.js +431 -0
- package/lib/webhooks.js +305 -0
- package/package.json +43 -0
|
@@ -0,0 +1,1017 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module b.cluster
|
|
4
|
+
* @featured true
|
|
5
|
+
* @nav Production
|
|
6
|
+
* @title Cluster
|
|
7
|
+
*
|
|
8
|
+
* @intro
|
|
9
|
+
* Opt-in active/active leader election with fencing-tokenized writes.
|
|
10
|
+
* An external database is required: the framework's default provider
|
|
11
|
+
* stores the leader-election row, the per-chain tip rows, and the
|
|
12
|
+
* shared vault-key fingerprint in the same backend so every node sees
|
|
13
|
+
* one source of truth. When `b.cluster.init` is never called, the
|
|
14
|
+
* local process behaves as a permanent single leader: `isLeader()`
|
|
15
|
+
* always returns true, `fencingToken()` returns 0, no heartbeat runs,
|
|
16
|
+
* no DB is touched. Single-node deployments pay zero overhead.
|
|
17
|
+
*
|
|
18
|
+
* When init IS called, the framework starts a heartbeat that renews
|
|
19
|
+
* the leader lease via the configured provider. On lease loss (network
|
|
20
|
+
* partition, takeover, lease expiry) the node transitions to follower
|
|
21
|
+
* and write-side framework primitives throw `NotLeaderError`. The
|
|
22
|
+
* audit + consent chains carry a fencing token alongside every row so
|
|
23
|
+
* a stale leader cannot silently extend the chain after losing its
|
|
24
|
+
* lease — the audit-tip CHECK constraint refuses the stale token at
|
|
25
|
+
* the database layer. The application-level `requireLeader()` gate is
|
|
26
|
+
* an early-rejection optimisation; the DB constraint is canonical.
|
|
27
|
+
*
|
|
28
|
+
* Threat model:
|
|
29
|
+
* - Two leaders writing simultaneously — prevented by fencing
|
|
30
|
+
* tokens carried into the audit-tip row.
|
|
31
|
+
* - Follower receiving a write — rejected at the framework boundary
|
|
32
|
+
* via NotLeaderError. Operators front the cluster with a load
|
|
33
|
+
* balancer that routes write paths to the current leader; the
|
|
34
|
+
* discovery handler exposes which node holds the lease.
|
|
35
|
+
* - External-db unreachable — heartbeat fails; after `leaseTtl` no
|
|
36
|
+
* leader exists and writes fail closed. When the DB recovers,
|
|
37
|
+
* election resumes.
|
|
38
|
+
* - Vault-key drift — every node fingerprints its vault keys on
|
|
39
|
+
* boot and compares against a canonical fingerprint stored in
|
|
40
|
+
* the cluster-state row. A node holding a different key refuses
|
|
41
|
+
* to participate, preventing silent sealed-column corruption.
|
|
42
|
+
*
|
|
43
|
+
* @card
|
|
44
|
+
* Opt-in active/active leader election with fencing-tokenized writes.
|
|
45
|
+
*/
|
|
46
|
+
var C = require("./constants");
|
|
47
|
+
var clusterProviderDb = require("./cluster-provider-db");
|
|
48
|
+
var bCrypto = require("./crypto");
|
|
49
|
+
var lazyRequire = require("./lazy-require");
|
|
50
|
+
var { boot } = require("./log");
|
|
51
|
+
var safeAsync = require("./safe-async");
|
|
52
|
+
var safeJson = require("./safe-json");
|
|
53
|
+
var safeSql = require("./safe-sql");
|
|
54
|
+
var safeUrl = require("./safe-url");
|
|
55
|
+
var { FrameworkError, ClusterError } = require("./framework-error");
|
|
56
|
+
|
|
57
|
+
// Lazy: vault → db → cluster forms a load-time chain, and external-db is
|
|
58
|
+
// loaded before its init has run; both are safe to call once cluster
|
|
59
|
+
// reaches runtime, but eager require here would deadlock the load order.
|
|
60
|
+
var externalDb = lazyRequire(function () { return require("./external-db"); });
|
|
61
|
+
var vault = lazyRequire(function () { return require("./vault"); });
|
|
62
|
+
|
|
63
|
+
var DEFAULT_LEASE_TTL = C.TIME.seconds(30);
|
|
64
|
+
var DEFAULT_HEARTBEAT = C.TIME.seconds(10);
|
|
65
|
+
// MIN_LEASE_TTL bumped from 5s → 10s. With 5s leases + 1s heartbeats,
|
|
66
|
+
// a network glitch + GC pause can leave the old leader believing it
|
|
67
|
+
// still holds the lease (4s remaining on its clock) while a new
|
|
68
|
+
// leader has already acquired. Old-leader writes during that window
|
|
69
|
+
// only land on framework state with a fencingToken WHERE clause
|
|
70
|
+
// (audit-tip CHECK catches it); operator-supplied writes through
|
|
71
|
+
// b.externalDb.transaction outside the audit chain DON'T carry the
|
|
72
|
+
// clause and can be accepted by both leaders. 10s leaves more room
|
|
73
|
+
// for the framework's audit-tip fencing to catch the split-brain
|
|
74
|
+
// before consequential writes reach durable state.
|
|
75
|
+
var MIN_LEASE_TTL = C.TIME.seconds(10);
|
|
76
|
+
var MIN_HEARTBEAT = C.TIME.seconds(1);
|
|
77
|
+
|
|
78
|
+
var initialized = false;
|
|
79
|
+
var terminated = false; // set true by shutdown() so the
|
|
80
|
+
// permanent-leader fallback isn't
|
|
81
|
+
// re-engaged after a graceful exit
|
|
82
|
+
var nodeId = null;
|
|
83
|
+
var role = null; // 'leader' | 'follower'
|
|
84
|
+
var provider = null;
|
|
85
|
+
var lease = null; // current lease (if leader)
|
|
86
|
+
var heartbeatTimer = null;
|
|
87
|
+
var heartbeatMs = null;
|
|
88
|
+
var leaseTtlMs = null;
|
|
89
|
+
var transitionHandlers = [];
|
|
90
|
+
// Backend coordinates for write-dispatch code in audit/consent/etc.
|
|
91
|
+
// These are set when cluster.init is called with `externalDbBackend`
|
|
92
|
+
// (the default DB-row provider path); operators using a custom
|
|
93
|
+
// provider can set them via init opts directly.
|
|
94
|
+
var configuredExternalDbBackend = null;
|
|
95
|
+
var configuredDialect = null;
|
|
96
|
+
// Operator-supplied routable endpoint for THIS node, used by external
|
|
97
|
+
// load balancers / service meshes to learn where to send write traffic.
|
|
98
|
+
// Stored in the leader-election row on every acquire/renew so any node
|
|
99
|
+
// (or external observer) can resolve "where is the current leader?"
|
|
100
|
+
// via cluster.currentLeader() / cluster.discoveryHandler().
|
|
101
|
+
var configuredEndpoint = null;
|
|
102
|
+
|
|
103
|
+
var log = boot("cluster");
|
|
104
|
+
|
|
105
|
+
class NotLeaderError extends FrameworkError {
|
|
106
|
+
constructor(message) {
|
|
107
|
+
super(message || "not leader: write rejected by cluster gate", "NOT_LEADER");
|
|
108
|
+
this.name = "NotLeaderError";
|
|
109
|
+
this.statusCode = 503; // operator's load balancer should retry on the leader
|
|
110
|
+
this.isClusterError = true;
|
|
111
|
+
this.isNotLeaderError = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var _err = ClusterError.factory;
|
|
116
|
+
|
|
117
|
+
function _emitTransition(kind, detail) {
|
|
118
|
+
var event = Object.assign({ kind: kind, nodeId: nodeId, at: Date.now() }, detail || {});
|
|
119
|
+
for (var i = 0; i < transitionHandlers.length; i++) {
|
|
120
|
+
try { transitionHandlers[i](event); }
|
|
121
|
+
catch (e) { log.error("transition handler threw: " + e.message); }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ---- init ----
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @primitive b.cluster.init
|
|
129
|
+
* @signature b.cluster.init(opts)
|
|
130
|
+
* @since 0.4.0
|
|
131
|
+
* @status stable
|
|
132
|
+
* @compliance soc2, dora
|
|
133
|
+
* @related b.cluster.shutdown, b.cluster.requireLeader, b.cluster.currentLeader
|
|
134
|
+
*
|
|
135
|
+
* One-time cluster bootstrap. Configures the leader-election provider,
|
|
136
|
+
* validates the operator-supplied endpoint, runs boot-time rollback
|
|
137
|
+
* detection on the audit + consent chains, fingerprints this node's
|
|
138
|
+
* vault keys against the canonical cluster-state row, then starts the
|
|
139
|
+
* heartbeat that acquires and renews the leader lease. Throws on
|
|
140
|
+
* second invocation, on missing nodeId, on a leaseTtl below 10s, on a
|
|
141
|
+
* heartbeat that doesn't fit comfortably inside the lease, on a role
|
|
142
|
+
* outside `leader` / `follower`, and on a chain or vault-key mismatch
|
|
143
|
+
* that would let this node corrupt cluster state.
|
|
144
|
+
*
|
|
145
|
+
* @opts
|
|
146
|
+
* nodeId: string, // required; stable identity
|
|
147
|
+
* role: "leader"|"follower",
|
|
148
|
+
* leaseTtl: number, // ms; default 30000, min 10000
|
|
149
|
+
* heartbeatInterval: number, // ms; default 10000, min 1000
|
|
150
|
+
* endpoint: string, // routable URL of THIS node
|
|
151
|
+
* allowedProtocols: number, // safeUrl.ALLOW_HTTP_TLS by default
|
|
152
|
+
* provider: object, // custom election provider
|
|
153
|
+
* externalDbBackend: object, // required when no custom provider
|
|
154
|
+
* dialect: "postgres"|"sqlite"|"mysql",
|
|
155
|
+
* onTransition: function (event),
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* await b.cluster.init({
|
|
159
|
+
* nodeId: "api-01",
|
|
160
|
+
* role: "leader",
|
|
161
|
+
* leaseTtl: 30000,
|
|
162
|
+
* heartbeatInterval: 10000,
|
|
163
|
+
* endpoint: "https://api-01.example.internal:8443",
|
|
164
|
+
* externalDbBackend: b.externalDb.backend("primary"),
|
|
165
|
+
* dialect: "postgres",
|
|
166
|
+
* onTransition: function (event) {
|
|
167
|
+
* // event.kind ∈ { "lease-acquired", "lease-lost", "lease-released" }
|
|
168
|
+
* console.log("cluster transition:", event.kind, event.fencingToken);
|
|
169
|
+
* },
|
|
170
|
+
* });
|
|
171
|
+
* // → undefined (heartbeat now running)
|
|
172
|
+
*/
|
|
173
|
+
async function init(opts) {
|
|
174
|
+
if (initialized) {
|
|
175
|
+
throw _err("ALREADY_INITIALIZED", "cluster.init() called twice", true);
|
|
176
|
+
}
|
|
177
|
+
opts = opts || {};
|
|
178
|
+
if (!opts.nodeId) {
|
|
179
|
+
throw _err("INVALID_CONFIG", "cluster.init({ nodeId }) is required", true);
|
|
180
|
+
}
|
|
181
|
+
nodeId = String(opts.nodeId);
|
|
182
|
+
|
|
183
|
+
leaseTtlMs = opts.leaseTtl != null ? Number(opts.leaseTtl) : DEFAULT_LEASE_TTL;
|
|
184
|
+
if (leaseTtlMs < MIN_LEASE_TTL) {
|
|
185
|
+
throw _err("INVALID_TTL",
|
|
186
|
+
"leaseTtl must be >= " + MIN_LEASE_TTL + "ms (got " + leaseTtlMs + ")",
|
|
187
|
+
true);
|
|
188
|
+
}
|
|
189
|
+
heartbeatMs = opts.heartbeatInterval != null
|
|
190
|
+
? Number(opts.heartbeatInterval)
|
|
191
|
+
: DEFAULT_HEARTBEAT;
|
|
192
|
+
if (heartbeatMs < MIN_HEARTBEAT) {
|
|
193
|
+
throw _err("INVALID_HEARTBEAT",
|
|
194
|
+
"heartbeatInterval must be >= " + MIN_HEARTBEAT + "ms (got " + heartbeatMs + ")",
|
|
195
|
+
true);
|
|
196
|
+
}
|
|
197
|
+
if (heartbeatMs >= leaseTtlMs) {
|
|
198
|
+
throw _err("INVALID_HEARTBEAT",
|
|
199
|
+
"heartbeatInterval must be < leaseTtl (got heartbeat=" + heartbeatMs +
|
|
200
|
+
", leaseTtl=" + leaseTtlMs + "); recommend ~1/3 of leaseTtl",
|
|
201
|
+
true);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
role = (opts.role || "leader").toLowerCase();
|
|
205
|
+
if (role !== "leader" && role !== "follower") {
|
|
206
|
+
throw _err("INVALID_ROLE", "role must be 'leader' or 'follower'", true);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Optional endpoint. If provided, validate scheme + shape via url-safe
|
|
210
|
+
// — HTTPS-only by default since this is the URL external services use
|
|
211
|
+
// to reach the leader. Operators with internal cleartext clusters opt
|
|
212
|
+
// in via opts.allowedProtocols (safeUrl.ALLOW_HTTP_ALL).
|
|
213
|
+
if (opts.endpoint != null) {
|
|
214
|
+
try {
|
|
215
|
+
safeUrl.parse(opts.endpoint, {
|
|
216
|
+
allowedProtocols: opts.allowedProtocols || safeUrl.ALLOW_HTTP_TLS,
|
|
217
|
+
errorClass: ClusterError,
|
|
218
|
+
});
|
|
219
|
+
} catch (e) {
|
|
220
|
+
// Re-throw with a config-shaped error so operators see the cluster.init
|
|
221
|
+
// boundary, not a bare url-safe trace.
|
|
222
|
+
throw _err("INVALID_ENDPOINT",
|
|
223
|
+
"cluster.init({ endpoint }) rejected: " + e.message, true);
|
|
224
|
+
}
|
|
225
|
+
configuredEndpoint = String(opts.endpoint);
|
|
226
|
+
} else {
|
|
227
|
+
configuredEndpoint = null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (typeof opts.onTransition === "function") {
|
|
231
|
+
transitionHandlers.push(opts.onTransition);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Provider: either operator-supplied, or build the default DB-row
|
|
235
|
+
// provider against an externalDb backend.
|
|
236
|
+
if (opts.provider) {
|
|
237
|
+
provider = opts.provider;
|
|
238
|
+
// Operator-custom provider: they may still be writing framework
|
|
239
|
+
// state to an externalDb backend, in which case they pass these
|
|
240
|
+
// separately so write-dispatch code knows where to go.
|
|
241
|
+
configuredExternalDbBackend = opts.externalDbBackend || null;
|
|
242
|
+
configuredDialect = (opts.dialect || "postgres").toLowerCase();
|
|
243
|
+
} else {
|
|
244
|
+
if (!opts.externalDbBackend) {
|
|
245
|
+
throw _err("INVALID_CONFIG",
|
|
246
|
+
"cluster.init requires either { provider } or { externalDbBackend }", true);
|
|
247
|
+
}
|
|
248
|
+
provider = clusterProviderDb.create({
|
|
249
|
+
externalDbBackend: opts.externalDbBackend,
|
|
250
|
+
dialect: opts.dialect,
|
|
251
|
+
});
|
|
252
|
+
configuredExternalDbBackend = opts.externalDbBackend;
|
|
253
|
+
configuredDialect = (opts.dialect || "postgres").toLowerCase();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (typeof provider.ensureSchema === "function") {
|
|
257
|
+
await provider.ensureSchema();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
initialized = true;
|
|
261
|
+
log("initialized as nodeId='" + nodeId + "', role='" + role + "'");
|
|
262
|
+
|
|
263
|
+
// Initial acquisition attempt (only if role === 'leader')
|
|
264
|
+
if (role === "leader") {
|
|
265
|
+
await _tryAcquire();
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Boot-time rollback detection on the audit + consent chains. Runs
|
|
269
|
+
// regardless of role — every node should refuse to participate in a
|
|
270
|
+
// cluster whose shared chains have been rolled back (a follower
|
|
271
|
+
// would face the same chain integrity failure if it later took
|
|
272
|
+
// over). Skipped when configuredExternalDbBackend is unset, which
|
|
273
|
+
// means a custom provider is in use without externalDb-resident
|
|
274
|
+
// framework state — the operator owns rollback detection in that
|
|
275
|
+
// case.
|
|
276
|
+
if (configuredExternalDbBackend) {
|
|
277
|
+
await _checkChainTipRollback("audit", "_blamejs_audit_log", "_blamejs_audit_tip");
|
|
278
|
+
await _checkChainTipRollback("consent", "_blamejs_consent_log", "_blamejs_consent_tip");
|
|
279
|
+
// Vault-key consistency: every node in a cluster must hold the
|
|
280
|
+
// SAME vault key. A node booting with a different key would seal
|
|
281
|
+
// new writes under a key the rest of the cluster can't unseal,
|
|
282
|
+
// and (on takeover) be unable to unseal the rest of the cluster's
|
|
283
|
+
// sealed columns — silent corruption. Compare a fingerprint of
|
|
284
|
+
// this node's vault keys against the canonical one stored at
|
|
285
|
+
// first cluster boot; refuse to participate on mismatch.
|
|
286
|
+
await _checkVaultKeyConsistency();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Start heartbeat
|
|
290
|
+
heartbeatTimer = safeAsync.repeating(_heartbeat, heartbeatMs, { name: "cluster-heartbeat" });
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Cluster-mode equivalent of db.js's single-node audit.tip-sidecar
|
|
294
|
+
// rollback check. Reads the persistent _blamejs_audit_tip row and
|
|
295
|
+
// compares to the current chain head in _blamejs_audit_log:
|
|
296
|
+
//
|
|
297
|
+
// - No tip row: first cluster boot or operator-cleared. Skip
|
|
298
|
+
// silently (matches the single-node sidecar-missing path).
|
|
299
|
+
// - Tip recorded a counter > current MAX: chain was truncated /
|
|
300
|
+
// restored from older snapshot. FATAL — refuse boot.
|
|
301
|
+
// - Tip recorded a hash that doesn't match the row at that
|
|
302
|
+
// counter: the row at that counter was substituted (different
|
|
303
|
+
// hash for same counter). FATAL — refuse boot.
|
|
304
|
+
//
|
|
305
|
+
// process.exit(1) is the framework's convention for boot-time
|
|
306
|
+
// integrity failures (audit chain, checkpoints, single-node
|
|
307
|
+
// rollback). Cluster mode keeps the same posture so operators see
|
|
308
|
+
// a single boot-time failure mode regardless of deployment shape.
|
|
309
|
+
// Generalized boot-time rollback check used by both audit and consent
|
|
310
|
+
// chains. chainName is the human-readable label included in log
|
|
311
|
+
// output ("audit" / "consent"). logTable is the chain table
|
|
312
|
+
// (_blamejs_audit_log / _blamejs_consent_log). tipTable is the
|
|
313
|
+
// single-row coordination table that records the latest counter +
|
|
314
|
+
// rowHash + fencingToken (_blamejs_audit_tip / _blamejs_consent_tip).
|
|
315
|
+
//
|
|
316
|
+
// Surfaces three outcomes:
|
|
317
|
+
// - tip table missing → operator running cluster gates-only mode
|
|
318
|
+
// (cluster wired for leader election but framework state still
|
|
319
|
+
// lives in per-node SQLite without `frameworkSchema.ensureSchema`);
|
|
320
|
+
// skip silently.
|
|
321
|
+
// - no tip row → first cluster boot or operator-cleared; skip.
|
|
322
|
+
// - currentMax < tipCounter, or tip rowHash != row-at-counter
|
|
323
|
+
// hash → FATAL via process.exit(1). Same posture as the
|
|
324
|
+
// single-node audit.tip sidecar rollback check.
|
|
325
|
+
async function _checkChainTipRollback(chainName, logTable, tipTable) {
|
|
326
|
+
// Both tables are framework-internal constants from the call sites
|
|
327
|
+
// (`_blamejs_audit_log`, `_blamejs_consent_log`, etc.). Validate +
|
|
328
|
+
// quote per the framework's identifier-quoting convention so a
|
|
329
|
+
// future rename can't silently break the query.
|
|
330
|
+
safeSql.validateIdentifier(logTable, { allowReserved: true });
|
|
331
|
+
safeSql.validateIdentifier(tipTable, { allowReserved: true });
|
|
332
|
+
var qLogTable = safeSql.quoteIdentifier(logTable);
|
|
333
|
+
var qTipTable = safeSql.quoteIdentifier(tipTable);
|
|
334
|
+
|
|
335
|
+
var tipRows;
|
|
336
|
+
try {
|
|
337
|
+
tipRows = await externalDb().query(
|
|
338
|
+
"SELECT atMonotonicCounter, rowHash FROM " + qTipTable +
|
|
339
|
+
" WHERE scope = " + (configuredDialect === "postgres" ? "$1" : "?"),
|
|
340
|
+
[chainName],
|
|
341
|
+
{ backend: configuredExternalDbBackend }
|
|
342
|
+
);
|
|
343
|
+
} catch (e) {
|
|
344
|
+
var msg = (e && e.message) || "";
|
|
345
|
+
if (/no such table|does not exist|relation .* does not exist/i.test(msg)) {
|
|
346
|
+
log(chainName + "-tip table not present — skipping rollback check (cluster gates-only mode)");
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
throw e;
|
|
350
|
+
}
|
|
351
|
+
if (!tipRows.rows || tipRows.rows.length === 0) {
|
|
352
|
+
log("no " + chainName + "-tip row — skipping rollback check (first cluster boot or operator-cleared)");
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
var tip = tipRows.rows[0];
|
|
356
|
+
var tipCounter = Number(tip.atMonotonicCounter);
|
|
357
|
+
var tipHash = tip.rowHash;
|
|
358
|
+
|
|
359
|
+
var currentRows = await externalDb().query(
|
|
360
|
+
"SELECT MAX(monotonicCounter) AS m FROM " + qLogTable,
|
|
361
|
+
[],
|
|
362
|
+
{ backend: configuredExternalDbBackend }
|
|
363
|
+
);
|
|
364
|
+
var currentMax = (currentRows.rows && currentRows.rows[0] && currentRows.rows[0].m)
|
|
365
|
+
? Number(currentRows.rows[0].m)
|
|
366
|
+
: 0;
|
|
367
|
+
|
|
368
|
+
if (currentMax < tipCounter) {
|
|
369
|
+
throw _err("ROLLBACK_DETECTED",
|
|
370
|
+
"FATAL: cluster-mode " + chainName + "-log rollback detected. " +
|
|
371
|
+
chainName + "-tip counter: " + tipCounter +
|
|
372
|
+
"; current external-db max: " + currentMax +
|
|
373
|
+
". Either external-db was restored from an older snapshot, or " +
|
|
374
|
+
logTable + " rows have been deleted. Investigate before continuing.",
|
|
375
|
+
true);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
if (tipHash) {
|
|
379
|
+
var hashRows = await externalDb().query(
|
|
380
|
+
"SELECT rowHash FROM " + qLogTable + " WHERE monotonicCounter = " +
|
|
381
|
+
(configuredDialect === "postgres" ? "$1" : "?"),
|
|
382
|
+
[tipCounter],
|
|
383
|
+
{ backend: configuredExternalDbBackend }
|
|
384
|
+
);
|
|
385
|
+
if (hashRows.rows && hashRows.rows.length > 0) {
|
|
386
|
+
var rowAtTip = hashRows.rows[0].rowHash;
|
|
387
|
+
if (rowAtTip !== tipHash) {
|
|
388
|
+
throw _err("ROLLBACK_DETECTED",
|
|
389
|
+
"FATAL: cluster-mode " + chainName + "-log rollback detected (row-hash mismatch). " +
|
|
390
|
+
chainName + "-tip counter: " + tipCounter +
|
|
391
|
+
"; " + chainName + "-tip rowHash: " + tipHash +
|
|
392
|
+
"; current row rowHash: " + rowAtTip +
|
|
393
|
+
". The row at the recorded tip counter has a different hash — " +
|
|
394
|
+
"indicates row substitution at the chain head. Investigate before continuing.",
|
|
395
|
+
true);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
log("cluster " + chainName + "-tip rollback check ok (tip counter " + tipCounter +
|
|
400
|
+
", current " + currentMax + ")");
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Compute a deterministic fingerprint of THIS node's vault keys.
|
|
404
|
+
// SHA3-512 of the concatenated public keys (PQC + classical halves of
|
|
405
|
+
// the hybrid encryption keypair). One-way: nothing about the private
|
|
406
|
+
// key material is recoverable from the fingerprint, so it's safe to
|
|
407
|
+
// store in the coordination table that all cluster nodes can read.
|
|
408
|
+
//
|
|
409
|
+
// Returns null if vault.init() hasn't been called — cluster gates-only
|
|
410
|
+
// mode (no sealed-column work) doesn't need this check, same defensive
|
|
411
|
+
// posture as the audit-tip rollback check skipping when there's no
|
|
412
|
+
// audit-tip table.
|
|
413
|
+
function _vaultKeyFingerprint() {
|
|
414
|
+
var keysJson;
|
|
415
|
+
try {
|
|
416
|
+
keysJson = vault().getKeysJson();
|
|
417
|
+
} catch (e) {
|
|
418
|
+
// vault.init() not called — gates-only mode. Skip silently.
|
|
419
|
+
if (/vault.init\(\) must be awaited/.test((e && e.message) || "")) {
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
throw e;
|
|
423
|
+
}
|
|
424
|
+
// vault.getKeysJson() returns the keys serialized as JSON (the same
|
|
425
|
+
// format vault writes to disk). Parse to extract the public halves;
|
|
426
|
+
// we never touch privateKey/ecPrivateKey here.
|
|
427
|
+
var keys = safeJson.parse(keysJson);
|
|
428
|
+
if (!keys || !keys.publicKey || !keys.ecPublicKey) return null;
|
|
429
|
+
// Domain-separation prefix so this fingerprint can't be confused
|
|
430
|
+
// with a hash of the same bytes computed elsewhere in the framework.
|
|
431
|
+
return bCrypto.sha3Hash("blamejs/cluster-state/v1\n" +
|
|
432
|
+
keys.publicKey + "\n" +
|
|
433
|
+
keys.ecPublicKey);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
async function _checkVaultKeyConsistency() {
|
|
437
|
+
var localFp = _vaultKeyFingerprint();
|
|
438
|
+
if (localFp === null) {
|
|
439
|
+
log("vault not initialized — skipping vault-key consistency check (cluster gates-only mode)");
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
var nowMs = Date.now();
|
|
443
|
+
var ph = configuredDialect === "postgres";
|
|
444
|
+
|
|
445
|
+
// First boot: try to record THIS node's fingerprint. ON CONFLICT DO
|
|
446
|
+
// NOTHING means the FIRST node to boot wins; subsequent nodes
|
|
447
|
+
// observe whatever's already there. Every node then SELECTs and
|
|
448
|
+
// compares — any mismatch (including ours after a losing race)
|
|
449
|
+
// surfaces the drift.
|
|
450
|
+
try {
|
|
451
|
+
await externalDb().query(
|
|
452
|
+
"INSERT INTO _blamejs_cluster_state " +
|
|
453
|
+
" (scope, vaultKeyFp, recordedAt, recordedByNode) " +
|
|
454
|
+
"VALUES ('state', " +
|
|
455
|
+
(ph ? "$1, $2, $3" : "?, ?, ?") + ") " +
|
|
456
|
+
"ON CONFLICT (scope) DO NOTHING",
|
|
457
|
+
[localFp, nowMs, nodeId],
|
|
458
|
+
{ backend: configuredExternalDbBackend }
|
|
459
|
+
);
|
|
460
|
+
} catch (e) {
|
|
461
|
+
// Table missing → the cluster-provider-db ensureSchema didn't run
|
|
462
|
+
// (custom provider that doesn't create _blamejs_cluster_state).
|
|
463
|
+
// Skip silently — same defensive posture as the audit-tip check.
|
|
464
|
+
var msg = (e && e.message) || "";
|
|
465
|
+
if (/no such table|does not exist|relation .* does not exist/i.test(msg)) {
|
|
466
|
+
log("cluster-state table not present — skipping vault-key consistency check (custom provider)");
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
throw e;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Read whatever fingerprint is canonical (ours if first boot,
|
|
473
|
+
// someone else's if we lost the race or are joining an existing cluster).
|
|
474
|
+
var rows = await externalDb().query(
|
|
475
|
+
"SELECT vaultKeyFp, recordedByNode, recordedAt FROM _blamejs_cluster_state " +
|
|
476
|
+
"WHERE scope = 'state'",
|
|
477
|
+
[],
|
|
478
|
+
{ backend: configuredExternalDbBackend }
|
|
479
|
+
);
|
|
480
|
+
if (!rows.rows || rows.rows.length === 0) {
|
|
481
|
+
// Should never happen — we just INSERTed. Surface as fatal so the
|
|
482
|
+
// condition isn't silently ignored.
|
|
483
|
+
throw _err("CLUSTER_STATE_MISSING",
|
|
484
|
+
"FATAL: cluster-state row missing immediately after INSERT — " +
|
|
485
|
+
"external-db may not be honoring writes. Refusing boot.",
|
|
486
|
+
true);
|
|
487
|
+
}
|
|
488
|
+
var canonical = rows.rows[0];
|
|
489
|
+
if (canonical.vaultKeyFp !== localFp) {
|
|
490
|
+
var fpPrefix = C.BYTES.bytes(16);
|
|
491
|
+
throw _err("VAULT_KEY_DRIFT",
|
|
492
|
+
"FATAL: vault-key drift detected. " +
|
|
493
|
+
"local node: " + nodeId +
|
|
494
|
+
"; local fingerprint: " + localFp.slice(0, fpPrefix) + "…" +
|
|
495
|
+
"; canonical recorded by: " + canonical.recordedByNode +
|
|
496
|
+
"; canonical fingerprint: " + canonical.vaultKeyFp.slice(0, fpPrefix) + "…" +
|
|
497
|
+
". This node holds a DIFFERENT vault key than the rest of the " +
|
|
498
|
+
"cluster. Sealed-column writes from this node would be unreadable " +
|
|
499
|
+
"by the others (and vice versa). Restore the same vault key file " +
|
|
500
|
+
"before booting this node into the cluster.",
|
|
501
|
+
true);
|
|
502
|
+
}
|
|
503
|
+
log("cluster vault-key consistency ok (fingerprint " +
|
|
504
|
+
localFp.slice(0, C.BYTES.bytes(16)) + "… recorded by " + canonical.recordedByNode + ")");
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
async function _tryAcquire() {
|
|
508
|
+
if (role !== "leader") return; // pinned-follower role: never claim
|
|
509
|
+
try {
|
|
510
|
+
var got = await provider.acquireLease(nodeId, leaseTtlMs, {
|
|
511
|
+
endpoint: configuredEndpoint,
|
|
512
|
+
});
|
|
513
|
+
if (got) {
|
|
514
|
+
var wasLeader = !!lease;
|
|
515
|
+
lease = got;
|
|
516
|
+
if (!wasLeader) {
|
|
517
|
+
log("acquired lease — fencingToken=" + lease.fencingToken);
|
|
518
|
+
_emitTransition("lease-acquired", { fencingToken: lease.fencingToken });
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
} catch (e) {
|
|
522
|
+
log.error("acquire failed: " + e.message);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
async function _heartbeat() {
|
|
527
|
+
if (!initialized) return;
|
|
528
|
+
// ±20% per-tick jitter on followers — without it, N followers
|
|
529
|
+
// polling on a deterministic cadence all fire _tryAcquire at the
|
|
530
|
+
// same wall-clock instant on lease expiry, producing thundering-
|
|
531
|
+
// herd INSERT/UPDATE pressure on the leader-election row at
|
|
532
|
+
// exactly the worst time. Leader-renewal path doesn't jitter
|
|
533
|
+
// (a missed renewal hands the lease to a follower; the timing
|
|
534
|
+
// budget is in `leaseTtl - heartbeatMs`, not in the jitter
|
|
535
|
+
// window).
|
|
536
|
+
if (!lease) {
|
|
537
|
+
var jitterMs = Math.floor(Math.random() * (heartbeatMs * 0.4)); // allow:math-random-noncrypto — heartbeat jitter, not security-bearing
|
|
538
|
+
if (jitterMs > 0) {
|
|
539
|
+
await safeAsync.sleep(jitterMs);
|
|
540
|
+
}
|
|
541
|
+
if (!initialized) return;
|
|
542
|
+
// Not currently leader — try to acquire (lease may have expired
|
|
543
|
+
// on the previous holder).
|
|
544
|
+
await _tryAcquire();
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
// We hold a lease — renew it. Re-supply the configured endpoint so a
|
|
548
|
+
// hot-reload of the operator's config (e.g. node moves to a new
|
|
549
|
+
// routable URL after a restart) eventually reaches the discovery row.
|
|
550
|
+
try {
|
|
551
|
+
lease = await provider.renewLease(lease, { endpoint: configuredEndpoint });
|
|
552
|
+
} catch (e) {
|
|
553
|
+
if (e.code === "LEASE_LOST") {
|
|
554
|
+
log.error("lease lost: " + e.message);
|
|
555
|
+
var lostToken = lease ? lease.fencingToken : null;
|
|
556
|
+
lease = null;
|
|
557
|
+
_emitTransition("lease-lost", { fencingToken: lostToken });
|
|
558
|
+
// Attempt to re-acquire on the next heartbeat naturally.
|
|
559
|
+
} else {
|
|
560
|
+
// Transient error — retry on next heartbeat. If it persists past
|
|
561
|
+
// leaseTtl another node will steal, and we'll detect via LEASE_LOST.
|
|
562
|
+
log.error("renew failed transiently: " + e.message);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// ---- public sync surface ----
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* @primitive b.cluster.isLeader
|
|
571
|
+
* @signature b.cluster.isLeader()
|
|
572
|
+
* @since 0.4.0
|
|
573
|
+
* @status stable
|
|
574
|
+
* @related b.cluster.requireLeader, b.cluster.fencingToken, b.cluster.currentLeader
|
|
575
|
+
*
|
|
576
|
+
* Synchronous leader check. Returns `true` when this node currently
|
|
577
|
+
* holds a non-expired lease, OR when `b.cluster.init` was never called
|
|
578
|
+
* (single-node permanent-leader fallback). Returns `false` after a
|
|
579
|
+
* graceful `shutdown()`, after lease loss, or while a follower is
|
|
580
|
+
* waiting for its first lease. Cheap; safe to call on every request to
|
|
581
|
+
* branch leader-only work (scheduled jobs, cache warmers, write-side
|
|
582
|
+
* sweeps).
|
|
583
|
+
*
|
|
584
|
+
* @example
|
|
585
|
+
* if (b.cluster.isLeader()) {
|
|
586
|
+
* // Run scheduled tick on the leader only.
|
|
587
|
+
* await runHourlyRollup();
|
|
588
|
+
* }
|
|
589
|
+
* // → undefined
|
|
590
|
+
*/
|
|
591
|
+
function isLeader() {
|
|
592
|
+
if (terminated) return false; // post-shutdown: never leader
|
|
593
|
+
if (!initialized) return true; // never-initialized: permanent leader
|
|
594
|
+
return !!lease && Date.now() < lease.expiresAt;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* @primitive b.cluster.isClusterMode
|
|
599
|
+
* @signature b.cluster.isClusterMode()
|
|
600
|
+
* @since 0.4.0
|
|
601
|
+
* @status stable
|
|
602
|
+
* @related b.cluster.init, b.cluster.externalDbBackend
|
|
603
|
+
*
|
|
604
|
+
* Returns `true` when `b.cluster.init` has been called AND an
|
|
605
|
+
* externalDbBackend is wired — i.e. framework state (audit, consent,
|
|
606
|
+
* fencing-tokenized writes) should route to the shared external DB.
|
|
607
|
+
* Returns `false` in single-node fallback or when a custom provider
|
|
608
|
+
* was supplied without an externalDbBackend; in that case the operator
|
|
609
|
+
* owns write-dispatch.
|
|
610
|
+
*
|
|
611
|
+
* @example
|
|
612
|
+
* if (b.cluster.isClusterMode()) {
|
|
613
|
+
* console.log("framework state lives on", b.cluster.externalDbBackend());
|
|
614
|
+
* }
|
|
615
|
+
* // → undefined
|
|
616
|
+
*/
|
|
617
|
+
// Has cluster.init been called with a real configuration? Used by
|
|
618
|
+
// write-dispatch code (audit, consent, …) to decide whether framework
|
|
619
|
+
// state should go to local SQLite or external-db.
|
|
620
|
+
function isClusterMode() {
|
|
621
|
+
return initialized && !!configuredExternalDbBackend;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* @primitive b.cluster.externalDbBackend
|
|
626
|
+
* @signature b.cluster.externalDbBackend()
|
|
627
|
+
* @since 0.4.0
|
|
628
|
+
* @status stable
|
|
629
|
+
* @related b.cluster.init, b.cluster.dialect, b.cluster.isClusterMode
|
|
630
|
+
*
|
|
631
|
+
* Returns the externalDb backend handle wired at init, or `null` in
|
|
632
|
+
* single-node fallback / when a custom provider was supplied without
|
|
633
|
+
* one. Internal write-dispatch code (audit, consent, fencing-tokenized
|
|
634
|
+
* primitives) calls this to route framework state to the shared
|
|
635
|
+
* backend; operator code rarely needs it directly.
|
|
636
|
+
*
|
|
637
|
+
* @example
|
|
638
|
+
* var backend = b.cluster.externalDbBackend();
|
|
639
|
+
* if (backend) {
|
|
640
|
+
* // Framework state lands on the shared cluster DB.
|
|
641
|
+
* }
|
|
642
|
+
* // → undefined
|
|
643
|
+
*/
|
|
644
|
+
function externalDbBackend() {
|
|
645
|
+
return configuredExternalDbBackend;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* @primitive b.cluster.dialect
|
|
650
|
+
* @signature b.cluster.dialect()
|
|
651
|
+
* @since 0.4.0
|
|
652
|
+
* @status stable
|
|
653
|
+
* @related b.cluster.externalDbBackend, b.cluster.init
|
|
654
|
+
*
|
|
655
|
+
* Returns the SQL dialect string wired at init — `"postgres"`,
|
|
656
|
+
* `"sqlite"`, or `"mysql"`. Used by write-dispatch code that emits raw
|
|
657
|
+
* placeholder syntax (`$1` vs `?`) against the shared backend.
|
|
658
|
+
*
|
|
659
|
+
* @example
|
|
660
|
+
* var ph = b.cluster.dialect() === "postgres" ? "$1" : "?";
|
|
661
|
+
* // → undefined
|
|
662
|
+
*/
|
|
663
|
+
function dialect() {
|
|
664
|
+
return configuredDialect;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* @primitive b.cluster.currentNodeId
|
|
669
|
+
* @signature b.cluster.currentNodeId()
|
|
670
|
+
* @since 0.4.0
|
|
671
|
+
* @status stable
|
|
672
|
+
* @related b.cluster.endpoint, b.cluster.currentLeader
|
|
673
|
+
*
|
|
674
|
+
* Returns this node's configured nodeId, or `"single-node-local"` in
|
|
675
|
+
* the permanent-leader fallback when init was never called. Stable
|
|
676
|
+
* across the lifetime of the process — operators use it to tag audit
|
|
677
|
+
* metadata and observability events with the node identity.
|
|
678
|
+
*
|
|
679
|
+
* @example
|
|
680
|
+
* b.audit.safeEmit({
|
|
681
|
+
* action: "system.bootstrapped",
|
|
682
|
+
* actor: { systemNode: b.cluster.currentNodeId() },
|
|
683
|
+
* outcome: "success",
|
|
684
|
+
* });
|
|
685
|
+
* // → undefined
|
|
686
|
+
*/
|
|
687
|
+
function currentNodeId() {
|
|
688
|
+
return initialized ? nodeId : "single-node-local";
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
/**
|
|
692
|
+
* @primitive b.cluster.endpoint
|
|
693
|
+
* @signature b.cluster.endpoint()
|
|
694
|
+
* @since 0.7.30
|
|
695
|
+
* @status stable
|
|
696
|
+
* @related b.cluster.discoveryHandler, b.cluster.currentLeader
|
|
697
|
+
*
|
|
698
|
+
* This node's routable endpoint URL — the value supplied as
|
|
699
|
+
* `opts.endpoint` to `b.cluster.init`. Returns `null` when not
|
|
700
|
+
* configured or in single-node fallback. External observers wanting
|
|
701
|
+
* to learn the leader's URL should call `discoveryHandler()` /
|
|
702
|
+
* `currentLeader()` instead; this getter is for the local node's own
|
|
703
|
+
* self-identity.
|
|
704
|
+
*
|
|
705
|
+
* @example
|
|
706
|
+
* var here = b.cluster.endpoint();
|
|
707
|
+
* // → "https://api-01.example.internal:8443"
|
|
708
|
+
*/
|
|
709
|
+
function endpoint() {
|
|
710
|
+
return configuredEndpoint;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* @primitive b.cluster.fencingToken
|
|
715
|
+
* @signature b.cluster.fencingToken()
|
|
716
|
+
* @since 0.4.0
|
|
717
|
+
* @status stable
|
|
718
|
+
* @compliance soc2
|
|
719
|
+
* @related b.cluster.isLeader, b.cluster.currentLeader
|
|
720
|
+
*
|
|
721
|
+
* Current monotonic fencing token for this node's lease. Increments
|
|
722
|
+
* with every successful acquisition; a stale leader's token is
|
|
723
|
+
* strictly less than the new leader's, and the audit-tip CHECK
|
|
724
|
+
* constraint refuses inserts carrying a stale token. Returns `0` when
|
|
725
|
+
* no lease is held (follower, between leases, single-node fallback).
|
|
726
|
+
*
|
|
727
|
+
* @example
|
|
728
|
+
* var token = b.cluster.fencingToken();
|
|
729
|
+
* // → 42
|
|
730
|
+
*/
|
|
731
|
+
function fencingToken() {
|
|
732
|
+
if (!initialized) return 0;
|
|
733
|
+
return lease ? lease.fencingToken : 0;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* @primitive b.cluster.requireLeader
|
|
738
|
+
* @signature b.cluster.requireLeader()
|
|
739
|
+
* @since 0.4.0
|
|
740
|
+
* @status stable
|
|
741
|
+
* @related b.cluster.isLeader, b.cluster.currentLeader
|
|
742
|
+
*
|
|
743
|
+
* Throws `NotLeaderError` (statusCode 503) when this node is not the
|
|
744
|
+
* current leader. Use at the top of write-side handlers so a follower
|
|
745
|
+
* receiving a misrouted request rejects fast instead of producing a
|
|
746
|
+
* downstream fencing-token rejection. Single-node deployments where
|
|
747
|
+
* init was never called short-circuit through `isLeader() === true`
|
|
748
|
+
* and never throw.
|
|
749
|
+
*
|
|
750
|
+
* @example
|
|
751
|
+
* try {
|
|
752
|
+
* b.cluster.requireLeader();
|
|
753
|
+
* await runHourlyRollup();
|
|
754
|
+
* } catch (e) {
|
|
755
|
+
* if (e.isNotLeaderError) {
|
|
756
|
+
* // Operator's load balancer should retry on the leader.
|
|
757
|
+
* res.writeHead(503).end();
|
|
758
|
+
* return;
|
|
759
|
+
* }
|
|
760
|
+
* throw e;
|
|
761
|
+
* }
|
|
762
|
+
* // → undefined
|
|
763
|
+
*/
|
|
764
|
+
function requireLeader() {
|
|
765
|
+
if (!isLeader()) {
|
|
766
|
+
throw new NotLeaderError(
|
|
767
|
+
"node '" + currentNodeId() + "' is not currently leader" +
|
|
768
|
+
(initialized ? "" : " (cluster not initialized)")
|
|
769
|
+
);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
/**
|
|
774
|
+
* @primitive b.cluster.currentLeader
|
|
775
|
+
* @signature b.cluster.currentLeader()
|
|
776
|
+
* @since 0.4.0
|
|
777
|
+
* @status stable
|
|
778
|
+
* @related b.cluster.discoveryHandler, b.cluster.endpoint, b.cluster.isLeader
|
|
779
|
+
*
|
|
780
|
+
* Async snapshot of the cluster's current leader. Returns
|
|
781
|
+
* `{ nodeId, leaseExpiresAt, fencingToken, endpoint }` when a leader
|
|
782
|
+
* holds a non-expired lease, or `null` when no node currently holds
|
|
783
|
+
* the lease (election in progress, DB unreachable, lease expired).
|
|
784
|
+
* In single-node fallback, returns the synthetic
|
|
785
|
+
* `{ nodeId: "single-node-local", leaseExpiresAt: Infinity, ... }`
|
|
786
|
+
* record so callers don't need a second branch.
|
|
787
|
+
*
|
|
788
|
+
* @example
|
|
789
|
+
* var leader = await b.cluster.currentLeader();
|
|
790
|
+
* if (leader && leader.endpoint) {
|
|
791
|
+
* console.log("forward write to", leader.endpoint);
|
|
792
|
+
* }
|
|
793
|
+
* // → undefined
|
|
794
|
+
*/
|
|
795
|
+
async function currentLeader() {
|
|
796
|
+
if (!initialized) {
|
|
797
|
+
return {
|
|
798
|
+
nodeId: "single-node-local",
|
|
799
|
+
leaseExpiresAt: Infinity,
|
|
800
|
+
fencingToken: 0,
|
|
801
|
+
endpoint: null,
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
return await provider.currentLeader();
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
// HTTP request handler — replies with the current cluster leader for
|
|
808
|
+
// service-mesh / load-balancer discovery. Operators mount this at
|
|
809
|
+
// whatever route they want (`/cluster/leader`, `/health/leader`, etc.).
|
|
810
|
+
//
|
|
811
|
+
// 200 application/json — leader present
|
|
812
|
+
// { leader: { nodeId, endpoint, fencingToken, leaseExpiresAt },
|
|
813
|
+
// self: { nodeId, endpoint, isLeader } }
|
|
814
|
+
//
|
|
815
|
+
// 503 application/json — no leader (no row, expired lease, DB
|
|
816
|
+
// unreachable, single-node not initialized with cluster mode)
|
|
817
|
+
// { leader: null, self: { nodeId, endpoint, isLeader } }
|
|
818
|
+
//
|
|
819
|
+
// No auth — this endpoint is intended to be called by infrastructure
|
|
820
|
+
// inside the trust boundary (LB, healthcheck, dashboard). Operators
|
|
821
|
+
// who expose it externally should layer auth via their own middleware.
|
|
822
|
+
//
|
|
823
|
+
// Handler is method-agnostic so it works behind any HTTP probe shape
|
|
824
|
+
// (GET, HEAD, etc.). Cache-Control: no-store to avoid stale-leader
|
|
825
|
+
// responses pinned by a caching proxy during a takeover.
|
|
826
|
+
/**
|
|
827
|
+
* @primitive b.cluster.discoveryHandler
|
|
828
|
+
* @signature b.cluster.discoveryHandler()
|
|
829
|
+
* @since 0.7.30
|
|
830
|
+
* @status stable
|
|
831
|
+
* @related b.cluster.currentLeader, b.cluster.endpoint
|
|
832
|
+
*
|
|
833
|
+
* Returns an HTTP `(req, res)` handler suitable for mounting on any
|
|
834
|
+
* route (e.g. `/cluster/leader`). Replies 200 JSON with
|
|
835
|
+
* `{ leader, self }` when a leader holds the lease, 503 JSON with
|
|
836
|
+
* `{ leader: null, self }` when no leader exists or the DB is
|
|
837
|
+
* unreachable. Method-agnostic; emits `Cache-Control: no-store` so
|
|
838
|
+
* caching proxies don't pin a stale leader during a takeover. No auth
|
|
839
|
+
* — intended for infrastructure inside the trust boundary (load
|
|
840
|
+
* balancers, healthchecks, dashboards). Operators exposing the
|
|
841
|
+
* endpoint externally should layer auth via their own middleware.
|
|
842
|
+
*
|
|
843
|
+
* @example
|
|
844
|
+
* var leaderProbe = b.cluster.discoveryHandler();
|
|
845
|
+
* server.on("request", function (req, res) {
|
|
846
|
+
* if (req.url === "/cluster/leader") return leaderProbe(req, res);
|
|
847
|
+
* // ... rest of routing
|
|
848
|
+
* });
|
|
849
|
+
* // → undefined
|
|
850
|
+
*/
|
|
851
|
+
function discoveryHandler() {
|
|
852
|
+
return async function (req, res) {
|
|
853
|
+
var selfInfo = {
|
|
854
|
+
nodeId: currentNodeId(),
|
|
855
|
+
endpoint: configuredEndpoint,
|
|
856
|
+
isLeader: isLeader(),
|
|
857
|
+
};
|
|
858
|
+
var body;
|
|
859
|
+
var status;
|
|
860
|
+
try {
|
|
861
|
+
var leader = await currentLeader();
|
|
862
|
+
if (leader && leader.nodeId && leader.nodeId !== "single-node-local") {
|
|
863
|
+
body = { leader: leader, self: selfInfo };
|
|
864
|
+
status = 200;
|
|
865
|
+
} else if (leader && leader.nodeId === "single-node-local") {
|
|
866
|
+
// Permanent-leader fallback (cluster.init never called). Reply
|
|
867
|
+
// 200 — the operator's app is healthy and the "leader" is this
|
|
868
|
+
// process. Useful so the discovery endpoint is never a false
|
|
869
|
+
// negative in single-node deployments.
|
|
870
|
+
body = { leader: leader, self: selfInfo };
|
|
871
|
+
status = 200;
|
|
872
|
+
} else {
|
|
873
|
+
body = { leader: null, self: selfInfo };
|
|
874
|
+
status = 503;
|
|
875
|
+
}
|
|
876
|
+
} catch (e) {
|
|
877
|
+
body = { leader: null, self: selfInfo, error: e.message };
|
|
878
|
+
status = 503;
|
|
879
|
+
}
|
|
880
|
+
var json = JSON.stringify(body);
|
|
881
|
+
res.writeHead(status, {
|
|
882
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
883
|
+
"Content-Length": Buffer.byteLength(json),
|
|
884
|
+
"Cache-Control": "no-store",
|
|
885
|
+
});
|
|
886
|
+
res.end(json);
|
|
887
|
+
};
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
/**
|
|
891
|
+
* @primitive b.cluster.onTransition
|
|
892
|
+
* @signature b.cluster.onTransition(handler)
|
|
893
|
+
* @since 0.4.0
|
|
894
|
+
* @status stable
|
|
895
|
+
* @related b.cluster.init, b.cluster.shutdown
|
|
896
|
+
*
|
|
897
|
+
* Register a callback fired on every cluster role transition. Event
|
|
898
|
+
* shape: `{ kind, nodeId, at, fencingToken? }` where `kind` is one of
|
|
899
|
+
* `"lease-acquired"`, `"lease-lost"`, `"lease-released"`. Multiple
|
|
900
|
+
* handlers can be registered; each runs in registration order and
|
|
901
|
+
* a throwing handler is logged but doesn't break the chain. Throws
|
|
902
|
+
* synchronously when `handler` is not a function.
|
|
903
|
+
*
|
|
904
|
+
* @example
|
|
905
|
+
* b.cluster.onTransition(function (event) {
|
|
906
|
+
* b.audit.safeEmit({
|
|
907
|
+
* action: "system.cluster_transition",
|
|
908
|
+
* actor: { systemNode: event.nodeId },
|
|
909
|
+
* outcome: "success",
|
|
910
|
+
* metadata: { kind: event.kind, fencingToken: event.fencingToken },
|
|
911
|
+
* });
|
|
912
|
+
* });
|
|
913
|
+
* // → undefined
|
|
914
|
+
*/
|
|
915
|
+
function onTransition(handler) {
|
|
916
|
+
if (typeof handler !== "function") {
|
|
917
|
+
throw _err("INVALID_HANDLER", "onTransition expects a function", true);
|
|
918
|
+
}
|
|
919
|
+
transitionHandlers.push(handler);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
/**
|
|
923
|
+
* @primitive b.cluster.shutdown
|
|
924
|
+
* @signature b.cluster.shutdown()
|
|
925
|
+
* @since 0.4.0
|
|
926
|
+
* @status stable
|
|
927
|
+
* @related b.cluster.init, b.cluster.onTransition
|
|
928
|
+
*
|
|
929
|
+
* Graceful cluster exit. Stops the heartbeat, releases the lease via
|
|
930
|
+
* the provider so the next election round can fire immediately
|
|
931
|
+
* (instead of waiting for `leaseTtl` to expire), emits a
|
|
932
|
+
* `lease-released` transition, and resets internal state. Idempotent
|
|
933
|
+
* when init was never called. After shutdown, `isLeader()` returns
|
|
934
|
+
* `false` permanently for this process; a fresh `init()` is required
|
|
935
|
+
* to participate again. Wire into the framework's appShutdown hook so
|
|
936
|
+
* SIGTERM frees the lease before the new replica boots.
|
|
937
|
+
*
|
|
938
|
+
* @example
|
|
939
|
+
* process.on("SIGTERM", async function () {
|
|
940
|
+
* await b.cluster.shutdown();
|
|
941
|
+
* process.exit(0);
|
|
942
|
+
* });
|
|
943
|
+
* // → undefined
|
|
944
|
+
*/
|
|
945
|
+
async function shutdown() {
|
|
946
|
+
if (!initialized) return;
|
|
947
|
+
if (heartbeatTimer) {
|
|
948
|
+
heartbeatTimer.stop();
|
|
949
|
+
heartbeatTimer = null;
|
|
950
|
+
}
|
|
951
|
+
if (lease) {
|
|
952
|
+
try {
|
|
953
|
+
await provider.releaseLease(lease);
|
|
954
|
+
_emitTransition("lease-released", { fencingToken: lease.fencingToken });
|
|
955
|
+
log("lease released on shutdown");
|
|
956
|
+
} catch (e) {
|
|
957
|
+
log.error("release on shutdown failed: " + e.message);
|
|
958
|
+
}
|
|
959
|
+
lease = null;
|
|
960
|
+
}
|
|
961
|
+
initialized = false;
|
|
962
|
+
terminated = true;
|
|
963
|
+
provider = null;
|
|
964
|
+
role = null;
|
|
965
|
+
leaseTtlMs = null;
|
|
966
|
+
heartbeatMs = null;
|
|
967
|
+
configuredExternalDbBackend = null;
|
|
968
|
+
configuredDialect = null;
|
|
969
|
+
configuredEndpoint = null;
|
|
970
|
+
transitionHandlers = [];
|
|
971
|
+
// nodeId is preserved post-shutdown so audit metadata still reflects
|
|
972
|
+
// who this process was; cleared only by _resetForTest.
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// ---- test helpers — not part of public contract ----
|
|
976
|
+
|
|
977
|
+
function _resetForTest() {
|
|
978
|
+
if (heartbeatTimer) heartbeatTimer.stop();
|
|
979
|
+
heartbeatTimer = null;
|
|
980
|
+
initialized = false;
|
|
981
|
+
terminated = false;
|
|
982
|
+
nodeId = null;
|
|
983
|
+
role = null;
|
|
984
|
+
provider = null;
|
|
985
|
+
lease = null;
|
|
986
|
+
leaseTtlMs = null;
|
|
987
|
+
heartbeatMs = null;
|
|
988
|
+
configuredExternalDbBackend = null;
|
|
989
|
+
configuredDialect = null;
|
|
990
|
+
configuredEndpoint = null;
|
|
991
|
+
transitionHandlers = [];
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
async function _heartbeatNowForTest() {
|
|
995
|
+
// Drive one heartbeat synchronously without waiting for the timer —
|
|
996
|
+
// lets tests deterministically observe lease state transitions.
|
|
997
|
+
await _heartbeat();
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
module.exports = {
|
|
1001
|
+
init: init,
|
|
1002
|
+
isLeader: isLeader,
|
|
1003
|
+
isClusterMode: isClusterMode,
|
|
1004
|
+
externalDbBackend: externalDbBackend,
|
|
1005
|
+
dialect: dialect,
|
|
1006
|
+
currentNodeId: currentNodeId,
|
|
1007
|
+
endpoint: endpoint,
|
|
1008
|
+
fencingToken: fencingToken,
|
|
1009
|
+
requireLeader: requireLeader,
|
|
1010
|
+
currentLeader: currentLeader,
|
|
1011
|
+
discoveryHandler: discoveryHandler,
|
|
1012
|
+
onTransition: onTransition,
|
|
1013
|
+
shutdown: shutdown,
|
|
1014
|
+
NotLeaderError: NotLeaderError,
|
|
1015
|
+
_resetForTest: _resetForTest,
|
|
1016
|
+
_heartbeatNowForTest: _heartbeatNowForTest,
|
|
1017
|
+
};
|