@opendatalabs/personal-server-ts-core 1.33.8 → 1.34.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/dist/additions/budget.d.ts +28 -0
- package/dist/additions/budget.d.ts.map +1 -0
- package/dist/additions/budget.js +119 -0
- package/dist/additions/budget.js.map +1 -0
- package/dist/additions/durable.d.ts +64 -0
- package/dist/additions/durable.d.ts.map +1 -0
- package/dist/additions/durable.js +591 -0
- package/dist/additions/durable.js.map +1 -0
- package/dist/additions/first-added.d.ts +32 -48
- package/dist/additions/first-added.d.ts.map +1 -1
- package/dist/additions/first-added.js +68 -123
- package/dist/additions/first-added.js.map +1 -1
- package/dist/additions/index.d.ts +3 -0
- package/dist/additions/index.d.ts.map +1 -1
- package/dist/additions/index.js +3 -0
- package/dist/additions/index.js.map +1 -1
- package/dist/additions/ledger-store.js +1 -1
- package/dist/additions/record-rules.d.ts.map +1 -1
- package/dist/additions/record-rules.js +7 -0
- package/dist/additions/record-rules.js.map +1 -1
- package/dist/additions/summary.d.ts +88 -1
- package/dist/additions/summary.d.ts.map +1 -1
- package/dist/additions/summary.js +173 -8
- package/dist/additions/summary.js.map +1 -1
- package/dist/additions/version-inventory.d.ts +80 -0
- package/dist/additions/version-inventory.d.ts.map +1 -0
- package/dist/additions/version-inventory.js +232 -0
- package/dist/additions/version-inventory.js.map +1 -0
- package/dist/api/index.d.ts +70 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +506 -79
- package/dist/api/index.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/request.d.ts +6 -0
- package/dist/auth/request.d.ts.map +1 -1
- package/dist/auth/request.js +66 -4
- package/dist/auth/request.js.map +1 -1
- package/dist/contracts/data.d.ts +54 -8
- package/dist/contracts/data.d.ts.map +1 -1
- package/dist/contracts/data.js +178 -35
- package/dist/contracts/data.js.map +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/derivatives/registration.d.ts +0 -5
- package/dist/derivatives/registration.d.ts.map +1 -1
- package/dist/derivatives/registration.js +2 -1
- package/dist/derivatives/registration.js.map +1 -1
- package/dist/errors/pdpp-catalog.d.ts +36 -0
- package/dist/errors/pdpp-catalog.d.ts.map +1 -0
- package/dist/errors/pdpp-catalog.js +86 -0
- package/dist/errors/pdpp-catalog.js.map +1 -0
- package/dist/grants/index.d.ts +2 -0
- package/dist/grants/index.d.ts.map +1 -1
- package/dist/grants/index.js +4 -0
- package/dist/grants/index.js.map +1 -1
- package/dist/grants/pdpp-binding-store.d.ts +89 -0
- package/dist/grants/pdpp-binding-store.d.ts.map +1 -0
- package/dist/grants/pdpp-binding-store.js +112 -0
- package/dist/grants/pdpp-binding-store.js.map +1 -0
- package/dist/grants/pdpp-binding.d.ts +169 -0
- package/dist/grants/pdpp-binding.d.ts.map +1 -0
- package/dist/grants/pdpp-binding.js +236 -0
- package/dist/grants/pdpp-binding.js.map +1 -0
- package/dist/legacy-projection/bindings.d.ts +28 -1
- package/dist/legacy-projection/bindings.d.ts.map +1 -1
- package/dist/legacy-projection/bindings.js +622 -189
- package/dist/legacy-projection/bindings.js.map +1 -1
- package/dist/legacy-projection/claude-source-record.d.ts +22 -0
- package/dist/legacy-projection/claude-source-record.d.ts.map +1 -0
- package/dist/legacy-projection/claude-source-record.js +360 -0
- package/dist/legacy-projection/claude-source-record.js.map +1 -0
- package/dist/legacy-projection/declared-text.d.ts +41 -0
- package/dist/legacy-projection/declared-text.d.ts.map +1 -0
- package/dist/legacy-projection/declared-text.js +199 -0
- package/dist/legacy-projection/declared-text.js.map +1 -0
- package/dist/legacy-projection/github-browser-bindings.d.ts.map +1 -1
- package/dist/legacy-projection/github-browser-bindings.js +89 -5
- package/dist/legacy-projection/github-browser-bindings.js.map +1 -1
- package/dist/legacy-projection/github-legacy-fields.d.ts +6 -0
- package/dist/legacy-projection/github-legacy-fields.d.ts.map +1 -0
- package/dist/legacy-projection/github-legacy-fields.js +202 -0
- package/dist/legacy-projection/github-legacy-fields.js.map +1 -0
- package/dist/legacy-projection/index.d.ts +3 -1
- package/dist/legacy-projection/index.d.ts.map +1 -1
- package/dist/legacy-projection/index.js +49 -1
- package/dist/legacy-projection/index.js.map +1 -1
- package/dist/legacy-projection/oura-browser-bindings.d.ts.map +1 -1
- package/dist/legacy-projection/oura-browser-bindings.js +43 -41
- package/dist/legacy-projection/oura-browser-bindings.js.map +1 -1
- package/dist/legacy-projection/types.d.ts +38 -2
- package/dist/legacy-projection/types.d.ts.map +1 -1
- package/dist/mcp/resources.d.ts.map +1 -1
- package/dist/mcp/resources.js +3 -0
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +11 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/pdpp/approval.d.ts +271 -0
- package/dist/pdpp/approval.d.ts.map +1 -0
- package/dist/pdpp/approval.js +467 -0
- package/dist/pdpp/approval.js.map +1 -0
- package/dist/pdpp/client-identity.d.ts +88 -0
- package/dist/pdpp/client-identity.d.ts.map +1 -0
- package/dist/pdpp/client-identity.js +196 -0
- package/dist/pdpp/client-identity.js.map +1 -0
- package/dist/pdpp/client-metadata.d.ts +95 -0
- package/dist/pdpp/client-metadata.d.ts.map +1 -0
- package/dist/pdpp/client-metadata.js +96 -0
- package/dist/pdpp/client-metadata.js.map +1 -0
- package/dist/pdpp/commitments.d.ts +75 -0
- package/dist/pdpp/commitments.d.ts.map +1 -0
- package/dist/pdpp/commitments.js +113 -0
- package/dist/pdpp/commitments.js.map +1 -0
- package/dist/pdpp/declaration.d.ts +118 -0
- package/dist/pdpp/declaration.d.ts.map +1 -0
- package/dist/pdpp/declaration.js +836 -0
- package/dist/pdpp/declaration.js.map +1 -0
- package/dist/pdpp/index.d.ts +37 -0
- package/dist/pdpp/index.d.ts.map +1 -0
- package/dist/pdpp/index.js +23 -0
- package/dist/pdpp/index.js.map +1 -0
- package/dist/pdpp/issuance.d.ts +126 -0
- package/dist/pdpp/issuance.d.ts.map +1 -0
- package/dist/pdpp/issuance.js +180 -0
- package/dist/pdpp/issuance.js.map +1 -0
- package/dist/pdpp/pkce.d.ts +53 -0
- package/dist/pdpp/pkce.d.ts.map +1 -0
- package/dist/pdpp/pkce.js +109 -0
- package/dist/pdpp/pkce.js.map +1 -0
- package/dist/pdpp/redirect.d.ts +60 -0
- package/dist/pdpp/redirect.d.ts.map +1 -0
- package/dist/pdpp/redirect.js +125 -0
- package/dist/pdpp/redirect.js.map +1 -0
- package/dist/pdpp/resolve.d.ts +109 -0
- package/dist/pdpp/resolve.d.ts.map +1 -0
- package/dist/pdpp/resolve.js +393 -0
- package/dist/pdpp/resolve.js.map +1 -0
- package/dist/pdpp/review.d.ts +280 -0
- package/dist/pdpp/review.d.ts.map +1 -0
- package/dist/pdpp/review.js +205 -0
- package/dist/pdpp/review.js.map +1 -0
- package/dist/pdpp/selection.d.ts +50 -0
- package/dist/pdpp/selection.d.ts.map +1 -0
- package/dist/pdpp/selection.js +442 -0
- package/dist/pdpp/selection.js.map +1 -0
- package/dist/pdpp/store.d.ts +228 -0
- package/dist/pdpp/store.d.ts.map +1 -0
- package/dist/pdpp/store.js +542 -0
- package/dist/pdpp/store.js.map +1 -0
- package/dist/pdpp/tokens.d.ts +181 -0
- package/dist/pdpp/tokens.d.ts.map +1 -0
- package/dist/pdpp/tokens.js +419 -0
- package/dist/pdpp/tokens.js.map +1 -0
- package/dist/pdpp/types.d.ts +441 -0
- package/dist/pdpp/types.d.ts.map +1 -0
- package/dist/pdpp/types.js +61 -0
- package/dist/pdpp/types.js.map +1 -0
- package/dist/pdpp-version.d.ts +28 -0
- package/dist/pdpp-version.d.ts.map +1 -0
- package/dist/pdpp-version.js +28 -0
- package/dist/pdpp-version.js.map +1 -0
- package/dist/policy/data-read.d.ts +24 -0
- package/dist/policy/data-read.d.ts.map +1 -1
- package/dist/policy/data-read.js +60 -3
- package/dist/policy/data-read.js.map +1 -1
- package/dist/policy/data-write.d.ts.map +1 -1
- package/dist/policy/data-write.js +3 -0
- package/dist/policy/data-write.js.map +1 -1
- package/dist/policy/index.d.ts +1 -0
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/index.js +1 -0
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/reserved-scopes.d.ts +3 -0
- package/dist/policy/reserved-scopes.d.ts.map +1 -0
- package/dist/policy/reserved-scopes.js +5 -0
- package/dist/policy/reserved-scopes.js.map +1 -0
- package/dist/ports/index.d.ts +63 -0
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/pdpp-auth.d.ts +129 -0
- package/dist/ports/pdpp-auth.d.ts.map +1 -0
- package/dist/ports/pdpp-auth.js +60 -0
- package/dist/ports/pdpp-auth.js.map +1 -0
- package/dist/ports/pdpp-auth.test-utils.d.ts +9 -0
- package/dist/ports/pdpp-auth.test-utils.d.ts.map +1 -0
- package/dist/ports/pdpp-auth.test-utils.js +18 -0
- package/dist/ports/pdpp-auth.test-utils.js.map +1 -0
- package/dist/schemas/server-config.d.ts +44 -0
- package/dist/schemas/server-config.d.ts.map +1 -1
- package/dist/schemas/server-config.js +91 -0
- package/dist/schemas/server-config.js.map +1 -1
- package/dist/signing/request-signer.d.ts +2 -0
- package/dist/signing/request-signer.d.ts.map +1 -1
- package/dist/signing/request-signer.js +1 -0
- package/dist/signing/request-signer.js.map +1 -1
- package/dist/storage/adapters/interface.d.ts +3 -0
- package/dist/storage/adapters/interface.d.ts.map +1 -1
- package/dist/storage/adapters/vana-audience.d.ts +12 -0
- package/dist/storage/adapters/vana-audience.d.ts.map +1 -0
- package/dist/storage/adapters/vana-audience.js +72 -0
- package/dist/storage/adapters/vana-audience.js.map +1 -0
- package/dist/storage/adapters/vana.d.ts +2 -0
- package/dist/storage/adapters/vana.d.ts.map +1 -1
- package/dist/storage/adapters/vana.js +53 -20
- package/dist/storage/adapters/vana.js.map +1 -1
- package/dist/storage/canonical-legacy-projection.d.ts +262 -0
- package/dist/storage/canonical-legacy-projection.d.ts.map +1 -0
- package/dist/storage/canonical-legacy-projection.js +761 -0
- package/dist/storage/canonical-legacy-projection.js.map +1 -0
- package/dist/storage/index/manager.d.ts +29 -2
- package/dist/storage/index/manager.d.ts.map +1 -1
- package/dist/storage/index/schema.d.ts +1 -1
- package/dist/storage/index/schema.js +1 -1
- package/dist/storage/index/types.d.ts +7 -1
- package/dist/storage/index/types.d.ts.map +1 -1
- package/dist/storage/legacy-projection.d.ts +4 -3
- package/dist/storage/legacy-projection.d.ts.map +1 -1
- package/dist/storage/legacy-projection.js +145 -42
- package/dist/storage/legacy-projection.js.map +1 -1
- package/dist/storage/legacy-scope-coverage-exceptions.d.ts +8 -0
- package/dist/storage/legacy-scope-coverage-exceptions.d.ts.map +1 -0
- package/dist/storage/legacy-scope-coverage-exceptions.js +10 -0
- package/dist/storage/legacy-scope-coverage-exceptions.js.map +1 -0
- package/dist/storage/legacy-scope-coverage.d.ts +53 -0
- package/dist/storage/legacy-scope-coverage.d.ts.map +1 -0
- package/dist/storage/legacy-scope-coverage.js +403 -0
- package/dist/storage/legacy-scope-coverage.js.map +1 -0
- package/dist/storage/legacy-scope-entity-keys.d.ts +4 -0
- package/dist/storage/legacy-scope-entity-keys.d.ts.map +1 -0
- package/dist/storage/legacy-scope-entity-keys.js +92 -0
- package/dist/storage/legacy-scope-entity-keys.js.map +1 -0
- package/dist/storage/legacy-scope-view.d.ts +154 -0
- package/dist/storage/legacy-scope-view.d.ts.map +1 -0
- package/dist/storage/legacy-scope-view.js +735 -0
- package/dist/storage/legacy-scope-view.js.map +1 -0
- package/dist/storage/pdpp-records/completion.d.ts +91 -0
- package/dist/storage/pdpp-records/completion.d.ts.map +1 -0
- package/dist/storage/pdpp-records/completion.js +170 -0
- package/dist/storage/pdpp-records/completion.js.map +1 -0
- package/dist/storage/pdpp-records/cursor.d.ts +41 -0
- package/dist/storage/pdpp-records/cursor.d.ts.map +1 -0
- package/dist/storage/pdpp-records/cursor.js +49 -0
- package/dist/storage/pdpp-records/cursor.js.map +1 -0
- package/dist/storage/pdpp-records/declaration-witness.d.ts +58 -0
- package/dist/storage/pdpp-records/declaration-witness.d.ts.map +1 -0
- package/dist/storage/pdpp-records/declaration-witness.js +230 -0
- package/dist/storage/pdpp-records/declaration-witness.js.map +1 -0
- package/dist/storage/pdpp-records/enforcement.d.ts +52 -0
- package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -0
- package/dist/storage/pdpp-records/enforcement.js +116 -0
- package/dist/storage/pdpp-records/enforcement.js.map +1 -0
- package/dist/storage/pdpp-records/index.d.ts +5 -0
- package/dist/storage/pdpp-records/index.d.ts.map +1 -0
- package/dist/storage/pdpp-records/index.js +5 -0
- package/dist/storage/pdpp-records/index.js.map +1 -0
- package/dist/storage/pdpp-records/ingest-plan.d.ts +39 -0
- package/dist/storage/pdpp-records/ingest-plan.d.ts.map +1 -0
- package/dist/storage/pdpp-records/ingest-plan.js +103 -0
- package/dist/storage/pdpp-records/ingest-plan.js.map +1 -0
- package/dist/storage/pdpp-records/interface.d.ts +104 -0
- package/dist/storage/pdpp-records/interface.d.ts.map +1 -0
- package/dist/storage/pdpp-records/interface.js +2 -0
- package/dist/storage/pdpp-records/interface.js.map +1 -0
- package/dist/storage/pdpp-records/memory-store.d.ts +9 -0
- package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -0
- package/dist/storage/pdpp-records/memory-store.js +466 -0
- package/dist/storage/pdpp-records/memory-store.js.map +1 -0
- package/dist/storage/pdpp-records/portable.d.ts +9 -0
- package/dist/storage/pdpp-records/portable.d.ts.map +1 -0
- package/dist/storage/pdpp-records/portable.js +8 -0
- package/dist/storage/pdpp-records/portable.js.map +1 -0
- package/dist/storage/pdpp-records/read-port.d.ts +44 -0
- package/dist/storage/pdpp-records/read-port.d.ts.map +1 -0
- package/dist/storage/pdpp-records/read-port.js +22 -0
- package/dist/storage/pdpp-records/read-port.js.map +1 -0
- package/dist/storage/pdpp-records/record-key.d.ts +52 -0
- package/dist/storage/pdpp-records/record-key.d.ts.map +1 -0
- package/dist/storage/pdpp-records/record-key.js +97 -0
- package/dist/storage/pdpp-records/record-key.js.map +1 -0
- package/dist/storage/pdpp-records/schema.d.ts +41 -0
- package/dist/storage/pdpp-records/schema.d.ts.map +1 -0
- package/dist/storage/pdpp-records/schema.js +153 -0
- package/dist/storage/pdpp-records/schema.js.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts +88 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.js +57 -0
- package/dist/storage/pdpp-records/stream-declaration.js.map +1 -0
- package/dist/storage/pdpp-records/types.d.ts +138 -0
- package/dist/storage/pdpp-records/types.d.ts.map +1 -0
- package/dist/storage/pdpp-records/types.js +38 -0
- package/dist/storage/pdpp-records/types.js.map +1 -0
- package/dist/sync/data-point-feed.d.ts +3 -0
- package/dist/sync/data-point-feed.d.ts.map +1 -1
- package/dist/sync/data-point-feed.js +17 -1
- package/dist/sync/data-point-feed.js.map +1 -1
- package/dist/sync/delete-data-port.d.ts +2 -0
- package/dist/sync/delete-data-port.d.ts.map +1 -1
- package/dist/sync/delete-data-port.js +1 -1
- package/dist/sync/delete-data-port.js.map +1 -1
- package/dist/sync/engine/sync-manager.d.ts.map +1 -1
- package/dist/sync/engine/sync-manager.js +5 -2
- package/dist/sync/engine/sync-manager.js.map +1 -1
- package/dist/sync/index.d.ts +3 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/pdpp-import.d.ts +192 -0
- package/dist/sync/pdpp-import.d.ts.map +1 -0
- package/dist/sync/pdpp-import.js +441 -0
- package/dist/sync/pdpp-import.js.map +1 -0
- package/dist/sync/scope-deletions.d.ts +10 -0
- package/dist/sync/scope-deletions.d.ts.map +1 -1
- package/dist/sync/scope-deletions.js +40 -7
- package/dist/sync/scope-deletions.js.map +1 -1
- package/dist/sync/workers/download.d.ts +14 -0
- package/dist/sync/workers/download.d.ts.map +1 -1
- package/dist/sync/workers/download.js +149 -13
- package/dist/sync/workers/download.js.map +1 -1
- package/dist/sync/workers/upload.d.ts +2 -0
- package/dist/sync/workers/upload.d.ts.map +1 -1
- package/dist/sync/workers/upload.js +7 -0
- package/dist/sync/workers/upload.js.map +1 -1
- package/dist/test-utils/memory-storage.d.ts +1 -1
- package/dist/test-utils/memory-storage.d.ts.map +1 -1
- package/dist/test-utils/memory-storage.js +11 -5
- package/dist/test-utils/memory-storage.js.map +1 -1
- package/package.json +54 -4
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { RecordDataValidator } from "./ingest-plan.js";
|
|
2
|
+
import type { ChangesSinceOptions, ChangesSincePage, IngestResult, ListRecordsOptions, ListRecordsPage, PdppBlobMeta, PdppRecordEnvelopeInput, PdppStoredRecord, StreamListing, StreamSemantics } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Persistence index for PDPP records. Implementable by a SQLite backend
|
|
5
|
+
* (desktop, `sqlite-store.ts`) and an in-memory backend that stands in for
|
|
6
|
+
* the Enclave runtime (`memory-store.ts`) — real Enclave persistence
|
|
7
|
+
* integration needs the supplied Enclave runtime and is out of scope here.
|
|
8
|
+
*/
|
|
9
|
+
export interface PdppRecordStore {
|
|
10
|
+
/**
|
|
11
|
+
* Decides each envelope with `planIngest` and writes the accepted ones
|
|
12
|
+
* atomically: a thrown error rolls back every write from this call, it
|
|
13
|
+
* never leaves partial version/history state. Each envelope gets exactly
|
|
14
|
+
* one outcome in `results`. A rejected envelope writes nothing and does
|
|
15
|
+
* not fail the rest of the batch. An `unchanged` envelope writes nothing
|
|
16
|
+
* either: no version, no history row, no write-clock tick.
|
|
17
|
+
*
|
|
18
|
+
* Declarations are looked up per envelope by `(stream, instance)`, since
|
|
19
|
+
* one stream name can belong to several sources.
|
|
20
|
+
*
|
|
21
|
+
* The SQLite PS backend also accepts a method and generation. It validates
|
|
22
|
+
* the generation in this transaction and binds an empty instance to that
|
|
23
|
+
* method with its first accepted write. That backend rejects every
|
|
24
|
+
* envelope of a call that omits the binding, with `method_required`.
|
|
25
|
+
*
|
|
26
|
+
* `validateData` rejects an upsert whose data does not conform to the
|
|
27
|
+
* declared stream schema; that envelope writes nothing.
|
|
28
|
+
*/
|
|
29
|
+
ingestBatch(envelopes: PdppRecordEnvelopeInput[], streamSemantics: (stream: string, instance: string) => StreamSemantics, primaryKeyFields: (stream: string, instance: string) => string[], binding?: {
|
|
30
|
+
method: string;
|
|
31
|
+
generation: number;
|
|
32
|
+
}, validateData?: RecordDataValidator): IngestResult;
|
|
33
|
+
getRecord(instance: string, stream: string, recordKey: string): PdppStoredRecord | undefined;
|
|
34
|
+
listRecords(stream: string, options: ListRecordsOptions): ListRecordsPage;
|
|
35
|
+
/**
|
|
36
|
+
* Owner-authenticated explicit delete directive (DELETE endpoint). Only
|
|
37
|
+
* valid for mutable_state streams; returns false if the stream is
|
|
38
|
+
* append_only or the record does not exist.
|
|
39
|
+
*/
|
|
40
|
+
deleteRecord(instance: string, stream: string, recordKey: string, deletedAt: string, streamSemantics: StreamSemantics): boolean;
|
|
41
|
+
changesSince(stream: string, options: ChangesSinceOptions): ChangesSincePage;
|
|
42
|
+
listStreams(instanceIds: string[]): StreamListing[];
|
|
43
|
+
putBlobMeta(meta: PdppBlobMeta): void;
|
|
44
|
+
getBlobMeta(blobId: string): PdppBlobMeta | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Atomically persists blob bytes and their metadata together (metadata and
|
|
47
|
+
* bytes are never written as two separate, independently-failable steps —
|
|
48
|
+
* the existing-row check and the write happen inside one transaction, not
|
|
49
|
+
* a check followed by a racing upsert). blob_id is derived from the bytes
|
|
50
|
+
* themselves (content-addressed: `sha256:<hex>`, this store's own
|
|
51
|
+
* convention, not a spec-core requirement), not supplied by the caller —
|
|
52
|
+
* a producer cannot claim an arbitrary id for its bytes, and identical
|
|
53
|
+
* bytes always resolve to the same blob_id regardless of which ingest
|
|
54
|
+
* wrote them first.
|
|
55
|
+
*
|
|
56
|
+
* Re-storing bytes that hash to an already-known blob_id is a verified
|
|
57
|
+
* no-op only when mimeType matches AND the previously-stored bytes
|
|
58
|
+
* actually still hash/size-match their own recorded metadata:
|
|
59
|
+
* - metadata-only row (no bytes ever stored, e.g. a legacy fixture that
|
|
60
|
+
* called `putBlobMeta` directly): completed by writing the bytes now.
|
|
61
|
+
* - existing bytes verified intact and mimeType matches: idempotent
|
|
62
|
+
* no-op, returns the existing metadata unchanged.
|
|
63
|
+
* - existing bytes present but corrupt/truncated relative to their own
|
|
64
|
+
* metadata: throws BlobConflictError rather than silently reporting
|
|
65
|
+
* success over content that can no longer be trusted, or silently
|
|
66
|
+
* overwriting it as if this were the first write.
|
|
67
|
+
* - mimeType differs from the existing record (regardless of byte
|
|
68
|
+
* health): throws BlobConflictError — refusing to let a second write
|
|
69
|
+
* silently redefine what an existing blob_id means.
|
|
70
|
+
*/
|
|
71
|
+
storeBlobBytes(bytes: Uint8Array, mimeType: string): PdppBlobMeta;
|
|
72
|
+
/**
|
|
73
|
+
* Reads back bytes for a blob_id, verifying the stored payload's actual
|
|
74
|
+
* size and SHA-256 still match the recorded metadata before returning
|
|
75
|
+
* anything. Returns undefined when the blob has metadata-only rows (legacy
|
|
76
|
+
* or test fixtures that called `putBlobMeta` directly), no bytes were ever
|
|
77
|
+
* stored, or the stored bytes are corrupt/truncated relative to their own
|
|
78
|
+
* metadata -- fail closed rather than deliver unverified bytes under a
|
|
79
|
+
* trusted-looking 200.
|
|
80
|
+
*/
|
|
81
|
+
getBlobBytes(blobId: string): Uint8Array<ArrayBuffer> | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Finds every non-deleted record that references a `blob_id` via
|
|
84
|
+
* `data.blob_ref.blob_id` (spec §4 "Binary data (blob_ref)"). Identical
|
|
85
|
+
* blob bytes can legitimately be referenced by more than one record or
|
|
86
|
+
* instance, so callers must check every returned reference and grant
|
|
87
|
+
* access if ANY one passes their authorization constraints (spec §8 "Get
|
|
88
|
+
* a blob") -- an inaccessible reference must never hide an accessible
|
|
89
|
+
* one. A `blob_id` alone is never sufficient to authorize access: the
|
|
90
|
+
* resource server must verify the grant includes a stream containing a
|
|
91
|
+
* record that references this blob, that record passes all grant
|
|
92
|
+
* filters, and `blob_ref` is in the grant's authorized field projection.
|
|
93
|
+
* Returns an empty array if no ingested record currently references this
|
|
94
|
+
* blob_id.
|
|
95
|
+
*/
|
|
96
|
+
findBlobReferences(blobId: string): BlobReference[];
|
|
97
|
+
close(): void;
|
|
98
|
+
}
|
|
99
|
+
export interface BlobReference {
|
|
100
|
+
instance: string;
|
|
101
|
+
stream: string;
|
|
102
|
+
recordKey: string;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/storage/pdpp-records/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CACT,SAAS,EAAE,uBAAuB,EAAE,EACpC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,eAAe,EACtE,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,EAChE,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAChD,YAAY,CAAC,EAAE,mBAAmB,GACjC,YAAY,CAAC;IAEhB,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,gBAAgB,GAAG,SAAS,CAAC;IAEhC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAE1E;;;;OAIG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC;IAEX,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAAC;IAE7E,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAEpD,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAEtC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IAEtD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAElE;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;IAElE;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;IAEpD,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/storage/pdpp-records/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PdppRecordStore } from "./interface.js";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory PdppRecordStore. Stands in for the Enclave runtime for this
|
|
4
|
+
* lane's own tests and as a second implementation of the shared interface.
|
|
5
|
+
* This is NOT a real Enclave persistence integration — that needs the
|
|
6
|
+
* supplied Enclave runtime, which this lane does not have access to.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createMemoryRecordStore(): PdppRecordStore;
|
|
9
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../../src/storage/pdpp-records/memory-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAsDtD;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,eAAe,CAsgBzD"}
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { planIngest, summarizeIngest, } from "./ingest-plan.js";
|
|
4
|
+
import { decodeCursor, encodeCursor } from "./cursor.js";
|
|
5
|
+
import { BlobConflictError, CursorExpiredError, InvalidCursorError, } from "./types.js";
|
|
6
|
+
import { InvalidCursorSyntaxError } from "./cursor.js";
|
|
7
|
+
function blobIdForBytes(bytes) {
|
|
8
|
+
return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
9
|
+
}
|
|
10
|
+
function rowKey(instance, stream, recordKey) {
|
|
11
|
+
return `${instance}\0${stream}\0${recordKey}`;
|
|
12
|
+
}
|
|
13
|
+
function parseOffset(value) {
|
|
14
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
|
|
15
|
+
throw new InvalidCursorError();
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* In-memory PdppRecordStore. Stands in for the Enclave runtime for this
|
|
21
|
+
* lane's own tests and as a second implementation of the shared interface.
|
|
22
|
+
* This is NOT a real Enclave persistence integration — that needs the
|
|
23
|
+
* supplied Enclave runtime, which this lane does not have access to.
|
|
24
|
+
*/
|
|
25
|
+
export function createMemoryRecordStore() {
|
|
26
|
+
const current = new Map();
|
|
27
|
+
const history = [];
|
|
28
|
+
const blobs = new Map();
|
|
29
|
+
const blobBytes = new Map();
|
|
30
|
+
const epoch = randomUUID();
|
|
31
|
+
let writeClock = 0; // monotonic logical clock, avoids wall-clock ties in tests
|
|
32
|
+
function nextWriteTimestamp() {
|
|
33
|
+
writeClock += 1;
|
|
34
|
+
// Encode as an ISO-ish sortable string using the logical clock so
|
|
35
|
+
// multiple writes within the same millisecond still order correctly.
|
|
36
|
+
return new Date(writeClock).toISOString();
|
|
37
|
+
}
|
|
38
|
+
function cursorEpoch() {
|
|
39
|
+
return epoch;
|
|
40
|
+
}
|
|
41
|
+
function assertCursorScope(payload, stream) {
|
|
42
|
+
if (payload.stream !== stream) {
|
|
43
|
+
throw new CursorExpiredError();
|
|
44
|
+
}
|
|
45
|
+
if (payload.epoch !== cursorEpoch()) {
|
|
46
|
+
throw new CursorExpiredError();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function ingestBatch(envelopes, streamSemantics, primaryKeyFields, _binding, validateData) {
|
|
50
|
+
const results = [];
|
|
51
|
+
// Stage writes and commit them together, so a thrown error leaves no
|
|
52
|
+
// partial state (the in-memory twin of the SQLite transaction). Later
|
|
53
|
+
// envelopes read the staged rows, so two envelopes for one key are
|
|
54
|
+
// decided in order.
|
|
55
|
+
const staged = new Map();
|
|
56
|
+
const stagedHistory = [];
|
|
57
|
+
const read = (key) => staged.get(key) ?? current.get(key);
|
|
58
|
+
envelopes.forEach((envelope, index) => {
|
|
59
|
+
const plan = planIngest(index, envelope, streamSemantics(envelope.stream, envelope.instance), primaryKeyFields(envelope.stream, envelope.instance), (recordKey) => {
|
|
60
|
+
const row = read(rowKey(envelope.instance, envelope.stream, recordKey));
|
|
61
|
+
if (!row)
|
|
62
|
+
return undefined;
|
|
63
|
+
return row.deleted
|
|
64
|
+
? { deleted: true, data: null }
|
|
65
|
+
: { deleted: false, data: row.data };
|
|
66
|
+
}, validateData);
|
|
67
|
+
results.push(plan.outcome);
|
|
68
|
+
if (!plan.write)
|
|
69
|
+
return;
|
|
70
|
+
const { recordKey, data } = plan.write;
|
|
71
|
+
const key = rowKey(envelope.instance, envelope.stream, recordKey);
|
|
72
|
+
const version = (read(key)?.version ?? 0) + 1;
|
|
73
|
+
const row = data === null
|
|
74
|
+
? {
|
|
75
|
+
instance: envelope.instance,
|
|
76
|
+
stream: envelope.stream,
|
|
77
|
+
recordKey,
|
|
78
|
+
version,
|
|
79
|
+
deletedAt: envelope.emitted_at,
|
|
80
|
+
emittedAt: envelope.emitted_at,
|
|
81
|
+
deleted: true,
|
|
82
|
+
}
|
|
83
|
+
: {
|
|
84
|
+
instance: envelope.instance,
|
|
85
|
+
stream: envelope.stream,
|
|
86
|
+
recordKey,
|
|
87
|
+
data,
|
|
88
|
+
version,
|
|
89
|
+
emittedAt: envelope.emitted_at,
|
|
90
|
+
deleted: false,
|
|
91
|
+
};
|
|
92
|
+
staged.set(key, row);
|
|
93
|
+
stagedHistory.push({
|
|
94
|
+
instance: envelope.instance,
|
|
95
|
+
stream: envelope.stream,
|
|
96
|
+
recordKey,
|
|
97
|
+
version,
|
|
98
|
+
writtenAt: nextWriteTimestamp(),
|
|
99
|
+
row,
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
for (const [key, row] of staged)
|
|
103
|
+
current.set(key, row);
|
|
104
|
+
history.push(...stagedHistory);
|
|
105
|
+
return summarizeIngest(results);
|
|
106
|
+
}
|
|
107
|
+
function getRecord(instance, stream, recordKey) {
|
|
108
|
+
const row = current.get(rowKey(instance, stream, recordKey));
|
|
109
|
+
if (!row || row.deleted)
|
|
110
|
+
return undefined;
|
|
111
|
+
return row;
|
|
112
|
+
}
|
|
113
|
+
function projectFields(data, fields) {
|
|
114
|
+
if (!fields)
|
|
115
|
+
return data;
|
|
116
|
+
const projected = {};
|
|
117
|
+
for (const field of fields) {
|
|
118
|
+
if (field in data)
|
|
119
|
+
projected[field] = data[field];
|
|
120
|
+
}
|
|
121
|
+
return projected;
|
|
122
|
+
}
|
|
123
|
+
function sortKey(row) {
|
|
124
|
+
// cursor_field is modeled here as emittedAt (stand-in for the declared
|
|
125
|
+
// cursor_field — the ingest path only knows emitted_at, per-stream
|
|
126
|
+
// declared cursor fields are a SourceDeclaration concern the RS route
|
|
127
|
+
// layer resolves before calling into the store).
|
|
128
|
+
return [row.emittedAt, row.recordKey];
|
|
129
|
+
}
|
|
130
|
+
function listRecords(stream, options) {
|
|
131
|
+
let startAfter = null;
|
|
132
|
+
if (options.cursor) {
|
|
133
|
+
const payload = decodeCursor(options.cursor);
|
|
134
|
+
if (payload.kind !== "list")
|
|
135
|
+
throw new InvalidCursorError();
|
|
136
|
+
assertCursorScope(payload, stream);
|
|
137
|
+
if (payload.order !== options.order)
|
|
138
|
+
throw new InvalidCursorError();
|
|
139
|
+
startAfter = [payload.sortValue ?? "", payload.recordKey];
|
|
140
|
+
}
|
|
141
|
+
const rows = Array.from(current.values()).filter((row) => !row.deleted &&
|
|
142
|
+
row.stream === stream &&
|
|
143
|
+
options.instanceIds.includes(row.instance));
|
|
144
|
+
rows.sort((a, b) => {
|
|
145
|
+
const [aVal, aKey] = sortKey(a);
|
|
146
|
+
const [bVal, bKey] = sortKey(b);
|
|
147
|
+
const cmp = aVal === bVal ? aKey.localeCompare(bKey) : aVal < bVal ? -1 : 1;
|
|
148
|
+
return options.order === "asc" ? cmp : -cmp;
|
|
149
|
+
});
|
|
150
|
+
let filtered = rows;
|
|
151
|
+
if (startAfter) {
|
|
152
|
+
const [afterVal, afterKey] = startAfter;
|
|
153
|
+
filtered = rows.filter((row) => {
|
|
154
|
+
const [val, key] = sortKey(row);
|
|
155
|
+
const cmp = val === afterVal
|
|
156
|
+
? key.localeCompare(afterKey)
|
|
157
|
+
: val < afterVal
|
|
158
|
+
? -1
|
|
159
|
+
: 1;
|
|
160
|
+
return options.order === "asc" ? cmp > 0 : cmp < 0;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const page = filtered.slice(0, options.limit);
|
|
164
|
+
const hasMore = filtered.length > options.limit;
|
|
165
|
+
const last = page[page.length - 1];
|
|
166
|
+
return {
|
|
167
|
+
data: page.map((row) => ({
|
|
168
|
+
...row,
|
|
169
|
+
data: projectFields(row.data, options.fields),
|
|
170
|
+
})),
|
|
171
|
+
hasMore,
|
|
172
|
+
nextCursor: hasMore && last
|
|
173
|
+
? encodeCursor({
|
|
174
|
+
kind: "list",
|
|
175
|
+
stream,
|
|
176
|
+
epoch: cursorEpoch(),
|
|
177
|
+
order: options.order,
|
|
178
|
+
sortValue: sortKey(last)[0],
|
|
179
|
+
recordKey: last.recordKey,
|
|
180
|
+
})
|
|
181
|
+
: undefined,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function deleteRecord(instance, stream, recordKey, deletedAt, streamSemantics) {
|
|
185
|
+
if (streamSemantics === "append_only")
|
|
186
|
+
return false;
|
|
187
|
+
const key = rowKey(instance, stream, recordKey);
|
|
188
|
+
const existing = current.get(key);
|
|
189
|
+
if (!existing || existing.deleted)
|
|
190
|
+
return false;
|
|
191
|
+
const version = existing.version + 1;
|
|
192
|
+
const tombstone = {
|
|
193
|
+
instance,
|
|
194
|
+
stream,
|
|
195
|
+
recordKey,
|
|
196
|
+
version,
|
|
197
|
+
deletedAt,
|
|
198
|
+
emittedAt: deletedAt,
|
|
199
|
+
deleted: true,
|
|
200
|
+
};
|
|
201
|
+
current.set(key, tombstone);
|
|
202
|
+
history.push({
|
|
203
|
+
instance,
|
|
204
|
+
stream,
|
|
205
|
+
recordKey,
|
|
206
|
+
version,
|
|
207
|
+
writtenAt: nextWriteTimestamp(),
|
|
208
|
+
row: tombstone,
|
|
209
|
+
});
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
function changesSince(stream, options) {
|
|
213
|
+
let horizon;
|
|
214
|
+
let sinceHorizon;
|
|
215
|
+
let offset = 0;
|
|
216
|
+
if (options.cursor) {
|
|
217
|
+
// Continuing an already-anchored session: horizon and sinceHorizon
|
|
218
|
+
// both come from the page cursor, not re-derived from changesSince.
|
|
219
|
+
const payload = decodeCursor(options.cursor);
|
|
220
|
+
if (payload.kind !== "changes_since")
|
|
221
|
+
throw new InvalidCursorError();
|
|
222
|
+
assertCursorScope(payload, stream);
|
|
223
|
+
horizon = payload.horizon;
|
|
224
|
+
sinceHorizon = payload.sinceHorizon;
|
|
225
|
+
offset = parseOffset(payload.offset);
|
|
226
|
+
}
|
|
227
|
+
else if (options.changesSince) {
|
|
228
|
+
let payload;
|
|
229
|
+
try {
|
|
230
|
+
payload = decodeCursor(options.changesSince);
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
if (err instanceof InvalidCursorSyntaxError) {
|
|
234
|
+
throw new CursorExpiredError();
|
|
235
|
+
}
|
|
236
|
+
throw err;
|
|
237
|
+
}
|
|
238
|
+
if (payload.kind !== "changes_since")
|
|
239
|
+
throw new InvalidCursorError();
|
|
240
|
+
assertCursorScope(payload, stream);
|
|
241
|
+
// The incoming token is the *previous* session's horizon. This
|
|
242
|
+
// session's page-1 horizon is anchored fresh at "now" so writes that
|
|
243
|
+
// land mid-session don't leak into this session's later pages.
|
|
244
|
+
sinceHorizon = payload.horizon;
|
|
245
|
+
horizon = nextWriteTimestamp();
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// First-ever sync: no baseline, every current record is "changed".
|
|
249
|
+
sinceHorizon = null;
|
|
250
|
+
horizon = nextWriteTimestamp();
|
|
251
|
+
}
|
|
252
|
+
// Every write strictly after `horizon` is excluded from every page of
|
|
253
|
+
// this session (session-horizon anchoring) — new writes surface only
|
|
254
|
+
// via the next session's `changes_since`.
|
|
255
|
+
const relevant = history.filter((entry) => entry.stream === stream &&
|
|
256
|
+
options.instanceIds.includes(entry.instance) &&
|
|
257
|
+
entry.writtenAt <= horizon);
|
|
258
|
+
const latestAsOfHorizon = new Map();
|
|
259
|
+
for (const entry of relevant) {
|
|
260
|
+
const k = rowKey(entry.instance, entry.stream, entry.recordKey);
|
|
261
|
+
const prior = latestAsOfHorizon.get(k);
|
|
262
|
+
if (!prior || entry.version > prior.version) {
|
|
263
|
+
latestAsOfHorizon.set(k, entry);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const changed = [];
|
|
267
|
+
for (const entry of latestAsOfHorizon.values()) {
|
|
268
|
+
if (sinceHorizon !== null) {
|
|
269
|
+
const wroteSincePrior = history.some((h) => h.stream === entry.stream &&
|
|
270
|
+
h.recordKey === entry.recordKey &&
|
|
271
|
+
h.instance === entry.instance &&
|
|
272
|
+
h.writtenAt > sinceHorizon &&
|
|
273
|
+
h.writtenAt <= horizon);
|
|
274
|
+
if (!wroteSincePrior)
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (entry.row.deleted) {
|
|
278
|
+
changed.push(entry.row);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const projectedNow = projectFields(entry.row.data, options.fields);
|
|
282
|
+
if (sinceHorizon !== null && options.fields) {
|
|
283
|
+
// Eligibility MUST be computed on the grant-authorized projection
|
|
284
|
+
// (spec §4): if only unauthorized fields changed since the prior
|
|
285
|
+
// session horizon, this record must not appear as "changed".
|
|
286
|
+
const priorEntry = [...history]
|
|
287
|
+
.filter((h) => h.stream === entry.stream &&
|
|
288
|
+
h.recordKey === entry.recordKey &&
|
|
289
|
+
h.instance === entry.instance &&
|
|
290
|
+
h.writtenAt <= sinceHorizon)
|
|
291
|
+
.sort((a, b) => b.version - a.version)[0];
|
|
292
|
+
if (priorEntry && !priorEntry.row.deleted) {
|
|
293
|
+
const priorProjected = projectFields(priorEntry.row.data, options.fields);
|
|
294
|
+
if (JSON.stringify(priorProjected) === JSON.stringify(projectedNow)) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Return the RAW (unprojected) row here, not `projectedNow`. Eligibility
|
|
300
|
+
// above legitimately needs the grant-authorized projection to decide
|
|
301
|
+
// "did the authorized fields change" without leaking a hidden-field
|
|
302
|
+
// change. But a caller enforcing time_constraint against `row.data`
|
|
303
|
+
// (packages/server/src/routes/pdpp-records.ts) needs the real field
|
|
304
|
+
// value, not one already stripped to the grant's fields — projecting
|
|
305
|
+
// here would silently break that filter for any grant whose fields
|
|
306
|
+
// don't happen to include the time_constraint field. Field projection
|
|
307
|
+
// for the response is the caller's job, applied AFTER any filtering
|
|
308
|
+
// that reads real field values.
|
|
309
|
+
changed.push(entry.row);
|
|
310
|
+
}
|
|
311
|
+
changed.sort((a, b) => a.recordKey.localeCompare(b.recordKey));
|
|
312
|
+
const page = changed.slice(offset, offset + options.limit);
|
|
313
|
+
const hasMore = offset + options.limit < changed.length;
|
|
314
|
+
return {
|
|
315
|
+
data: page,
|
|
316
|
+
hasMore,
|
|
317
|
+
nextCursor: hasMore
|
|
318
|
+
? encodeCursor({
|
|
319
|
+
kind: "changes_since",
|
|
320
|
+
stream,
|
|
321
|
+
epoch: cursorEpoch(),
|
|
322
|
+
horizon,
|
|
323
|
+
sinceHorizon,
|
|
324
|
+
offset: offset + options.limit,
|
|
325
|
+
})
|
|
326
|
+
: undefined,
|
|
327
|
+
nextChangesSince: hasMore
|
|
328
|
+
? undefined
|
|
329
|
+
: encodeCursor({
|
|
330
|
+
kind: "changes_since",
|
|
331
|
+
stream,
|
|
332
|
+
epoch: cursorEpoch(),
|
|
333
|
+
horizon,
|
|
334
|
+
sinceHorizon: null,
|
|
335
|
+
offset: 0,
|
|
336
|
+
}),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function listStreams(instanceIds) {
|
|
340
|
+
const byStream = new Map();
|
|
341
|
+
for (const row of current.values()) {
|
|
342
|
+
if (row.deleted)
|
|
343
|
+
continue;
|
|
344
|
+
if (!instanceIds.includes(row.instance))
|
|
345
|
+
continue;
|
|
346
|
+
const entry = byStream.get(row.stream) ?? { count: 0, lastUpdated: null };
|
|
347
|
+
entry.count += 1;
|
|
348
|
+
const updated = row.emittedAt;
|
|
349
|
+
if (!entry.lastUpdated || updated > entry.lastUpdated) {
|
|
350
|
+
entry.lastUpdated = updated;
|
|
351
|
+
}
|
|
352
|
+
byStream.set(row.stream, entry);
|
|
353
|
+
}
|
|
354
|
+
return Array.from(byStream.entries()).map(([stream, v]) => ({
|
|
355
|
+
stream,
|
|
356
|
+
recordCount: v.count,
|
|
357
|
+
lastUpdated: v.lastUpdated,
|
|
358
|
+
}));
|
|
359
|
+
}
|
|
360
|
+
function findBlobReferences(blobId) {
|
|
361
|
+
// Scanned on demand rather than maintained as a separate mutable index:
|
|
362
|
+
// this store already holds every current row in memory, and a scan
|
|
363
|
+
// avoids a second piece of state that could drift from `current` on
|
|
364
|
+
// every ingest/delete. A record's blob reference lives at
|
|
365
|
+
// `data.blob_ref.blob_id` per spec §4 "Binary data (blob_ref)". Every
|
|
366
|
+
// matching non-deleted row is returned -- identical bytes can
|
|
367
|
+
// legitimately be referenced by more than one record.
|
|
368
|
+
const references = [];
|
|
369
|
+
for (const row of current.values()) {
|
|
370
|
+
if (row.deleted)
|
|
371
|
+
continue;
|
|
372
|
+
const blobRef = row.data.blob_ref;
|
|
373
|
+
if (blobRef &&
|
|
374
|
+
typeof blobRef === "object" &&
|
|
375
|
+
blobRef.blob_id === blobId) {
|
|
376
|
+
references.push({
|
|
377
|
+
instance: row.instance,
|
|
378
|
+
stream: row.stream,
|
|
379
|
+
recordKey: row.recordKey,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return references;
|
|
384
|
+
}
|
|
385
|
+
/** True only when the stored bytes actually hash/size-match `meta`. */
|
|
386
|
+
function storedBytesVerify(meta) {
|
|
387
|
+
const bytes = blobBytes.get(meta.blobId);
|
|
388
|
+
if (!bytes)
|
|
389
|
+
return false;
|
|
390
|
+
if (bytes.byteLength !== meta.sizeBytes)
|
|
391
|
+
return false;
|
|
392
|
+
return createHash("sha256").update(bytes).digest("hex") === meta.sha256;
|
|
393
|
+
}
|
|
394
|
+
function storeBlobBytes(bytes, mimeType) {
|
|
395
|
+
const blobId = blobIdForBytes(bytes);
|
|
396
|
+
const existing = blobs.get(blobId);
|
|
397
|
+
if (existing) {
|
|
398
|
+
const sha256 = blobId.slice("sha256:".length);
|
|
399
|
+
if (existing.mimeType !== mimeType ||
|
|
400
|
+
existing.sha256 !== sha256 ||
|
|
401
|
+
existing.sizeBytes !== bytes.byteLength) {
|
|
402
|
+
throw new BlobConflictError(blobId, existing);
|
|
403
|
+
}
|
|
404
|
+
if (!blobBytes.has(existing.blobId)) {
|
|
405
|
+
// Metadata-only row (legacy/test fixture via putBlobMeta, or a prior
|
|
406
|
+
// write that never got this far): complete it with real bytes now,
|
|
407
|
+
// rather than reporting a false "already stored" no-op.
|
|
408
|
+
blobBytes.set(blobId, bytes.slice());
|
|
409
|
+
return existing;
|
|
410
|
+
}
|
|
411
|
+
if (!storedBytesVerify(existing)) {
|
|
412
|
+
// Bytes are present but corrupt relative to their own metadata.
|
|
413
|
+
// Reporting success here would hand back an existing-looking
|
|
414
|
+
// success while the underlying content stays broken; refuse
|
|
415
|
+
// instead of silently repairing or silently succeeding.
|
|
416
|
+
throw new BlobConflictError(blobId, existing);
|
|
417
|
+
}
|
|
418
|
+
// Verified idempotent no-op: content and mimeType both match.
|
|
419
|
+
return existing;
|
|
420
|
+
}
|
|
421
|
+
const sha256 = blobId.slice("sha256:".length);
|
|
422
|
+
const meta = {
|
|
423
|
+
blobId,
|
|
424
|
+
mimeType,
|
|
425
|
+
sizeBytes: bytes.byteLength,
|
|
426
|
+
sha256,
|
|
427
|
+
};
|
|
428
|
+
// Bytes and metadata become visible together: no reader can observe one
|
|
429
|
+
// without the other.
|
|
430
|
+
blobBytes.set(blobId, bytes.slice());
|
|
431
|
+
blobs.set(blobId, meta);
|
|
432
|
+
return meta;
|
|
433
|
+
}
|
|
434
|
+
function getBlobBytes(blobId) {
|
|
435
|
+
const meta = blobs.get(blobId);
|
|
436
|
+
const bytes = blobBytes.get(blobId);
|
|
437
|
+
if (!meta || !bytes)
|
|
438
|
+
return undefined;
|
|
439
|
+
if (bytes.byteLength !== meta.sizeBytes)
|
|
440
|
+
return undefined;
|
|
441
|
+
const actualHash = createHash("sha256").update(bytes).digest("hex");
|
|
442
|
+
if (actualHash !== meta.sha256)
|
|
443
|
+
return undefined;
|
|
444
|
+
return bytes.slice();
|
|
445
|
+
}
|
|
446
|
+
return {
|
|
447
|
+
ingestBatch,
|
|
448
|
+
getRecord,
|
|
449
|
+
listRecords,
|
|
450
|
+
deleteRecord,
|
|
451
|
+
changesSince,
|
|
452
|
+
listStreams,
|
|
453
|
+
putBlobMeta: (meta) => blobs.set(meta.blobId, meta),
|
|
454
|
+
getBlobMeta: (blobId) => blobs.get(blobId),
|
|
455
|
+
storeBlobBytes,
|
|
456
|
+
getBlobBytes,
|
|
457
|
+
findBlobReferences,
|
|
458
|
+
close: () => {
|
|
459
|
+
current.clear();
|
|
460
|
+
history.length = 0;
|
|
461
|
+
blobs.clear();
|
|
462
|
+
blobBytes.clear();
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../../src/storage/pdpp-records/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Record decisions and contracts shared by Node and browser runtimes. */
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export type { PdppRecordStore, BlobReference } from "./interface.js";
|
|
4
|
+
export { encodeRecordKey, computeRecordKeyFromData, keyMatchesData, RecordKeyError, } from "./record-key.js";
|
|
5
|
+
export * from "./cursor.js";
|
|
6
|
+
export * from "./ingest-plan.js";
|
|
7
|
+
export * from "./stream-declaration.js";
|
|
8
|
+
export * from "./enforcement.js";
|
|
9
|
+
//# sourceMappingURL=portable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable.d.ts","sourceRoot":"","sources":["../../../src/storage/pdpp-records/portable.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Record decisions and contracts shared by Node and browser runtimes. */
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export { encodeRecordKey, computeRecordKeyFromData, keyMatchesData, RecordKeyError, } from "./record-key.js";
|
|
4
|
+
export * from "./cursor.js";
|
|
5
|
+
export * from "./ingest-plan.js";
|
|
6
|
+
export * from "./stream-declaration.js";
|
|
7
|
+
export * from "./enforcement.js";
|
|
8
|
+
//# sourceMappingURL=portable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable.js","sourceRoot":"","sources":["../../../src/storage/pdpp-records/portable.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,cAAc,YAAY,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
|