@adcp/sdk 15.9.1 → 16.0.0-beta.2
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/bin/adcp-identity.js +74 -0
- package/bin/adcp.js +2 -0
- package/dist/lib/adapters/keyed-account-backend.d.mts +37 -0
- package/dist/lib/adapters/keyed-account-backend.d.ts +37 -0
- package/dist/lib/adapters/keyed-account-backend.js +121 -0
- package/dist/lib/adapters/keyed-account-backend.mjs +94 -0
- package/dist/lib/adapters/keyed-account-store.d.mts +28 -0
- package/dist/lib/adapters/keyed-account-store.d.ts +28 -0
- package/dist/lib/adapters/keyed-account-store.js +227 -0
- package/dist/lib/adapters/keyed-account-store.mjs +203 -0
- package/dist/lib/core/SingleAgentClient.d.mts +25 -2
- package/dist/lib/core/SingleAgentClient.d.ts +25 -2
- package/dist/lib/core/SingleAgentClient.js +280 -62
- package/dist/lib/core/SingleAgentClient.mjs +282 -57
- package/dist/lib/core/TaskExecutor.d.mts +6 -0
- package/dist/lib/core/TaskExecutor.d.ts +6 -0
- package/dist/lib/core/TaskExecutor.js +66 -5
- package/dist/lib/core/TaskExecutor.mjs +71 -5
- package/dist/lib/core/postgres-webhook-registration-store.js +32 -5
- package/dist/lib/core/postgres-webhook-registration-store.mjs +32 -5
- package/dist/lib/core/redis-webhook-registration-store.js +23 -1
- package/dist/lib/core/redis-webhook-registration-store.mjs +23 -1
- package/dist/lib/core/webhook-registration.d.mts +7 -1
- package/dist/lib/core/webhook-registration.d.ts +7 -1
- package/dist/lib/core/webhook-registration.js +24 -2
- package/dist/lib/core/webhook-registration.mjs +23 -2
- package/dist/lib/identity-3.3/generated-compat.d.mts +34 -0
- package/dist/lib/identity-3.3/generated-compat.d.ts +34 -0
- package/dist/lib/identity-3.3/generated-compat.js +16 -0
- package/dist/lib/identity-3.3/generated-compat.mjs +0 -0
- package/dist/lib/identity-3.3/index.d.mts +10 -0
- package/dist/lib/identity-3.3/index.d.ts +10 -0
- package/dist/lib/identity-3.3/index.js +79 -0
- package/dist/lib/identity-3.3/index.mjs +50 -0
- package/dist/lib/identity-3.3/lifecycle.d.mts +125 -0
- package/dist/lib/identity-3.3/lifecycle.d.ts +125 -0
- package/dist/lib/identity-3.3/lifecycle.js +294 -0
- package/dist/lib/identity-3.3/lifecycle.mjs +272 -0
- package/dist/lib/identity-3.3/revocation.d.mts +86 -0
- package/dist/lib/identity-3.3/revocation.d.ts +86 -0
- package/dist/lib/identity-3.3/revocation.js +308 -0
- package/dist/lib/identity-3.3/revocation.mjs +286 -0
- package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
- package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
- package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
- package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
- package/dist/lib/identity-3.3/server.d.mts +46 -0
- package/dist/lib/identity-3.3/server.d.ts +46 -0
- package/dist/lib/identity-3.3/server.js +279 -0
- package/dist/lib/identity-3.3/server.mjs +260 -0
- package/dist/lib/identity-3.3/store.d.mts +24 -0
- package/dist/lib/identity-3.3/store.d.ts +24 -0
- package/dist/lib/identity-3.3/store.js +191 -0
- package/dist/lib/identity-3.3/store.mjs +169 -0
- package/dist/lib/identity-3.3/trust.d.mts +155 -0
- package/dist/lib/identity-3.3/trust.d.ts +155 -0
- package/dist/lib/identity-3.3/trust.js +383 -0
- package/dist/lib/identity-3.3/trust.mjs +342 -0
- package/dist/lib/identity-3.3/types.d.mts +155 -0
- package/dist/lib/identity-3.3/types.d.ts +155 -0
- package/dist/lib/identity-3.3/types.js +16 -0
- package/dist/lib/identity-3.3/types.mjs +0 -0
- package/dist/lib/identity-3.3/validation.d.mts +2 -0
- package/dist/lib/identity-3.3/validation.d.ts +2 -0
- package/dist/lib/identity-3.3/validation.js +125 -0
- package/dist/lib/identity-3.3/validation.mjs +91 -0
- package/dist/lib/index.d.mts +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.js +2 -0
- package/dist/lib/index.mjs +2 -0
- package/dist/lib/protocols/index.d.mts +1 -1
- package/dist/lib/protocols/index.d.ts +1 -1
- package/dist/lib/protocols/index.js +2 -2
- package/dist/lib/protocols/index.mjs +2 -2
- package/dist/lib/reporting/azure/index.d.mts +5 -0
- package/dist/lib/reporting/azure/index.d.ts +5 -0
- package/dist/lib/reporting/azure/index.js +26 -7
- package/dist/lib/reporting/azure/index.mjs +26 -7
- package/dist/lib/reporting/bigquery/index.d.mts +39 -5
- package/dist/lib/reporting/bigquery/index.d.ts +39 -5
- package/dist/lib/reporting/bigquery/index.js +26 -20
- package/dist/lib/reporting/bigquery/index.mjs +26 -20
- package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
- package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
- package/dist/lib/reporting/gcs/errors.d.mts +6 -0
- package/dist/lib/reporting/gcs/errors.d.ts +6 -0
- package/dist/lib/reporting/gcs/fence.d.mts +5 -0
- package/dist/lib/reporting/gcs/fence.d.ts +5 -0
- package/dist/lib/reporting/gcs/index.d.mts +9 -0
- package/dist/lib/reporting/gcs/index.d.ts +9 -0
- package/dist/lib/reporting/gcs/reader.d.mts +27 -3
- package/dist/lib/reporting/gcs/reader.d.ts +27 -3
- package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
- package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
- package/dist/lib/reporting/gcs/row-provider.js +34 -14
- package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
- package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
- package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
- package/dist/lib/reporting/ledger/index.d.mts +11 -0
- package/dist/lib/reporting/ledger/index.d.ts +11 -0
- package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
- package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
- package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
- package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
- package/dist/lib/reporting/ledger/managed.d.mts +86 -6
- package/dist/lib/reporting/ledger/managed.d.ts +86 -6
- package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
- package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
- package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
- package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
- package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
- package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
- package/dist/lib/reporting/ledger/postgres.js +43 -27
- package/dist/lib/reporting/ledger/postgres.mjs +43 -27
- package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
- package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
- package/dist/lib/reporting/ledger/row-encoding.js +8 -4
- package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
- package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
- package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
- package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
- package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
- package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
- package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
- package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
- package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
- package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
- package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
- package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
- package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
- package/dist/lib/reporting/ledger/row-storage.js +126 -66
- package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
- package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
- package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
- package/dist/lib/reporting/ledger/schedule.js +24 -0
- package/dist/lib/reporting/ledger/schedule.mjs +23 -0
- package/dist/lib/reporting/ledger/types.d.mts +23 -1
- package/dist/lib/reporting/ledger/types.d.ts +23 -1
- package/dist/lib/reporting/s3/index.d.mts +5 -0
- package/dist/lib/reporting/s3/index.d.ts +5 -0
- package/dist/lib/reporting/s3/index.js +37 -14
- package/dist/lib/reporting/s3/index.mjs +37 -14
- package/dist/lib/reporting/service/index.d.mts +10 -0
- package/dist/lib/reporting/service/index.d.ts +10 -0
- package/dist/lib/reporting/service/maintenance.d.mts +28 -2
- package/dist/lib/reporting/service/maintenance.d.ts +28 -2
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/account-sync-contract.d.mts +14 -0
- package/dist/lib/server/account-sync-contract.d.ts +14 -0
- package/dist/lib/server/account-sync-contract.js +225 -0
- package/dist/lib/server/account-sync-contract.mjs +197 -0
- package/dist/lib/server/adcp-server.js +5 -0
- package/dist/lib/server/adcp-server.mjs +10 -0
- package/dist/lib/server/auth-signature.d.mts +15 -0
- package/dist/lib/server/auth-signature.d.ts +15 -0
- package/dist/lib/server/auth-signature.js +72 -2
- package/dist/lib/server/auth-signature.mjs +81 -2
- package/dist/lib/server/auth.d.mts +6 -0
- package/dist/lib/server/auth.d.ts +6 -0
- package/dist/lib/server/auth.js +6 -0
- package/dist/lib/server/auth.mjs +6 -0
- package/dist/lib/server/create-adcp-server.d.mts +19 -5
- package/dist/lib/server/create-adcp-server.d.ts +19 -5
- package/dist/lib/server/create-adcp-server.js +259 -19
- package/dist/lib/server/create-adcp-server.mjs +266 -10
- package/dist/lib/server/decisioning/account.d.mts +24 -1
- package/dist/lib/server/decisioning/account.d.ts +24 -1
- package/dist/lib/server/decisioning/index.d.mts +1 -1
- package/dist/lib/server/decisioning/index.d.ts +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
- package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
- package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
- package/dist/lib/server/index.d.mts +2 -0
- package/dist/lib/server/index.d.ts +2 -0
- package/dist/lib/server/index.js +12 -0
- package/dist/lib/server/index.mjs +12 -0
- package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
- package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
- package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
- package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
- package/dist/lib/server/principal/types.d.mts +1 -1
- package/dist/lib/server/principal/types.d.ts +1 -1
- package/dist/lib/server/serve.js +5 -0
- package/dist/lib/server/serve.mjs +5 -0
- package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
- package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
- package/dist/lib/server/webhook-delivery/recovery.js +4 -0
- package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
- package/dist/lib/server/webhook-emitter.d.mts +10 -0
- package/dist/lib/server/webhook-emitter.d.ts +10 -0
- package/dist/lib/server/webhook-emitter.js +22 -0
- package/dist/lib/server/webhook-emitter.mjs +22 -0
- package/dist/lib/signing/agent-context.d.mts +0 -5
- package/dist/lib/signing/agent-context.d.ts +0 -5
- package/dist/lib/signing/agent-context.js +9 -1
- package/dist/lib/signing/agent-context.mjs +9 -1
- package/dist/lib/signing/agent-fetch.js +27 -2
- package/dist/lib/signing/agent-fetch.mjs +32 -2
- package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
- package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
- package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
- package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
- package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
- package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
- package/dist/lib/signing/agent-resolver/index.js +5 -0
- package/dist/lib/signing/agent-resolver/index.mjs +3 -0
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
- package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
- package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
- package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
- package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
- package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
- package/dist/lib/signing/brand-jwks.d.mts +2 -2
- package/dist/lib/signing/brand-jwks.d.ts +2 -2
- package/dist/lib/signing/brand-jwks.js +4 -4
- package/dist/lib/signing/brand-jwks.mjs +4 -4
- package/dist/lib/signing/client.d.mts +1 -0
- package/dist/lib/signing/client.d.ts +1 -0
- package/dist/lib/signing/client.js +5 -0
- package/dist/lib/signing/client.mjs +3 -0
- package/dist/lib/signing/crypto.js +8 -0
- package/dist/lib/signing/crypto.mjs +9 -1
- package/dist/lib/signing/fetch-async.js +1 -1
- package/dist/lib/signing/fetch-async.mjs +1 -1
- package/dist/lib/signing/fetch.js +1 -1
- package/dist/lib/signing/fetch.mjs +1 -1
- package/dist/lib/signing/jwks-https.d.mts +1 -1
- package/dist/lib/signing/jwks-https.d.ts +1 -1
- package/dist/lib/signing/jwks-https.js +1 -1
- package/dist/lib/signing/jwks-https.mjs +1 -1
- package/dist/lib/signing/jwks.d.mts +11 -3
- package/dist/lib/signing/jwks.d.ts +11 -3
- package/dist/lib/signing/jwks.js +1 -1
- package/dist/lib/signing/jwks.mjs +1 -1
- package/dist/lib/signing/middleware.js +9 -0
- package/dist/lib/signing/middleware.mjs +14 -0
- package/dist/lib/signing/parser.d.mts +9 -6
- package/dist/lib/signing/parser.d.ts +9 -6
- package/dist/lib/signing/parser.js +82 -64
- package/dist/lib/signing/parser.mjs +83 -65
- package/dist/lib/signing/revocation.d.mts +4 -1
- package/dist/lib/signing/revocation.d.ts +4 -1
- package/dist/lib/signing/revocation.js +36 -3
- package/dist/lib/signing/revocation.mjs +34 -2
- package/dist/lib/signing/server.d.mts +1 -1
- package/dist/lib/signing/server.d.ts +1 -1
- package/dist/lib/signing/server.js +4 -0
- package/dist/lib/signing/server.mjs +4 -0
- package/dist/lib/signing/types.d.mts +3 -0
- package/dist/lib/signing/types.d.ts +3 -0
- package/dist/lib/signing/verifier.js +1 -1
- package/dist/lib/signing/verifier.mjs +1 -1
- package/dist/lib/signing/web-bot-auth.d.mts +191 -0
- package/dist/lib/signing/web-bot-auth.d.ts +191 -0
- package/dist/lib/signing/web-bot-auth.js +837 -0
- package/dist/lib/signing/web-bot-auth.mjs +796 -0
- package/dist/lib/signing/webhook-verifier.js +1 -1
- package/dist/lib/signing/webhook-verifier.mjs +1 -1
- package/dist/lib/testing/client.d.mts +1 -4
- package/dist/lib/testing/client.d.ts +1 -4
- package/dist/lib/testing/client.js +141 -20
- package/dist/lib/testing/client.mjs +137 -19
- package/dist/lib/testing/compliance/comply.js +29 -10
- package/dist/lib/testing/compliance/comply.mjs +37 -11
- package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
- package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
- package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
- package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
- package/dist/lib/testing/storyboard/default-invariants.js +2 -0
- package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
- package/dist/lib/testing/storyboard/runner.js +23 -8
- package/dist/lib/testing/storyboard/runner.mjs +24 -8
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/types/adcp.d.mts +4 -0
- package/dist/lib/types/adcp.d.ts +4 -0
- package/dist/lib/types/schemas.generated.d.ts +6 -6
- package/dist/lib/utils/capabilities.d.mts +1 -0
- package/dist/lib/utils/capabilities.d.ts +1 -0
- package/dist/lib/utils/capabilities.js +5 -0
- package/dist/lib/utils/capabilities.mjs +5 -0
- package/dist/lib/v2/projection/catalog-snapshot.js +3 -1
- package/dist/lib/v2/projection/catalog-snapshot.mjs +3 -1
- package/dist/lib/v2/projection/creative-delivery.d.mts +34 -10
- package/dist/lib/v2/projection/creative-delivery.d.ts +34 -10
- package/dist/lib/v2/projection/creative-delivery.js +26 -10
- package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
- package/dist/lib/v2/projection/index.d.mts +1 -1
- package/dist/lib/v2/projection/index.d.ts +1 -1
- package/dist/lib/v2/projection/index.js +2 -0
- package/dist/lib/v2/projection/index.mjs +2 -0
- package/dist/lib/v2/projection/legacy-routes.d.mts +34 -2
- package/dist/lib/v2/projection/legacy-routes.d.ts +34 -2
- package/dist/lib/v2/projection/legacy-routes.js +35 -2
- package/dist/lib/v2/projection/legacy-routes.mjs +32 -2
- package/dist/lib/validation/schema-loader.d.mts +2 -0
- package/dist/lib/validation/schema-loader.d.ts +2 -0
- package/dist/lib/validation/schema-loader.js +43 -4
- package/dist/lib/validation/schema-loader.mjs +39 -3
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.mjs +3 -3
- package/docs/TYPE-SUMMARY.md +2 -2
- package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
- package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
- package/docs/guides/REPORTING-LEDGER.md +99 -29
- package/docs/guides/REPORTING-OPERATIONS.md +29 -13
- package/docs/guides/REPORTING-STABILITY.md +76 -0
- package/docs/guides/account-resolution.md +101 -0
- package/docs/llms.txt +3 -2
- package/docs/migration-12-to-13.md +15 -0
- package/docs/migration-14.x-rc-worksheet.md +4 -4
- package/docs/migration-agent-identity-3.3.md +494 -0
- package/docs/migration-agent-resolution-3.3.md +5 -0
- package/docs/migration-reporting-row-storage-alignment.md +137 -0
- package/examples/storyboards/account-sync-contract.yaml +57 -0
- package/package.json +17 -1
|
@@ -12,12 +12,22 @@ interface ReportingPgClient {
|
|
|
12
12
|
query<Row extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[]): Promise<ReportingPgResult<Row>>;
|
|
13
13
|
release(error?: Error): void;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
17
|
+
*/
|
|
15
18
|
export interface ReportingPgPool {
|
|
16
19
|
query<Row extends QueryResultRow = QueryResultRow>(text: string, values?: unknown[]): Promise<ReportingPgResult<Row>>;
|
|
17
20
|
connect(): Promise<ReportingPgClient>;
|
|
18
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
24
|
+
*/
|
|
19
25
|
export declare const REPORTING_LEDGER_MIGRATION: string;
|
|
20
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Constraint installed by {@link REPORTING_LEDGER_FINALITY_WRITER_FENCE_MIGRATION}.
|
|
28
|
+
*
|
|
29
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
30
|
+
*/
|
|
21
31
|
export declare const REPORTING_LEDGER_FINALITY_FENCE_CONSTRAINT = "adcp_reporting_transitions_finality_recorded";
|
|
22
32
|
/**
|
|
23
33
|
* Cutover migration that fences pre-SDK-14 writers out of the transition log.
|
|
@@ -39,8 +49,13 @@ export declare const REPORTING_LEDGER_FINALITY_FENCE_CONSTRAINT = "adcp_reportin
|
|
|
39
49
|
* multiply finality-only events, which is the intended trade: loud rejection
|
|
40
50
|
* beats a quietly broken invariant. Idempotent and re-runnable; it takes no lock
|
|
41
51
|
* once installed.
|
|
52
|
+
*
|
|
53
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
42
54
|
*/
|
|
43
55
|
export declare const REPORTING_LEDGER_FINALITY_WRITER_FENCE_MIGRATION: string;
|
|
56
|
+
/**
|
|
57
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
58
|
+
*/
|
|
44
59
|
export interface PostgresReportingLedgerStoreOptions {
|
|
45
60
|
/** Assert that the supplied PostgreSQL database/schema is isolated to this deployment. */
|
|
46
61
|
acknowledgeIsolatedDatabase?: boolean;
|
|
@@ -103,21 +118,38 @@ export interface PostgresReportingLedgerStoreOptions {
|
|
|
103
118
|
*/
|
|
104
119
|
changeFeed?: boolean;
|
|
105
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
123
|
+
*/
|
|
106
124
|
export declare class ReportingLedgerLeaseLostError extends Error {
|
|
107
125
|
constructor(message?: string);
|
|
108
126
|
}
|
|
109
|
-
/**
|
|
127
|
+
/**
|
|
128
|
+
* A planner or writer named a period whose ledger records were retired by retention.
|
|
129
|
+
*
|
|
130
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
131
|
+
*/
|
|
110
132
|
export declare class ReportingLedgerPeriodRetiredError extends Error {
|
|
111
133
|
constructor(message?: string);
|
|
112
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
137
|
+
*/
|
|
113
138
|
export declare class ReportingLedgerContinuityError extends Error {
|
|
114
139
|
constructor(message?: string);
|
|
115
140
|
}
|
|
116
|
-
/**
|
|
141
|
+
/**
|
|
142
|
+
* Bounded global cleanup for expired cursor snapshots and changes checkpoints.
|
|
143
|
+
*
|
|
144
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
145
|
+
*/
|
|
117
146
|
export declare function sweepExpiredReportingLedgerState(pool: Pick<ReportingPgPool, 'query'>, limit?: number): Promise<{
|
|
118
147
|
snapshotsDeleted: number;
|
|
119
148
|
checkpointsDeleted: number;
|
|
120
149
|
}>;
|
|
150
|
+
/**
|
|
151
|
+
* @experimental Reliable Reporting storage surface: breaking changes may ship in minor releases. See https://github.com/adcontextprotocol/adcp-client/blob/main/docs/guides/REPORTING-STABILITY.md
|
|
152
|
+
*/
|
|
121
153
|
export declare class PostgresReportingLedgerStore implements ReportingLedgerStore {
|
|
122
154
|
private readonly pool;
|
|
123
155
|
/**
|
|
@@ -151,9 +183,11 @@ export declare class PostgresReportingLedgerStore implements ReportingLedgerStor
|
|
|
151
183
|
/** Append one host change-feed row inside the caller's account-locked transaction. */
|
|
152
184
|
private appendChange;
|
|
153
185
|
/**
|
|
154
|
-
*
|
|
155
|
-
* `{revision_key}
|
|
156
|
-
*
|
|
186
|
+
* Defense in depth for snapshot compaction (see `compactSupersededSnapshots`): throws `INVALID_INPUT`
|
|
187
|
+
* if a writable object row binding's key template omits `{revision_key}`. Every such binding is
|
|
188
|
+
* already refused when the store is configured, so this only guards a configuration changed after
|
|
189
|
+
* construction; `readOnly` bindings are skipped. Called by `compactSupersededSnapshots` and by
|
|
190
|
+
* service construction when compaction is enabled.
|
|
157
191
|
*/
|
|
158
192
|
assertCompactionSafeRowBindings(): void;
|
|
159
193
|
/** Probe and register row storage when enabled. Safe to call repeatedly. */
|
|
@@ -475,9 +509,9 @@ export declare class PostgresReportingLedgerStore implements ReportingLedgerStor
|
|
|
475
509
|
/**
|
|
476
510
|
* Delete external row objects, skipping any object another row set still references.
|
|
477
511
|
*
|
|
478
|
-
*
|
|
479
|
-
*
|
|
480
|
-
*
|
|
512
|
+
* Object keys are unique per row set (every writable template includes `{revision_key}`), but header-only
|
|
513
|
+
* revisions share chunks within an obligation and rows written under an older template can name one
|
|
514
|
+
* object from several row sets. An object is therefore deleted only when no
|
|
481
515
|
* chunk of a live (or unavailable) row set outside this operation references the same binding,
|
|
482
516
|
* key and native version, and no other open write intent created it. Row sets already `pruning`
|
|
483
517
|
* or `pruned` do not count: their own operation deletes the object, and counting them would let
|
|
@@ -468,9 +468,11 @@ class PostgresReportingLedgerStore {
|
|
|
468
468
|
);
|
|
469
469
|
}
|
|
470
470
|
/**
|
|
471
|
-
*
|
|
472
|
-
* `{revision_key}
|
|
473
|
-
*
|
|
471
|
+
* Defense in depth for snapshot compaction (see `compactSupersededSnapshots`): throws `INVALID_INPUT`
|
|
472
|
+
* if a writable object row binding's key template omits `{revision_key}`. Every such binding is
|
|
473
|
+
* already refused when the store is configured, so this only guards a configuration changed after
|
|
474
|
+
* construction; `readOnly` bindings are skipped. Called by `compactSupersededSnapshots` and by
|
|
475
|
+
* service construction when compaction is enabled.
|
|
474
476
|
*/
|
|
475
477
|
assertCompactionSafeRowBindings() {
|
|
476
478
|
this.rowStorage.assertCompactionSafeKeyTemplates();
|
|
@@ -857,6 +859,7 @@ ${managedDueArm} )
|
|
|
857
859
|
rows: revision.rows,
|
|
858
860
|
finality: revision.finality,
|
|
859
861
|
periodStart: lease.obligation.period.start,
|
|
862
|
+
sourceTimezone: lease.obligation.period.sourceTimezone,
|
|
860
863
|
binding: revision.binding,
|
|
861
864
|
controlTotals: revision.wireRevision.control_totals
|
|
862
865
|
}) : void 0;
|
|
@@ -1015,6 +1018,7 @@ ${managedDueArm} )
|
|
|
1015
1018
|
obligationId: adjustment.reporting_obligation_id,
|
|
1016
1019
|
rows: adjustment.rows,
|
|
1017
1020
|
periodStart: lease.obligation.period.start,
|
|
1021
|
+
sourceTimezone: lease.obligation.period.sourceTimezone,
|
|
1018
1022
|
binding: adjustment.binding
|
|
1019
1023
|
}) : void 0;
|
|
1020
1024
|
const upload = prepared?.binding.kind === "object" ? await this.uploadRowSetUnlessCommitted(prepared, lease, "adcp_reporting_adjustments", "adjustment_id") : void 0;
|
|
@@ -1569,16 +1573,16 @@ ${managedDueArm} )
|
|
|
1569
1573
|
);
|
|
1570
1574
|
if (rowStorage) {
|
|
1571
1575
|
const objects = await this.query(
|
|
1572
|
-
`SELECT DISTINCT row_set.row_binding_id, chunk.
|
|
1576
|
+
`SELECT DISTINCT row_set.row_binding_id, chunk.object_ref, chunk.native_version_ref
|
|
1573
1577
|
FROM adcp_reporting_row_chunks chunk
|
|
1574
1578
|
JOIN adcp_reporting_row_sets row_set ON row_set.row_set_id = chunk.row_set_id
|
|
1575
|
-
WHERE chunk.obligation_id = $1 AND chunk.
|
|
1579
|
+
WHERE chunk.obligation_id = $1 AND chunk.object_ref IS NOT NULL`,
|
|
1576
1580
|
[obligationId]
|
|
1577
1581
|
);
|
|
1578
1582
|
const byBinding = /* @__PURE__ */ new Map();
|
|
1579
1583
|
for (const row of objects.rows) {
|
|
1580
1584
|
const list = byBinding.get(row.row_binding_id) ?? [];
|
|
1581
|
-
list.push({
|
|
1585
|
+
list.push({ objectRef: row.object_ref, nativeVersionRef: row.native_version_ref });
|
|
1582
1586
|
byBinding.set(row.row_binding_id, list);
|
|
1583
1587
|
}
|
|
1584
1588
|
for (const [bindingId, list] of byBinding) {
|
|
@@ -1799,15 +1803,15 @@ ${managedDueArm} )
|
|
|
1799
1803
|
);
|
|
1800
1804
|
if (binding.rows.length === 0) return false;
|
|
1801
1805
|
const objects = await this.query(
|
|
1802
|
-
`SELECT DISTINCT chunk.
|
|
1806
|
+
`SELECT DISTINCT chunk.object_ref, chunk.native_version_ref
|
|
1803
1807
|
FROM adcp_reporting_row_chunks chunk
|
|
1804
|
-
WHERE chunk.row_set_id = $1 AND chunk.
|
|
1808
|
+
WHERE chunk.row_set_id = $1 AND chunk.object_ref IS NOT NULL`,
|
|
1805
1809
|
[revisionId]
|
|
1806
1810
|
);
|
|
1807
1811
|
if (objects.rows.length > 0) {
|
|
1808
1812
|
await this.deleteUnreferencedObjects(
|
|
1809
1813
|
binding.rows[0].row_binding_id,
|
|
1810
|
-
objects.rows.map((row) => ({
|
|
1814
|
+
objects.rows.map((row) => ({ objectRef: row.object_ref, nativeVersionRef: row.native_version_ref })),
|
|
1811
1815
|
{ rowSetId: revisionId },
|
|
1812
1816
|
signal
|
|
1813
1817
|
);
|
|
@@ -1815,10 +1819,10 @@ ${managedDueArm} )
|
|
|
1815
1819
|
await this.transaction(
|
|
1816
1820
|
async (client) => {
|
|
1817
1821
|
const dropped = await client.query(
|
|
1818
|
-
`DELETE FROM adcp_reporting_row_chunks WHERE row_set_id = $1 RETURNING sha256,
|
|
1822
|
+
`DELETE FROM adcp_reporting_row_chunks WHERE row_set_id = $1 RETURNING sha256, object_ref`,
|
|
1819
1823
|
[revisionId]
|
|
1820
1824
|
);
|
|
1821
|
-
const bodies = [...new Set(dropped.rows.filter((row) => row.
|
|
1825
|
+
const bodies = [...new Set(dropped.rows.filter((row) => row.object_ref === null).map((row) => row.sha256))];
|
|
1822
1826
|
if (bodies.length > 0) {
|
|
1823
1827
|
await client.query(
|
|
1824
1828
|
`DELETE FROM adcp_reporting_chunk_bodies body
|
|
@@ -1826,7 +1830,7 @@ ${managedDueArm} )
|
|
|
1826
1830
|
AND NOT EXISTS (
|
|
1827
1831
|
SELECT 1 FROM adcp_reporting_row_chunks other
|
|
1828
1832
|
WHERE other.account_id = body.account_id AND other.obligation_id = body.obligation_id
|
|
1829
|
-
AND other.sha256 = body.sha256 AND other.
|
|
1833
|
+
AND other.sha256 = body.sha256 AND other.object_ref IS NULL
|
|
1830
1834
|
)`,
|
|
1831
1835
|
[accountId, obligationId, bodies]
|
|
1832
1836
|
);
|
|
@@ -1884,7 +1888,12 @@ ${managedDueArm} )
|
|
|
1884
1888
|
RETURNING created_objects`,
|
|
1885
1889
|
key
|
|
1886
1890
|
);
|
|
1887
|
-
return updated.rows[0]?.created_objects
|
|
1891
|
+
return updated.rows[0]?.created_objects.map((object) => ({
|
|
1892
|
+
objectRef: object.object_ref ?? object.objectKey,
|
|
1893
|
+
nativeVersionRef: object.native_version_ref ?? object.nativeVersion
|
|
1894
|
+
})).filter(
|
|
1895
|
+
(object) => typeof object.objectRef === "string" && typeof object.nativeVersionRef === "string"
|
|
1896
|
+
);
|
|
1888
1897
|
},
|
|
1889
1898
|
{ preBeginAdvisoryLock: accountLock(intent.account_id) }
|
|
1890
1899
|
);
|
|
@@ -1931,9 +1940,9 @@ ${managedDueArm} )
|
|
|
1931
1940
|
/**
|
|
1932
1941
|
* Delete external row objects, skipping any object another row set still references.
|
|
1933
1942
|
*
|
|
1934
|
-
*
|
|
1935
|
-
*
|
|
1936
|
-
*
|
|
1943
|
+
* Object keys are unique per row set (every writable template includes `{revision_key}`), but header-only
|
|
1944
|
+
* revisions share chunks within an obligation and rows written under an older template can name one
|
|
1945
|
+
* object from several row sets. An object is therefore deleted only when no
|
|
1937
1946
|
* chunk of a live (or unavailable) row set outside this operation references the same binding,
|
|
1938
1947
|
* key and native version, and no other open write intent created it. Row sets already `pruning`
|
|
1939
1948
|
* or `pruned` do not count: their own operation deletes the object, and counting them would let
|
|
@@ -1955,27 +1964,30 @@ ${managedDueArm} )
|
|
|
1955
1964
|
signal?.throwIfAborted();
|
|
1956
1965
|
const removed = await this.transaction(async (client) => {
|
|
1957
1966
|
await client.query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", [
|
|
1958
|
-
objectLock(bindingId, object.
|
|
1967
|
+
objectLock(bindingId, object.objectRef)
|
|
1959
1968
|
]);
|
|
1960
1969
|
const referenced = await client.query(
|
|
1961
1970
|
`(SELECT 1 FROM adcp_reporting_row_chunks chunk
|
|
1962
1971
|
JOIN adcp_reporting_row_sets row_set ON row_set.row_set_id = chunk.row_set_id
|
|
1963
|
-
WHERE row_set.row_binding_id = $1 AND chunk.
|
|
1972
|
+
WHERE row_set.row_binding_id = $1 AND chunk.object_ref = $2 AND chunk.native_version_ref = $3
|
|
1964
1973
|
AND row_set.rows_state IN ('live', 'unavailable')
|
|
1965
1974
|
AND ($4::text IS NULL OR chunk.obligation_id <> $4)
|
|
1966
1975
|
AND ($5::text IS NULL OR chunk.row_set_id <> $5)
|
|
1967
1976
|
LIMIT 1)
|
|
1968
1977
|
UNION ALL
|
|
1969
1978
|
(SELECT 1 FROM adcp_reporting_row_write_intents intent
|
|
1970
|
-
WHERE intent.row_binding_id = $1 AND intent.state = 'open'
|
|
1979
|
+
WHERE intent.row_binding_id = $1 AND intent.state = 'open'
|
|
1980
|
+
AND (intent.created_objects @> $6::jsonb OR intent.created_objects @> $7::jsonb)
|
|
1971
1981
|
LIMIT 1)`,
|
|
1972
1982
|
[
|
|
1973
1983
|
bindingId,
|
|
1974
|
-
object.
|
|
1975
|
-
object.
|
|
1984
|
+
object.objectRef,
|
|
1985
|
+
object.nativeVersionRef,
|
|
1976
1986
|
scope.obligationId ?? null,
|
|
1977
1987
|
scope.rowSetId ?? null,
|
|
1978
|
-
JSON.stringify([{
|
|
1988
|
+
JSON.stringify([{ object_ref: object.objectRef, native_version_ref: object.nativeVersionRef }]),
|
|
1989
|
+
// An older writer still running during a rolling upgrade records the pre-alignment keys.
|
|
1990
|
+
JSON.stringify([{ objectKey: object.objectRef, nativeVersion: object.nativeVersionRef }])
|
|
1979
1991
|
]
|
|
1980
1992
|
);
|
|
1981
1993
|
if (referenced.rows.length > 0) return false;
|
|
@@ -2061,7 +2073,11 @@ ${managedDueArm} )
|
|
|
2061
2073
|
SET created_objects = created_objects || $5::jsonb
|
|
2062
2074
|
WHERE row_binding_id = $1 AND row_set_id = $2 AND content_sha256 = $3
|
|
2063
2075
|
AND owner_token = $4 AND state = 'open'`,
|
|
2064
|
-
[
|
|
2076
|
+
[
|
|
2077
|
+
...intentKey,
|
|
2078
|
+
ownerToken,
|
|
2079
|
+
JSON.stringify([{ object_ref: object.objectRef, native_version_ref: object.nativeVersionRef }])
|
|
2080
|
+
]
|
|
2065
2081
|
);
|
|
2066
2082
|
if (recorded.rowCount !== 1) {
|
|
2067
2083
|
throw new import_row_storage.ReportingRowStoreError("STATE_UNAVAILABLE", "the row upload intent was taken over or swept");
|
|
@@ -2097,10 +2113,10 @@ ${managedDueArm} )
|
|
|
2097
2113
|
}
|
|
2098
2114
|
}
|
|
2099
2115
|
if (!upload.sharedFrom) {
|
|
2100
|
-
const adopted = upload.locators.filter((locator) => !locator.created).sort((left, right) => left.
|
|
2116
|
+
const adopted = upload.locators.filter((locator) => !locator.created).sort((left, right) => left.objectRef < right.objectRef ? -1 : left.objectRef > right.objectRef ? 1 : 0);
|
|
2101
2117
|
for (const locator of adopted) {
|
|
2102
2118
|
await client.query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", [
|
|
2103
|
-
objectLock(prepared.bindingId, locator.
|
|
2119
|
+
objectLock(prepared.bindingId, locator.objectRef)
|
|
2104
2120
|
]);
|
|
2105
2121
|
}
|
|
2106
2122
|
if (adopted.length > 0) await this.rowStorage.assertObjectsPresent(prepared.bindingId, adopted);
|
|
@@ -4294,8 +4310,8 @@ function rfc3339Microseconds(expression) {
|
|
|
4294
4310
|
function accountLock(accountId) {
|
|
4295
4311
|
return `adcp-reporting-account:${accountId}`;
|
|
4296
4312
|
}
|
|
4297
|
-
function objectLock(bindingId,
|
|
4298
|
-
return `adcp-reporting-object:${bindingId}:${
|
|
4313
|
+
function objectLock(bindingId, objectRef) {
|
|
4314
|
+
return `adcp-reporting-object:${bindingId}:${objectRef}`;
|
|
4299
4315
|
}
|
|
4300
4316
|
async function resolveStoredFinalityBaseline(transaction, obligationId) {
|
|
4301
4317
|
const latest = await transaction.query(
|
|
@@ -469,9 +469,11 @@ class PostgresReportingLedgerStore {
|
|
|
469
469
|
);
|
|
470
470
|
}
|
|
471
471
|
/**
|
|
472
|
-
*
|
|
473
|
-
* `{revision_key}
|
|
474
|
-
*
|
|
472
|
+
* Defense in depth for snapshot compaction (see `compactSupersededSnapshots`): throws `INVALID_INPUT`
|
|
473
|
+
* if a writable object row binding's key template omits `{revision_key}`. Every such binding is
|
|
474
|
+
* already refused when the store is configured, so this only guards a configuration changed after
|
|
475
|
+
* construction; `readOnly` bindings are skipped. Called by `compactSupersededSnapshots` and by
|
|
476
|
+
* service construction when compaction is enabled.
|
|
475
477
|
*/
|
|
476
478
|
assertCompactionSafeRowBindings() {
|
|
477
479
|
this.rowStorage.assertCompactionSafeKeyTemplates();
|
|
@@ -858,6 +860,7 @@ ${managedDueArm} )
|
|
|
858
860
|
rows: revision.rows,
|
|
859
861
|
finality: revision.finality,
|
|
860
862
|
periodStart: lease.obligation.period.start,
|
|
863
|
+
sourceTimezone: lease.obligation.period.sourceTimezone,
|
|
861
864
|
binding: revision.binding,
|
|
862
865
|
controlTotals: revision.wireRevision.control_totals
|
|
863
866
|
}) : void 0;
|
|
@@ -1016,6 +1019,7 @@ ${managedDueArm} )
|
|
|
1016
1019
|
obligationId: adjustment.reporting_obligation_id,
|
|
1017
1020
|
rows: adjustment.rows,
|
|
1018
1021
|
periodStart: lease.obligation.period.start,
|
|
1022
|
+
sourceTimezone: lease.obligation.period.sourceTimezone,
|
|
1019
1023
|
binding: adjustment.binding
|
|
1020
1024
|
}) : void 0;
|
|
1021
1025
|
const upload = prepared?.binding.kind === "object" ? await this.uploadRowSetUnlessCommitted(prepared, lease, "adcp_reporting_adjustments", "adjustment_id") : void 0;
|
|
@@ -1570,16 +1574,16 @@ ${managedDueArm} )
|
|
|
1570
1574
|
);
|
|
1571
1575
|
if (rowStorage) {
|
|
1572
1576
|
const objects = await this.query(
|
|
1573
|
-
`SELECT DISTINCT row_set.row_binding_id, chunk.
|
|
1577
|
+
`SELECT DISTINCT row_set.row_binding_id, chunk.object_ref, chunk.native_version_ref
|
|
1574
1578
|
FROM adcp_reporting_row_chunks chunk
|
|
1575
1579
|
JOIN adcp_reporting_row_sets row_set ON row_set.row_set_id = chunk.row_set_id
|
|
1576
|
-
WHERE chunk.obligation_id = $1 AND chunk.
|
|
1580
|
+
WHERE chunk.obligation_id = $1 AND chunk.object_ref IS NOT NULL`,
|
|
1577
1581
|
[obligationId]
|
|
1578
1582
|
);
|
|
1579
1583
|
const byBinding = /* @__PURE__ */ new Map();
|
|
1580
1584
|
for (const row of objects.rows) {
|
|
1581
1585
|
const list = byBinding.get(row.row_binding_id) ?? [];
|
|
1582
|
-
list.push({
|
|
1586
|
+
list.push({ objectRef: row.object_ref, nativeVersionRef: row.native_version_ref });
|
|
1583
1587
|
byBinding.set(row.row_binding_id, list);
|
|
1584
1588
|
}
|
|
1585
1589
|
for (const [bindingId, list] of byBinding) {
|
|
@@ -1800,15 +1804,15 @@ ${managedDueArm} )
|
|
|
1800
1804
|
);
|
|
1801
1805
|
if (binding.rows.length === 0) return false;
|
|
1802
1806
|
const objects = await this.query(
|
|
1803
|
-
`SELECT DISTINCT chunk.
|
|
1807
|
+
`SELECT DISTINCT chunk.object_ref, chunk.native_version_ref
|
|
1804
1808
|
FROM adcp_reporting_row_chunks chunk
|
|
1805
|
-
WHERE chunk.row_set_id = $1 AND chunk.
|
|
1809
|
+
WHERE chunk.row_set_id = $1 AND chunk.object_ref IS NOT NULL`,
|
|
1806
1810
|
[revisionId]
|
|
1807
1811
|
);
|
|
1808
1812
|
if (objects.rows.length > 0) {
|
|
1809
1813
|
await this.deleteUnreferencedObjects(
|
|
1810
1814
|
binding.rows[0].row_binding_id,
|
|
1811
|
-
objects.rows.map((row) => ({
|
|
1815
|
+
objects.rows.map((row) => ({ objectRef: row.object_ref, nativeVersionRef: row.native_version_ref })),
|
|
1812
1816
|
{ rowSetId: revisionId },
|
|
1813
1817
|
signal
|
|
1814
1818
|
);
|
|
@@ -1816,10 +1820,10 @@ ${managedDueArm} )
|
|
|
1816
1820
|
await this.transaction(
|
|
1817
1821
|
async (client) => {
|
|
1818
1822
|
const dropped = await client.query(
|
|
1819
|
-
`DELETE FROM adcp_reporting_row_chunks WHERE row_set_id = $1 RETURNING sha256,
|
|
1823
|
+
`DELETE FROM adcp_reporting_row_chunks WHERE row_set_id = $1 RETURNING sha256, object_ref`,
|
|
1820
1824
|
[revisionId]
|
|
1821
1825
|
);
|
|
1822
|
-
const bodies = [...new Set(dropped.rows.filter((row) => row.
|
|
1826
|
+
const bodies = [...new Set(dropped.rows.filter((row) => row.object_ref === null).map((row) => row.sha256))];
|
|
1823
1827
|
if (bodies.length > 0) {
|
|
1824
1828
|
await client.query(
|
|
1825
1829
|
`DELETE FROM adcp_reporting_chunk_bodies body
|
|
@@ -1827,7 +1831,7 @@ ${managedDueArm} )
|
|
|
1827
1831
|
AND NOT EXISTS (
|
|
1828
1832
|
SELECT 1 FROM adcp_reporting_row_chunks other
|
|
1829
1833
|
WHERE other.account_id = body.account_id AND other.obligation_id = body.obligation_id
|
|
1830
|
-
AND other.sha256 = body.sha256 AND other.
|
|
1834
|
+
AND other.sha256 = body.sha256 AND other.object_ref IS NULL
|
|
1831
1835
|
)`,
|
|
1832
1836
|
[accountId, obligationId, bodies]
|
|
1833
1837
|
);
|
|
@@ -1885,7 +1889,12 @@ ${managedDueArm} )
|
|
|
1885
1889
|
RETURNING created_objects`,
|
|
1886
1890
|
key
|
|
1887
1891
|
);
|
|
1888
|
-
return updated.rows[0]?.created_objects
|
|
1892
|
+
return updated.rows[0]?.created_objects.map((object) => ({
|
|
1893
|
+
objectRef: object.object_ref ?? object.objectKey,
|
|
1894
|
+
nativeVersionRef: object.native_version_ref ?? object.nativeVersion
|
|
1895
|
+
})).filter(
|
|
1896
|
+
(object) => typeof object.objectRef === "string" && typeof object.nativeVersionRef === "string"
|
|
1897
|
+
);
|
|
1889
1898
|
},
|
|
1890
1899
|
{ preBeginAdvisoryLock: accountLock(intent.account_id) }
|
|
1891
1900
|
);
|
|
@@ -1932,9 +1941,9 @@ ${managedDueArm} )
|
|
|
1932
1941
|
/**
|
|
1933
1942
|
* Delete external row objects, skipping any object another row set still references.
|
|
1934
1943
|
*
|
|
1935
|
-
*
|
|
1936
|
-
*
|
|
1937
|
-
*
|
|
1944
|
+
* Object keys are unique per row set (every writable template includes `{revision_key}`), but header-only
|
|
1945
|
+
* revisions share chunks within an obligation and rows written under an older template can name one
|
|
1946
|
+
* object from several row sets. An object is therefore deleted only when no
|
|
1938
1947
|
* chunk of a live (or unavailable) row set outside this operation references the same binding,
|
|
1939
1948
|
* key and native version, and no other open write intent created it. Row sets already `pruning`
|
|
1940
1949
|
* or `pruned` do not count: their own operation deletes the object, and counting them would let
|
|
@@ -1956,27 +1965,30 @@ ${managedDueArm} )
|
|
|
1956
1965
|
signal?.throwIfAborted();
|
|
1957
1966
|
const removed = await this.transaction(async (client) => {
|
|
1958
1967
|
await client.query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", [
|
|
1959
|
-
objectLock(bindingId, object.
|
|
1968
|
+
objectLock(bindingId, object.objectRef)
|
|
1960
1969
|
]);
|
|
1961
1970
|
const referenced = await client.query(
|
|
1962
1971
|
`(SELECT 1 FROM adcp_reporting_row_chunks chunk
|
|
1963
1972
|
JOIN adcp_reporting_row_sets row_set ON row_set.row_set_id = chunk.row_set_id
|
|
1964
|
-
WHERE row_set.row_binding_id = $1 AND chunk.
|
|
1973
|
+
WHERE row_set.row_binding_id = $1 AND chunk.object_ref = $2 AND chunk.native_version_ref = $3
|
|
1965
1974
|
AND row_set.rows_state IN ('live', 'unavailable')
|
|
1966
1975
|
AND ($4::text IS NULL OR chunk.obligation_id <> $4)
|
|
1967
1976
|
AND ($5::text IS NULL OR chunk.row_set_id <> $5)
|
|
1968
1977
|
LIMIT 1)
|
|
1969
1978
|
UNION ALL
|
|
1970
1979
|
(SELECT 1 FROM adcp_reporting_row_write_intents intent
|
|
1971
|
-
WHERE intent.row_binding_id = $1 AND intent.state = 'open'
|
|
1980
|
+
WHERE intent.row_binding_id = $1 AND intent.state = 'open'
|
|
1981
|
+
AND (intent.created_objects @> $6::jsonb OR intent.created_objects @> $7::jsonb)
|
|
1972
1982
|
LIMIT 1)`,
|
|
1973
1983
|
[
|
|
1974
1984
|
bindingId,
|
|
1975
|
-
object.
|
|
1976
|
-
object.
|
|
1985
|
+
object.objectRef,
|
|
1986
|
+
object.nativeVersionRef,
|
|
1977
1987
|
scope.obligationId ?? null,
|
|
1978
1988
|
scope.rowSetId ?? null,
|
|
1979
|
-
JSON.stringify([{
|
|
1989
|
+
JSON.stringify([{ object_ref: object.objectRef, native_version_ref: object.nativeVersionRef }]),
|
|
1990
|
+
// An older writer still running during a rolling upgrade records the pre-alignment keys.
|
|
1991
|
+
JSON.stringify([{ objectKey: object.objectRef, nativeVersion: object.nativeVersionRef }])
|
|
1980
1992
|
]
|
|
1981
1993
|
);
|
|
1982
1994
|
if (referenced.rows.length > 0) return false;
|
|
@@ -2062,7 +2074,11 @@ ${managedDueArm} )
|
|
|
2062
2074
|
SET created_objects = created_objects || $5::jsonb
|
|
2063
2075
|
WHERE row_binding_id = $1 AND row_set_id = $2 AND content_sha256 = $3
|
|
2064
2076
|
AND owner_token = $4 AND state = 'open'`,
|
|
2065
|
-
[
|
|
2077
|
+
[
|
|
2078
|
+
...intentKey,
|
|
2079
|
+
ownerToken,
|
|
2080
|
+
JSON.stringify([{ object_ref: object.objectRef, native_version_ref: object.nativeVersionRef }])
|
|
2081
|
+
]
|
|
2066
2082
|
);
|
|
2067
2083
|
if (recorded.rowCount !== 1) {
|
|
2068
2084
|
throw new ReportingRowStoreError("STATE_UNAVAILABLE", "the row upload intent was taken over or swept");
|
|
@@ -2098,10 +2114,10 @@ ${managedDueArm} )
|
|
|
2098
2114
|
}
|
|
2099
2115
|
}
|
|
2100
2116
|
if (!upload.sharedFrom) {
|
|
2101
|
-
const adopted = upload.locators.filter((locator) => !locator.created).sort((left, right) => left.
|
|
2117
|
+
const adopted = upload.locators.filter((locator) => !locator.created).sort((left, right) => left.objectRef < right.objectRef ? -1 : left.objectRef > right.objectRef ? 1 : 0);
|
|
2102
2118
|
for (const locator of adopted) {
|
|
2103
2119
|
await client.query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", [
|
|
2104
|
-
objectLock(prepared.bindingId, locator.
|
|
2120
|
+
objectLock(prepared.bindingId, locator.objectRef)
|
|
2105
2121
|
]);
|
|
2106
2122
|
}
|
|
2107
2123
|
if (adopted.length > 0) await this.rowStorage.assertObjectsPresent(prepared.bindingId, adopted);
|
|
@@ -4295,8 +4311,8 @@ function rfc3339Microseconds(expression) {
|
|
|
4295
4311
|
function accountLock(accountId) {
|
|
4296
4312
|
return `adcp-reporting-account:${accountId}`;
|
|
4297
4313
|
}
|
|
4298
|
-
function objectLock(bindingId,
|
|
4299
|
-
return `adcp-reporting-object:${bindingId}:${
|
|
4314
|
+
function objectLock(bindingId, objectRef) {
|
|
4315
|
+
return `adcp-reporting-object:${bindingId}:${objectRef}`;
|
|
4300
4316
|
}
|
|
4301
4317
|
async function resolveStoredFinalityBaseline(transaction, obligationId) {
|
|
4302
4318
|
const latest = await transaction.query(
|