@opendatalabs/personal-server-ts-core 1.33.8 → 1.34.1
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 +5 -1
- package/dist/legacy-projection/index.d.ts.map +1 -1
- package/dist/legacy-projection/index.js +55 -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/read-client.d.ts.map +1 -1
- package/dist/mcp/read-client.js +10 -1
- package/dist/mcp/read-client.js.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 +13 -10
- package/dist/storage/legacy-projection.d.ts.map +1 -1
- package/dist/storage/legacy-projection.js +269 -74
- 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,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDPP Core §6 selection-request validation.
|
|
3
|
+
*
|
|
4
|
+
* This is the shape gate that runs before consent. It answers one question:
|
|
5
|
+
* is this request expressible against the retained declaration snapshot? It
|
|
6
|
+
* does not resolve anything — `resolve.ts` does that, and only against the
|
|
7
|
+
* same snapshot this module validated against.
|
|
8
|
+
*
|
|
9
|
+
* "Fails neutrally" in §6 means the both/neither `streams`/`selection_preset`
|
|
10
|
+
* failure is a Source validation failure the binding maps to an error code; it
|
|
11
|
+
* must not leak which of the two the client got wrong, and it must not depend
|
|
12
|
+
* on any owner-specific state. We return a binding-neutral failure and let the
|
|
13
|
+
* OAuth/RAR layer map it to RFC 9396 `invalid_authorization_details`.
|
|
14
|
+
*/
|
|
15
|
+
import { PDPP_DATA_ACCESS_TYPE, PDPP_DATA_ACCESS_TYPE_V02, } from "./types.js";
|
|
16
|
+
function fail(code, message) {
|
|
17
|
+
return { ok: false, failure: { code, message } };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Canonical key strings: a plain string for a simple key, a minified JSON
|
|
21
|
+
* array for a compound key (§6 `resources`). We validate arity and type
|
|
22
|
+
* against the declaration's `primary_key` here so an unsatisfiable resource
|
|
23
|
+
* list is rejected at issuance rather than silently matching nothing at the RS.
|
|
24
|
+
*/
|
|
25
|
+
function validateResourceKey(raw, primaryKey) {
|
|
26
|
+
if (primaryKey.length <= 1) {
|
|
27
|
+
// A simple key is a plain string. A JSON array here is an arity error.
|
|
28
|
+
if (raw.startsWith("[")) {
|
|
29
|
+
return "expected a simple key string, got a compound key array";
|
|
30
|
+
}
|
|
31
|
+
return raw.length > 0 ? null : "resource key must not be empty";
|
|
32
|
+
}
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return "compound resource key must be a minified JSON array";
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(parsed)) {
|
|
41
|
+
return "compound resource key must be a JSON array";
|
|
42
|
+
}
|
|
43
|
+
if (parsed.length !== primaryKey.length) {
|
|
44
|
+
return `compound resource key has ${parsed.length} parts, declaration primary_key has ${primaryKey.length}`;
|
|
45
|
+
}
|
|
46
|
+
if (!parsed.every((part) => typeof part === "string")) {
|
|
47
|
+
return "compound resource key parts must be strings";
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The field set a `minimum.fields` member must be drawn from: the *expanded
|
|
53
|
+
* request*, not the declaration.
|
|
54
|
+
*
|
|
55
|
+
* v0.2 requires rejecting fields "outside the expanded request", which is a
|
|
56
|
+
* stricter gate than the declared schema. A floor naming a field the client
|
|
57
|
+
* did not request is incoherent — the upper limit already excludes it, so the
|
|
58
|
+
* minimum could never be met and the request could never succeed. Catching it
|
|
59
|
+
* here turns a guaranteed `access_denied` at issuance into a fixable shape
|
|
60
|
+
* error before a human is asked to decide anything.
|
|
61
|
+
*/
|
|
62
|
+
function expandedRequestFields(stream, declared, snapshot) {
|
|
63
|
+
if (stream.view !== undefined) {
|
|
64
|
+
const view = snapshot.views?.find((v) => v.name === stream.view);
|
|
65
|
+
// An unresolvable view already failed above; treat it as empty here.
|
|
66
|
+
return view ? view.fields.filter((f) => declared.fields.includes(f)) : [];
|
|
67
|
+
}
|
|
68
|
+
if (stream.fields !== undefined) {
|
|
69
|
+
return stream.fields.filter((f) => declared.fields.includes(f));
|
|
70
|
+
}
|
|
71
|
+
// Omitting both asks for all permitted fields, so the whole declared set is
|
|
72
|
+
// in the expanded request.
|
|
73
|
+
return declared.fields;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validate a request `time_range`'s own shape, independent of which stream
|
|
77
|
+
* carries it.
|
|
78
|
+
*
|
|
79
|
+
* Shared by the named-stream path and the wildcard path so the two cannot
|
|
80
|
+
* disagree about what a well-formed window is. Before this was factored out,
|
|
81
|
+
* a wildcard's window skipped every check here — unparseable bounds, an
|
|
82
|
+
* inverted `since`/`until`, and an empty `{}` were all accepted, while the
|
|
83
|
+
* same values written longhand were rejected. A shorthand that validates less
|
|
84
|
+
* than the form it stands for is a hole, not a convenience.
|
|
85
|
+
*
|
|
86
|
+
* `value` is untrusted JSON, so the object and string types are checked
|
|
87
|
+
* rather than assumed: a `null` or a number here must be a validation failure,
|
|
88
|
+
* not a `TypeError` that the binding turns into a 500.
|
|
89
|
+
*/
|
|
90
|
+
function validateTimeRangeBounds(value, subject) {
|
|
91
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
92
|
+
return fail("invalid_request", `${subject} time_range must be an object`);
|
|
93
|
+
}
|
|
94
|
+
const { since, until } = value;
|
|
95
|
+
if (since === undefined && until === undefined) {
|
|
96
|
+
return fail("invalid_request", `${subject} has an empty time_range`);
|
|
97
|
+
}
|
|
98
|
+
for (const [label, bound] of [
|
|
99
|
+
["since", since],
|
|
100
|
+
["until", until],
|
|
101
|
+
]) {
|
|
102
|
+
if (bound === undefined)
|
|
103
|
+
continue;
|
|
104
|
+
if (typeof bound !== "string" || Number.isNaN(Date.parse(bound))) {
|
|
105
|
+
return fail("invalid_request", `${subject} time_range.${label} is not a valid ISO 8601 instant`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (typeof since === "string" && typeof until === "string") {
|
|
109
|
+
if (Date.parse(since) >= Date.parse(until)) {
|
|
110
|
+
return fail("invalid_request", `${subject} time_range.since must precede time_range.until`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { ok: true };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Validate one v0.2 `minimum` against the request that carries it.
|
|
117
|
+
*
|
|
118
|
+
* Everything here is a shape question answerable without the owner, the
|
|
119
|
+
* inventory, or any record. Whether the *owner's* narrowing then satisfies a
|
|
120
|
+
* well-formed minimum is an issuance question, handled in `resolve.ts`.
|
|
121
|
+
*/
|
|
122
|
+
function validateMinimum(stream, declared, snapshot) {
|
|
123
|
+
const minimum = stream.minimum;
|
|
124
|
+
if (minimum === undefined)
|
|
125
|
+
return { ok: true };
|
|
126
|
+
const bad = (message) => fail("invalid_minimum", `stream '${stream.name}' minimum: ${message}`);
|
|
127
|
+
if (typeof minimum !== "object" || minimum === null) {
|
|
128
|
+
return bad("must be an object");
|
|
129
|
+
}
|
|
130
|
+
// Only `fields` and `time_range` are recognized. An unknown member must not
|
|
131
|
+
// pass silently: the client would believe it imposed a condition the AS
|
|
132
|
+
// never evaluates.
|
|
133
|
+
const unknown = Object.keys(minimum).filter((key) => key !== "fields" && key !== "time_range");
|
|
134
|
+
if (unknown.length > 0) {
|
|
135
|
+
return bad(`unknown member(s) ${unknown.join(", ")}`);
|
|
136
|
+
}
|
|
137
|
+
if (minimum.fields === undefined && minimum.time_range === undefined) {
|
|
138
|
+
return bad("must specify at least one of fields or time_range");
|
|
139
|
+
}
|
|
140
|
+
if (minimum.fields !== undefined) {
|
|
141
|
+
const fields = minimum.fields;
|
|
142
|
+
if (!Array.isArray(fields) || fields.length === 0) {
|
|
143
|
+
return bad("fields must be a non-empty array");
|
|
144
|
+
}
|
|
145
|
+
if (!fields.every((f) => typeof f === "string" && f.length > 0)) {
|
|
146
|
+
return bad("fields must contain non-empty strings");
|
|
147
|
+
}
|
|
148
|
+
if (new Set(fields).size !== fields.length) {
|
|
149
|
+
return bad("fields must not contain duplicates");
|
|
150
|
+
}
|
|
151
|
+
const permitted = expandedRequestFields(stream, declared, snapshot);
|
|
152
|
+
const outside = fields.filter((f) => !permitted.includes(f));
|
|
153
|
+
if (outside.length > 0) {
|
|
154
|
+
return bad(`fields outside the expanded request: ${outside.join(", ")}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (minimum.time_range !== undefined) {
|
|
158
|
+
const range = minimum.time_range;
|
|
159
|
+
if (typeof range !== "object" || range === null || Array.isArray(range)) {
|
|
160
|
+
return bad("time_range must be an object");
|
|
161
|
+
}
|
|
162
|
+
const { since, until } = range;
|
|
163
|
+
// Unlike a request `time_range`, a minimum window must be closed: an open
|
|
164
|
+
// floor would mean "at least everything", which no narrowing can satisfy
|
|
165
|
+
// and which the request's own upper limit already bounds.
|
|
166
|
+
if (typeof since !== "string" || typeof until !== "string") {
|
|
167
|
+
return bad("time_range must contain both since and until");
|
|
168
|
+
}
|
|
169
|
+
const from = Date.parse(since);
|
|
170
|
+
const to = Date.parse(until);
|
|
171
|
+
if (Number.isNaN(from) || Number.isNaN(to)) {
|
|
172
|
+
return bad("time_range bounds must be valid ISO 8601 instants");
|
|
173
|
+
}
|
|
174
|
+
if (from >= to) {
|
|
175
|
+
return bad("time_range.since must precede time_range.until");
|
|
176
|
+
}
|
|
177
|
+
if (!declared.consent_time_field) {
|
|
178
|
+
return bad("stream declares no consent_time_field and cannot carry a time minimum");
|
|
179
|
+
}
|
|
180
|
+
// The floor must sit inside the ceiling. Comparisons are on instants, so
|
|
181
|
+
// an offset-bearing timestamp is ordered by the moment it names rather
|
|
182
|
+
// than by its string form.
|
|
183
|
+
const requested = stream.time_range;
|
|
184
|
+
const ceilingSince = requested?.since !== undefined ? Date.parse(requested.since) : -Infinity;
|
|
185
|
+
const ceilingUntil = requested?.until !== undefined ? Date.parse(requested.until) : Infinity;
|
|
186
|
+
if (from < ceilingSince || to > ceilingUntil) {
|
|
187
|
+
return bad("time_range falls outside the requested time_range");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return { ok: true };
|
|
191
|
+
}
|
|
192
|
+
function validateStreamRequest(stream, snapshot, revision) {
|
|
193
|
+
// The entry is untrusted JSON: `streams: [null]` and `streams: ["name"]`
|
|
194
|
+
// both reach here. Every check below reads a member off it, so the shape
|
|
195
|
+
// gate comes first or the first read throws.
|
|
196
|
+
if (typeof stream !== "object" || stream === null || Array.isArray(stream)) {
|
|
197
|
+
return fail("invalid_request", "each stream entry must be an object");
|
|
198
|
+
}
|
|
199
|
+
if (typeof stream.name !== "string" || stream.name.length === 0) {
|
|
200
|
+
return fail("invalid_request", "each stream entry must carry a non-empty name");
|
|
201
|
+
}
|
|
202
|
+
if (stream.necessity !== undefined) {
|
|
203
|
+
if (stream.necessity !== "required" && stream.necessity !== "optional") {
|
|
204
|
+
return fail("invalid_request", `stream '${stream.name}' necessity must be required or optional`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (stream.minimum !== undefined && revision === "0.1") {
|
|
208
|
+
// v0.1 has no `minimum`. Accepting and ignoring it is the one outcome
|
|
209
|
+
// worse than rejecting: the client would ship believing a floor is
|
|
210
|
+
// enforced. A client that wants minima moves to the v0.2 type.
|
|
211
|
+
return fail("unsupported_selection_parameter", `stream '${stream.name}' carries minimum, which requires the ${PDPP_DATA_ACCESS_TYPE_V02} detail type`);
|
|
212
|
+
}
|
|
213
|
+
// A wildcard is checked by the caller (it must be the sole entry) and
|
|
214
|
+
// expands during resolution, so there is no declared stream to match yet.
|
|
215
|
+
if (stream.name === "*") {
|
|
216
|
+
if (stream.view !== undefined) {
|
|
217
|
+
return fail("unsupported_selection_parameter", "view cannot be combined with a wildcard stream selection");
|
|
218
|
+
}
|
|
219
|
+
if (stream.minimum !== undefined) {
|
|
220
|
+
// A wildcard minimum would be one floor asserted over every stream the
|
|
221
|
+
// declaration happens to contain, including streams whose schema has no
|
|
222
|
+
// such field and streams that cannot carry a time window at all. v0.2
|
|
223
|
+
// defines a minimum per named stream; it says nothing about what a
|
|
224
|
+
// fanned-out one would mean, so we do not invent semantics for it.
|
|
225
|
+
return fail("unsupported_selection_parameter", "minimum cannot be combined with a wildcard stream selection");
|
|
226
|
+
}
|
|
227
|
+
if (stream.time_range !== undefined) {
|
|
228
|
+
// A wildcard is shorthand for naming every declared stream, so it
|
|
229
|
+
// cannot mean something weaker than naming them. §6's rule for a named
|
|
230
|
+
// stream — "no consent_time_field, no time_range" — therefore applies
|
|
231
|
+
// to every stream the wildcard expands to.
|
|
232
|
+
//
|
|
233
|
+
// The alternative was to keep accepting this and let resolution drop
|
|
234
|
+
// the window for time-incapable streams, which is what the code did.
|
|
235
|
+
// That silently issued unbounded access to those streams from a request
|
|
236
|
+
// whose own words asked for a bounded one: the owner approved, and the
|
|
237
|
+
// client received, more than either had read. A request that cannot be
|
|
238
|
+
// carried out as written is refused, not quietly reinterpreted.
|
|
239
|
+
const incapable = snapshot.streams
|
|
240
|
+
.filter((s) => !s.consent_time_field)
|
|
241
|
+
.map((s) => s.name);
|
|
242
|
+
if (incapable.length > 0) {
|
|
243
|
+
return fail("unsupported_selection_parameter", `wildcard time_range expands to stream(s) that declare no consent_time_field and cannot accept it: ${incapable.join(", ")}`);
|
|
244
|
+
}
|
|
245
|
+
// The window's own shape is checked by the same rule a named stream's
|
|
246
|
+
// is; a wildcard must not be the weaker form.
|
|
247
|
+
const bounds = validateTimeRangeBounds(stream.time_range, "wildcard stream selection");
|
|
248
|
+
if (!bounds.ok)
|
|
249
|
+
return bounds;
|
|
250
|
+
}
|
|
251
|
+
return { ok: true };
|
|
252
|
+
}
|
|
253
|
+
const declared = snapshot.streams.find((s) => s.name === stream.name);
|
|
254
|
+
if (!declared) {
|
|
255
|
+
return fail("unknown_stream", `stream '${stream.name}' is not declared by the retained snapshot`);
|
|
256
|
+
}
|
|
257
|
+
if (stream.view !== undefined && stream.fields !== undefined) {
|
|
258
|
+
return fail("invalid_request", `stream '${stream.name}' specifies both view and fields, which are mutually exclusive`);
|
|
259
|
+
}
|
|
260
|
+
if (stream.view !== undefined) {
|
|
261
|
+
const view = snapshot.views?.find((v) => v.name === stream.view);
|
|
262
|
+
if (!view) {
|
|
263
|
+
return fail("unknown_view", `view '${stream.view}' is not defined for this source`);
|
|
264
|
+
}
|
|
265
|
+
// §9 AS item 12: a view naming a field absent from the retained schema is
|
|
266
|
+
// not resolvable, and we reject rather than silently dropping the field.
|
|
267
|
+
const absent = view.fields.filter((f) => !declared.fields.includes(f));
|
|
268
|
+
if (absent.length > 0) {
|
|
269
|
+
return fail("unknown_field", `view '${stream.view}' names fields absent from stream '${stream.name}': ${absent.join(", ")}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (stream.fields !== undefined) {
|
|
273
|
+
if (!Array.isArray(stream.fields)) {
|
|
274
|
+
return fail("invalid_request", `stream '${stream.name}' fields must be an array`);
|
|
275
|
+
}
|
|
276
|
+
if (stream.fields.length === 0) {
|
|
277
|
+
return fail("invalid_request", `stream '${stream.name}' specifies an empty fields list`);
|
|
278
|
+
}
|
|
279
|
+
if (!stream.fields.every((f) => typeof f === "string" && f.length > 0)) {
|
|
280
|
+
return fail("invalid_request", `stream '${stream.name}' fields must contain non-empty strings`);
|
|
281
|
+
}
|
|
282
|
+
const absent = stream.fields.filter((f) => !declared.fields.includes(f));
|
|
283
|
+
if (absent.length > 0) {
|
|
284
|
+
return fail("unknown_field", `stream '${stream.name}' requests fields absent from the retained schema: ${absent.join(", ")}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (stream.time_range !== undefined) {
|
|
288
|
+
// §6: the declaration's consent_time_field is the authoritative signal
|
|
289
|
+
// that a stream is time-range-capable. No field, no time_range.
|
|
290
|
+
if (!declared.consent_time_field) {
|
|
291
|
+
return fail("unsupported_selection_parameter", `stream '${stream.name}' declares no consent_time_field and cannot accept time_range`);
|
|
292
|
+
}
|
|
293
|
+
const bounds = validateTimeRangeBounds(stream.time_range, `stream '${stream.name}'`);
|
|
294
|
+
if (!bounds.ok)
|
|
295
|
+
return bounds;
|
|
296
|
+
}
|
|
297
|
+
if (stream.resources !== undefined) {
|
|
298
|
+
if (!Array.isArray(stream.resources)) {
|
|
299
|
+
return fail("invalid_request", `stream '${stream.name}' resources must be an array`);
|
|
300
|
+
}
|
|
301
|
+
if (stream.resources.length === 0) {
|
|
302
|
+
return fail("invalid_request", `stream '${stream.name}' specifies an empty resources list`);
|
|
303
|
+
}
|
|
304
|
+
for (const raw of stream.resources) {
|
|
305
|
+
if (typeof raw !== "string") {
|
|
306
|
+
return fail("invalid_resource_key", `stream '${stream.name}' resources must contain strings`);
|
|
307
|
+
}
|
|
308
|
+
const problem = validateResourceKey(raw, declared.primary_key);
|
|
309
|
+
if (problem) {
|
|
310
|
+
return fail("invalid_resource_key", `stream '${stream.name}' resource '${raw}': ${problem}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Last, so a minimum naming a field that is itself undeclared reports the
|
|
315
|
+
// undeclared field rather than the floor built on it.
|
|
316
|
+
return validateMinimum(stream, declared, snapshot);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Validate one selection request against the retained declaration snapshot.
|
|
320
|
+
*
|
|
321
|
+
* The caller must have already retrieved and pinned `snapshot`; this function
|
|
322
|
+
* never fetches. §9 AS item 16 requires that the same snapshot carry through
|
|
323
|
+
* consent and issuance, so passing a freshly fetched declaration here and a
|
|
324
|
+
* different one to `resolveGrant` would defeat the whole guarantee.
|
|
325
|
+
*/
|
|
326
|
+
export function validateSelectionRequest(request, snapshot) {
|
|
327
|
+
// Exactly two types are recognized, each resolved under its own revision.
|
|
328
|
+
// Anything else is rejected rather than processed as the nearest PDPP type:
|
|
329
|
+
// a type URI the AS does not implement carries rules it does not apply.
|
|
330
|
+
const revision = request.type === PDPP_DATA_ACCESS_TYPE_V02
|
|
331
|
+
? "0.2"
|
|
332
|
+
: request.type === PDPP_DATA_ACCESS_TYPE
|
|
333
|
+
? "0.1"
|
|
334
|
+
: null;
|
|
335
|
+
if (revision === null) {
|
|
336
|
+
return fail("invalid_request", `authorization detail type must be ${PDPP_DATA_ACCESS_TYPE} or ${PDPP_DATA_ACCESS_TYPE_V02}`);
|
|
337
|
+
}
|
|
338
|
+
if (typeof request.source !== "object" ||
|
|
339
|
+
request.source === null ||
|
|
340
|
+
Array.isArray(request.source)) {
|
|
341
|
+
return fail("invalid_request", "source must be an object");
|
|
342
|
+
}
|
|
343
|
+
if (request.source.id !== snapshot.source_id) {
|
|
344
|
+
return fail("invalid_request", "request source.id does not match the retained declaration snapshot");
|
|
345
|
+
}
|
|
346
|
+
// §6: the purpose code must be a syntactically valid absolute URI, and that
|
|
347
|
+
// is the only syntactic gate. §9 AS item 6 forbids rejecting a code merely
|
|
348
|
+
// for being absent from the registry — an unregistered code renders from its
|
|
349
|
+
// description or raw URI instead.
|
|
350
|
+
if (!isAbsoluteUri(request.purpose_code)) {
|
|
351
|
+
return fail("invalid_request", "purpose_code must be an absolute URI");
|
|
352
|
+
}
|
|
353
|
+
if (request.access_mode !== "single_use" &&
|
|
354
|
+
request.access_mode !== "continuous") {
|
|
355
|
+
return fail("invalid_request", "access_mode must be single_use or continuous");
|
|
356
|
+
}
|
|
357
|
+
if (request.retention !== undefined) {
|
|
358
|
+
const retention = request.retention;
|
|
359
|
+
if (typeof retention !== "object" ||
|
|
360
|
+
retention === null ||
|
|
361
|
+
Array.isArray(retention)) {
|
|
362
|
+
return fail("invalid_request", "retention must be an object");
|
|
363
|
+
}
|
|
364
|
+
const { on_expiry } = retention;
|
|
365
|
+
if (on_expiry !== "delete" && on_expiry !== "anonymize") {
|
|
366
|
+
// `archive` was dropped in v0.1 and is the likely wrong value here.
|
|
367
|
+
return fail("invalid_request", "retention.on_expiry must be delete or anonymize");
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const hasStreams = request.streams !== undefined;
|
|
371
|
+
const hasPreset = request.selection_preset !== undefined;
|
|
372
|
+
if (hasStreams === hasPreset) {
|
|
373
|
+
// Both or neither. Deliberately one message for both cases: the failure
|
|
374
|
+
// is about the pair, and distinguishing them tells a probing client which
|
|
375
|
+
// half the server accepted.
|
|
376
|
+
return fail("source_validation_failed", "exactly one of streams or selection_preset is required");
|
|
377
|
+
}
|
|
378
|
+
if (hasPreset) {
|
|
379
|
+
const preset = snapshot.selection_presets?.find((p) => p.name === request.selection_preset);
|
|
380
|
+
if (!preset) {
|
|
381
|
+
return fail("unknown_preset", `selection preset '${request.selection_preset}' is not defined by the retained snapshot`);
|
|
382
|
+
}
|
|
383
|
+
// The preset's own streams still have to be expressible against the
|
|
384
|
+
// snapshot; a declaration that ships a preset naming a dropped stream is
|
|
385
|
+
// invalid and we would rather fail here than resolve an empty grant.
|
|
386
|
+
for (const stream of preset.streams) {
|
|
387
|
+
const result = validateStreamRequest(stream, snapshot, revision);
|
|
388
|
+
if (!result.ok)
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
return { ok: true };
|
|
392
|
+
}
|
|
393
|
+
const streams = request.streams ?? [];
|
|
394
|
+
if (!Array.isArray(streams)) {
|
|
395
|
+
return fail("invalid_request", "streams must be an array");
|
|
396
|
+
}
|
|
397
|
+
if (streams.length === 0) {
|
|
398
|
+
return fail("invalid_request", "streams must not be empty");
|
|
399
|
+
}
|
|
400
|
+
// Every check from here down reads `.name` off an entry — the wildcard
|
|
401
|
+
// scan, the uniqueness scan, and the per-stream validation — so the entry
|
|
402
|
+
// shapes are gated once, first, rather than at each read.
|
|
403
|
+
for (const entry of streams) {
|
|
404
|
+
if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
|
|
405
|
+
return fail("invalid_request", "each stream entry must be an object");
|
|
406
|
+
}
|
|
407
|
+
if (typeof entry.name !== "string" || entry.name.length === 0) {
|
|
408
|
+
return fail("invalid_request", "each stream entry must carry a non-empty name");
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
const wildcards = streams.filter((s) => s.name === "*");
|
|
412
|
+
if (wildcards.length > 0 && streams.length > 1) {
|
|
413
|
+
// §6 clause 6.8-3: a wildcard entry must be the only entry. Like the
|
|
414
|
+
// streams/preset exactly-one check above, this is a Source validation
|
|
415
|
+
// failure and must map to the same RFC 9396 code.
|
|
416
|
+
return fail("source_validation_failed", "a wildcard stream entry must be the only entry in streams");
|
|
417
|
+
}
|
|
418
|
+
const seen = new Set();
|
|
419
|
+
for (const stream of streams) {
|
|
420
|
+
if (seen.has(stream.name)) {
|
|
421
|
+
// §6 clause 6.8-3: stream names must be unique — also a Source
|
|
422
|
+
// validation failure.
|
|
423
|
+
return fail("source_validation_failed", `stream '${stream.name}' appears more than once`);
|
|
424
|
+
}
|
|
425
|
+
seen.add(stream.name);
|
|
426
|
+
const result = validateStreamRequest(stream, snapshot, revision);
|
|
427
|
+
if (!result.ok)
|
|
428
|
+
return result;
|
|
429
|
+
}
|
|
430
|
+
return { ok: true };
|
|
431
|
+
}
|
|
432
|
+
function isAbsoluteUri(value) {
|
|
433
|
+
try {
|
|
434
|
+
// URL rejects relative references, which is exactly the check we want.
|
|
435
|
+
new URL(value);
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/pdpp/selection.ts"],"names":[],"mappings":"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"}
|