footprintjs 10.3.0 → 10.5.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/README.md +63 -25
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
- package/dist/esm/lib/capture/absentEntries.js +81 -0
- package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/esm/lib/capture/checkpointCapture.js +104 -0
- package/dist/esm/lib/capture/historyData.d.ts +13 -0
- package/dist/esm/lib/capture/historyData.js +96 -0
- package/dist/esm/lib/capture/historyNote.d.ts +4 -0
- package/dist/esm/lib/capture/historyNote.js +57 -0
- package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
- package/dist/esm/lib/capture/historyTarget.js +35 -0
- package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
- package/dist/esm/lib/capture/historyTypes.js +4 -0
- package/dist/esm/lib/capture/nativeCoverage.d.ts +20 -7
- package/dist/esm/lib/capture/nativeCoverage.js +50 -12
- package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
- package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
- package/dist/esm/lib/capture/noteShape.d.ts +10 -0
- package/dist/esm/lib/capture/noteShape.js +93 -0
- package/dist/esm/lib/capture/readSources.d.ts +49 -0
- package/dist/esm/lib/capture/readSources.js +99 -0
- package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
- package/dist/esm/lib/capture/sinkSettlement.js +10 -0
- package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
- package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
- package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
- package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +3 -0
- package/dist/esm/lib/capture/storedReadSourceCounts.js +78 -0
- package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
- package/dist/esm/lib/capture/storedReadSources.js +104 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +14 -2
- package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/esm/lib/engine/types.d.ts +4 -0
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +9 -0
- package/dist/esm/lib/memory/StageContext.js +96 -9
- package/dist/esm/lib/memory/frameTypes.d.ts +3 -0
- package/dist/esm/lib/memory/frameTypes.js +1 -1
- package/dist/esm/lib/memory/logAddress.d.ts +3 -0
- package/dist/esm/lib/memory/logAddress.js +7 -0
- package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
- package/dist/esm/lib/memory/runPolicy.js +2 -1
- package/dist/esm/lib/pause/record.js +8 -2
- package/dist/esm/lib/pause/types.d.ts +2 -0
- package/dist/esm/lib/pause/types.js +1 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +19 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +92 -6
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +50 -10
- package/dist/esm/lib/runner/attach.js +3 -1
- package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
- package/dist/esm/lib/runner/captureHistory.js +112 -0
- package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/index.d.ts +1 -0
- package/dist/esm/lib/runner/index.js +1 -1
- package/dist/esm/lib/runner/options.js +42 -3
- package/dist/esm/lib/runner/readStoredCapture.d.ts +41 -0
- package/dist/esm/lib/runner/readStoredCapture.js +36 -0
- package/dist/esm/lib/runner/recordSink.d.ts +11 -0
- package/dist/esm/lib/runner/recordSink.js +48 -13
- package/dist/esm/lib/runner/snapshot.js +2 -2
- package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/esm/lib/runner/storedCaptureAdmission.js +99 -0
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
- package/dist/esm/lib/sinks/fileSink.js +8 -2
- package/dist/esm/trace.d.ts +2 -0
- package/dist/esm/trace.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/absentEntries.js +86 -0
- package/dist/lib/capture/checkpointCapture.js +110 -0
- package/dist/lib/capture/historyData.js +104 -0
- package/dist/lib/capture/historyNote.js +61 -0
- package/dist/lib/capture/historyTarget.js +40 -0
- package/dist/lib/capture/historyTypes.js +7 -0
- package/dist/lib/capture/nativeCoverage.js +52 -13
- package/dist/lib/capture/nativeSourceAddress.js +19 -0
- package/dist/lib/capture/noteShape.js +103 -0
- package/dist/lib/capture/readSources.js +106 -0
- package/dist/lib/capture/sinkSettlement.js +14 -0
- package/dist/lib/capture/sourceReadCounts.js +31 -0
- package/dist/lib/capture/sourceReferenceBudget.js +25 -0
- package/dist/lib/capture/storedReadSourceCounts.js +82 -0
- package/dist/lib/capture/storedReadSources.js +108 -0
- package/dist/lib/engine/handlers/SubflowExecutor.js +14 -2
- package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +96 -9
- package/dist/lib/memory/frameTypes.js +1 -1
- package/dist/lib/memory/logAddress.js +11 -0
- package/dist/lib/memory/runPolicy.js +2 -1
- package/dist/lib/pause/record.js +8 -2
- package/dist/lib/pause/types.js +1 -1
- package/dist/lib/runner/ExecutionRuntime.js +91 -5
- package/dist/lib/runner/FlowChartExecutor.js +50 -10
- package/dist/lib/runner/attach.js +3 -1
- package/dist/lib/runner/captureHistory.js +116 -0
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/index.js +1 -1
- package/dist/lib/runner/options.js +42 -3
- package/dist/lib/runner/readStoredCapture.js +40 -0
- package/dist/lib/runner/recordSink.js +50 -15
- package/dist/lib/runner/snapshot.js +2 -2
- package/dist/lib/runner/storedCaptureAdmission.js +103 -0
- package/dist/lib/scope/ScopeFacade.js +2 -2
- package/dist/lib/sinks/fileSink.js +8 -2
- package/dist/trace.js +4 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/capture/absentEntries.d.ts +7 -0
- package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/types/lib/capture/historyData.d.ts +13 -0
- package/dist/types/lib/capture/historyNote.d.ts +4 -0
- package/dist/types/lib/capture/historyTarget.d.ts +5 -0
- package/dist/types/lib/capture/historyTypes.d.ts +39 -0
- package/dist/types/lib/capture/nativeCoverage.d.ts +20 -7
- package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
- package/dist/types/lib/capture/noteShape.d.ts +10 -0
- package/dist/types/lib/capture/readSources.d.ts +49 -0
- package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
- package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
- package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
- package/dist/types/lib/capture/storedReadSourceCounts.d.ts +3 -0
- package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/types/lib/engine/types.d.ts +4 -0
- package/dist/types/lib/memory/StageContext.d.ts +9 -0
- package/dist/types/lib/memory/frameTypes.d.ts +3 -0
- package/dist/types/lib/memory/logAddress.d.ts +3 -0
- package/dist/types/lib/memory/runPolicy.d.ts +5 -1
- package/dist/types/lib/pause/types.d.ts +2 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +19 -3
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/types/lib/runner/captureHistory.d.ts +8 -0
- package/dist/types/lib/runner/checkpoint.d.ts +2 -0
- package/dist/types/lib/runner/index.d.ts +1 -0
- package/dist/types/lib/runner/readStoredCapture.d.ts +41 -0
- package/dist/types/lib/runner/recordSink.d.ts +11 -0
- package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/types/lib/sinks/fileSink.d.ts +2 -1
- package/dist/types/trace.d.ts +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { CAPTURE_CHANNEL_STATUSES, CAPTURE_COMMIT_VALUE_MODES, CAPTURE_LIMITATIONS, CAPTURE_PROVENANCE_MODES, CAPTURE_RETENTION_MODES, isCaptureValue, } from './nativeCoverage.js';
|
|
2
|
+
/** @internal One inert-data boundary for checkpoint and history capture codecs. */
|
|
3
|
+
export function ownData(record, key) {
|
|
4
|
+
if (!record || typeof record !== 'object' || Object.getPrototypeOf(record) !== Object.prototype)
|
|
5
|
+
return undefined;
|
|
6
|
+
return Object.getOwnPropertyDescriptor(record, key)?.value;
|
|
7
|
+
}
|
|
8
|
+
export function captureIdentifier(value) {
|
|
9
|
+
return typeof value === 'string' && value.length > 0 && value.length <= 2048;
|
|
10
|
+
}
|
|
11
|
+
function count(value) {
|
|
12
|
+
return Number.isSafeInteger(value) && value >= 0;
|
|
13
|
+
}
|
|
14
|
+
/** Exact history shapes refuse extras; checkpoints deliberately project known fields. */
|
|
15
|
+
function shapeKeys(value, fields, exact) {
|
|
16
|
+
return !exact || (!!value && typeof value === 'object' && Object.keys(value).length === fields.length);
|
|
17
|
+
}
|
|
18
|
+
export function copyIdentity(value, exact = false, version = 1) {
|
|
19
|
+
const runId = ownData(value, 'runId');
|
|
20
|
+
const address = ownData(value, 'logAddress');
|
|
21
|
+
const logRunId = ownData(address, 'logRunId');
|
|
22
|
+
const drill = ownData(address, 'drillPath');
|
|
23
|
+
const commits = ownData(value, 'commits');
|
|
24
|
+
const from = ownData(commits, 'from');
|
|
25
|
+
const to = ownData(commits, 'to');
|
|
26
|
+
if (ownData(value, 'version') !== version ||
|
|
27
|
+
!captureIdentifier(runId) ||
|
|
28
|
+
!captureIdentifier(logRunId) ||
|
|
29
|
+
!Array.isArray(drill) ||
|
|
30
|
+
Object.getPrototypeOf(drill) !== Array.prototype ||
|
|
31
|
+
Object.getOwnPropertyDescriptor(drill, 'length')?.value !== 0 ||
|
|
32
|
+
!count(from) ||
|
|
33
|
+
!count(to) ||
|
|
34
|
+
from > to ||
|
|
35
|
+
!shapeKeys(address, ['logRunId', 'drillPath'], exact) ||
|
|
36
|
+
!shapeKeys(commits, ['from', 'to'], exact))
|
|
37
|
+
return undefined;
|
|
38
|
+
return {
|
|
39
|
+
runId,
|
|
40
|
+
logAddress: Object.freeze({ logRunId, drillPath: Object.freeze([]) }),
|
|
41
|
+
commits: Object.freeze({ from, to }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function copyModes(value, exact = false) {
|
|
45
|
+
const readTracking = ownData(value, 'readTracking');
|
|
46
|
+
const writeTracking = ownData(value, 'writeTracking');
|
|
47
|
+
const commitValues = ownData(value, 'commitValues');
|
|
48
|
+
const writeProvenance = ownData(value, 'writeProvenance');
|
|
49
|
+
if (!isCaptureValue(readTracking, CAPTURE_RETENTION_MODES) ||
|
|
50
|
+
!isCaptureValue(writeTracking, CAPTURE_RETENTION_MODES) ||
|
|
51
|
+
!isCaptureValue(commitValues, CAPTURE_COMMIT_VALUE_MODES) ||
|
|
52
|
+
!isCaptureValue(writeProvenance, CAPTURE_PROVENANCE_MODES) ||
|
|
53
|
+
!shapeKeys(value, ['readTracking', 'writeTracking', 'commitValues', 'writeProvenance'], exact))
|
|
54
|
+
return undefined;
|
|
55
|
+
return Object.freeze({ readTracking, writeTracking, commitValues, writeProvenance });
|
|
56
|
+
}
|
|
57
|
+
export function copyChannels(value, exact = false) {
|
|
58
|
+
const observed = copyObservedChannels(value);
|
|
59
|
+
if (!observed ||
|
|
60
|
+
ownData(value, 'readSources') !== 'not-collected' ||
|
|
61
|
+
!shapeKeys(value, ['reads', 'writes', 'attention', 'control', 'readSources'], exact))
|
|
62
|
+
return undefined;
|
|
63
|
+
return Object.freeze({ ...observed, readSources: 'not-collected' });
|
|
64
|
+
}
|
|
65
|
+
/** Shared native statuses; source version admission remains explicit at each codec boundary. */
|
|
66
|
+
export function copyObservedChannels(value) {
|
|
67
|
+
const reads = ownData(value, 'reads');
|
|
68
|
+
const writes = ownData(value, 'writes');
|
|
69
|
+
const attention = ownData(value, 'attention');
|
|
70
|
+
const control = ownData(value, 'control');
|
|
71
|
+
if (!isCaptureValue(reads, CAPTURE_CHANNEL_STATUSES) ||
|
|
72
|
+
!isCaptureValue(writes, CAPTURE_CHANNEL_STATUSES) ||
|
|
73
|
+
!isCaptureValue(attention, CAPTURE_CHANNEL_STATUSES) ||
|
|
74
|
+
!isCaptureValue(control, CAPTURE_CHANNEL_STATUSES))
|
|
75
|
+
return undefined;
|
|
76
|
+
return Object.freeze({ reads, writes, attention, control });
|
|
77
|
+
}
|
|
78
|
+
export function copyLimitations(value) {
|
|
79
|
+
if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)
|
|
80
|
+
return undefined;
|
|
81
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
82
|
+
if (!count(length) || length > 32)
|
|
83
|
+
return undefined;
|
|
84
|
+
const limitations = [];
|
|
85
|
+
for (let index = 0; index < length; index++) {
|
|
86
|
+
const entry = Object.getOwnPropertyDescriptor(value, String(index))?.value;
|
|
87
|
+
if (!isCaptureValue(entry, CAPTURE_LIMITATIONS))
|
|
88
|
+
return undefined;
|
|
89
|
+
limitations.push(entry);
|
|
90
|
+
}
|
|
91
|
+
return Object.freeze(limitations);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZVNoYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL25vdGVTaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFlLEVBQUUsR0FBVztJQUNsRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEgsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEtBQWM7SUFDM0IsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFLLEtBQWdCLElBQUksQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBUyxTQUFTLENBQUMsS0FBYyxFQUFFLE1BQXlCLEVBQUUsS0FBYztJQUMxRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FB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LENBQUMsT0FBTyxFQUFFLHdCQUF3QixDQUFDO1FBRWxELE9BQU8sU0FBUyxDQUFDO0lBQ25CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDaEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDdkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7SUFDNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhcHR1cmVMaW1pdGF0aW9uLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTLFxuICBDQVBUVVJFX0NPTU1JVF9WQUxVRV9NT0RFUyxcbiAgQ0FQVFVSRV9MSU1JVEFUSU9OUyxcbiAgQ0FQVFVSRV9QUk9WRU5BTkNFX01PREVTLFxuICBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUyxcbiAgaXNDYXB0dXJlVmFsdWUsXG59IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuXG4vKiogQGludGVybmFsIE9uZSBpbmVydC1kYXRhIGJvdW5kYXJ5IGZvciBjaGVja3BvaW50IGFuZCBoaXN0b3J5IGNhcHR1cmUgY29kZWNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkRhdGEocmVjb3JkOiB1bmtub3duLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVjb3JkKSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVjb3JkLCBrZXkpPy52YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVJZGVudGlmaWVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0ODtcbn1cblxuZnVuY3Rpb24gY291bnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpICYmICh2YWx1ZSBhcyBudW1iZXIpID49IDA7XG59XG5cbi8qKiBFeGFjdCBoaXN0b3J5IHNoYXBlcyByZWZ1c2UgZXh0cmFzOyBjaGVja3BvaW50cyBkZWxpYmVyYXRlbHkgcHJvamVjdCBrbm93biBmaWVsZHMuICovXG5mdW5jdGlvbiBzaGFwZUtleXModmFsdWU6IHVua25vd24sIGZpZWxkczogcmVhZG9ubHkgc3RyaW5nW10sIGV4YWN0OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZXhhY3QgfHwgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSBmaWVsZHMubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJZGVudGl0eShcbiAgdmFsdWU6IHVua25vd24sXG4gIGV4YWN0ID0gZmFsc2UsXG4gIHZlcnNpb246IDEgfCAyID0gMSxcbik6IFBpY2s8TmF0aXZlQ2FwdHVyZU5vdGUsICdydW5JZCcgfCAnbG9nQWRkcmVzcycgfCAnY29tbWl0cyc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcnVuSWQgPSBvd25EYXRhKHZhbHVlLCAncnVuSWQnKTtcbiAgY29uc3QgYWRkcmVzcyA9IG93bkRhdGEodmFsdWUsICdsb2dBZGRyZXNzJyk7XG4gIGNvbnN0IGxvZ1J1bklkID0gb3duRGF0YShhZGRyZXNzLCAnbG9nUnVuSWQnKTtcbiAgY29uc3QgZHJpbGwgPSBvd25EYXRhKGFkZHJlc3MsICdkcmlsbFBhdGgnKTtcbiAgY29uc3QgY29tbWl0cyA9IG93bkRhdGEodmFsdWUsICdjb21taXRzJyk7XG4gIGNvbnN0IGZyb20gPSBvd25EYXRhKGNvbW1pdHMsICdmcm9tJyk7XG4gIGNvbnN0IHRvID0gb3duRGF0YShjb21taXRzLCAndG8nKTtcbiAgaWYgKFxuICAgIG93bkRhdGEodmFsdWUsICd2ZXJzaW9uJykgIT09IHZlcnNpb24gfHxcbiAgICAhY2FwdHVyZUlkZW50aWZpZXIocnVuSWQpIHx8XG4gICAgIWNhcHR1cmVJZGVudGlmaWVyKGxvZ1J1bklkKSB8fFxuICAgICFBcnJheS5pc0FycmF5KGRyaWxsKSB8fFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihkcmlsbCkgIT09IEFycmF5LnByb3RvdHlwZSB8fFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZHJpbGwsICdsZW5ndGgnKT8udmFsdWUgIT09IDAgfHxcbiAgICAhY291bnQoZnJvbSkgfHxcbiAgICAhY291bnQodG8pIHx8XG4gICAgZnJvbSA+IHRvIHx8XG4gICAgIXNoYXBlS2V5cyhhZGRyZXNzLCBbJ2xvZ1J1bklkJywgJ2RyaWxsUGF0aCddLCBleGFjdCkgfHxcbiAgICAhc2hhcGVLZXlzKGNvbW1pdHMsIFsnZnJvbScsICd0byddLCBleGFjdClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcnVuSWQsXG4gICAgbG9nQWRkcmVzczogT2JqZWN0LmZyZWV6ZSh7IGxvZ1J1bklkLCBkcmlsbFBhdGg6IE9iamVjdC5mcmVlemUoW10pIH0pLFxuICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tLCB0byB9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlNb2Rlcyh2YWx1ZTogdW5rbm93biwgZXhhY3QgPSBmYWxzZSk6IE5hdGl2ZUNhcHR1cmVOb3RlWydtb2RlcyddIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhZFRyYWNraW5nID0gb3duRGF0YSh2YWx1ZSwgJ3JlYWRUcmFja2luZycpO1xuICBjb25zdCB3cml0ZVRyYWNraW5nID0gb3duRGF0YSh2YWx1ZSwgJ3dyaXRlVHJhY2tpbmcnKTtcbiAgY29uc3QgY29tbWl0VmFsdWVzID0gb3duRGF0YSh2YWx1ZSwgJ2NvbW1pdFZhbHVlcycpO1xuICBjb25zdCB3cml0ZVByb3ZlbmFuY2UgPSBvd25EYXRhKHZhbHVlLCAnd3JpdGVQcm92ZW5hbmNlJyk7XG4gIGlmIChcbiAgICAhaXNDYXB0dXJlVmFsdWUocmVhZFRyYWNraW5nLCBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUykgfHxcbiAgICAhaXNDYXB0dXJlVmFsdWUod3JpdGVUcmFja2luZywgQ0FQVFVSRV9SRVRFTlRJT05fTU9ERVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKGNvbW1pdFZhbHVlcywgQ0FQVFVSRV9DT01NSVRfVkFMVUVfTU9ERVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKHdyaXRlUHJvdmVuYW5jZSwgQ0FQVFVSRV9QUk9WRU5BTkNFX01PREVTKSB8fFxuICAgICFzaGFwZUtleXModmFsdWUsIFsncmVhZFRyYWNraW5nJywgJ3dyaXRlVHJhY2tpbmcnLCAnY29tbWl0VmFsdWVzJywgJ3dyaXRlUHJvdmVuYW5jZSddLCBleGFjdClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgcmVhZFRyYWNraW5nLCB3cml0ZVRyYWNraW5nLCBjb21taXRWYWx1ZXMsIHdyaXRlUHJvdmVuYW5jZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlDaGFubmVscyh2YWx1ZTogdW5rbm93biwgZXhhY3QgPSBmYWxzZSk6IE5hdGl2ZUNhcHR1cmVOb3RlWydjaGFubmVscyddIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb2JzZXJ2ZWQgPSBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2YWx1ZSk7XG4gIGlmIChcbiAgICAhb2JzZXJ2ZWQgfHxcbiAgICBvd25EYXRhKHZhbHVlLCAncmVhZFNvdXJjZXMnKSAhPT0gJ25vdC1jb2xsZWN0ZWQnIHx8XG4gICAgIXNoYXBlS2V5cyh2YWx1ZSwgWydyZWFkcycsICd3cml0ZXMnLCAnYXR0ZW50aW9uJywgJ2NvbnRyb2wnLCAncmVhZFNvdXJjZXMnXSwgZXhhY3QpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLm9ic2VydmVkLCByZWFkU291cmNlczogJ25vdC1jb2xsZWN0ZWQnIH0pO1xufVxuXG4vKiogU2hhcmVkIG5hdGl2ZSBzdGF0dXNlczsgc291cmNlIHZlcnNpb24gYWRtaXNzaW9uIHJlbWFpbnMgZXhwbGljaXQgYXQgZWFjaCBjb2RlYyBib3VuZGFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2YWx1ZTogdW5rbm93bik6IE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGVbJ2NoYW5uZWxzJ10sICdyZWFkU291cmNlcyc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhZHMgPSBvd25EYXRhKHZhbHVlLCAncmVhZHMnKTtcbiAgY29uc3Qgd3JpdGVzID0gb3duRGF0YSh2YWx1ZSwgJ3dyaXRlcycpO1xuICBjb25zdCBhdHRlbnRpb24gPSBvd25EYXRhKHZhbHVlLCAnYXR0ZW50aW9uJyk7XG4gIGNvbnN0IGNvbnRyb2wgPSBvd25EYXRhKHZhbHVlLCAnY29udHJvbCcpO1xuICBpZiAoXG4gICAgIWlzQ2FwdHVyZVZhbHVlKHJlYWRzLCBDQVBUVVJFX0NIQU5ORUxfU1RBVFVTRVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKHdyaXRlcywgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKSB8fFxuICAgICFpc0NhcHR1cmVWYWx1ZShhdHRlbnRpb24sIENBUFRVUkVfQ0hBTk5FTF9TVEFUVVNFUykgfHxcbiAgICAhaXNDYXB0dXJlVmFsdWUoY29udHJvbCwgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyByZWFkcywgd3JpdGVzLCBhdHRlbnRpb24sIGNvbnRyb2wgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5TGltaXRhdGlvbnModmFsdWU6IHVua25vd24pOiByZWFkb25seSBDYXB0dXJlTGltaXRhdGlvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpICE9PSBBcnJheS5wcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxlbmd0aCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdsZW5ndGgnKT8udmFsdWU7XG4gIGlmICghY291bnQobGVuZ3RoKSB8fCBsZW5ndGggPiAzMikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGltaXRhdGlvbnM6IENhcHR1cmVMaW1pdGF0aW9uW10gPSBbXTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwgU3RyaW5nKGluZGV4KSk/LnZhbHVlO1xuICAgIGlmICghaXNDYXB0dXJlVmFsdWUoZW50cnksIENBUFRVUkVfTElNSVRBVElPTlMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxpbWl0YXRpb25zLnB1c2goZW50cnkpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKGxpbWl0YXRpb25zKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ReadSourceRecord, ReadSourceSnapshot } from 'foottrace/write';
|
|
2
|
+
import type { CaptureChannelStatus, NativeCaptureNote } from './nativeCoverage.js';
|
|
3
|
+
/** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
|
|
4
|
+
export declare const SOURCE_LIMITATIONS: readonly ["privacy-active", "identity-unavailable", "untracked-read", "custom-scope", "child-source-ownership", "source-address-unsupported", "resumed-source-ownership", "sink-source-unsupported", "source-history-not-included", "source-capture-failed", "redacted-source-export"];
|
|
5
|
+
export type SourceLimitation = (typeof SOURCE_LIMITATIONS)[number];
|
|
6
|
+
/** Packet 3 is an in-memory observation, not a stored-history acknowledgement. */
|
|
7
|
+
export interface EngineReadSources {
|
|
8
|
+
readonly version: 1;
|
|
9
|
+
readonly runId: string;
|
|
10
|
+
readonly persistence: 'memory-only';
|
|
11
|
+
readonly commits: {
|
|
12
|
+
readonly from: number;
|
|
13
|
+
readonly to: number;
|
|
14
|
+
};
|
|
15
|
+
readonly status: CaptureChannelStatus;
|
|
16
|
+
readonly limitations: readonly SourceLimitation[];
|
|
17
|
+
/** Absent means unknown ownership, never an observed-empty book. */
|
|
18
|
+
readonly record?: ReadSourceSnapshot;
|
|
19
|
+
}
|
|
20
|
+
/** A new discriminant prevents strict v1 readers from accepting new completeness claims. */
|
|
21
|
+
export interface NativeReadCaptureNote extends Omit<NativeCaptureNote, 'version' | 'channels'> {
|
|
22
|
+
readonly version: 2;
|
|
23
|
+
readonly channels: Omit<NativeCaptureNote['channels'], 'readSources'> & {
|
|
24
|
+
readonly readSources: CaptureChannelStatus;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export type NativeCaptureObservation = NativeCaptureNote | NativeReadCaptureNote;
|
|
28
|
+
/** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
|
|
29
|
+
export declare class EngineReadSourceCapture {
|
|
30
|
+
readonly runId: string;
|
|
31
|
+
private readonly book?;
|
|
32
|
+
readonly from: number;
|
|
33
|
+
private readonly gaps;
|
|
34
|
+
private sealed?;
|
|
35
|
+
private retired;
|
|
36
|
+
get observing(): boolean;
|
|
37
|
+
get active(): boolean;
|
|
38
|
+
constructor(runId: string, book?: ReadSourceRecord | undefined, gap?: SourceLimitation, from?: number);
|
|
39
|
+
limit(gap: SourceLimitation): void;
|
|
40
|
+
retire(): void;
|
|
41
|
+
seal(to: number): void;
|
|
42
|
+
snapshot(to: number, redact?: boolean): EngineReadSources;
|
|
43
|
+
}
|
|
44
|
+
/** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
|
|
45
|
+
export declare function withReadSources(note: NativeCaptureNote, sources: EngineReadSources): NativeReadCaptureNote;
|
|
46
|
+
/** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
|
|
47
|
+
export declare function readSourceStatus(record: ReadSourceSnapshot | undefined, limitations: number): CaptureChannelStatus;
|
|
48
|
+
/** Redacted exports withhold every reference, including those captured before a later privacy mark. */
|
|
49
|
+
export declare function redactReadSources(source: EngineReadSources): EngineReadSources;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
|
|
2
|
+
export const SOURCE_LIMITATIONS = Object.freeze([
|
|
3
|
+
'privacy-active',
|
|
4
|
+
'identity-unavailable',
|
|
5
|
+
'untracked-read',
|
|
6
|
+
'custom-scope',
|
|
7
|
+
'child-source-ownership',
|
|
8
|
+
'source-address-unsupported',
|
|
9
|
+
'resumed-source-ownership',
|
|
10
|
+
'sink-source-unsupported',
|
|
11
|
+
'source-history-not-included',
|
|
12
|
+
'source-capture-failed',
|
|
13
|
+
'redacted-source-export',
|
|
14
|
+
]);
|
|
15
|
+
/** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
|
|
16
|
+
export class EngineReadSourceCapture {
|
|
17
|
+
runId;
|
|
18
|
+
book;
|
|
19
|
+
from;
|
|
20
|
+
gaps = new Set();
|
|
21
|
+
sealed;
|
|
22
|
+
retired = false;
|
|
23
|
+
get observing() {
|
|
24
|
+
return this.book !== undefined;
|
|
25
|
+
}
|
|
26
|
+
get active() {
|
|
27
|
+
return this.observing && !this.retired;
|
|
28
|
+
}
|
|
29
|
+
constructor(runId, book, gap, from = 0) {
|
|
30
|
+
this.runId = runId;
|
|
31
|
+
this.book = book;
|
|
32
|
+
this.from = from;
|
|
33
|
+
if (gap)
|
|
34
|
+
this.gaps.add(gap);
|
|
35
|
+
}
|
|
36
|
+
limit(gap) {
|
|
37
|
+
if (!this.sealed)
|
|
38
|
+
this.gaps.add(gap);
|
|
39
|
+
}
|
|
40
|
+
retire() {
|
|
41
|
+
this.retired = true;
|
|
42
|
+
this.book?.retire();
|
|
43
|
+
}
|
|
44
|
+
seal(to) {
|
|
45
|
+
if (this.sealed)
|
|
46
|
+
return;
|
|
47
|
+
this.sealed = this.snapshot(to);
|
|
48
|
+
this.retire();
|
|
49
|
+
}
|
|
50
|
+
snapshot(to, redact = false) {
|
|
51
|
+
if (redact)
|
|
52
|
+
return redactReadSources(this.snapshot(to));
|
|
53
|
+
if (this.sealed && !redact)
|
|
54
|
+
return this.sealed;
|
|
55
|
+
const gaps = new Set(this.gaps);
|
|
56
|
+
const record = this.book?.snapshot();
|
|
57
|
+
const status = readSourceStatus(record, gaps.size);
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
version: 1,
|
|
60
|
+
runId: this.runId,
|
|
61
|
+
persistence: 'memory-only',
|
|
62
|
+
commits: Object.freeze({ from: this.from, to }),
|
|
63
|
+
status,
|
|
64
|
+
limitations: Object.freeze([...gaps]),
|
|
65
|
+
...(record && { record }),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
|
|
70
|
+
export function withReadSources(note, sources) {
|
|
71
|
+
return Object.freeze({
|
|
72
|
+
...note,
|
|
73
|
+
version: 2,
|
|
74
|
+
channels: Object.freeze({ ...note.channels, readSources: sources.status }),
|
|
75
|
+
limitations: Object.freeze(note.limitations.filter((gap) => gap !== 'read-sources-not-collected')),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** One status rule shared by native observations and stored admission; storage cannot upgrade coverage. */
|
|
79
|
+
export function readSourceStatus(record, limitations) {
|
|
80
|
+
return !record
|
|
81
|
+
? 'unknown'
|
|
82
|
+
: record.status === 'failed'
|
|
83
|
+
? 'failed'
|
|
84
|
+
: record.status !== 'captured' || limitations > 0
|
|
85
|
+
? 'partial'
|
|
86
|
+
: 'captured';
|
|
87
|
+
}
|
|
88
|
+
/** Redacted exports withhold every reference, including those captured before a later privacy mark. */
|
|
89
|
+
export function redactReadSources(source) {
|
|
90
|
+
return Object.freeze({
|
|
91
|
+
version: source.version,
|
|
92
|
+
runId: source.runId,
|
|
93
|
+
persistence: source.persistence,
|
|
94
|
+
commits: source.commits,
|
|
95
|
+
status: 'unknown',
|
|
96
|
+
limitations: Object.freeze([...new Set([...source.limitations, 'redacted-source-export'])]),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtDQUNoQixDQUFDLENBQUM7QUF3QlosNkdBQTZHO0FBQzdHLE1BQU0sT0FBTyx1QkFBdUI7SUFhdkI7SUFDUTtJQUVSO0lBZk0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzVDLE1BQU0sQ0FBcUI7SUFDM0IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFB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SztRQUNuQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSx3QkFBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWFkU291cmNlUmVjb3JkLCBSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IENhcHR1cmVDaGFubmVsU3RhdHVzLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuXG4vKiogRW5naW5lIGNvdmVyYWdlIG9ubHkuIFNvdXJjZSBkZXNjcmlwdG9ycyBhbmQgdGhlaXIgY29kZWMgYmVsb25nIHRvIGZvb3R0cmFjZS93cml0ZS4gKi9cbmV4cG9ydCBjb25zdCBTT1VSQ0VfTElNSVRBVElPTlMgPSBPYmplY3QuZnJlZXplKFtcbiAgJ3ByaXZhY3ktYWN0aXZlJyxcbiAgJ2lkZW50aXR5LXVuYXZhaWxhYmxlJyxcbiAgJ3VudHJhY2tlZC1yZWFkJyxcbiAgJ2N1c3RvbS1zY29wZScsXG4gICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3NvdXJjZS1hZGRyZXNzLXVuc3VwcG9ydGVkJyxcbiAgJ3Jlc3VtZWQtc291cmNlLW93bmVyc2hpcCcsXG4gICdzaW5rLXNvdXJjZS11bnN1cHBvcnRlZCcsXG4gICdzb3VyY2UtaGlzdG9yeS1ub3QtaW5jbHVkZWQnLFxuICAnc291cmNlLWNhcHR1cmUtZmFpbGVkJyxcbiAgJ3JlZGFjdGVkLXNvdXJjZS1leHBvcnQnLFxuXSBhcyBjb25zdCk7XG5leHBvcnQgdHlwZSBTb3VyY2VMaW1pdGF0aW9uID0gKHR5cGVvZiBTT1VSQ0VfTElNSVRBVElPTlMpW251bWJlcl07XG5cbi8qKiBQYWNrZXQgMyBpcyBhbiBpbi1tZW1vcnkgb2JzZXJ2YXRpb24sIG5vdCBhIHN0b3JlZC1oaXN0b3J5IGFja25vd2xlZGdlbWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lUmVhZFNvdXJjZXMge1xuICByZWFkb25seSB2ZXJzaW9uOiAxO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JztcbiAgcmVhZG9ubHkgY29tbWl0czogeyByZWFkb25seSBmcm9tOiBudW1iZXI7IHJlYWRvbmx5IHRvOiBudW1iZXIgfTtcbiAgcmVhZG9ubHkgc3RhdHVzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgcmVhZG9ubHkgbGltaXRhdGlvbnM6IHJlYWRvbmx5IFNvdXJjZUxpbWl0YXRpb25bXTtcbiAgLyoqIEFic2VudCBtZWFucyB1bmtub3duIG93bmVyc2hpcCwgbmV2ZXIgYW4gb2JzZXJ2ZWQtZW1wdHkgYm9vay4gKi9cbiAgcmVhZG9ubHkgcmVjb3JkPzogUmVhZFNvdXJjZVNuYXBzaG90O1xufVxuXG4vKiogQSBuZXcgZGlzY3JpbWluYW50IHByZXZlbnRzIHN0cmljdCB2MSByZWFkZXJzIGZyb20gYWNjZXB0aW5nIG5ldyBjb21wbGV0ZW5lc3MgY2xhaW1zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUgZXh0ZW5kcyBPbWl0PE5hdGl2ZUNhcHR1cmVOb3RlLCAndmVyc2lvbicgfCAnY2hhbm5lbHMnPiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDI7XG4gIHJlYWRvbmx5IGNoYW5uZWxzOiBPbWl0PE5hdGl2ZUNhcHR1cmVOb3RlWydjaGFubmVscyddLCAncmVhZFNvdXJjZXMnPiAmIHtcbiAgICByZWFkb25seSByZWFkU291cmNlczogQ2FwdHVyZUNoYW5uZWxTdGF0dXM7XG4gIH07XG59XG5leHBvcnQgdHlwZSBOYXRpdmVDYXB0dXJlT2JzZXJ2YXRpb24gPSBOYXRpdmVDYXB0dXJlTm90ZSB8IE5hdGl2ZVJlYWRDYXB0dXJlTm90ZTtcblxuLyoqIE9uZSBvd25lciBwZXIgcnVudGltZS9sZWc7IHByb3BhZ2F0ZWQgb25seSB0byBmcmFtZXMgaW4gdGhhdCBsb2cuIE5ldmVyIHJlYWRzIHZhbHVlcyBvciBzY2FucyBjb21taXRzLiAqL1xuZXhwb3J0IGNsYXNzIEVuZ2luZVJlYWRTb3VyY2VDYXB0dXJlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXBzID0gbmV3IFNldDxTb3VyY2VMaW1pdGF0aW9uPigpO1xuICBwcml2YXRlIHNlYWxlZD86IEVuZ2luZVJlYWRTb3VyY2VzO1xuICBwcml2YXRlIHJldGlyZWQgPSBmYWxzZTtcbiAgZ2V0IG9ic2VydmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ib29rICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmluZyAmJiAhdGhpcy5yZXRpcmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogU291cmNlTGltaXRhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIHJldGlyZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJldGlyZWQgPSB0cnVlO1xuICAgIHRoaXMuYm9vaz8ucmV0aXJlKCk7XG4gIH1cblxuICBzZWFsKHRvOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWFsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlYWxlZCA9IHRoaXMuc25hcHNob3QodG8pO1xuICAgIHRoaXMucmV0aXJlKCk7XG4gIH1cblxuICBzbmFwc2hvdCh0bzogbnVtYmVyLCByZWRhY3QgPSBmYWxzZSk6IEVuZ2luZVJlYWRTb3VyY2VzIHtcbiAgICBpZiAocmVkYWN0KSByZXR1cm4gcmVkYWN0UmVhZFNvdXJjZXModGhpcy5zbmFwc2hvdCh0bykpO1xuICAgIGlmICh0aGlzLnNlYWxlZCAmJiAhcmVkYWN0KSByZXR1cm4gdGhpcy5zZWFsZWQ7XG4gICAgY29uc3QgZ2FwcyA9IG5ldyBTZXQodGhpcy5nYXBzKTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmJvb2s/LnNuYXBzaG90KCk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQsIGdhcHMuc2l6ZSk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgcGVyc2lzdGVuY2U6ICdtZW1vcnktb25seScsXG4gICAgICBjb21taXRzOiBPYmplY3QuZnJlZXplKHsgZnJvbTogdGhpcy5mcm9tLCB0byB9KSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi5nYXBzXSksXG4gICAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBLZWVwIHRoZSB2MSBwcm9kdWNlciB1bmNoYW5nZWQuIE9ubHkgZXhwbGljaXRseSBlbmFibGVkIHNvdXJjZSBvYnNlcnZhdGlvbnMgYWNxdWlyZSB2Mi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVhZFNvdXJjZXMobm90ZTogTmF0aXZlQ2FwdHVyZU5vdGUsIHNvdXJjZXM6IEVuZ2luZVJlYWRTb3VyY2VzKTogTmF0aXZlUmVhZENhcHR1cmVOb3RlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIC4uLm5vdGUsXG4gICAgdmVyc2lvbjogMixcbiAgICBjaGFubmVsczogT2JqZWN0LmZyZWV6ZSh7IC4uLm5vdGUuY2hhbm5lbHMsIHJlYWRTb3VyY2VzOiBzb3VyY2VzLnN0YXR1cyB9KSxcbiAgICBsaW1pdGF0aW9uczogT2JqZWN0LmZyZWV6ZShub3RlLmxpbWl0YXRpb25zLmZpbHRlcigoZ2FwKSA9PiBnYXAgIT09ICdyZWFkLXNvdXJjZXMtbm90LWNvbGxlY3RlZCcpKSxcbiAgfSk7XG59XG5cbi8qKiBPbmUgc3RhdHVzIHJ1bGUgc2hhcmVkIGJ5IG5hdGl2ZSBvYnNlcnZhdGlvbnMgYW5kIHN0b3JlZCBhZG1pc3Npb247IHN0b3JhZ2UgY2Fubm90IHVwZ3JhZGUgY292ZXJhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQ6IFJlYWRTb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZCwgbGltaXRhdGlvbnM6IG51bWJlcik6IENhcHR1cmVDaGFubmVsU3RhdHVzIHtcbiAgcmV0dXJuICFyZWNvcmRcbiAgICA/ICd1bmtub3duJ1xuICAgIDogcmVjb3JkLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICA/ICdmYWlsZWQnXG4gICAgOiByZWNvcmQuc3RhdHVzICE9PSAnY2FwdHVyZWQnIHx8IGxpbWl0YXRpb25zID4gMFxuICAgID8gJ3BhcnRpYWwnXG4gICAgOiAnY2FwdHVyZWQnO1xufVxuXG4vKiogUmVkYWN0ZWQgZXhwb3J0cyB3aXRoaG9sZCBldmVyeSByZWZlcmVuY2UsIGluY2x1ZGluZyB0aG9zZSBjYXB0dXJlZCBiZWZvcmUgYSBsYXRlciBwcml2YWN5IG1hcmsuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UmVhZFNvdXJjZXMoc291cmNlOiBFbmdpbmVSZWFkU291cmNlcyk6IEVuZ2luZVJlYWRTb3VyY2VzIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHZlcnNpb246IHNvdXJjZS52ZXJzaW9uLFxuICAgIHJ1bklkOiBzb3VyY2UucnVuSWQsXG4gICAgcGVyc2lzdGVuY2U6IHNvdXJjZS5wZXJzaXN0ZW5jZSxcbiAgICBjb21taXRzOiBzb3VyY2UuY29tbWl0cyxcbiAgICBzdGF0dXM6ICd1bmtub3duJyxcbiAgICBsaW1pdGF0aW9uczogT2JqZWN0LmZyZWV6ZShbLi4ubmV3IFNldChbLi4uc291cmNlLmxpbWl0YXRpb25zLCAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcgYXMgY29uc3RdKV0pLFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
|
|
3
|
+
* watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
|
|
4
|
+
* handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
|
|
5
|
+
*/
|
|
6
|
+
export declare function settleOnce<T>(value: unknown, onValue: () => T, onError: (error: unknown) => T): Promise<T>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
|
|
3
|
+
* watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
|
|
4
|
+
* handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
|
|
5
|
+
*/
|
|
6
|
+
export function settleOnce(value, onValue, onError) {
|
|
7
|
+
const adopted = value instanceof Promise ? value : new Promise((resolve) => resolve(value));
|
|
8
|
+
return Promise.prototype.then.call(adopted, onValue, onError);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lua1NldHRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvc2lua1NldHRsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUksS0FBYyxFQUFFLE9BQWdCLEVBQUUsT0FBOEI7SUFDNUYsTUFBTSxPQUFPLEdBQXFCLEtBQUssWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlHLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFlLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYHZhbHVlYCwgc2V0dGxlZCBPTkNFIGludG8gYG9uVmFsdWVgIC8gYG9uRXJyb3JgIOKAlCBuZXZlciB0aHJvdWdoIHRoZSB2YWx1ZSdzIG93biBgdGhlbmA6IGEgbmF0aXZlIHByb21pc2UgaXNcbiAqIHdhdGNoZWQgdGhyb3VnaCB0aGUgcmVhbCBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgKGFuIG93biBgdGhlbmAgb24gaXQgaXMgbm90IHRydXN0ZWQsIHNvIGl0cyByZWplY3Rpb24gaXMgYWx3YXlzXG4gKiBoYW5kbGVkKSwgYW55IG90aGVyIHRoZW5hYmxlIGFkb3B0ZWQgaW50byBhIGZyZXNoIHByb21pc2UuIEEgcGxhaW4gdmFsdWUgaXMgYSBmdWxmaWxtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dGxlT25jZTxUPih2YWx1ZTogdW5rbm93biwgb25WYWx1ZTogKCkgPT4gVCwgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGFkb3B0ZWQ6IFByb21pc2U8dW5rbm93bj4gPSB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gIHJldHVybiBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoYWRvcHRlZCwgb25WYWx1ZSwgb25FcnJvcikgYXMgUHJvbWlzZTxUPjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReadSource } from 'foottrace/write';
|
|
2
|
+
/** Native per-execution totals, independent of last-value retention and the bounded source book. */
|
|
3
|
+
export interface SourceReadCounts {
|
|
4
|
+
readonly observed: number;
|
|
5
|
+
readonly retained: number;
|
|
6
|
+
/** Counts the native writer's returned kinds, never classifies values or chooses sources. */
|
|
7
|
+
readonly kinds: Readonly<Record<ReadSource['kind'], number>>;
|
|
8
|
+
}
|
|
9
|
+
export declare const EMPTY_SOURCE_READ_COUNTS: SourceReadCounts;
|
|
10
|
+
/** Fixed scalar counters only; discarded attempts remain part of this execution's history. */
|
|
11
|
+
export declare class SourceReadCounter {
|
|
12
|
+
private observed;
|
|
13
|
+
private retained;
|
|
14
|
+
private kinds;
|
|
15
|
+
observe(): boolean;
|
|
16
|
+
retain(kind: ReadSource['kind']): void;
|
|
17
|
+
snapshot(): SourceReadCounts;
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const EMPTY_SOURCE_READ_COUNTS = Object.freeze({
|
|
2
|
+
observed: 0,
|
|
3
|
+
retained: 0,
|
|
4
|
+
kinds: Object.freeze({ base: 0, committed: 0, staged: 0, unavailable: 0 }),
|
|
5
|
+
});
|
|
6
|
+
/** Fixed scalar counters only; discarded attempts remain part of this execution's history. */
|
|
7
|
+
export class SourceReadCounter {
|
|
8
|
+
observed = 0;
|
|
9
|
+
retained = 0;
|
|
10
|
+
kinds = { ...EMPTY_SOURCE_READ_COUNTS.kinds };
|
|
11
|
+
observe() {
|
|
12
|
+
if (this.observed === Number.MAX_SAFE_INTEGER)
|
|
13
|
+
return false;
|
|
14
|
+
this.observed++;
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
retain(kind) {
|
|
18
|
+
if (this.retained < this.observed) {
|
|
19
|
+
this.retained++;
|
|
20
|
+
this.kinds[kind]++;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
snapshot() {
|
|
24
|
+
return Object.freeze({ observed: this.observed, retained: this.retained, kinds: Object.freeze({ ...this.kinds }) });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlUmVhZENvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zb3VyY2VSZWFkQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFxQixNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RFLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzRSxDQUFDLENBQUM7QUFFSCw4RkFBOEY7QUFDOUYsTUFBTSxPQUFPLGlCQUFpQjtJQUNwQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssR0FBRyxFQUFFLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFdEQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUF3QjtRQUM3QixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0SCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2UgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG4vKiogTmF0aXZlIHBlci1leGVjdXRpb24gdG90YWxzLCBpbmRlcGVuZGVudCBvZiBsYXN0LXZhbHVlIHJldGVudGlvbiBhbmQgdGhlIGJvdW5kZWQgc291cmNlIGJvb2suICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVJlYWRDb3VudHMge1xuICByZWFkb25seSBvYnNlcnZlZDogbnVtYmVyO1xuICByZWFkb25seSByZXRhaW5lZDogbnVtYmVyO1xuICAvKiogQ291bnRzIHRoZSBuYXRpdmUgd3JpdGVyJ3MgcmV0dXJuZWQga2luZHMsIG5ldmVyIGNsYXNzaWZpZXMgdmFsdWVzIG9yIGNob29zZXMgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkga2luZHM6IFJlYWRvbmx5PFJlY29yZDxSZWFkU291cmNlWydraW5kJ10sIG51bWJlcj4+O1xufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTOiBTb3VyY2VSZWFkQ291bnRzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG9ic2VydmVkOiAwLFxuICByZXRhaW5lZDogMCxcbiAga2luZHM6IE9iamVjdC5mcmVlemUoeyBiYXNlOiAwLCBjb21taXR0ZWQ6IDAsIHN0YWdlZDogMCwgdW5hdmFpbGFibGU6IDAgfSksXG59KTtcblxuLyoqIEZpeGVkIHNjYWxhciBjb3VudGVycyBvbmx5OyBkaXNjYXJkZWQgYXR0ZW1wdHMgcmVtYWluIHBhcnQgb2YgdGhpcyBleGVjdXRpb24ncyBoaXN0b3J5LiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVJlYWRDb3VudGVyIHtcbiAgcHJpdmF0ZSBvYnNlcnZlZCA9IDA7XG4gIHByaXZhdGUgcmV0YWluZWQgPSAwO1xuICBwcml2YXRlIGtpbmRzID0geyAuLi5FTVBUWV9TT1VSQ0VfUkVBRF9DT1VOVFMua2luZHMgfTtcblxuICBvYnNlcnZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm9ic2VydmVkID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMub2JzZXJ2ZWQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldGFpbihraW5kOiBSZWFkU291cmNlWydraW5kJ10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXRhaW5lZCA8IHRoaXMub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMucmV0YWluZWQrKztcbiAgICAgIHRoaXMua2luZHNba2luZF0rKztcbiAgICB9XG4gIH1cblxuICBzbmFwc2hvdCgpOiBTb3VyY2VSZWFkQ291bnRzIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IG9ic2VydmVkOiB0aGlzLm9ic2VydmVkLCByZXRhaW5lZDogdGhpcy5yZXRhaW5lZCwga2luZHM6IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLmtpbmRzIH0pIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CommitBundle } from 'foottrace';
|
|
2
|
+
/** Conservative work cap before each distinct public value query, including shared-root replay/cloning. */
|
|
3
|
+
export declare class SourceReferenceBudget {
|
|
4
|
+
private rows;
|
|
5
|
+
private bytes;
|
|
6
|
+
private readonly queryRows;
|
|
7
|
+
private readonly queryBytes;
|
|
8
|
+
constructor(commitLog: readonly CommitBundle[], initialState?: Record<string, unknown>);
|
|
9
|
+
spend(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HistoryDataError } from './historyData.js';
|
|
2
|
+
/** Conservative work cap before each distinct public value query, including shared-root replay/cloning. */
|
|
3
|
+
export class SourceReferenceBudget {
|
|
4
|
+
rows = 0;
|
|
5
|
+
bytes = 0;
|
|
6
|
+
queryRows;
|
|
7
|
+
queryBytes;
|
|
8
|
+
constructor(commitLog, initialState) {
|
|
9
|
+
this.queryRows = 1 + commitLog.length + commitLog.reduce((count, bundle) => count + bundle.trace.length, 0);
|
|
10
|
+
this.queryBytes = new TextEncoder().encode(JSON.stringify({ commitLog, initialState })).length;
|
|
11
|
+
}
|
|
12
|
+
spend() {
|
|
13
|
+
// The entire admitted basis is an upper estimate for each query; repeat (commit,key) hits spend nothing.
|
|
14
|
+
// Refuse before calling the reader, never after doing unaccounted work or silently cutting evidence.
|
|
15
|
+
if (this.queryRows > 1_000_000 - this.rows || this.queryBytes > 64 * 1024 * 1024 - this.bytes)
|
|
16
|
+
throw new HistoryDataError('source-validation-limit');
|
|
17
|
+
this.rows += this.queryRows;
|
|
18
|
+
this.bytes += this.queryBytes;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlUmVmZXJlbmNlQnVkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3NvdXJjZVJlZmVyZW5jZUJ1ZGdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCwyR0FBMkc7QUFDM0csTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNELFNBQVMsQ0FBUztJQUNsQixVQUFVLENBQVM7SUFFcEMsWUFBWSxTQUFrQyxFQUFFLFlBQXNDO1FBQ3BGLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRUQsS0FBSztRQUNILHlHQUF5RztRQUN6RyxxR0FBcUc7UUFDckcsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUs7WUFDM0YsTUFBTSxJQUFJLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IEhpc3RvcnlEYXRhRXJyb3IgfSBmcm9tICcuL2hpc3RvcnlEYXRhLmpzJztcblxuLyoqIENvbnNlcnZhdGl2ZSB3b3JrIGNhcCBiZWZvcmUgZWFjaCBkaXN0aW5jdCBwdWJsaWMgdmFsdWUgcXVlcnksIGluY2x1ZGluZyBzaGFyZWQtcm9vdCByZXBsYXkvY2xvbmluZy4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VSZWZlcmVuY2VCdWRnZXQge1xuICBwcml2YXRlIHJvd3MgPSAwO1xuICBwcml2YXRlIGJ5dGVzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeVJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeUJ5dGVzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICB0aGlzLnF1ZXJ5Um93cyA9IDEgKyBjb21taXRMb2cubGVuZ3RoICsgY29tbWl0TG9nLnJlZHVjZSgoY291bnQsIGJ1bmRsZSkgPT4gY291bnQgKyBidW5kbGUudHJhY2UubGVuZ3RoLCAwKTtcbiAgICB0aGlzLnF1ZXJ5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyBjb21taXRMb2csIGluaXRpYWxTdGF0ZSB9KSkubGVuZ3RoO1xuICB9XG5cbiAgc3BlbmQoKTogdm9pZCB7XG4gICAgLy8gVGhlIGVudGlyZSBhZG1pdHRlZCBiYXNpcyBpcyBhbiB1cHBlciBlc3RpbWF0ZSBmb3IgZWFjaCBxdWVyeTsgcmVwZWF0IChjb21taXQsa2V5KSBoaXRzIHNwZW5kIG5vdGhpbmcuXG4gICAgLy8gUmVmdXNlIGJlZm9yZSBjYWxsaW5nIHRoZSByZWFkZXIsIG5ldmVyIGFmdGVyIGRvaW5nIHVuYWNjb3VudGVkIHdvcmsgb3Igc2lsZW50bHkgY3V0dGluZyBldmlkZW5jZS5cbiAgICBpZiAodGhpcy5xdWVyeVJvd3MgPiAxXzAwMF8wMDAgLSB0aGlzLnJvd3MgfHwgdGhpcy5xdWVyeUJ5dGVzID4gNjQgKiAxMDI0ICogMTAyNCAtIHRoaXMuYnl0ZXMpXG4gICAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignc291cmNlLXZhbGlkYXRpb24tbGltaXQnKTtcbiAgICB0aGlzLnJvd3MgKz0gdGhpcy5xdWVyeVJvd3M7XG4gICAgdGhpcy5ieXRlcyArPSB0aGlzLnF1ZXJ5Qnl0ZXM7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ReadSourceSnapshot } from 'foottrace/write';
|
|
2
|
+
/** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
|
|
3
|
+
export declare function storedReadSourceCounts(record: ReadSourceSnapshot, executionTree: unknown, committedOwners: ReadonlyMap<string, number>): boolean;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { EMPTY_SOURCE_READ_COUNTS } from './sourceReadCounts.js';
|
|
2
|
+
const KINDS = Object.keys(EMPTY_SOURCE_READ_COUNTS.kinds);
|
|
3
|
+
function countsOf(value) {
|
|
4
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
5
|
+
return undefined;
|
|
6
|
+
const counts = value;
|
|
7
|
+
if (Object.keys(value).length !== 3 ||
|
|
8
|
+
!Number.isSafeInteger(counts.observed) ||
|
|
9
|
+
!Number.isSafeInteger(counts.retained) ||
|
|
10
|
+
counts.observed < 0 ||
|
|
11
|
+
counts.retained < 0 ||
|
|
12
|
+
counts.retained > counts.observed)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (!counts.kinds || typeof counts.kinds !== 'object' || Array.isArray(counts.kinds))
|
|
15
|
+
return undefined;
|
|
16
|
+
if (Object.keys(counts.kinds).length !== KINDS.length)
|
|
17
|
+
return undefined;
|
|
18
|
+
let sum = 0;
|
|
19
|
+
for (const kind of KINDS) {
|
|
20
|
+
const count = counts.kinds[kind];
|
|
21
|
+
if (!Number.isSafeInteger(count) || count < 0)
|
|
22
|
+
return undefined;
|
|
23
|
+
sum += count;
|
|
24
|
+
if (sum > counts.retained)
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
if (sum !== counts.retained)
|
|
28
|
+
return undefined;
|
|
29
|
+
return counts;
|
|
30
|
+
}
|
|
31
|
+
/** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
|
|
32
|
+
export function storedReadSourceCounts(record, executionTree, committedOwners) {
|
|
33
|
+
const owners = new Map();
|
|
34
|
+
const pending = [executionTree];
|
|
35
|
+
let visited = 0;
|
|
36
|
+
while (pending.length) {
|
|
37
|
+
if (++visited > 100_000)
|
|
38
|
+
return false;
|
|
39
|
+
const value = pending.pop();
|
|
40
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
41
|
+
return false;
|
|
42
|
+
const node = value;
|
|
43
|
+
const id = node.runtimeStageId;
|
|
44
|
+
if (Object.hasOwn(node, 'readSourceCounts')) {
|
|
45
|
+
const counts = countsOf(node.readSourceCounts);
|
|
46
|
+
if (!counts || (record.status === 'captured' && counts.observed !== counts.retained))
|
|
47
|
+
return false;
|
|
48
|
+
if (typeof id !== 'string' || !id) {
|
|
49
|
+
if (counts.observed || counts.retained)
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
if (owners.has(id))
|
|
54
|
+
return false;
|
|
55
|
+
owners.set(id, counts);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else if (typeof id === 'string' && committedOwners.has(id))
|
|
59
|
+
return false;
|
|
60
|
+
if (Object.hasOwn(node, 'next'))
|
|
61
|
+
pending.push(node.next);
|
|
62
|
+
if (Object.hasOwn(node, 'children')) {
|
|
63
|
+
if (!Array.isArray(node.children) || node.children.length > 100_000 - visited - pending.length)
|
|
64
|
+
return false;
|
|
65
|
+
for (const child of node.children)
|
|
66
|
+
pending.push(child);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const remaining = new Map([...owners].map(([id, counts]) => [id, { ...counts.kinds }]));
|
|
70
|
+
for (const row of record.occurrences) {
|
|
71
|
+
const counts = remaining.get(row.runtimeStageId);
|
|
72
|
+
if (!counts || counts[row.source.kind] === 0)
|
|
73
|
+
return false;
|
|
74
|
+
counts[row.source.kind]--;
|
|
75
|
+
}
|
|
76
|
+
return [...remaining.values()].every((counts) => KINDS.every((kind) => counts[kind] === 0));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZUNvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zdG9yZWRSZWFkU291cmNlQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUF3QyxDQUFDO0FBRWpHLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRixNQUFNLE1BQU0sR0FBRyxLQUF5QixDQUFDO0lBQ3pDLElBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUMvQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUM7UUFDbkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVE7UUFFakMsT0FBTyxTQUFTLENBQUM7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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RyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0csS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVhZFNvdXJjZVNuYXBzaG90IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBTb3VyY2VSZWFkQ291bnRzIH0gZnJvbSAnLi9zb3VyY2VSZWFkQ291bnRzLmpzJztcbmltcG9ydCB7IEVNUFRZX1NPVVJDRV9SRUFEX0NPVU5UUyB9IGZyb20gJy4vc291cmNlUmVhZENvdW50cy5qcyc7XG5cbmNvbnN0IEtJTkRTID0gT2JqZWN0LmtleXMoRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTLmtpbmRzKSBhcyAoa2V5b2YgU291cmNlUmVhZENvdW50c1sna2luZHMnXSlbXTtcblxuZnVuY3Rpb24gY291bnRzT2YodmFsdWU6IHVua25vd24pOiBTb3VyY2VSZWFkQ291bnRzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb3VudHMgPSB2YWx1ZSBhcyBTb3VyY2VSZWFkQ291bnRzO1xuICBpZiAoXG4gICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCAhPT0gMyB8fFxuICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudHMub2JzZXJ2ZWQpIHx8XG4gICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50cy5yZXRhaW5lZCkgfHxcbiAgICBjb3VudHMub2JzZXJ2ZWQgPCAwIHx8XG4gICAgY291bnRzLnJldGFpbmVkIDwgMCB8fFxuICAgIGNvdW50cy5yZXRhaW5lZCA+IGNvdW50cy5vYnNlcnZlZFxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjb3VudHMua2luZHMgfHwgdHlwZW9mIGNvdW50cy5raW5kcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShjb3VudHMua2luZHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoT2JqZWN0LmtleXMoY291bnRzLmtpbmRzKS5sZW5ndGggIT09IEtJTkRTLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAoY29uc3Qga2luZCBvZiBLSU5EUykge1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRzLmtpbmRzW2tpbmRdO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpIHx8IGNvdW50IDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdW0gKz0gY291bnQ7XG4gICAgaWYgKHN1bSA+IGNvdW50cy5yZXRhaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoc3VtICE9PSBjb3VudHMucmV0YWluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb3VudHM7XG59XG5cbi8qKiBBbHJlYWR5IGluZXJ0LCBieXRlLWJvdW5kZWQgZXZpZGVuY2UuIENoZWNrIG5hdGl2ZSBjb3VudHM7IG5ldmVyIHJlY29uc3RydWN0IHJlYWQgb2NjdXJyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkUmVhZFNvdXJjZUNvdW50cyhcbiAgcmVjb3JkOiBSZWFkU291cmNlU25hcHNob3QsXG4gIGV4ZWN1dGlvblRyZWU6IHVua25vd24sXG4gIGNvbW1pdHRlZE93bmVyczogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VSZWFkQ291bnRzPigpO1xuICBjb25zdCBwZW5kaW5nID0gW2V4ZWN1dGlvblRyZWVdO1xuICBsZXQgdmlzaXRlZCA9IDA7XG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCkge1xuICAgIGlmICgrK3Zpc2l0ZWQgPiAxMDBfMDAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpO1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG5vZGUgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpZCA9IG5vZGUucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKE9iamVjdC5oYXNPd24obm9kZSwgJ3JlYWRTb3VyY2VDb3VudHMnKSkge1xuICAgICAgY29uc3QgY291bnRzID0gY291bnRzT2Yobm9kZS5yZWFkU291cmNlQ291bnRzKTtcbiAgICAgIGlmICghY291bnRzIHx8IChyZWNvcmQuc3RhdHVzID09PSAnY2FwdHVyZWQnICYmIGNvdW50cy5vYnNlcnZlZCAhPT0gY291bnRzLnJldGFpbmVkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgIWlkKSB7XG4gICAgICAgIGlmIChjb3VudHMub2JzZXJ2ZWQgfHwgY291bnRzLnJldGFpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3duZXJzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgb3duZXJzLnNldChpZCwgY291bnRzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgY29tbWl0dGVkT3duZXJzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihub2RlLCAnbmV4dCcpKSBwZW5kaW5nLnB1c2gobm9kZS5uZXh0KTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihub2RlLCAnY2hpbGRyZW4nKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMTAwXzAwMCAtIHZpc2l0ZWQgLSBwZW5kaW5nLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSBwZW5kaW5nLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZW1haW5pbmcgPSBuZXcgTWFwKFsuLi5vd25lcnNdLm1hcCgoW2lkLCBjb3VudHNdKSA9PiBbaWQsIHsgLi4uY291bnRzLmtpbmRzIH1dKSk7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJlY29yZC5vY2N1cnJlbmNlcykge1xuICAgIGNvbnN0IGNvdW50cyA9IHJlbWFpbmluZy5nZXQocm93LnJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIWNvdW50cyB8fCBjb3VudHNbcm93LnNvdXJjZS5raW5kXSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvdW50c1tyb3cuc291cmNlLmtpbmRdLS07XG4gIH1cbiAgcmV0dXJuIFsuLi5yZW1haW5pbmcudmFsdWVzKCldLmV2ZXJ5KChjb3VudHMpID0+IEtJTkRTLmV2ZXJ5KChraW5kKSA9PiBjb3VudHNba2luZF0gPT09IDApKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CommitBundle } from 'foottrace';
|
|
2
|
+
import type { EngineReadSources, NativeReadCaptureNote } from './readSources.js';
|
|
3
|
+
/** After inert JSON admission: the record's codec owns descriptors; the engine binds its root observation. */
|
|
4
|
+
export declare function storedReadSources(value: unknown, capture: NativeReadCaptureNote, commitLog: readonly CommitBundle[], initialState?: Record<string, unknown>, executionTree?: unknown): EngineReadSources | undefined;
|