@emilia-protocol/gate 0.11.0 → 0.13.0
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 +58 -0
- package/README.md +252 -0
- package/action-control-manifest.js +3 -268
- package/action-escrow-custodian.js +3 -394
- package/action-escrow-evidence.js +3 -858
- package/action-escrow-package.js +3 -1668
- package/action-escrow-postgres.js +3 -337
- package/action-escrow-state.js +3 -396
- package/action-escrow-verifiers.js +3 -331
- package/action-escrow.js +3 -2447
- package/action-packs.js +3 -140
- package/adapters/_kit.js +3 -104
- package/adapters/aws.js +3 -108
- package/adapters/cloudflare.js +3 -54
- package/adapters/gcp.js +3 -70
- package/adapters/github.js +3 -109
- package/adapters/jira.js +3 -55
- package/adapters/k8s.js +3 -70
- package/adapters/linear.js +3 -55
- package/adapters/salesforce.js +3 -55
- package/adapters/stripe.js +3 -81
- package/adapters/supabase.js +3 -121
- package/adapters/terraform.js +3 -59
- package/adapters/vercel.js +3 -84
- package/aec-execution.js +3 -312
- package/breakglass.js +3 -582
- package/capability-receipt.js +4 -0
- package/cf1-conformance.js +3 -106
- package/challenge-store.js +3 -69
- package/control-plane.js +3 -340
- package/coverage.js +3 -721
- package/demo.mjs +1 -1
- package/deployment-attestation.js +3 -247
- package/dist/action-control-manifest.d.ts +82 -0
- package/dist/action-control-manifest.d.ts.map +1 -0
- package/dist/action-control-manifest.js +422 -0
- package/dist/action-control-manifest.js.map +1 -0
- package/dist/action-escrow-custodian.d.ts +74 -0
- package/dist/action-escrow-custodian.d.ts.map +1 -0
- package/dist/action-escrow-custodian.js +363 -0
- package/dist/action-escrow-custodian.js.map +1 -0
- package/dist/action-escrow-evidence.d.ts +130 -0
- package/dist/action-escrow-evidence.d.ts.map +1 -0
- package/dist/action-escrow-evidence.js +1012 -0
- package/dist/action-escrow-evidence.js.map +1 -0
- package/dist/action-escrow-package.d.ts +10 -0
- package/dist/action-escrow-package.d.ts.map +1 -0
- package/dist/action-escrow-package.js +1583 -0
- package/dist/action-escrow-package.js.map +1 -0
- package/dist/action-escrow-postgres.d.ts +62 -0
- package/dist/action-escrow-postgres.d.ts.map +1 -0
- package/dist/action-escrow-postgres.js +339 -0
- package/dist/action-escrow-postgres.js.map +1 -0
- package/dist/action-escrow-state.d.ts +141 -0
- package/dist/action-escrow-state.d.ts.map +1 -0
- package/dist/action-escrow-state.js +413 -0
- package/dist/action-escrow-state.js.map +1 -0
- package/dist/action-escrow-verifiers.d.ts +65 -0
- package/dist/action-escrow-verifiers.d.ts.map +1 -0
- package/dist/action-escrow-verifiers.js +421 -0
- package/dist/action-escrow-verifiers.js.map +1 -0
- package/dist/action-escrow.d.ts +112 -0
- package/dist/action-escrow.d.ts.map +1 -0
- package/dist/action-escrow.js +2661 -0
- package/dist/action-escrow.js.map +1 -0
- package/dist/action-packs.d.ts +54 -0
- package/dist/action-packs.d.ts.map +1 -0
- package/dist/action-packs.js +143 -0
- package/dist/action-packs.js.map +1 -0
- package/dist/adapters/_kit.d.ts +50 -0
- package/dist/adapters/_kit.d.ts.map +1 -0
- package/dist/adapters/_kit.js +98 -0
- package/dist/adapters/_kit.js.map +1 -0
- package/dist/adapters/aws.d.ts +158 -0
- package/dist/adapters/aws.d.ts.map +1 -0
- package/dist/adapters/aws.js +136 -0
- package/dist/adapters/aws.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +116 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +75 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/gcp.d.ts +139 -0
- package/dist/adapters/gcp.d.ts.map +1 -0
- package/dist/adapters/gcp.js +69 -0
- package/dist/adapters/gcp.js.map +1 -0
- package/dist/adapters/github.d.ts +123 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +105 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/jira.d.ts +109 -0
- package/dist/adapters/jira.d.ts.map +1 -0
- package/dist/adapters/jira.js +54 -0
- package/dist/adapters/jira.js.map +1 -0
- package/dist/adapters/k8s.d.ts +139 -0
- package/dist/adapters/k8s.d.ts.map +1 -0
- package/dist/adapters/k8s.js +69 -0
- package/dist/adapters/k8s.js.map +1 -0
- package/dist/adapters/linear.d.ts +109 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +54 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/salesforce.d.ts +109 -0
- package/dist/adapters/salesforce.d.ts.map +1 -0
- package/dist/adapters/salesforce.js +54 -0
- package/dist/adapters/salesforce.js.map +1 -0
- package/dist/adapters/stripe.d.ts +116 -0
- package/dist/adapters/stripe.d.ts.map +1 -0
- package/dist/adapters/stripe.js +77 -0
- package/dist/adapters/stripe.js.map +1 -0
- package/dist/adapters/supabase.d.ts +127 -0
- package/dist/adapters/supabase.d.ts.map +1 -0
- package/dist/adapters/supabase.js +112 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/adapters/terraform.d.ts +109 -0
- package/dist/adapters/terraform.d.ts.map +1 -0
- package/dist/adapters/terraform.js +58 -0
- package/dist/adapters/terraform.js.map +1 -0
- package/dist/adapters/vercel.d.ts +114 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +81 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/aec-execution.d.ts +107 -0
- package/dist/aec-execution.d.ts.map +1 -0
- package/dist/aec-execution.js +334 -0
- package/dist/aec-execution.js.map +1 -0
- package/dist/breakglass.d.ts +205 -0
- package/dist/breakglass.d.ts.map +1 -0
- package/dist/breakglass.js +627 -0
- package/dist/breakglass.js.map +1 -0
- package/dist/capability-receipt.d.ts +601 -0
- package/dist/capability-receipt.d.ts.map +1 -0
- package/dist/capability-receipt.js +1177 -0
- package/dist/capability-receipt.js.map +1 -0
- package/dist/cf1-conformance.d.ts +83 -0
- package/dist/cf1-conformance.d.ts.map +1 -0
- package/dist/cf1-conformance.js +94 -0
- package/dist/cf1-conformance.js.map +1 -0
- package/dist/challenge-store.d.ts +20 -0
- package/dist/challenge-store.d.ts.map +1 -0
- package/dist/challenge-store.js +62 -0
- package/dist/challenge-store.js.map +1 -0
- package/dist/control-plane.d.ts +136 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +349 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/coverage.d.ts +156 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +768 -0
- package/dist/coverage.js.map +1 -0
- package/dist/deployment-attestation.d.ts +93 -0
- package/dist/deployment-attestation.d.ts.map +1 -0
- package/dist/deployment-attestation.js +262 -0
- package/dist/deployment-attestation.js.map +1 -0
- package/dist/eg1-conformance.d.ts +286 -0
- package/dist/eg1-conformance.d.ts.map +1 -0
- package/dist/eg1-conformance.js +379 -0
- package/dist/eg1-conformance.js.map +1 -0
- package/dist/enterprise.d.ts +88 -0
- package/dist/enterprise.d.ts.map +1 -0
- package/dist/enterprise.js +194 -0
- package/dist/enterprise.js.map +1 -0
- package/dist/evidence-postgres.d.ts +123 -0
- package/dist/evidence-postgres.d.ts.map +1 -0
- package/dist/evidence-postgres.js +343 -0
- package/dist/evidence-postgres.js.map +1 -0
- package/dist/evidence.d.ts +113 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +369 -0
- package/dist/evidence.js.map +1 -0
- package/dist/execution-binding.d.ts +49 -0
- package/dist/execution-binding.d.ts.map +1 -0
- package/dist/execution-binding.js +243 -0
- package/dist/execution-binding.js.map +1 -0
- package/dist/formal-runtime-map.d.ts +42 -0
- package/dist/formal-runtime-map.d.ts.map +1 -0
- package/dist/formal-runtime-map.js +23 -0
- package/dist/formal-runtime-map.js.map +1 -0
- package/dist/index.d.ts +1002 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1736 -0
- package/dist/index.js.map +1 -0
- package/dist/key-registry.d.ts +60 -0
- package/dist/key-registry.d.ts.map +1 -0
- package/dist/key-registry.js +144 -0
- package/dist/key-registry.js.map +1 -0
- package/dist/mcp.d.ts +53 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +112 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metering.d.ts +80 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/metering.js +227 -0
- package/dist/metering.js.map +1 -0
- package/dist/metrics.d.ts +68 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +242 -0
- package/dist/metrics.js.map +1 -0
- package/dist/network-witness.d.ts +167 -0
- package/dist/network-witness.d.ts.map +1 -0
- package/dist/network-witness.js +520 -0
- package/dist/network-witness.js.map +1 -0
- package/dist/protocol-state.d.ts +141 -0
- package/dist/protocol-state.d.ts.map +1 -0
- package/dist/protocol-state.js +106 -0
- package/dist/protocol-state.js.map +1 -0
- package/dist/receipt-program.d.ts +59 -0
- package/dist/receipt-program.d.ts.map +1 -0
- package/dist/receipt-program.js +1053 -0
- package/dist/receipt-program.js.map +1 -0
- package/dist/reliance-kernel.d.ts +66 -0
- package/dist/reliance-kernel.d.ts.map +1 -0
- package/dist/reliance-kernel.js +103 -0
- package/dist/reliance-kernel.js.map +1 -0
- package/dist/reliance-packet.d.ts +67 -0
- package/dist/reliance-packet.d.ts.map +1 -0
- package/dist/reliance-packet.js +176 -0
- package/dist/reliance-packet.js.map +1 -0
- package/dist/remedy-program-postgres.d.ts +37 -0
- package/dist/remedy-program-postgres.d.ts.map +1 -0
- package/dist/remedy-program-postgres.js +291 -0
- package/dist/remedy-program-postgres.js.map +1 -0
- package/dist/remedy-program-receipt.d.ts +97 -0
- package/dist/remedy-program-receipt.d.ts.map +1 -0
- package/dist/remedy-program-receipt.js +817 -0
- package/dist/remedy-program-receipt.js.map +1 -0
- package/dist/remedy-program.d.ts +76 -0
- package/dist/remedy-program.d.ts.map +1 -0
- package/dist/remedy-program.js +1346 -0
- package/dist/remedy-program.js.map +1 -0
- package/dist/reports/art14.d.ts +101 -0
- package/dist/reports/art14.d.ts.map +1 -0
- package/dist/reports/art14.js +340 -0
- package/dist/reports/art14.js.map +1 -0
- package/dist/reports/assurance-package.d.ts +197 -0
- package/dist/reports/assurance-package.d.ts.map +1 -0
- package/dist/reports/assurance-package.js +313 -0
- package/dist/reports/assurance-package.js.map +1 -0
- package/dist/reports/auditor-workpaper.d.ts +194 -0
- package/dist/reports/auditor-workpaper.d.ts.map +1 -0
- package/dist/reports/auditor-workpaper.js +545 -0
- package/dist/reports/auditor-workpaper.js.map +1 -0
- package/dist/reports/external-verification.d.ts +76 -0
- package/dist/reports/external-verification.d.ts.map +1 -0
- package/dist/reports/external-verification.js +209 -0
- package/dist/reports/external-verification.js.map +1 -0
- package/dist/reports/reperform.d.ts +122 -0
- package/dist/reports/reperform.d.ts.map +1 -0
- package/dist/reports/reperform.js +432 -0
- package/dist/reports/reperform.js.map +1 -0
- package/dist/reports/underwriter.d.ts +127 -0
- package/dist/reports/underwriter.d.ts.map +1 -0
- package/dist/reports/underwriter.js +348 -0
- package/dist/reports/underwriter.js.map +1 -0
- package/dist/retention.d.ts +88 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +90 -0
- package/dist/retention.js.map +1 -0
- package/dist/roster.d.ts +113 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +261 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime-monitor.d.ts +132 -0
- package/dist/runtime-monitor.d.ts.map +1 -0
- package/dist/runtime-monitor.js +197 -0
- package/dist/runtime-monitor.js.map +1 -0
- package/dist/settlement.d.ts +68 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +306 -0
- package/dist/settlement.js.map +1 -0
- package/dist/siem.d.ts +261 -0
- package/dist/siem.d.ts.map +1 -0
- package/dist/siem.js +247 -0
- package/dist/siem.js.map +1 -0
- package/dist/store-postgres.d.ts +107 -0
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/store-postgres.js +152 -0
- package/dist/store-postgres.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +202 -0
- package/dist/store.js.map +1 -0
- package/dist/strict-json.d.ts +14 -0
- package/dist/strict-json.d.ts.map +1 -0
- package/dist/strict-json.js +132 -0
- package/dist/strict-json.js.map +1 -0
- package/dist/trust-program-adapters.d.ts +122 -0
- package/dist/trust-program-adapters.d.ts.map +1 -0
- package/dist/trust-program-adapters.js +802 -0
- package/dist/trust-program-adapters.js.map +1 -0
- package/dist/trust-program-postgres.d.ts +41 -0
- package/dist/trust-program-postgres.d.ts.map +1 -0
- package/dist/trust-program-postgres.js +346 -0
- package/dist/trust-program-postgres.js.map +1 -0
- package/dist/trust-program-revocation.d.ts +206 -0
- package/dist/trust-program-revocation.d.ts.map +1 -0
- package/dist/trust-program-revocation.js +600 -0
- package/dist/trust-program-revocation.js.map +1 -0
- package/dist/trust-program.d.ts +197 -0
- package/dist/trust-program.d.ts.map +1 -0
- package/dist/trust-program.js +1351 -0
- package/dist/trust-program.js.map +1 -0
- package/dist/witness-postgres.d.ts +43 -0
- package/dist/witness-postgres.d.ts.map +1 -0
- package/dist/witness-postgres.js +92 -0
- package/dist/witness-postgres.js.map +1 -0
- package/dist/zk-range-proof.d.ts +78 -0
- package/dist/zk-range-proof.d.ts.map +1 -0
- package/dist/zk-range-proof.js +228 -0
- package/dist/zk-range-proof.js.map +1 -0
- package/eg1-conformance.js +3 -404
- package/enterprise.js +3 -180
- package/ep-assure.mjs +1 -0
- package/evidence-postgres.js +3 -356
- package/evidence.js +4 -360
- package/execution-binding.js +3 -212
- package/formal-runtime-map.js +4 -0
- package/index.js +4 -1249
- package/key-registry.js +3 -134
- package/mcp.js +3 -109
- package/metering.js +3 -226
- package/metrics.js +3 -231
- package/network-witness.js +3 -499
- package/package.json +31 -2
- package/receipt-program.js +4 -0
- package/reliance-kernel.js +3 -112
- package/reliance-packet.js +3 -175
- package/remedy-program-postgres.js +4 -0
- package/remedy-program-receipt.js +4 -0
- package/remedy-program.js +4 -0
- package/reports/art14.js +0 -0
- package/reports/assurance-package.js +2 -312
- package/reports/auditor-workpaper.js +3 -537
- package/reports/external-verification.js +3 -222
- package/reports/reperform.js +3 -424
- package/reports/underwriter.js +3 -339
- package/retention.js +3 -84
- package/roster.js +3 -264
- package/runtime-monitor.js +4 -0
- package/settlement.js +3 -299
- package/siem.js +3 -235
- package/src/action-control-manifest.ts +424 -0
- package/src/action-escrow-custodian.ts +427 -0
- package/src/action-escrow-evidence.ts +1178 -0
- package/src/action-escrow-package.ts +1821 -0
- package/src/action-escrow-postgres.ts +366 -0
- package/src/action-escrow-state.ts +498 -0
- package/src/action-escrow-verifiers.ts +484 -0
- package/src/action-escrow.ts +3039 -0
- package/src/action-packs.ts +170 -0
- package/src/adapters/_kit.ts +117 -0
- package/src/adapters/aws.ts +142 -0
- package/src/adapters/cloudflare.ts +78 -0
- package/src/adapters/gcp.ts +71 -0
- package/src/adapters/github.ts +110 -0
- package/src/adapters/jira.ts +56 -0
- package/src/adapters/k8s.ts +71 -0
- package/src/adapters/linear.ts +56 -0
- package/src/adapters/salesforce.ts +56 -0
- package/src/adapters/stripe.ts +82 -0
- package/src/adapters/supabase.ts +122 -0
- package/src/adapters/terraform.ts +60 -0
- package/src/adapters/vercel.ts +85 -0
- package/src/aec-execution.ts +354 -0
- package/src/breakglass.ts +647 -0
- package/src/capability-receipt.ts +1258 -0
- package/src/cf1-conformance.ts +120 -0
- package/src/challenge-store.ts +70 -0
- package/src/control-plane.ts +374 -0
- package/src/coverage.ts +832 -0
- package/src/deployment-attestation.ts +259 -0
- package/src/eg1-conformance.ts +471 -0
- package/src/enterprise.ts +195 -0
- package/src/evidence-postgres.ts +374 -0
- package/src/evidence.ts +367 -0
- package/src/execution-binding.ts +236 -0
- package/src/formal-runtime-map.ts +24 -0
- package/src/index.ts +2122 -0
- package/src/key-registry.ts +150 -0
- package/src/mcp.ts +120 -0
- package/src/metering.ts +237 -0
- package/src/metrics.ts +232 -0
- package/src/network-witness.ts +585 -0
- package/src/protocol-state.ts +143 -0
- package/src/protocol-state.typecheck.ts +94 -0
- package/src/receipt-program.ts +1105 -0
- package/src/reliance-kernel.ts +119 -0
- package/src/reliance-packet.ts +206 -0
- package/src/remedy-program-postgres.ts +367 -0
- package/src/remedy-program-receipt.ts +891 -0
- package/src/remedy-program.ts +1388 -0
- package/src/reports/art14.ts +361 -0
- package/src/reports/assurance-package.ts +330 -0
- package/src/reports/auditor-workpaper.ts +558 -0
- package/src/reports/external-verification.ts +232 -0
- package/src/reports/reperform.ts +441 -0
- package/src/reports/underwriter.ts +356 -0
- package/src/retention.ts +100 -0
- package/src/roster.ts +273 -0
- package/src/runtime-monitor.ts +217 -0
- package/src/settlement.ts +313 -0
- package/src/siem.ts +247 -0
- package/src/store-postgres.ts +167 -0
- package/src/store.ts +214 -0
- package/src/strict-json.ts +115 -0
- package/src/trust-program-adapters.ts +847 -0
- package/src/trust-program-postgres.ts +429 -0
- package/src/trust-program-revocation.ts +751 -0
- package/src/trust-program.ts +1460 -0
- package/src/witness-postgres.ts +106 -0
- package/src/zk-range-proof.ts +250 -0
- package/store-postgres.js +3 -161
- package/store.js +4 -198
- package/strict-json.js +3 -102
- package/trust-program-adapters.js +4 -0
- package/trust-program-postgres.js +4 -0
- package/trust-program-revocation.js +4 -0
- package/trust-program.js +4 -0
- package/witness-postgres.js +3 -96
- package/zk-range-proof.js +4 -0
|
@@ -1,338 +1,4 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
* Each transition compares the exact prior serialized snapshot and installs
|
|
6
|
-
* the exact replacement in one SQL statement. Backend errors propagate; the
|
|
7
|
-
* state machine must refuse rather than treating an outage as absent state.
|
|
8
|
-
*/
|
|
9
|
-
import crypto from 'node:crypto';
|
|
10
|
-
import { strictJsonGate } from './strict-json.js';
|
|
11
|
-
|
|
12
|
-
export const ACTION_ESCROW_PG_STORE_VERSION = 'EP-ACTION-ESCROW-PG-STORE-v1';
|
|
13
|
-
export const ACTION_ESCROW_STATE_TABLE = 'ep_action_escrow_state';
|
|
14
|
-
export const ACTION_ESCROW_EVENT_TABLE = 'ep_action_escrow_state_events';
|
|
15
|
-
export const ACTION_ESCROW_MAX_STATE_BYTES = 4 * 1024 * 1024;
|
|
16
|
-
|
|
17
|
-
export const ACTION_ESCROW_STATE_DDL = `CREATE TABLE IF NOT EXISTS ${ACTION_ESCROW_STATE_TABLE} (
|
|
18
|
-
agreement_key TEXT PRIMARY KEY,
|
|
19
|
-
revision BIGINT NOT NULL CHECK (revision >= 0),
|
|
20
|
-
record_json TEXT NOT NULL,
|
|
21
|
-
updated_at BIGINT NOT NULL,
|
|
22
|
-
CHECK (octet_length(record_json) <= ${ACTION_ESCROW_MAX_STATE_BYTES})
|
|
23
|
-
);
|
|
24
|
-
CREATE TABLE IF NOT EXISTS ${ACTION_ESCROW_EVENT_TABLE} (
|
|
25
|
-
agreement_key TEXT NOT NULL,
|
|
26
|
-
revision BIGINT NOT NULL CHECK (revision >= 0),
|
|
27
|
-
previous_revision BIGINT NULL,
|
|
28
|
-
record_json TEXT NOT NULL,
|
|
29
|
-
record_digest TEXT NOT NULL CHECK (record_digest ~ '^sha256:[0-9a-f]{64}$'),
|
|
30
|
-
recorded_at BIGINT NOT NULL,
|
|
31
|
-
PRIMARY KEY (agreement_key, revision),
|
|
32
|
-
CHECK (
|
|
33
|
-
(revision = 0 AND previous_revision IS NULL)
|
|
34
|
-
OR previous_revision = revision - 1
|
|
35
|
-
),
|
|
36
|
-
CHECK (octet_length(record_json) <= ${ACTION_ESCROW_MAX_STATE_BYTES})
|
|
37
|
-
);
|
|
38
|
-
REVOKE ALL ON ${ACTION_ESCROW_STATE_TABLE} FROM PUBLIC;
|
|
39
|
-
REVOKE ALL ON ${ACTION_ESCROW_EVENT_TABLE} FROM PUBLIC;
|
|
40
|
-
REVOKE UPDATE, DELETE, TRUNCATE ON ${ACTION_ESCROW_EVENT_TABLE} FROM PUBLIC;`;
|
|
41
|
-
|
|
42
|
-
export function actionEscrowRuntimeGrantDdl(roleName) {
|
|
43
|
-
if (typeof roleName !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]{0,62}$/.test(roleName)) {
|
|
44
|
-
throw new TypeError('action-escrow runtime role name is invalid');
|
|
45
|
-
}
|
|
46
|
-
const role = `"${roleName}"`;
|
|
47
|
-
return `REVOKE ALL ON ${ACTION_ESCROW_STATE_TABLE} FROM ${role};
|
|
48
|
-
REVOKE ALL ON ${ACTION_ESCROW_EVENT_TABLE} FROM ${role};
|
|
49
|
-
GRANT SELECT, INSERT, UPDATE ON ${ACTION_ESCROW_STATE_TABLE} TO ${role};
|
|
50
|
-
GRANT SELECT, INSERT ON ${ACTION_ESCROW_EVENT_TABLE} TO ${role};
|
|
51
|
-
REVOKE DELETE, TRUNCATE ON ${ACTION_ESCROW_STATE_TABLE} FROM ${role};
|
|
52
|
-
REVOKE UPDATE, DELETE, TRUNCATE ON ${ACTION_ESCROW_EVENT_TABLE} FROM ${role};`;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export const ACTION_ESCROW_STATE_SQL = Object.freeze({
|
|
56
|
-
health: `SELECT
|
|
57
|
-
to_regclass('public.${ACTION_ESCROW_STATE_TABLE}') IS NOT NULL AS table_ready,
|
|
58
|
-
to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}') IS NOT NULL AS event_table_ready,
|
|
59
|
-
CASE WHEN to_regclass('public.${ACTION_ESCROW_STATE_TABLE}') IS NULL THEN FALSE
|
|
60
|
-
ELSE has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_STATE_TABLE}'), 'SELECT')
|
|
61
|
-
AND has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_STATE_TABLE}'), 'INSERT')
|
|
62
|
-
AND has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_STATE_TABLE}'), 'UPDATE') END AS can_use,
|
|
63
|
-
CASE WHEN to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}') IS NULL THEN FALSE
|
|
64
|
-
ELSE has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}'), 'SELECT')
|
|
65
|
-
AND has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}'), 'INSERT') END AS can_append_history,
|
|
66
|
-
CASE WHEN to_regclass('public.${ACTION_ESCROW_STATE_TABLE}') IS NULL THEN TRUE
|
|
67
|
-
ELSE (SELECT relowner = (SELECT oid FROM pg_roles WHERE rolname = current_user)
|
|
68
|
-
FROM pg_class WHERE oid = to_regclass('public.${ACTION_ESCROW_STATE_TABLE}')) END AS owns_state_table,
|
|
69
|
-
CASE WHEN to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}') IS NULL THEN TRUE
|
|
70
|
-
ELSE (SELECT relowner = (SELECT oid FROM pg_roles WHERE rolname = current_user)
|
|
71
|
-
FROM pg_class WHERE oid = to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}')) END AS owns_event_table,
|
|
72
|
-
CASE WHEN to_regclass('public.${ACTION_ESCROW_STATE_TABLE}') IS NULL THEN TRUE
|
|
73
|
-
ELSE has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_STATE_TABLE}'), 'DELETE')
|
|
74
|
-
OR has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_STATE_TABLE}'), 'TRUNCATE') END AS can_destroy_state,
|
|
75
|
-
CASE WHEN to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}') IS NULL THEN TRUE
|
|
76
|
-
ELSE has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}'), 'UPDATE')
|
|
77
|
-
OR has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}'), 'DELETE')
|
|
78
|
-
OR has_table_privilege(current_user, to_regclass('public.${ACTION_ESCROW_EVENT_TABLE}'), 'TRUNCATE') END AS can_mutate_history`,
|
|
79
|
-
read: `SELECT revision, record_json FROM ${ACTION_ESCROW_STATE_TABLE} WHERE agreement_key = $1`,
|
|
80
|
-
history: `SELECT revision, previous_revision, record_json, record_digest, recorded_at
|
|
81
|
-
FROM ${ACTION_ESCROW_EVENT_TABLE}
|
|
82
|
-
WHERE agreement_key = $1
|
|
83
|
-
ORDER BY revision ASC`,
|
|
84
|
-
create: `WITH installed AS (
|
|
85
|
-
INSERT INTO ${ACTION_ESCROW_STATE_TABLE} (agreement_key, revision, record_json, updated_at)
|
|
86
|
-
VALUES ($1, 0, $2, $3)
|
|
87
|
-
ON CONFLICT (agreement_key) DO NOTHING
|
|
88
|
-
RETURNING agreement_key, revision, record_json, updated_at
|
|
89
|
-
), journaled AS (
|
|
90
|
-
INSERT INTO ${ACTION_ESCROW_EVENT_TABLE}
|
|
91
|
-
(agreement_key, revision, previous_revision, record_json, record_digest, recorded_at)
|
|
92
|
-
SELECT agreement_key, revision, NULL, record_json, $4, updated_at
|
|
93
|
-
FROM installed
|
|
94
|
-
RETURNING revision
|
|
95
|
-
)
|
|
96
|
-
SELECT revision FROM journaled`,
|
|
97
|
-
compareAndSwap: `WITH installed AS (
|
|
98
|
-
UPDATE ${ACTION_ESCROW_STATE_TABLE}
|
|
99
|
-
SET revision = $3, record_json = $4, updated_at = $5
|
|
100
|
-
WHERE agreement_key = $1 AND revision = $2 AND updated_at <= $5
|
|
101
|
-
RETURNING agreement_key, revision, record_json, updated_at
|
|
102
|
-
), journaled AS (
|
|
103
|
-
INSERT INTO ${ACTION_ESCROW_EVENT_TABLE}
|
|
104
|
-
(agreement_key, revision, previous_revision, record_json, record_digest, recorded_at)
|
|
105
|
-
SELECT agreement_key, revision, $2, record_json, $6, updated_at
|
|
106
|
-
FROM installed
|
|
107
|
-
RETURNING revision
|
|
108
|
-
)
|
|
109
|
-
SELECT revision FROM journaled`,
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
function validKey(value) {
|
|
113
|
-
return typeof value === 'string'
|
|
114
|
-
&& value.length >= 1
|
|
115
|
-
&& value.length <= 512
|
|
116
|
-
&& !/[\u0000-\u001f\u007f]/.test(value);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function parsedState(value) {
|
|
120
|
-
if (typeof value !== 'string'
|
|
121
|
-
|| Buffer.byteLength(value, 'utf8') > ACTION_ESCROW_MAX_STATE_BYTES
|
|
122
|
-
|| !strictJsonGate(value).ok) {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
try {
|
|
126
|
-
const parsed = JSON.parse(value);
|
|
127
|
-
return parsed !== null
|
|
128
|
-
&& typeof parsed === 'object'
|
|
129
|
-
&& !Array.isArray(parsed)
|
|
130
|
-
&& Object.getPrototypeOf(parsed) === Object.prototype
|
|
131
|
-
? parsed
|
|
132
|
-
: null;
|
|
133
|
-
} catch {
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function recordDigest(value) {
|
|
139
|
-
return `sha256:${crypto.createHash('sha256').update(value, 'utf8').digest('hex')}`;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function assertResult(result, operation) {
|
|
143
|
-
if (!result || typeof result.rowCount !== 'number' || !Number.isSafeInteger(result.rowCount)
|
|
144
|
-
|| result.rowCount < 0) {
|
|
145
|
-
throw new Error(`${operation}: malformed Postgres result`);
|
|
146
|
-
}
|
|
147
|
-
return result;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* @param {object} options
|
|
152
|
-
* @param {(text:string, params:any[]) => Promise<{rowCount:number,rows?:any[]}>} options.query
|
|
153
|
-
* @param {number|Function} [options.now=Date.now]
|
|
154
|
-
*/
|
|
155
|
-
export function createActionEscrowPostgresStore({
|
|
156
|
-
query,
|
|
157
|
-
now = Date.now,
|
|
158
|
-
} = {}) {
|
|
159
|
-
if (typeof query !== 'function') {
|
|
160
|
-
throw new TypeError('createActionEscrowPostgresStore requires an async pg-style query function');
|
|
161
|
-
}
|
|
162
|
-
let lastNow = Number.NEGATIVE_INFINITY;
|
|
163
|
-
|
|
164
|
-
function nowMs() {
|
|
165
|
-
const value = typeof now === 'function' ? now() : now;
|
|
166
|
-
if (!Number.isSafeInteger(value) || value < 0) {
|
|
167
|
-
throw new Error('action-escrow store clock must be a non-negative safe-integer epoch millisecond');
|
|
168
|
-
}
|
|
169
|
-
if (value < lastNow) {
|
|
170
|
-
throw new Error(`action-escrow store clock regression refused: ${value} < ${lastNow}`);
|
|
171
|
-
}
|
|
172
|
-
lastNow = value;
|
|
173
|
-
return value;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function assertKey(key) {
|
|
177
|
-
if (!validKey(key)) throw new TypeError('action-escrow agreement key is invalid');
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function assertState(value, revision) {
|
|
181
|
-
const parsed = parsedState(value);
|
|
182
|
-
if (!parsed) {
|
|
183
|
-
throw new TypeError('action-escrow state must be bounded strict JSON text');
|
|
184
|
-
}
|
|
185
|
-
if (!Number.isSafeInteger(parsed.revision)
|
|
186
|
-
|| parsed.revision < 0
|
|
187
|
-
|| parsed.revision !== revision) {
|
|
188
|
-
throw new TypeError('action-escrow state revision must match the CAS revision');
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
async function loadHistory(key) {
|
|
193
|
-
const result = assertResult(
|
|
194
|
-
await query(ACTION_ESCROW_STATE_SQL.history, [key]),
|
|
195
|
-
'action-escrow history',
|
|
196
|
-
);
|
|
197
|
-
if (!Array.isArray(result.rows) || result.rows.length !== result.rowCount) {
|
|
198
|
-
throw new Error('action-escrow history: malformed Postgres result');
|
|
199
|
-
}
|
|
200
|
-
let previousRecordedAt = Number.NEGATIVE_INFINITY;
|
|
201
|
-
const history = result.rows.map((row, index) => {
|
|
202
|
-
const revision = Number(row?.revision);
|
|
203
|
-
const previousRevision = row?.previous_revision === null
|
|
204
|
-
? null
|
|
205
|
-
: Number(row?.previous_revision);
|
|
206
|
-
const recordedAt = Number(row?.recorded_at);
|
|
207
|
-
if (!Number.isSafeInteger(revision)
|
|
208
|
-
|| revision !== index
|
|
209
|
-
|| previousRevision !== (revision === 0 ? null : revision - 1)
|
|
210
|
-
|| !Number.isSafeInteger(recordedAt)
|
|
211
|
-
|| recordedAt < 0
|
|
212
|
-
|| recordedAt < previousRecordedAt
|
|
213
|
-
|| !parsedState(row?.record_json)
|
|
214
|
-
|| row?.record_digest !== recordDigest(row.record_json)) {
|
|
215
|
-
throw new Error('action-escrow history: invalid or non-contiguous event');
|
|
216
|
-
}
|
|
217
|
-
assertState(row.record_json, revision);
|
|
218
|
-
previousRecordedAt = recordedAt;
|
|
219
|
-
return Object.freeze({
|
|
220
|
-
revision,
|
|
221
|
-
previous_revision: previousRevision,
|
|
222
|
-
record_json: row.record_json,
|
|
223
|
-
record_digest: row.record_digest,
|
|
224
|
-
recorded_at: recordedAt,
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
return Object.freeze(history);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
async function read(key) {
|
|
231
|
-
assertKey(key);
|
|
232
|
-
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
233
|
-
const result = assertResult(
|
|
234
|
-
await query(ACTION_ESCROW_STATE_SQL.read, [key]),
|
|
235
|
-
'action-escrow read',
|
|
236
|
-
);
|
|
237
|
-
if (result.rowCount > 1
|
|
238
|
-
|| !Array.isArray(result.rows)
|
|
239
|
-
|| result.rows.length !== result.rowCount) {
|
|
240
|
-
throw new Error('action-escrow read: database returned malformed or ambiguous state');
|
|
241
|
-
}
|
|
242
|
-
const history = await loadHistory(key);
|
|
243
|
-
if (result.rowCount === 0) {
|
|
244
|
-
if (history.length === 0) return null;
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
if (!Number.isSafeInteger(Number(result.rows[0]?.revision))
|
|
248
|
-
|| Number(result.rows[0].revision) < 0
|
|
249
|
-
|| !parsedState(result.rows[0]?.record_json)) {
|
|
250
|
-
throw new Error('action-escrow read: database returned malformed or ambiguous state');
|
|
251
|
-
}
|
|
252
|
-
const revision = Number(result.rows[0].revision);
|
|
253
|
-
assertState(result.rows[0].record_json, revision);
|
|
254
|
-
const tail = history.at(-1);
|
|
255
|
-
if (tail?.revision === revision
|
|
256
|
-
&& tail.record_json === result.rows[0].record_json
|
|
257
|
-
&& tail.record_digest === recordDigest(result.rows[0].record_json)) {
|
|
258
|
-
return { revision, value: result.rows[0].record_json };
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
throw new Error('action-escrow read: state and append-only journal do not agree');
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
return Object.freeze({
|
|
265
|
-
version: ACTION_ESCROW_PG_STORE_VERSION,
|
|
266
|
-
durable: true,
|
|
267
|
-
atomicExpectedRevisionCas: true,
|
|
268
|
-
linearizableReads: true,
|
|
269
|
-
monotonicRevisions: true,
|
|
270
|
-
nonExpiring: true,
|
|
271
|
-
maxStateBytes: ACTION_ESCROW_MAX_STATE_BYTES,
|
|
272
|
-
async health() {
|
|
273
|
-
const result = assertResult(
|
|
274
|
-
await query(ACTION_ESCROW_STATE_SQL.health, []),
|
|
275
|
-
'action-escrow health',
|
|
276
|
-
);
|
|
277
|
-
if (result.rowCount !== 1 || !Array.isArray(result.rows) || result.rows.length !== 1) {
|
|
278
|
-
throw new Error('action-escrow health: malformed Postgres result');
|
|
279
|
-
}
|
|
280
|
-
return {
|
|
281
|
-
ok: result.rows[0].table_ready === true
|
|
282
|
-
&& result.rows[0].event_table_ready === true
|
|
283
|
-
&& result.rows[0].can_use === true
|
|
284
|
-
&& result.rows[0].can_append_history === true
|
|
285
|
-
&& result.rows[0].owns_state_table === false
|
|
286
|
-
&& result.rows[0].owns_event_table === false
|
|
287
|
-
&& result.rows[0].can_destroy_state === false
|
|
288
|
-
&& result.rows[0].can_mutate_history === false,
|
|
289
|
-
version: ACTION_ESCROW_PG_STORE_VERSION,
|
|
290
|
-
};
|
|
291
|
-
},
|
|
292
|
-
read,
|
|
293
|
-
async readHistory(key) {
|
|
294
|
-
assertKey(key);
|
|
295
|
-
return loadHistory(key);
|
|
296
|
-
},
|
|
297
|
-
async compareAndSwap(key, expectedRevision, value) {
|
|
298
|
-
assertKey(key);
|
|
299
|
-
if (expectedRevision !== null
|
|
300
|
-
&& (!Number.isSafeInteger(expectedRevision) || expectedRevision < 0)) {
|
|
301
|
-
throw new TypeError('action-escrow expected revision is invalid');
|
|
302
|
-
}
|
|
303
|
-
const nextRevision = expectedRevision === null ? 0 : expectedRevision + 1;
|
|
304
|
-
assertState(value, nextRevision);
|
|
305
|
-
const sql = expectedRevision === null
|
|
306
|
-
? ACTION_ESCROW_STATE_SQL.create
|
|
307
|
-
: ACTION_ESCROW_STATE_SQL.compareAndSwap;
|
|
308
|
-
const params = expectedRevision === null
|
|
309
|
-
? [key, value, nowMs(), recordDigest(value)]
|
|
310
|
-
: [key, expectedRevision, nextRevision, value, nowMs(), recordDigest(value)];
|
|
311
|
-
const result = assertResult(
|
|
312
|
-
await query(sql, params),
|
|
313
|
-
'action-escrow compareAndSwap',
|
|
314
|
-
);
|
|
315
|
-
if (result.rowCount > 1) {
|
|
316
|
-
throw new Error('action-escrow compareAndSwap affected multiple rows');
|
|
317
|
-
}
|
|
318
|
-
if (result.rowCount === 0) return { applied: false, revision: null };
|
|
319
|
-
if (!Array.isArray(result.rows)
|
|
320
|
-
|| result.rows.length !== 1
|
|
321
|
-
|| Number(result.rows[0]?.revision) !== nextRevision) {
|
|
322
|
-
throw new Error('action-escrow compareAndSwap returned a malformed revision');
|
|
323
|
-
}
|
|
324
|
-
return { applied: true, revision: nextRevision };
|
|
325
|
-
},
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
export default {
|
|
330
|
-
ACTION_ESCROW_PG_STORE_VERSION,
|
|
331
|
-
ACTION_ESCROW_STATE_TABLE,
|
|
332
|
-
ACTION_ESCROW_EVENT_TABLE,
|
|
333
|
-
ACTION_ESCROW_MAX_STATE_BYTES,
|
|
334
|
-
ACTION_ESCROW_STATE_DDL,
|
|
335
|
-
actionEscrowRuntimeGrantDdl,
|
|
336
|
-
ACTION_ESCROW_STATE_SQL,
|
|
337
|
-
createActionEscrowPostgresStore,
|
|
338
|
-
};
|
|
2
|
+
// Compatibility entry point for the TypeScript action-escrow-postgres module.
|
|
3
|
+
export * from './dist/action-escrow-postgres.js';
|
|
4
|
+
export { default } from './dist/action-escrow-postgres.js';
|