@tearleads/client-sdk 0.1.41 → 0.1.42
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/client/Tearleads.js +3 -0
- package/client/Tearleads.js.map +1 -1
- package/data/keyingProjectionVerification/accessManifestCheckpointEnforcement.js +2 -0
- package/data/keyingProjectionVerification/accessManifestCheckpointEnforcement.js.map +1 -1
- package/data/keyingProjectionVerification/checkpointContext.d.ts +12 -0
- package/data/keyingProjectionVerification/checkpointContext.js +16 -0
- package/data/keyingProjectionVerification/checkpointContext.js.map +1 -1
- package/data/keyingProjectionVerification/containerDestinationVerification.js +3 -1
- package/data/keyingProjectionVerification/containerDestinationVerification.js.map +1 -1
- package/data/keyingProjectionVerification/containerProjectionVerification.js +12 -6
- package/data/keyingProjectionVerification/containerProjectionVerification.js.map +1 -1
- package/data/keyingProjectionVerification/documentProjectionVerification.js +10 -4
- package/data/keyingProjectionVerification/documentProjectionVerification.js.map +1 -1
- package/data/persistence/keyingCheckpointAdvancePersistence.js +27 -8
- package/data/persistence/keyingCheckpointAdvancePersistence.js.map +1 -1
- package/data/persistence/verifiedManifestBundlePersistence.d.ts +45 -0
- package/data/persistence/verifiedManifestBundlePersistence.js +282 -0
- package/data/persistence/verifiedManifestBundlePersistence.js.map +1 -0
- package/data/sqlite/schema.d.ts +157 -0
- package/data/sqlite/schema.js +3 -0
- package/data/sqlite/schema.js.map +1 -1
- package/data/sqlite/verifiedManifestBundleSchema.d.ts +174 -0
- package/data/sqlite/verifiedManifestBundleSchema.js +36 -0
- package/data/sqlite/verifiedManifestBundleSchema.js.map +1 -0
- package/internal/api-client/ApiClient.d.ts +4 -11
- package/internal/api-client/ApiClient.js +8 -6
- package/internal/api-client/ApiClient.js.map +1 -1
- package/internal/api-client/index.d.ts +1 -1
- package/internal/api-client/index.js +0 -1
- package/internal/api-client/index.js.map +1 -1
- package/internal/api-client/principalHistoryRequest.js +8 -2
- package/internal/api-client/principalHistoryRequest.js.map +1 -1
- package/internal/api-client/principalHistoryRequestContext.js +15 -5
- package/internal/api-client/principalHistoryRequestContext.js.map +1 -1
- package/internal/api-client/routes/writerProjections.js +6 -3
- package/internal/api-client/routes/writerProjections.js.map +1 -1
- package/internal/api-client/verifiedManifestCitations.d.ts +23 -0
- package/internal/api-client/verifiedManifestCitations.js +60 -0
- package/internal/api-client/verifiedManifestCitations.js.map +1 -0
- package/internal/api-client/writerProjectionRequests.js +75 -14
- package/internal/api-client/writerProjectionRequests.js.map +1 -1
- package/internal/crypto/index.d.ts +0 -1
- package/internal/crypto/index.js +0 -1
- package/internal/crypto/index.js.map +1 -1
- package/internal/validators/knownManifestsRefinements.js +5 -0
- package/internal/validators/knownManifestsRefinements.js.map +1 -0
- package/internal/validators/operation/writerProjections.d.ts +85 -319
- package/internal/validators/operation/writerProjections.js +11 -11
- package/internal/validators/operation/writerProjections.js.map +1 -1
- package/internal/validators/response/container.d.ts +429 -20
- package/internal/validators/response/container.js +40 -5
- package/internal/validators/response/container.js.map +1 -1
- package/internal/validators/response/documentMutation.d.ts +440 -20
- package/internal/validators/response/documentMutation.js +33 -3
- package/internal/validators/response/documentMutation.js.map +1 -1
- package/internal/validators/response/index.d.ts +3 -2
- package/internal/validators/response/index.js +3 -2
- package/internal/validators/response/index.js.map +1 -1
- package/internal/validators/response/manifestBundleReferences.js +79 -0
- package/internal/validators/response/manifestBundleReferences.js.map +1 -0
- package/internal/validators/response/writerProjectionWire.d.ts +19 -0
- package/internal/validators/response/writerProjectionWire.js +132 -0
- package/internal/validators/response/writerProjectionWire.js.map +1 -0
- package/internal/validators/schema.js +20 -0
- package/internal/validators/schema.js.map +1 -1
- package/internal/validators/util/index.d.ts +1 -1
- package/internal/validators/util/index.js +1 -1
- package/internal/validators/util/index.js.map +1 -1
- package/internal/validators/util/knownManifestWire.d.ts +11 -0
- package/internal/validators/util/knownManifestWire.js +28 -0
- package/internal/validators/util/knownManifestWire.js.map +1 -0
- package/internal/validators/writerProjectionRefinements.js +5 -0
- package/internal/validators/writerProjectionRefinements.js.map +1 -1
- package/package.json +1 -1
- package/workflows/registration/provisioningBootstrapBuilders.d.ts +0 -5
- package/workflows/sync/remoteReset.js +2 -0
- package/workflows/sync/remoteReset.js.map +1 -1
- package/internal/api-client/projectionHistoryTransport.js +0 -107
- package/internal/api-client/projectionHistoryTransport.js.map +0 -1
- package/internal/api-client/verifiedProjectionHistory.d.ts +0 -4
- package/internal/api-client/verifiedProjectionHistory.js +0 -12
- package/internal/api-client/verifiedProjectionHistory.js.map +0 -1
- package/internal/crypto/projectionHistory.d.ts +0 -14
- package/internal/crypto/projectionHistory.js +0 -90
- package/internal/crypto/projectionHistory.js.map +0 -1
- package/internal/crypto/projectionHistorySlots.d.ts +0 -13
- package/internal/crypto/projectionHistorySlots.js +0 -81
- package/internal/crypto/projectionHistorySlots.js.map +0 -1
- package/internal/validators/projectionHistoryRefinements.js +0 -5
- package/internal/validators/projectionHistoryRefinements.js.map +0 -1
- package/internal/validators/util/projectionHistoryWire.d.ts +0 -23
- package/internal/validators/util/projectionHistoryWire.js +0 -33
- package/internal/validators/util/projectionHistoryWire.js.map +0 -1
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { bytesToHex } from "./hex.js";
|
|
2
|
-
import { createIncrementalSha256 } from "./incrementalSha256.js";
|
|
3
|
-
import { projectionHistoryArrays, } from "./projectionHistorySlots.js";
|
|
4
|
-
function historyDigest(key, values) {
|
|
5
|
-
const hash = createIncrementalSha256();
|
|
6
|
-
hash.update(new TextEncoder().encode(JSON.stringify(["tearleads.projection-history", key, values])));
|
|
7
|
-
return bytesToHex(hash.digest());
|
|
8
|
-
}
|
|
9
|
-
/** Byte commitments describe evidence, not an authorization or verification result. */
|
|
10
|
-
export function captureProjectionHistory(projection) {
|
|
11
|
-
return projectionHistoryArrays(projection).flatMap((array) => array.chains.flatMap((chain) => {
|
|
12
|
-
if (chain.values.length === 0)
|
|
13
|
-
return [];
|
|
14
|
-
const values = structuredClone(chain.values);
|
|
15
|
-
return [
|
|
16
|
-
{
|
|
17
|
-
arrayKey: array.key,
|
|
18
|
-
values,
|
|
19
|
-
prefix: {
|
|
20
|
-
key: chain.key,
|
|
21
|
-
count: values.length,
|
|
22
|
-
digest: historyDigest(chain.key, values),
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
}));
|
|
27
|
-
}
|
|
28
|
-
/** Call only after normal server authorization and stored-evidence verification. */
|
|
29
|
-
export function omitProjectionHistory(projection, hints) {
|
|
30
|
-
if (hints.length === 0)
|
|
31
|
-
return projection;
|
|
32
|
-
// Server loaders may share arrays and objects between paths. JSON wire
|
|
33
|
-
// locations are independent: trimming one must not change another slot.
|
|
34
|
-
const result = JSON.parse(JSON.stringify(projection));
|
|
35
|
-
const requested = new Map(hints.map((hint) => [hint.key, hint]));
|
|
36
|
-
const omitted = [];
|
|
37
|
-
for (const array of projectionHistoryArrays(result)) {
|
|
38
|
-
const removed = new Map();
|
|
39
|
-
for (const chain of array.chains) {
|
|
40
|
-
const hint = requested.get(chain.key);
|
|
41
|
-
if (!hint || hint.count > chain.values.length)
|
|
42
|
-
continue;
|
|
43
|
-
const prefix = chain.values.slice(0, hint.count);
|
|
44
|
-
if (historyDigest(chain.key, prefix) !== hint.digest)
|
|
45
|
-
continue;
|
|
46
|
-
for (const item of prefix)
|
|
47
|
-
removed.set(item, (removed.get(item) ?? 0) + 1);
|
|
48
|
-
omitted.push(hint);
|
|
49
|
-
}
|
|
50
|
-
const retained = array.values.filter((value) => {
|
|
51
|
-
const remaining = removed.get(value) ?? 0;
|
|
52
|
-
if (remaining === 0)
|
|
53
|
-
return true;
|
|
54
|
-
removed.set(value, remaining - 1);
|
|
55
|
-
return false;
|
|
56
|
-
});
|
|
57
|
-
array.values.length = 0;
|
|
58
|
-
for (const value of retained)
|
|
59
|
-
array.values.push(value);
|
|
60
|
-
}
|
|
61
|
-
if (omitted.length)
|
|
62
|
-
result.historyPrefixes = omitted;
|
|
63
|
-
return result;
|
|
64
|
-
}
|
|
65
|
-
/** Rebuild exact cached evidence before the caller performs all ordinary checks. */
|
|
66
|
-
export function restoreProjectionHistory(projection, requested) {
|
|
67
|
-
const arrays = new Map(projectionHistoryArrays(projection).map((array) => [array.key, array]));
|
|
68
|
-
const available = new Map(requested.map((entry) => [entry.prefix.key, entry]));
|
|
69
|
-
for (const prefix of projection.historyPrefixes ?? []) {
|
|
70
|
-
const entry = available.get(prefix.key);
|
|
71
|
-
if (!entry ||
|
|
72
|
-
entry.prefix.count !== prefix.count ||
|
|
73
|
-
entry.prefix.digest !== prefix.digest)
|
|
74
|
-
return false;
|
|
75
|
-
const target = arrays.get(entry.arrayKey);
|
|
76
|
-
if (!target || historyDigest(prefix.key, entry.values) !== prefix.digest)
|
|
77
|
-
return false;
|
|
78
|
-
const suffix = target.values.slice();
|
|
79
|
-
target.values.length = 0;
|
|
80
|
-
for (const value of structuredClone(entry.values))
|
|
81
|
-
target.values.push(value);
|
|
82
|
-
for (const value of suffix)
|
|
83
|
-
target.values.push(value);
|
|
84
|
-
target.restoreOrder?.();
|
|
85
|
-
available.delete(prefix.key);
|
|
86
|
-
}
|
|
87
|
-
delete projection.historyPrefixes;
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=projectionHistory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projectionHistory.js","sourceRoot":"","sources":["projectionHistory.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProjectionHistoryPrefix } from \"@tearleads/validators/util\";\nimport { bytesToHex } from \"./hex\";\nimport { createIncrementalSha256 } from \"./incrementalSha256\";\nimport {\n type HistoryProjection,\n projectionHistoryArrays,\n} from \"./projectionHistorySlots\";\n\nexport type { HistoryProjection } from \"./projectionHistorySlots\";\nexport interface RetainedProjectionHistory {\n readonly prefix: ProjectionHistoryPrefix;\n readonly arrayKey: string;\n readonly values: readonly unknown[];\n}\n\nfunction historyDigest(key: string, values: readonly unknown[]): string {\n const hash = createIncrementalSha256();\n hash.update(\n new TextEncoder().encode(\n JSON.stringify([\"tearleads.projection-history\", key, values]),\n ),\n );\n return bytesToHex(hash.digest());\n}\n\n/** Byte commitments describe evidence, not an authorization or verification result. */\nexport function captureProjectionHistory(\n projection: HistoryProjection,\n): RetainedProjectionHistory[] {\n return projectionHistoryArrays(projection).flatMap((array) =>\n array.chains.flatMap((chain) => {\n if (chain.values.length === 0) return [];\n const values = structuredClone(chain.values);\n return [\n {\n arrayKey: array.key,\n values,\n prefix: {\n key: chain.key,\n count: values.length,\n digest: historyDigest(chain.key, values),\n },\n },\n ];\n }),\n );\n}\n\n/** Call only after normal server authorization and stored-evidence verification. */\nexport function omitProjectionHistory<T extends HistoryProjection>(\n projection: T,\n hints: readonly ProjectionHistoryPrefix[],\n): T {\n if (hints.length === 0) return projection;\n // Server loaders may share arrays and objects between paths. JSON wire\n // locations are independent: trimming one must not change another slot.\n const result: T = JSON.parse(JSON.stringify(projection));\n const requested = new Map(hints.map((hint) => [hint.key, hint]));\n const omitted: ProjectionHistoryPrefix[] = [];\n for (const array of projectionHistoryArrays(result)) {\n const removed = new Map<unknown, number>();\n for (const chain of array.chains) {\n const hint = requested.get(chain.key);\n if (!hint || hint.count > chain.values.length) continue;\n const prefix = chain.values.slice(0, hint.count);\n if (historyDigest(chain.key, prefix) !== hint.digest) continue;\n for (const item of prefix)\n removed.set(item, (removed.get(item) ?? 0) + 1);\n omitted.push(hint);\n }\n const retained = array.values.filter((value) => {\n const remaining = removed.get(value) ?? 0;\n if (remaining === 0) return true;\n removed.set(value, remaining - 1);\n return false;\n });\n array.values.length = 0;\n for (const value of retained) array.values.push(value);\n }\n if (omitted.length) result.historyPrefixes = omitted;\n return result;\n}\n\n/** Rebuild exact cached evidence before the caller performs all ordinary checks. */\nexport function restoreProjectionHistory(\n projection: HistoryProjection,\n requested: readonly RetainedProjectionHistory[],\n): boolean {\n const arrays = new Map(\n projectionHistoryArrays(projection).map((array) => [array.key, array]),\n );\n const available = new Map(\n requested.map((entry) => [entry.prefix.key, entry]),\n );\n for (const prefix of projection.historyPrefixes ?? []) {\n const entry = available.get(prefix.key);\n if (\n !entry ||\n entry.prefix.count !== prefix.count ||\n entry.prefix.digest !== prefix.digest\n )\n return false;\n const target = arrays.get(entry.arrayKey);\n if (!target || historyDigest(prefix.key, entry.values) !== prefix.digest)\n return false;\n const suffix = target.values.slice();\n target.values.length = 0;\n for (const value of structuredClone(entry.values))\n target.values.push(value);\n for (const value of suffix) target.values.push(value);\n target.restoreOrder?.();\n available.delete(prefix.key);\n }\n delete projection.historyPrefixes;\n return true;\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { ContainerWriterProjectionResponse, DocumentWriterProjectionResponse } from "../validators/response/index.js";
|
|
2
|
-
export type HistoryProjection = ContainerWriterProjectionResponse | DocumentWriterProjectionResponse;
|
|
3
|
-
export interface ProjectionHistoryArray {
|
|
4
|
-
readonly key: string;
|
|
5
|
-
readonly values: unknown[];
|
|
6
|
-
readonly restoreOrder?: (() => void) | undefined;
|
|
7
|
-
readonly chains: readonly {
|
|
8
|
-
readonly key: string;
|
|
9
|
-
readonly values: unknown[];
|
|
10
|
-
}[];
|
|
11
|
-
}
|
|
12
|
-
/** Only these evidence arrays can be omitted. Current heads and keys always travel. */
|
|
13
|
-
export declare function projectionHistoryArrays(projection: HistoryProjection): ProjectionHistoryArray[];
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { compareCanonicalStrings } from "./canonicalOrdering.js";
|
|
2
|
-
function manifestEpoch(bundle) {
|
|
3
|
-
const epoch = Reflect.get(bundle.manifest, "epoch");
|
|
4
|
-
return typeof epoch === "number" && Number.isFinite(epoch) ? epoch : 0;
|
|
5
|
-
}
|
|
6
|
-
function isDocumentProjection(projection) {
|
|
7
|
-
return "documentId" in projection && "documentManifest" in projection;
|
|
8
|
-
}
|
|
9
|
-
function unambiguousArrays(arrays) {
|
|
10
|
-
const occurrences = new Map();
|
|
11
|
-
for (const array of arrays)
|
|
12
|
-
occurrences.set(array.key, (occurrences.get(array.key) ?? 0) + 1);
|
|
13
|
-
// Ambiguous locations cannot safely negotiate an omission. Deliver them full.
|
|
14
|
-
return arrays.filter((array) => occurrences.get(array.key) === 1);
|
|
15
|
-
}
|
|
16
|
-
function manifestHistoryArray(key, values, newestFirst) {
|
|
17
|
-
const groups = new Map();
|
|
18
|
-
for (const value of values) {
|
|
19
|
-
const chain = JSON.stringify([
|
|
20
|
-
key,
|
|
21
|
-
Reflect.get(value.manifest, "organizationId"),
|
|
22
|
-
Reflect.get(value.manifest, "objectKind"),
|
|
23
|
-
Reflect.get(value.manifest, "objectId"),
|
|
24
|
-
]);
|
|
25
|
-
const entries = groups.get(chain) ?? [];
|
|
26
|
-
entries.push(value);
|
|
27
|
-
groups.set(chain, entries);
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
key,
|
|
31
|
-
values,
|
|
32
|
-
restoreOrder: newestFirst
|
|
33
|
-
? () => {
|
|
34
|
-
values.sort((a, b) => manifestEpoch(b) - manifestEpoch(a));
|
|
35
|
-
}
|
|
36
|
-
: undefined,
|
|
37
|
-
chains: [...groups].map(([chain, entries]) => ({
|
|
38
|
-
key: chain,
|
|
39
|
-
values: entries.sort((a, b) => manifestEpoch(a) - manifestEpoch(b) ||
|
|
40
|
-
compareCanonicalStrings(a.manifestHash, b.manifestHash)),
|
|
41
|
-
})),
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
/** Only these evidence arrays can be omitted. Current heads and keys always travel. */
|
|
45
|
-
export function projectionHistoryArrays(projection) {
|
|
46
|
-
const arrays = [];
|
|
47
|
-
const identity = isDocumentProjection(projection)
|
|
48
|
-
? [
|
|
49
|
-
"document",
|
|
50
|
-
Reflect.get(projection.documentManifest.manifest, "organizationId"),
|
|
51
|
-
projection.documentId,
|
|
52
|
-
]
|
|
53
|
-
: ["container", projection.organizationId, projection.containerId];
|
|
54
|
-
const add = (name, values) => {
|
|
55
|
-
const key = JSON.stringify([...identity, name]);
|
|
56
|
-
arrays.push({ key, values, chains: [{ key, values }] });
|
|
57
|
-
};
|
|
58
|
-
const manifests = (name, values, newestFirst = false) => {
|
|
59
|
-
const key = JSON.stringify([...identity, name]);
|
|
60
|
-
arrays.push(manifestHistoryArray(key, values, newestFirst));
|
|
61
|
-
};
|
|
62
|
-
const path = (name, value) => {
|
|
63
|
-
for (const [index, kek] of value.containerKeks.entries())
|
|
64
|
-
manifests(`${name}:kek:${index}:${kek.containerId}`, kek.containerManifestHistory);
|
|
65
|
-
};
|
|
66
|
-
const evidence = projection.policyEvidence;
|
|
67
|
-
add("organizationPayloads", evidence.organizationPayloads);
|
|
68
|
-
if (!isDocumentProjection(projection))
|
|
69
|
-
path("container", projection);
|
|
70
|
-
else {
|
|
71
|
-
for (const [index, value] of projection.authorizingContainerPaths.entries())
|
|
72
|
-
path(`path:${index}:${value.containerId}`, value);
|
|
73
|
-
// A dependency path is ordered root-to-leaf, not an unordered history.
|
|
74
|
-
for (const [index, values,] of projection.documentManifestContainerPaths.entries())
|
|
75
|
-
add(`documentManifestContainerPaths:${index}`, values);
|
|
76
|
-
manifests("documentContainerManifestHistory", projection.documentContainerManifestHistory);
|
|
77
|
-
manifests("documentManifestHistory", projection.documentManifestHistory, true);
|
|
78
|
-
}
|
|
79
|
-
return unambiguousArrays(arrays);
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=projectionHistorySlots.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projectionHistorySlots.js","sourceRoot":"","sources":["projectionHistorySlots.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccessManifestBundleWireResponse,\n ContainerKeyingPathResponse,\n ContainerWriterProjectionResponse,\n DocumentWriterProjectionResponse,\n} from \"@tearleads/validators/response\";\nimport { compareCanonicalStrings } from \"./canonicalOrdering\";\n\nexport type HistoryProjection =\n | ContainerWriterProjectionResponse\n | DocumentWriterProjectionResponse;\nexport interface ProjectionHistoryArray {\n readonly key: string;\n readonly values: unknown[];\n readonly restoreOrder?: (() => void) | undefined;\n readonly chains: readonly {\n readonly key: string;\n readonly values: unknown[];\n }[];\n}\n\nfunction manifestEpoch(bundle: AccessManifestBundleWireResponse): number {\n const epoch: unknown = Reflect.get(bundle.manifest, \"epoch\");\n return typeof epoch === \"number\" && Number.isFinite(epoch) ? epoch : 0;\n}\n\nfunction isDocumentProjection(\n projection: HistoryProjection,\n): projection is DocumentWriterProjectionResponse {\n return \"documentId\" in projection && \"documentManifest\" in projection;\n}\n\nfunction unambiguousArrays(\n arrays: ProjectionHistoryArray[],\n): ProjectionHistoryArray[] {\n const occurrences = new Map<string, number>();\n for (const array of arrays)\n occurrences.set(array.key, (occurrences.get(array.key) ?? 0) + 1);\n // Ambiguous locations cannot safely negotiate an omission. Deliver them full.\n return arrays.filter((array) => occurrences.get(array.key) === 1);\n}\n\nfunction manifestHistoryArray(\n key: string,\n values: AccessManifestBundleWireResponse[],\n newestFirst: boolean,\n): ProjectionHistoryArray {\n const groups = new Map<string, AccessManifestBundleWireResponse[]>();\n for (const value of values) {\n const chain = JSON.stringify([\n key,\n Reflect.get(value.manifest, \"organizationId\"),\n Reflect.get(value.manifest, \"objectKind\"),\n Reflect.get(value.manifest, \"objectId\"),\n ]);\n const entries = groups.get(chain) ?? [];\n entries.push(value);\n groups.set(chain, entries);\n }\n return {\n key,\n values,\n restoreOrder: newestFirst\n ? () => {\n values.sort((a, b) => manifestEpoch(b) - manifestEpoch(a));\n }\n : undefined,\n chains: [...groups].map(([chain, entries]) => ({\n key: chain,\n values: entries.sort(\n (a, b) =>\n manifestEpoch(a) - manifestEpoch(b) ||\n compareCanonicalStrings(a.manifestHash, b.manifestHash),\n ),\n })),\n };\n}\n\n/** Only these evidence arrays can be omitted. Current heads and keys always travel. */\nexport function projectionHistoryArrays(\n projection: HistoryProjection,\n): ProjectionHistoryArray[] {\n const arrays: ProjectionHistoryArray[] = [];\n const identity = isDocumentProjection(projection)\n ? [\n \"document\",\n Reflect.get(projection.documentManifest.manifest, \"organizationId\"),\n projection.documentId,\n ]\n : [\"container\", projection.organizationId, projection.containerId];\n const add = (name: string, values: unknown[]) => {\n const key = JSON.stringify([...identity, name]);\n arrays.push({ key, values, chains: [{ key, values }] });\n };\n const manifests = (\n name: string,\n values: AccessManifestBundleWireResponse[],\n newestFirst = false,\n ) => {\n const key = JSON.stringify([...identity, name]);\n arrays.push(manifestHistoryArray(key, values, newestFirst));\n };\n const path = (name: string, value: ContainerKeyingPathResponse) => {\n for (const [index, kek] of value.containerKeks.entries())\n manifests(\n `${name}:kek:${index}:${kek.containerId}`,\n kek.containerManifestHistory,\n );\n };\n const evidence = projection.policyEvidence;\n add(\"organizationPayloads\", evidence.organizationPayloads);\n if (!isDocumentProjection(projection)) path(\"container\", projection);\n else {\n for (const [index, value] of projection.authorizingContainerPaths.entries())\n path(`path:${index}:${value.containerId}`, value);\n // A dependency path is ordered root-to-leaf, not an unordered history.\n for (const [\n index,\n values,\n ] of projection.documentManifestContainerPaths.entries())\n add(`documentManifestContainerPaths:${index}`, values);\n manifests(\n \"documentContainerManifestHistory\",\n projection.documentContainerManifestHistory,\n );\n manifests(\n \"documentManifestHistory\",\n projection.documentManifestHistory,\n true,\n );\n }\n return unambiguousArrays(arrays);\n}\n"]}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export const projectionHistoryHeaderRefinement = {
|
|
2
|
-
id: "request.projection-history-prefixes",
|
|
3
|
-
description: "x-projection-history must decode to at most 32 prefixes with unique keys, positive safe integer counts, and lowercase SHA-256 digests",
|
|
4
|
-
};
|
|
5
|
-
//# sourceMappingURL=projectionHistoryRefinements.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projectionHistoryRefinements.js","sourceRoot":"","sources":["projectionHistoryRefinements.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,EAAE,EAAE,qCAAqC;IACzC,WAAW,EACT,uIAAuI;CACjI,CAAC","sourcesContent":["export const projectionHistoryHeaderRefinement = {\n id: \"request.projection-history-prefixes\",\n description:\n \"x-projection-history must decode to at most 32 prefixes with unique keys, positive safe integer counts, and lowercase SHA-256 digests\",\n} as const;\n"]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
/** Request budgets restrict cache hints, never the history a reader can recover. */
|
|
3
|
-
export declare const PROJECTION_HISTORY_HINT_CHARACTERS = 4096;
|
|
4
|
-
declare const ProjectionHistoryPrefixSchema: z.ZodObject<{
|
|
5
|
-
key: z.ZodCustom<string, string>;
|
|
6
|
-
count: z.ZodCustom<number, number>;
|
|
7
|
-
digest: z.ZodCustom<string, string>;
|
|
8
|
-
}, z.core.$strict>;
|
|
9
|
-
export declare const ProjectionHistoryPrefixesSchema: z.ZodCustom<{
|
|
10
|
-
key: string;
|
|
11
|
-
count: number;
|
|
12
|
-
digest: string;
|
|
13
|
-
}[], {
|
|
14
|
-
key: string;
|
|
15
|
-
count: number;
|
|
16
|
-
digest: string;
|
|
17
|
-
}[]>;
|
|
18
|
-
export type ProjectionHistoryPrefix = z.infer<typeof ProjectionHistoryPrefixSchema>;
|
|
19
|
-
export declare function parseProjectionHistoryHints(value: string): ProjectionHistoryPrefix[] | null;
|
|
20
|
-
export declare const ProjectionHistoryHeadersSchema: z.ZodObject<{
|
|
21
|
-
"x-projection-history": z.ZodOptional<z.ZodString>;
|
|
22
|
-
}, z.core.$strip>;
|
|
23
|
-
export {};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { registerJsonSchemaFragment, registerJsonSchemaRuntimeRefinements, } from "../jsonSchema.js";
|
|
3
|
-
import { projectionHistoryHeaderRefinement } from "../projectionHistoryRefinements.js";
|
|
4
|
-
import { arraySchema, boundedNonEmptyStringSchema, boundedPositiveIntegerSchema, sha256HexStringSchema, } from "../schema.js";
|
|
5
|
-
/** Request budgets restrict cache hints, never the history a reader can recover. */
|
|
6
|
-
export const PROJECTION_HISTORY_HINT_CHARACTERS = 4096;
|
|
7
|
-
const ProjectionHistoryPrefixSchema = z.strictObject({
|
|
8
|
-
key: boundedNonEmptyStringSchema(512),
|
|
9
|
-
count: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),
|
|
10
|
-
digest: sha256HexStringSchema,
|
|
11
|
-
});
|
|
12
|
-
export const ProjectionHistoryPrefixesSchema = arraySchema(ProjectionHistoryPrefixSchema, 32);
|
|
13
|
-
export function parseProjectionHistoryHints(value) {
|
|
14
|
-
try {
|
|
15
|
-
const parsed = ProjectionHistoryPrefixesSchema.safeParse(JSON.parse(decodeURIComponent(value)));
|
|
16
|
-
return parsed.success &&
|
|
17
|
-
new Set(parsed.data.map((item) => item.key)).size === parsed.data.length
|
|
18
|
-
? parsed.data
|
|
19
|
-
: null;
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
const hintHeader = registerJsonSchemaFragment(z.string().max(PROJECTION_HISTORY_HINT_CHARACTERS), {
|
|
26
|
-
type: "string",
|
|
27
|
-
maxLength: PROJECTION_HISTORY_HINT_CHARACTERS,
|
|
28
|
-
description: "URI-encoded JSON array of exact device-verified history prefixes (key, count, digest); at most 32 unique keys",
|
|
29
|
-
});
|
|
30
|
-
export const ProjectionHistoryHeadersSchema = z.object({
|
|
31
|
-
"x-projection-history": registerJsonSchemaRuntimeRefinements(hintHeader.refine((value) => parseProjectionHistoryHints(value) !== null), [projectionHistoryHeaderRefinement]).optional(),
|
|
32
|
-
});
|
|
33
|
-
//# sourceMappingURL=projectionHistoryWire.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projectionHistoryWire.js","sourceRoot":"","sources":["projectionHistoryWire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,0BAA0B,EAC1B,oCAAoC,GACrC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,oFAAoF;AACpF,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC;AACvD,MAAM,6BAA6B,GAAG,CAAC,CAAC,YAAY,CAAC;IACnD,GAAG,EAAE,2BAA2B,CAAC,GAAG,CAAC;IACrC,KAAK,EAAE,4BAA4B,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAC5D,MAAM,EAAE,qBAAqB;CAC9B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,WAAW,CACxD,6BAA6B,EAC7B,EAAE,CACH,CAAC;AAKF,MAAM,UAAU,2BAA2B,CACzC,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,+BAA+B,CAAC,SAAS,CACtD,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CACtC,CAAC;QACF,OAAO,MAAM,CAAC,OAAO;YACnB,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM;YACxE,CAAC,CAAC,MAAM,CAAC,IAAI;YACb,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,0BAA0B,CAC3C,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,kCAAkC,CAAC,EAClD;IACE,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,kCAAkC;IAC7C,WAAW,EACT,+GAA+G;CAClH,CACF,CAAC;AACF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,sBAAsB,EAAE,oCAAoC,CAC1D,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EACzE,CAAC,iCAAiC,CAAC,CACpC,CAAC,QAAQ,EAAE;CACb,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\nimport {\n registerJsonSchemaFragment,\n registerJsonSchemaRuntimeRefinements,\n} from \"../jsonSchema\";\nimport { projectionHistoryHeaderRefinement } from \"../projectionHistoryRefinements\";\nimport {\n arraySchema,\n boundedNonEmptyStringSchema,\n boundedPositiveIntegerSchema,\n sha256HexStringSchema,\n} from \"../schema\";\n\n/** Request budgets restrict cache hints, never the history a reader can recover. */\nexport const PROJECTION_HISTORY_HINT_CHARACTERS = 4096;\nconst ProjectionHistoryPrefixSchema = z.strictObject({\n key: boundedNonEmptyStringSchema(512),\n count: boundedPositiveIntegerSchema(Number.MAX_SAFE_INTEGER),\n digest: sha256HexStringSchema,\n});\nexport const ProjectionHistoryPrefixesSchema = arraySchema(\n ProjectionHistoryPrefixSchema,\n 32,\n);\nexport type ProjectionHistoryPrefix = z.infer<\n typeof ProjectionHistoryPrefixSchema\n>;\n\nexport function parseProjectionHistoryHints(\n value: string,\n): ProjectionHistoryPrefix[] | null {\n try {\n const parsed = ProjectionHistoryPrefixesSchema.safeParse(\n JSON.parse(decodeURIComponent(value)),\n );\n return parsed.success &&\n new Set(parsed.data.map((item) => item.key)).size === parsed.data.length\n ? parsed.data\n : null;\n } catch {\n return null;\n }\n}\n\nconst hintHeader = registerJsonSchemaFragment(\n z.string().max(PROJECTION_HISTORY_HINT_CHARACTERS),\n {\n type: \"string\",\n maxLength: PROJECTION_HISTORY_HINT_CHARACTERS,\n description:\n \"URI-encoded JSON array of exact device-verified history prefixes (key, count, digest); at most 32 unique keys\",\n },\n);\nexport const ProjectionHistoryHeadersSchema = z.object({\n \"x-projection-history\": registerJsonSchemaRuntimeRefinements(\n hintHeader.refine((value) => parseProjectionHistoryHints(value) !== null),\n [projectionHistoryHeaderRefinement],\n ).optional(),\n});\n"]}
|