footprintjs 9.48.2 → 10.0.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/AGENTS.md +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deltaEncoding.ts — the delta encoding's pure helpers (`commitValues:
|
|
3
|
-
* 'delta'`, #13c-B; docs/design/13c-b-delta-commit-verb.md), out of
|
|
4
|
-
* `TransactionBuffer` since 9.30.0: the overlap families of rule 3 and the
|
|
5
|
-
* order rows are emitted in (which now also places the admitted record's
|
|
6
|
-
* re-encoded families), the append detection, and the row that carries a
|
|
7
|
-
* value. The verb CHOICE stays in `TransactionBuffer · deltaRows`; nothing
|
|
8
|
-
* here replays the verb law.
|
|
9
|
-
*/
|
|
10
|
-
import { nativeSet as _set } from './pathOps.js';
|
|
11
|
-
import { deepEqual, DELIM } from './utils.js';
|
|
12
|
-
/**
|
|
13
|
-
* A delta row carrying a VALUE: an `append` of the tail when `before` is a
|
|
14
|
-
* strict prefix of `value` ({@link isStrictArrayPrefix}), else a `set` of it.
|
|
15
|
-
* The value is cloned here — the one copy the record takes.
|
|
16
|
-
*
|
|
17
|
-
* `marked` — a redaction mark sits BELOW this path (`list.1.token`): its
|
|
18
|
-
* indices count from the start of the WHOLE array, and an `append` row holds
|
|
19
|
-
* only the tail, where `scrubPatch` would find no element 1 and leave the
|
|
20
|
-
* secret in the log and the redacted mirror. Such a path always takes the
|
|
21
|
-
* `set` of the whole value, where the mark lands (9.30.0; the same gap was
|
|
22
|
-
* open in 9.29.0 for a hard write of base + tail).
|
|
23
|
-
*/
|
|
24
|
-
export function pushValueRow(rows, path, segments, before, value, prov, marked = false) {
|
|
25
|
-
if (!marked && isStrictArrayPrefix(before, value)) {
|
|
26
|
-
rows.trace.push({ path, verb: 'append', ...prov });
|
|
27
|
-
_set(rows.overwrite, segments, structuredClone(value.slice(before.length)));
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
rows.trace.push({ path, verb: 'set', ...prov });
|
|
31
|
-
_set(rows.overwrite, segments, structuredClone(value));
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Group survivors into OVERLAP FAMILIES (`toDeltaPayload` rule 3): each path's
|
|
36
|
-
* family is keyed by its SHALLOWEST surviving ancestor — walking prefixes
|
|
37
|
-
* shallow first means the first hit is that root, and a depth-1 path (the
|
|
38
|
-
* common case) never enters the loop at all. Any two paths sharing a root
|
|
39
|
-
* are exactly the paths whose patch storage overlaps.
|
|
40
|
-
*/
|
|
41
|
-
export function groupIntoFamilies(survivors, survivingPaths) {
|
|
42
|
-
const rootOf = new Map();
|
|
43
|
-
const byRoot = new Map();
|
|
44
|
-
for (const s of survivors) {
|
|
45
|
-
let root = s.path;
|
|
46
|
-
for (let i = 1; i < s.segments.length; i++) {
|
|
47
|
-
const ancestor = s.segments.slice(0, i).join(DELIM);
|
|
48
|
-
if (survivingPaths.has(ancestor)) {
|
|
49
|
-
root = ancestor;
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
rootOf.set(s.path, root);
|
|
54
|
-
const family = byRoot.get(root);
|
|
55
|
-
if (family)
|
|
56
|
-
family.push(s);
|
|
57
|
-
else
|
|
58
|
-
byRoot.set(root, [s]);
|
|
59
|
-
}
|
|
60
|
-
return { rootOf, byRoot };
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Emit survivors in last-touch order, with one exception: in an overlapping
|
|
64
|
-
* family the ROOT is emitted LAST — its whole-subtree set is what makes the
|
|
65
|
-
* replayed subtree exactly the family value (a descendant applied afterwards
|
|
66
|
-
* could only re-state a value already inside it, but would also leave behind
|
|
67
|
-
* the `key: undefined` shells 'full' mode never has). `before(touch)` runs
|
|
68
|
-
* ahead of each survivor with that survivor's last touch — where the
|
|
69
|
-
* re-encoded families of the admitted record take their places.
|
|
70
|
-
*/
|
|
71
|
-
export function emitInFamilyOrder(survivors, rootOf, byRoot, emit, before) {
|
|
72
|
-
for (const s of survivors) {
|
|
73
|
-
before(s.last);
|
|
74
|
-
const root = rootOf.get(s.path);
|
|
75
|
-
const family = byRoot.get(root);
|
|
76
|
-
if (family.length === 1) {
|
|
77
|
-
emit(s);
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (s.path !== root)
|
|
81
|
-
emit(s);
|
|
82
|
-
if (family[family.length - 1] === s)
|
|
83
|
-
emit(family.find((m) => m.path === root));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Append-detection predicate (#13c-B §2.2): both values are arrays, the
|
|
88
|
-
* final is strictly longer, and the base is a structural prefix of the
|
|
89
|
-
* final. Element compares short-circuit on reference identity (`deepEqual`'s
|
|
90
|
-
* `===` fast path) before walking structure, and bail at the first mismatch
|
|
91
|
-
* — worst case one structural compare of the base array, strictly cheaper
|
|
92
|
-
* than the full-value `structuredClone` the fallback pays.
|
|
93
|
-
*
|
|
94
|
-
* `before === undefined` (first write) fails `Array.isArray` → `set`, which
|
|
95
|
-
* keeps the first write as the causal anchor for "who initialized this key".
|
|
96
|
-
*
|
|
97
|
-
* BOTH arrays must also be plain and dense ({@link isIndexOnly}): replay
|
|
98
|
-
* reconstructs an append as `[...current, ...tail]`, and that spread carries
|
|
99
|
-
* ONLY indexed elements — a named property parked on an array (a nested write
|
|
100
|
-
* like `set(['history','note'], …)`, which `nativeSet` happily hangs off the
|
|
101
|
-
* array object) or a hole would be silently dropped, where `'full'` mode
|
|
102
|
-
* stores the value whole and keeps it.
|
|
103
|
-
*/
|
|
104
|
-
function isStrictArrayPrefix(before, after) {
|
|
105
|
-
if (!Array.isArray(before) || !Array.isArray(after))
|
|
106
|
-
return false;
|
|
107
|
-
if (after.length <= before.length)
|
|
108
|
-
return false;
|
|
109
|
-
for (let i = 0; i < before.length; i++) {
|
|
110
|
-
if (!deepEqual(before[i], after[i]))
|
|
111
|
-
return false;
|
|
112
|
-
}
|
|
113
|
-
return isIndexOnly(before) && isIndexOnly(after);
|
|
114
|
-
}
|
|
115
|
-
/** True when an array's own enumerable keys are exactly its indices — no
|
|
116
|
-
* extra named properties and no holes, i.e. the array survives a spread
|
|
117
|
-
* intact. One `Object.keys` pass, same order as the prefix compare above
|
|
118
|
-
* and paid only after it succeeds. */
|
|
119
|
-
function isIndexOnly(arr) {
|
|
120
|
-
return Object.keys(arr).length === arr.length;
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsdGFFbmNvZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2RlbHRhRW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQXdCOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixJQUFVLEVBQ1YsSUFBWSxFQUNaLFFBQWtCLEVBQ2xCLE1BQWUsRUFDZixLQUFjLEVBQ2QsSUFBd0MsRUFDeEMsTUFBTSxHQUFHLEtBQUs7SUFFZCxJQUFJLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUUsS0FBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxp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QUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEQsQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozt1Q0FHdUM7QUFDdkMsU0FBUyxXQUFXLENBQUMsR0FBYztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGVsdGFFbmNvZGluZy50cyDigJQgdGhlIGRlbHRhIGVuY29kaW5nJ3MgcHVyZSBoZWxwZXJzIChgY29tbWl0VmFsdWVzOlxuICogJ2RlbHRhJ2AsICMxM2MtQjsgZG9jcy9kZXNpZ24vMTNjLWItZGVsdGEtY29tbWl0LXZlcmIubWQpLCBvdXQgb2ZcbiAqIGBUcmFuc2FjdGlvbkJ1ZmZlcmAgc2luY2UgOS4zMC4wOiB0aGUgb3ZlcmxhcCBmYW1pbGllcyBvZiBydWxlIDMgYW5kIHRoZVxuICogb3JkZXIgcm93cyBhcmUgZW1pdHRlZCBpbiAod2hpY2ggbm93IGFsc28gcGxhY2VzIHRoZSBhZG1pdHRlZCByZWNvcmQnc1xuICogcmUtZW5jb2RlZCBmYW1pbGllcyksIHRoZSBhcHBlbmQgZGV0ZWN0aW9uLCBhbmQgdGhlIHJvdyB0aGF0IGNhcnJpZXMgYVxuICogdmFsdWUuIFRoZSB2ZXJiIENIT0lDRSBzdGF5cyBpbiBgVHJhbnNhY3Rpb25CdWZmZXIgwrcgZGVsdGFSb3dzYDsgbm90aGluZ1xuICogaGVyZSByZXBsYXlzIHRoZSB2ZXJiIGxhdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJvd3MgfSBmcm9tICcuL2FkbWlzc2lvbi5qcyc7XG5pbXBvcnQgeyBuYXRpdmVTZXQgYXMgX3NldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIERFTElNIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBPcC1sZXZlbCB2ZXJicyBzdGFnZWQgaW50byBgb3BUcmFjZWAuIGAnZGVsZXRlJ2AgaXMgc3RhZ2VkIGRpc3RpbmN0bHkgc29cbiAqICBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5OyB1bmRlclxuICogIHRoZSBkZWZhdWx0IGAnZnVsbCdgIG1vZGUgaXQgY29tbWl0cyBhcyBgJ3NldCdgIChvZiBgdW5kZWZpbmVkYCkg4oCUXG4gKiAgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy4gKi9cbmV4cG9ydCB0eXBlIE9wVmVyYiA9ICdzZXQnIHwgJ21lcmdlJyB8ICdkZWxldGUnO1xuXG4vKiogQSBwYXRoIHRoYXQgcGFzc2VkIHRoZSBuZXQtY2hhbmdlIGZpbHRlciwgd2l0aCBldmVyeXRoaW5nIHRoZSBkZWx0YVxuICogIGVuY29kZXIgbmVlZHMgdG8gZGVjaWRlIGl0cyB2ZXJiIOKAlCByZXNvbHZlZCBvbmNlLCB0aGVuIHJldXNlZCBieSB0aGVcbiAqICBvdmVybGFwLWZhbWlseSBncm91cGluZyAoYHRvRGVsdGFQYXlsb2FkYCBydWxlIDMpLiAqL1xuZXhwb3J0IHR5cGUgU3Vydml2b3IgPSB7XG4gIHBhdGg6IHN0cmluZztcbiAgc2VnbWVudHM6IHN0cmluZ1tdO1xuICB2ZXJiczogT3BWZXJiW107XG4gIHJlYWRLZXlzPzogc3RyaW5nW107XG4gIC8qKiBJbmRleCBpbiBgb3BUcmFjZWAgb2YgdGhpcyBwYXRoJ3MgbGFzdCBvcCAoaXRzIGxhc3QgdG91Y2gpLiAqL1xuICBsYXN0OiBudW1iZXI7XG4gIC8qKiBWYWx1ZSBhdCB0aGlzIHBhdGggd2hlbiB0aGUgc3RhZ2UgYmVnYW4gKHRoZSBhcHBlbmQvZGlmZiBiYXNlKS4gKi9cbiAgYmVmb3JlOiB1bmtub3duO1xuICAvKiogVmFsdWUgYXQgdGhpcyBwYXRoIGFmdGVyIGV2ZXJ5IHN0YWdlZCBvcCAocmVhZC15b3VyLXdyaXRlcyB2aWV3KS4gKi9cbiAgYWZ0ZXI6IHVua25vd247XG59O1xuXG4vKipcbiAqIEEgZGVsdGEgcm93IGNhcnJ5aW5nIGEgVkFMVUU6IGFuIGBhcHBlbmRgIG9mIHRoZSB0YWlsIHdoZW4gYGJlZm9yZWAgaXMgYVxuICogc3RyaWN0IHByZWZpeCBvZiBgdmFsdWVgICh7QGxpbmsgaXNTdHJpY3RBcnJheVByZWZpeH0pLCBlbHNlIGEgYHNldGAgb2YgaXQuXG4gKiBUaGUgdmFsdWUgaXMgY2xvbmVkIGhlcmUg4oCUIHRoZSBvbmUgY29weSB0aGUgcmVjb3JkIHRha2VzLlxuICpcbiAqIGBtYXJrZWRgIOKAlCBhIHJlZGFjdGlvbiBtYXJrIHNpdHMgQkVMT1cgdGhpcyBwYXRoIChgbGlzdC4xLnRva2VuYCk6IGl0c1xuICogaW5kaWNlcyBjb3VudCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgV0hPTEUgYXJyYXksIGFuZCBhbiBgYXBwZW5kYCByb3cgaG9sZHNcbiAqIG9ubHkgdGhlIHRhaWwsIHdoZXJlIGBzY3J1YlBhdGNoYCB3b3VsZCBmaW5kIG5vIGVsZW1lbnQgMSBhbmQgbGVhdmUgdGhlXG4gKiBzZWNyZXQgaW4gdGhlIGxvZyBhbmQgdGhlIHJlZGFjdGVkIG1pcnJvci4gU3VjaCBhIHBhdGggYWx3YXlzIHRha2VzIHRoZVxuICogYHNldGAgb2YgdGhlIHdob2xlIHZhbHVlLCB3aGVyZSB0aGUgbWFyayBsYW5kcyAoOS4zMC4wOyB0aGUgc2FtZSBnYXAgd2FzXG4gKiBvcGVuIGluIDkuMjkuMCBmb3IgYSBoYXJkIHdyaXRlIG9mIGJhc2UgKyB0YWlsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1c2hWYWx1ZVJvdyhcbiAgcm93czogUm93cyxcbiAgcGF0aDogc3RyaW5nLFxuICBzZWdtZW50czogc3RyaW5nW10sXG4gIGJlZm9yZTogdW5rbm93bixcbiAgdmFsdWU6IHVua25vd24sXG4gIHByb3Y6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQsXG4gIG1hcmtlZCA9IGZhbHNlLFxuKTogdm9pZCB7XG4gIGlmICghbWFya2VkICYmIGlzU3RyaWN0QXJyYXlQcmVmaXgoYmVmb3JlLCB2YWx1ZSkpIHtcbiAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnYXBwZW5kJywgLi4ucHJvdiB9KTtcbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKCh2YWx1ZSBhcyB1bmtub3duW10pLnNsaWNlKGJlZm9yZS5sZW5ndGgpKSk7XG4gIH0gZWxzZSB7XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3YgfSk7XG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpO1xuICB9XG59XG5cbi8qKlxuICogR3JvdXAgc3Vydml2b3JzIGludG8gT1ZFUkxBUCBGQU1JTElFUyAoYHRvRGVsdGFQYXlsb2FkYCBydWxlIDMpOiBlYWNoIHBhdGgnc1xuICogZmFtaWx5IGlzIGtleWVkIGJ5IGl0cyBTSEFMTE9XRVNUIHN1cnZpdmluZyBhbmNlc3RvciDigJQgd2Fsa2luZyBwcmVmaXhlc1xuICogc2hhbGxvdyBmaXJzdCBtZWFucyB0aGUgZmlyc3QgaGl0IGlzIHRoYXQgcm9vdCwgYW5kIGEgZGVwdGgtMSBwYXRoICh0aGVcbiAqIGNvbW1vbiBjYXNlKSBuZXZlciBlbnRlcnMgdGhlIGxvb3AgYXQgYWxsLiBBbnkgdHdvIHBhdGhzIHNoYXJpbmcgYSByb290XG4gKiBhcmUgZXhhY3RseSB0aGUgcGF0aHMgd2hvc2UgcGF0Y2ggc3RvcmFnZSBvdmVybGFwcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSW50b0ZhbWlsaWVzKFxuICBzdXJ2aXZvcnM6IFN1cnZpdm9yW10sXG4gIHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPixcbik6IHsgcm9vdE9mOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyBieVJvb3Q6IE1hcDxzdHJpbmcsIFN1cnZpdm9yW10+IH0ge1xuICBjb25zdCByb290T2YgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBieVJvb3QgPSBuZXcgTWFwPHN0cmluZywgU3Vydml2b3JbXT4oKTtcbiAgZm9yIChjb25zdCBzIG9mIHN1cnZpdm9ycykge1xuICAgIGxldCByb290ID0gcy5wYXRoO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcy5zZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSBzLnNlZ21lbnRzLnNsaWNlKDAsIGkpLmpvaW4oREVMSU0pO1xuICAgICAgaWYgKHN1cnZpdmluZ1BhdGhzLmhhcyhhbmNlc3RvcikpIHtcbiAgICAgICAgcm9vdCA9IGFuY2VzdG9yO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcm9vdE9mLnNldChzLnBhdGgsIHJvb3QpO1xuICAgIGNvbnN0IGZhbWlseSA9IGJ5Um9vdC5nZXQocm9vdCk7XG4gICAgaWYgKGZhbWlseSkgZmFtaWx5LnB1c2gocyk7XG4gICAgZWxzZSBieVJvb3Quc2V0KHJvb3QsIFtzXSk7XG4gIH1cbiAgcmV0dXJuIHsgcm9vdE9mLCBieVJvb3QgfTtcbn1cblxuLyoqXG4gKiBFbWl0IHN1cnZpdm9ycyBpbiBsYXN0LXRvdWNoIG9yZGVyLCB3aXRoIG9uZSBleGNlcHRpb246IGluIGFuIG92ZXJsYXBwaW5nXG4gKiBmYW1pbHkgdGhlIFJPT1QgaXMgZW1pdHRlZCBMQVNUIOKAlCBpdHMgd2hvbGUtc3VidHJlZSBzZXQgaXMgd2hhdCBtYWtlcyB0aGVcbiAqIHJlcGxheWVkIHN1YnRyZWUgZXhhY3RseSB0aGUgZmFtaWx5IHZhbHVlIChhIGRlc2NlbmRhbnQgYXBwbGllZCBhZnRlcndhcmRzXG4gKiBjb3VsZCBvbmx5IHJlLXN0YXRlIGEgdmFsdWUgYWxyZWFkeSBpbnNpZGUgaXQsIGJ1dCB3b3VsZCBhbHNvIGxlYXZlIGJlaGluZFxuICogdGhlIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGxzICdmdWxsJyBtb2RlIG5ldmVyIGhhcykuIGBiZWZvcmUodG91Y2gpYCBydW5zXG4gKiBhaGVhZCBvZiBlYWNoIHN1cnZpdm9yIHdpdGggdGhhdCBzdXJ2aXZvcidzIGxhc3QgdG91Y2gg4oCUIHdoZXJlIHRoZVxuICogcmUtZW5jb2RlZCBmYW1pbGllcyBvZiB0aGUgYWRtaXR0ZWQgcmVjb3JkIHRha2UgdGhlaXIgcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1pdEluRmFtaWx5T3JkZXIoXG4gIHN1cnZpdm9yczogU3Vydml2b3JbXSxcbiAgcm9vdE9mOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBieVJvb3Q6IE1hcDxzdHJpbmcsIFN1cnZpdm9yW10+LFxuICBlbWl0OiAoczogU3Vydml2b3IpID0+IHZvaWQsXG4gIGJlZm9yZTogKHRvdWNoOiBudW1iZXIpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzIG9mIHN1cnZpdm9ycykge1xuICAgIGJlZm9yZShzLmxhc3QpO1xuICAgIGNvbnN0IHJvb3QgPSByb290T2YuZ2V0KHMucGF0aCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGZhbWlseSA9IGJ5Um9vdC5nZXQocm9vdCkgYXMgU3Vydml2b3JbXTtcbiAgICBpZiAoZmFtaWx5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgZW1pdChzKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocy5wYXRoICE9PSByb290KSBlbWl0KHMpO1xuICAgIGlmIChmYW1pbHlbZmFtaWx5Lmxlbmd0aCAtIDFdID09PSBzKSBlbWl0KGZhbWlseS5maW5kKChtKSA9PiBtLnBhdGggPT09IHJvb3QpIGFzIFN1cnZpdm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwcGVuZC1kZXRlY3Rpb24gcHJlZGljYXRlICgjMTNjLUIgwqcyLjIpOiBib3RoIHZhbHVlcyBhcmUgYXJyYXlzLCB0aGVcbiAqIGZpbmFsIGlzIHN0cmljdGx5IGxvbmdlciwgYW5kIHRoZSBiYXNlIGlzIGEgc3RydWN0dXJhbCBwcmVmaXggb2YgdGhlXG4gKiBmaW5hbC4gRWxlbWVudCBjb21wYXJlcyBzaG9ydC1jaXJjdWl0IG9uIHJlZmVyZW5jZSBpZGVudGl0eSAoYGRlZXBFcXVhbGAnc1xuICogYD09PWAgZmFzdCBwYXRoKSBiZWZvcmUgd2Fsa2luZyBzdHJ1Y3R1cmUsIGFuZCBiYWlsIGF0IHRoZSBmaXJzdCBtaXNtYXRjaFxuICog4oCUIHdvcnN0IGNhc2Ugb25lIHN0cnVjdHVyYWwgY29tcGFyZSBvZiB0aGUgYmFzZSBhcnJheSwgc3RyaWN0bHkgY2hlYXBlclxuICogdGhhbiB0aGUgZnVsbC12YWx1ZSBgc3RydWN0dXJlZENsb25lYCB0aGUgZmFsbGJhY2sgcGF5cy5cbiAqXG4gKiBgYmVmb3JlID09PSB1bmRlZmluZWRgIChmaXJzdCB3cml0ZSkgZmFpbHMgYEFycmF5LmlzQXJyYXlgIOKGkiBgc2V0YCwgd2hpY2hcbiAqIGtlZXBzIHRoZSBmaXJzdCB3cml0ZSBhcyB0aGUgY2F1c2FsIGFuY2hvciBmb3IgXCJ3aG8gaW5pdGlhbGl6ZWQgdGhpcyBrZXlcIi5cbiAqXG4gKiBCT1RIIGFycmF5cyBtdXN0IGFsc28gYmUgcGxhaW4gYW5kIGRlbnNlICh7QGxpbmsgaXNJbmRleE9ubHl9KTogcmVwbGF5XG4gKiByZWNvbnN0cnVjdHMgYW4gYXBwZW5kIGFzIGBbLi4uY3VycmVudCwgLi4udGFpbF1gLCBhbmQgdGhhdCBzcHJlYWQgY2Fycmllc1xuICogT05MWSBpbmRleGVkIGVsZW1lbnRzIOKAlCBhIG5hbWVkIHByb3BlcnR5IHBhcmtlZCBvbiBhbiBhcnJheSAoYSBuZXN0ZWQgd3JpdGVcbiAqIGxpa2UgYHNldChbJ2hpc3RvcnknLCdub3RlJ10sIOKApilgLCB3aGljaCBgbmF0aXZlU2V0YCBoYXBwaWx5IGhhbmdzIG9mZiB0aGVcbiAqIGFycmF5IG9iamVjdCkgb3IgYSBob2xlIHdvdWxkIGJlIHNpbGVudGx5IGRyb3BwZWQsIHdoZXJlIGAnZnVsbCdgIG1vZGVcbiAqIHN0b3JlcyB0aGUgdmFsdWUgd2hvbGUgYW5kIGtlZXBzIGl0LlxuICovXG5mdW5jdGlvbiBpc1N0cmljdEFycmF5UHJlZml4KGJlZm9yZTogdW5rbm93biwgYWZ0ZXI6IHVua25vd24pOiBiZWZvcmUgaXMgdW5rbm93bltdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGJlZm9yZSkgfHwgIUFycmF5LmlzQXJyYXkoYWZ0ZXIpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhZnRlci5sZW5ndGggPD0gYmVmb3JlLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJlZm9yZS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghZGVlcEVxdWFsKGJlZm9yZVtpXSwgYWZ0ZXJbaV0pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzSW5kZXhPbmx5KGJlZm9yZSkgJiYgaXNJbmRleE9ubHkoYWZ0ZXIpO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGFuIGFycmF5J3Mgb3duIGVudW1lcmFibGUga2V5cyBhcmUgZXhhY3RseSBpdHMgaW5kaWNlcyDigJQgbm9cbiAqICBleHRyYSBuYW1lZCBwcm9wZXJ0aWVzIGFuZCBubyBob2xlcywgaS5lLiB0aGUgYXJyYXkgc3Vydml2ZXMgYSBzcHJlYWRcbiAqICBpbnRhY3QuIE9uZSBgT2JqZWN0LmtleXNgIHBhc3MsIHNhbWUgb3JkZXIgYXMgdGhlIHByZWZpeCBjb21wYXJlIGFib3ZlXG4gKiAgYW5kIHBhaWQgb25seSBhZnRlciBpdCBzdWNjZWVkcy4gKi9cbmZ1bmN0aW9uIGlzSW5kZXhPbmx5KGFycjogdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhhcnIpLmxlbmd0aCA9PT0gYXJyLmxlbmd0aDtcbn1cbiJdfQ==
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* equality.ts — structural equality of committed-state values: THE owner of
|
|
3
|
-
* "what counts as a change". What `TransactionBuffer`'s net-change filter, the
|
|
4
|
-
* admitted record's compare, the read model's writer rule and the
|
|
5
|
-
* borrowed-mutation guard all ask. Its one import is the classifier of value
|
|
6
|
-
* kinds (`capture/valueKinds.ts`, a leaf); re-exported from `utils.ts`, so no
|
|
7
|
-
* importer moved.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Structural deep equality for committed-state values.
|
|
11
|
-
*
|
|
12
|
-
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
13
|
-
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
14
|
-
* "no-op write"), and by `borrowedMutation.firstDifferingPath` to find where a
|
|
15
|
-
* borrowed read moved. Committed state must survive `structuredClone`, so the
|
|
16
|
-
* values it can hold are the kinds the clone keeps, and two values are equal
|
|
17
|
-
* when a record holds the same thing for both. Every kind has ONE arm below
|
|
18
|
-
* (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
|
|
19
|
-
* compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
|
|
20
|
-
* as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
|
|
21
|
-
* a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
|
|
22
|
-
* were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
|
|
23
|
-
* live state kept the OLD value.
|
|
24
|
-
*
|
|
25
|
-
* Semantics:
|
|
26
|
-
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
27
|
-
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
28
|
-
* - two values of different KINDS are never equal (a `Date` is never `{}`,
|
|
29
|
-
* an array never `{ 0: … }`)
|
|
30
|
-
* - `Date`: same `getTime()` (two invalid dates are equal)
|
|
31
|
-
* - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
|
|
32
|
-
* - `Error`: the same restored kind (one of the six built-in error names,
|
|
33
|
-
* else `Error`), own `message`, `stack` and own `cause` (deep) — what the
|
|
34
|
-
* clone keeps; any other own field is dropped by it, so it never counts
|
|
35
|
-
* (the admitted record's law)
|
|
36
|
-
* - a boxed primitive: the same wrapper type and the same primitive inside
|
|
37
|
-
* - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
|
|
38
|
-
* `DataView`: its type and the bytes IT views — never the rest of its
|
|
39
|
-
* buffer (a Node `Buffer` views a slice of a shared pool, and the record
|
|
40
|
-
* keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
|
|
41
|
-
* - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
|
|
42
|
-
* keys by `Map` identity (`SameValueZero`), values deep
|
|
43
|
-
* - `Set`: same size AND every member of `a` is deep-equal to SOME member
|
|
44
|
-
* of `b` (order-insensitive — a Set has no order to compare by)
|
|
45
|
-
* - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
|
|
46
|
-
* read): by the caller's {@link OpaqueRule} — equal only to itself by
|
|
47
|
-
* default (replacing one is always a change), or, when both sides are
|
|
48
|
-
* copies of one record, equal to any other of its kind
|
|
49
|
-
* - arrays: equal length AND deep-equal element-wise (order-sensitive; an
|
|
50
|
-
* array's expando keys are out of contract and not compared)
|
|
51
|
-
* - objects: identical set of keys that HOLD a value AND deep-equal per key.
|
|
52
|
-
* An own key whose value is `undefined` counts as ABSENT: it is this
|
|
53
|
-
* library's other spelling of a deleted key (`'full'` mode flattens
|
|
54
|
-
* `delete` into `key: undefined`; `'delta'` mode's `delete` verb removes
|
|
55
|
-
* the key), and every consumer — JSON, the fold, `commitValueAt`, the
|
|
56
|
-
* mirror — reads the two spellings as one state. So must the net-change
|
|
57
|
-
* filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
|
|
58
|
-
* are untouched — a slot holding `undefined` is still a slot.
|
|
59
|
-
*
|
|
60
|
-
* Cost & safety:
|
|
61
|
-
* - Allocates only transient `Object.keys` arrays, an error's property
|
|
62
|
-
* descriptors and a byte view per compared buffer — no clones (but one
|
|
63
|
-
* probe clone per class prototype, remembered: `capture/valueKinds.ts ·
|
|
64
|
-
* kindOf`). It is strictly cheaper than the `structuredClone` the commit
|
|
65
|
-
* already performs.
|
|
66
|
-
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
67
|
-
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
68
|
-
* by the value's own size.
|
|
69
|
-
* - Terminates on CYCLIC values (9.18.1): a state value must survive
|
|
70
|
-
* `structuredClone`, and `structuredClone` preserves cycles — so a
|
|
71
|
-
* self-referencing value is a legal value, not an out-of-contract one. A
|
|
72
|
-
* pair of objects already under comparison is treated as equal (the
|
|
73
|
-
* structural answer, lodash `isEqual` semantics); acyclic inputs see no
|
|
74
|
-
* change. Dev mode still warns about cycles at write time
|
|
75
|
-
* (`ScopeFacade.setValue`) because they surprise narrative and JSON.
|
|
76
|
-
*/
|
|
77
|
-
export declare function deepEqual(a: any, b: any, opaque?: OpaqueRule): boolean;
|
|
78
|
-
/**
|
|
79
|
-
* How {@link deepEqual} compares two OPAQUE values (a Blob, a `DOMException` —
|
|
80
|
-
* content this library cannot read):
|
|
81
|
-
*
|
|
82
|
-
* - `'identity'` (the default) — equal only to itself. The answer when one
|
|
83
|
-
* side is a value a stage handed in: the net-change filter
|
|
84
|
-
* (`TransactionBuffer`), the append check (`deltaEncoding`). A new object
|
|
85
|
-
* is a change, because nothing can say it is not.
|
|
86
|
-
* - `'copies'` — equal to any other of its kind. The answer when BOTH sides
|
|
87
|
-
* are copies of one recorded value — a fold's generations (`logModel`,
|
|
88
|
-
* `elementProvenance`), a retained read against live state
|
|
89
|
-
* (`borrowedMutation`), the record replayed against the read-back
|
|
90
|
-
* (`admission`): copies never share identity, so identity would call every
|
|
91
|
-
* opaque value changed.
|
|
92
|
-
*/
|
|
93
|
-
export type OpaqueRule = 'identity' | 'copies';
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* equality.ts — structural equality of committed-state values: THE owner of
|
|
3
|
-
* "what counts as a change". What `TransactionBuffer`'s net-change filter, the
|
|
4
|
-
* admitted record's compare, the read model's writer rule and the
|
|
5
|
-
* borrowed-mutation guard all ask. Its one import is the classifier of value
|
|
6
|
-
* kinds (`capture/valueKinds.ts`, a leaf); re-exported from `utils.ts`, so no
|
|
7
|
-
* importer moved.
|
|
8
|
-
*/
|
|
9
|
-
import { kindOf } from '../capture/valueKinds.js';
|
|
10
|
-
/**
|
|
11
|
-
* Structural deep equality for committed-state values.
|
|
12
|
-
*
|
|
13
|
-
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
14
|
-
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
15
|
-
* "no-op write"), and by `borrowedMutation.firstDifferingPath` to find where a
|
|
16
|
-
* borrowed read moved. Committed state must survive `structuredClone`, so the
|
|
17
|
-
* values it can hold are the kinds the clone keeps, and two values are equal
|
|
18
|
-
* when a record holds the same thing for both. Every kind has ONE arm below
|
|
19
|
-
* (`equalPairs`' switch over `ValueKind` — a kind added to the union does not
|
|
20
|
-
* compile until it is compared). Before 9.22.0 a Date, Map or Set was compared
|
|
21
|
-
* as an object with no own keys, and until 9.44.2 so were a RegExp, an Error,
|
|
22
|
-
* a boxed primitive, an ArrayBuffer, a DataView and a Blob: any two of a kind
|
|
23
|
-
* were "equal", so `$setValue('re', /y/g)` over `/x/g` committed no row and
|
|
24
|
-
* live state kept the OLD value.
|
|
25
|
-
*
|
|
26
|
-
* Semantics:
|
|
27
|
-
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
28
|
-
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
29
|
-
* - two values of different KINDS are never equal (a `Date` is never `{}`,
|
|
30
|
-
* an array never `{ 0: … }`)
|
|
31
|
-
* - `Date`: same `getTime()` (two invalid dates are equal)
|
|
32
|
-
* - `RegExp`: same `source` and `flags` (the clone resets `lastIndex`)
|
|
33
|
-
* - `Error`: the same restored kind (one of the six built-in error names,
|
|
34
|
-
* else `Error`), own `message`, `stack` and own `cause` (deep) — what the
|
|
35
|
-
* clone keeps; any other own field is dropped by it, so it never counts
|
|
36
|
-
* (the admitted record's law)
|
|
37
|
-
* - a boxed primitive: the same wrapper type and the same primitive inside
|
|
38
|
-
* - an `ArrayBuffer`: length, resizability and bytes; a typed array or a
|
|
39
|
-
* `DataView`: its type and the bytes IT views — never the rest of its
|
|
40
|
-
* buffer (a Node `Buffer` views a slice of a shared pool, and the record
|
|
41
|
-
* keeps the view's bytes only: `capture/freeze.ts · freezeRecord`)
|
|
42
|
-
* - `Map`: same size AND, per key of `a`, `b` holds a deep-equal value —
|
|
43
|
-
* keys by `Map` identity (`SameValueZero`), values deep
|
|
44
|
-
* - `Set`: same size AND every member of `a` is deep-equal to SOME member
|
|
45
|
-
* of `b` (order-insensitive — a Set has no order to compare by)
|
|
46
|
-
* - an OPAQUE value (a Blob, a `DOMException` — content this library cannot
|
|
47
|
-
* read): by the caller's {@link OpaqueRule} — equal only to itself by
|
|
48
|
-
* default (replacing one is always a change), or, when both sides are
|
|
49
|
-
* copies of one record, equal to any other of its kind
|
|
50
|
-
* - arrays: equal length AND deep-equal element-wise (order-sensitive; an
|
|
51
|
-
* array's expando keys are out of contract and not compared)
|
|
52
|
-
* - objects: identical set of keys that HOLD a value AND deep-equal per key.
|
|
53
|
-
* An own key whose value is `undefined` counts as ABSENT: it is this
|
|
54
|
-
* library's other spelling of a deleted key (`'full'` mode flattens
|
|
55
|
-
* `delete` into `key: undefined`; `'delta'` mode's `delete` verb removes
|
|
56
|
-
* the key), and every consumer — JSON, the fold, `commitValueAt`, the
|
|
57
|
-
* mirror — reads the two spellings as one state. So must the net-change
|
|
58
|
-
* filter (9.19.1): `{}` and `{ k: undefined }` are not a change. Arrays
|
|
59
|
-
* are untouched — a slot holding `undefined` is still a slot.
|
|
60
|
-
*
|
|
61
|
-
* Cost & safety:
|
|
62
|
-
* - Allocates only transient `Object.keys` arrays, an error's property
|
|
63
|
-
* descriptors and a byte view per compared buffer — no clones (but one
|
|
64
|
-
* probe clone per class prototype, remembered: `capture/valueKinds.ts ·
|
|
65
|
-
* kindOf`). It is strictly cheaper than the `structuredClone` the commit
|
|
66
|
-
* already performs.
|
|
67
|
-
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
68
|
-
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
69
|
-
* by the value's own size.
|
|
70
|
-
* - Terminates on CYCLIC values (9.18.1): a state value must survive
|
|
71
|
-
* `structuredClone`, and `structuredClone` preserves cycles — so a
|
|
72
|
-
* self-referencing value is a legal value, not an out-of-contract one. A
|
|
73
|
-
* pair of objects already under comparison is treated as equal (the
|
|
74
|
-
* structural answer, lodash `isEqual` semantics); acyclic inputs see no
|
|
75
|
-
* change. Dev mode still warns about cycles at write time
|
|
76
|
-
* (`ScopeFacade.setValue`) because they surprise narrative and JSON.
|
|
77
|
-
*/
|
|
78
|
-
export function deepEqual(a, b, opaque = 'identity') {
|
|
79
|
-
return equalPairs(a, b, undefined, opaque);
|
|
80
|
-
}
|
|
81
|
-
function equalPairs(a, b, seen, opaque) {
|
|
82
|
-
if (a === b)
|
|
83
|
-
return true; // same reference or identical primitive
|
|
84
|
-
if (typeof a !== typeof b)
|
|
85
|
-
return false;
|
|
86
|
-
if (a === null || b === null)
|
|
87
|
-
return a === b; // one is null, the other isn't
|
|
88
|
-
if (typeof a !== 'object')
|
|
89
|
-
return Object.is(a, b); // NaN-safe primitive compare
|
|
90
|
-
const kind = kindOf(a);
|
|
91
|
-
if (kind !== kindOf(b))
|
|
92
|
-
return false;
|
|
93
|
-
switch (kind) {
|
|
94
|
-
// Atoms: their content is a slot, not their keys.
|
|
95
|
-
case 'date':
|
|
96
|
-
return Object.is(Date.prototype.getTime.call(a), Date.prototype.getTime.call(b));
|
|
97
|
-
case 'regexp':
|
|
98
|
-
return a.source === b.source && a.flags === b.flags;
|
|
99
|
-
case 'boxed':
|
|
100
|
-
return tagOf(a) === tagOf(b) && equalPairs(a.valueOf(), b.valueOf(), seen, opaque);
|
|
101
|
-
case 'buffer':
|
|
102
|
-
return equalBuffers(a, b);
|
|
103
|
-
case 'view':
|
|
104
|
-
return equalViews(a, b);
|
|
105
|
-
case 'opaque':
|
|
106
|
-
return opaque === 'copies' && tagOf(a) === tagOf(b); // `a === b` was answered above
|
|
107
|
-
case 'plain':
|
|
108
|
-
case 'array':
|
|
109
|
-
case 'map':
|
|
110
|
-
case 'set':
|
|
111
|
-
case 'error':
|
|
112
|
-
return equalContainers(a, b, kind, seen, opaque);
|
|
113
|
-
default:
|
|
114
|
-
return unknownKind(kind);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/** The kinds whose content is other values: compared part by part, under the cycle guard. */
|
|
118
|
-
function equalContainers(a, b, kind, seen, opaque) {
|
|
119
|
-
// Cycle guard — a pair we are already inside is equal by assumption.
|
|
120
|
-
seen ??= new WeakMap();
|
|
121
|
-
let partners = seen.get(a);
|
|
122
|
-
if (partners?.has(b))
|
|
123
|
-
return true;
|
|
124
|
-
if (!partners)
|
|
125
|
-
seen.set(a, (partners = new WeakSet()));
|
|
126
|
-
partners.add(b);
|
|
127
|
-
if (kind === 'map')
|
|
128
|
-
return equalMaps(a, b, seen, opaque);
|
|
129
|
-
if (kind === 'set')
|
|
130
|
-
return equalSets(a, b, seen, opaque);
|
|
131
|
-
if (kind === 'error')
|
|
132
|
-
return equalErrors(a, b, seen, opaque);
|
|
133
|
-
if (kind === 'array') {
|
|
134
|
-
if (a.length !== b.length)
|
|
135
|
-
return false;
|
|
136
|
-
for (let i = 0; i < a.length; i++) {
|
|
137
|
-
if (!equalPairs(a[i], b[i], seen, opaque))
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
// Objects: only keys that HOLD a value take part — an own `undefined` is a
|
|
143
|
-
// deleted key, the same state as an absent one (see the contract above).
|
|
144
|
-
let aHeld = 0;
|
|
145
|
-
for (const key of Object.keys(a)) {
|
|
146
|
-
if (a[key] === undefined)
|
|
147
|
-
continue;
|
|
148
|
-
aHeld++;
|
|
149
|
-
if (!Object.prototype.hasOwnProperty.call(b, key))
|
|
150
|
-
return false;
|
|
151
|
-
if (!equalPairs(a[key], b[key], seen, opaque))
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
let bHeld = 0;
|
|
155
|
-
for (const key of Object.keys(b))
|
|
156
|
-
if (b[key] !== undefined)
|
|
157
|
-
bHeld++;
|
|
158
|
-
return aHeld === bHeld;
|
|
159
|
-
}
|
|
160
|
-
function unknownKind(kind) {
|
|
161
|
-
throw new TypeError(`deepEqual: no comparison for the value kind '${String(kind)}'`);
|
|
162
|
-
}
|
|
163
|
-
/** `[object Number]`, `[object Uint8Array]` … — the built-in type a boxed value or a view carries. */
|
|
164
|
-
function tagOf(value) {
|
|
165
|
-
return Object.prototype.toString.call(value);
|
|
166
|
-
}
|
|
167
|
-
/** The same view type over the same bytes — the bytes the view sees, wherever they sit in its buffer. */
|
|
168
|
-
function equalViews(a, b) {
|
|
169
|
-
if (tagOf(a) !== tagOf(b) || a.byteLength !== b.byteLength)
|
|
170
|
-
return false;
|
|
171
|
-
if (a.buffer === b.buffer && a.byteOffset === b.byteOffset)
|
|
172
|
-
return true;
|
|
173
|
-
const p = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
|
|
174
|
-
const q = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
|
|
175
|
-
for (let i = 0; i < p.length; i++)
|
|
176
|
-
if (p[i] !== q[i])
|
|
177
|
-
return false;
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
/** The same length, resizability and bytes. */
|
|
181
|
-
function equalBuffers(a, b) {
|
|
182
|
-
if (a === b)
|
|
183
|
-
return true;
|
|
184
|
-
const x = a;
|
|
185
|
-
const y = b;
|
|
186
|
-
if (x.byteLength !== y.byteLength || x.resizable !== y.resizable || x.maxByteLength !== y.maxByteLength) {
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
const p = new Uint8Array(a);
|
|
190
|
-
const q = new Uint8Array(b);
|
|
191
|
-
for (let i = 0; i < p.length; i++)
|
|
192
|
-
if (p[i] !== q[i])
|
|
193
|
-
return false;
|
|
194
|
-
return true;
|
|
195
|
-
}
|
|
196
|
-
/** The six error names `structuredClone` restores; any other name comes back an `Error`. */
|
|
197
|
-
const ERROR_NAMES = new Set(['EvalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError']);
|
|
198
|
-
/**
|
|
199
|
-
* Two errors as the clone keeps them: the restored kind, the own `message`,
|
|
200
|
-
* the `stack` and the own `cause` (deep). Any other own field is dropped by
|
|
201
|
-
* the clone, so it never counts.
|
|
202
|
-
*/
|
|
203
|
-
function equalErrors(a, b, seen, opaque) {
|
|
204
|
-
if (errorKindOf(a) !== errorKindOf(b) || stackOf(a) !== stackOf(b))
|
|
205
|
-
return false;
|
|
206
|
-
const aMessage = ownData(a, 'message');
|
|
207
|
-
const bMessage = ownData(b, 'message');
|
|
208
|
-
if (String(aMessage?.value) !== String(bMessage?.value) || !aMessage !== !bMessage)
|
|
209
|
-
return false;
|
|
210
|
-
const aCause = ownData(a, 'cause');
|
|
211
|
-
const bCause = ownData(b, 'cause');
|
|
212
|
-
if (!aCause || !bCause)
|
|
213
|
-
return !aCause === !bCause;
|
|
214
|
-
return equalPairs(aCause.value, bCause.value, seen, opaque);
|
|
215
|
-
}
|
|
216
|
-
function errorKindOf(error) {
|
|
217
|
-
const name = String(error.name);
|
|
218
|
-
return ERROR_NAMES.has(name) ? name : 'Error';
|
|
219
|
-
}
|
|
220
|
-
function stackOf(error) {
|
|
221
|
-
const stack = error.stack;
|
|
222
|
-
return typeof stack === 'string' ? stack : undefined;
|
|
223
|
-
}
|
|
224
|
-
/** An own DATA property, boxed — how the clone reads an error's `message` and `cause`. */
|
|
225
|
-
function ownData(value, key) {
|
|
226
|
-
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
227
|
-
return descriptor !== undefined && Object.prototype.hasOwnProperty.call(descriptor, 'value')
|
|
228
|
-
? { value: descriptor.value }
|
|
229
|
-
: undefined;
|
|
230
|
-
}
|
|
231
|
-
function equalMaps(a, b, seen, opaque) {
|
|
232
|
-
if (a.size !== b.size)
|
|
233
|
-
return false;
|
|
234
|
-
for (const [key, value] of a) {
|
|
235
|
-
if (!b.has(key))
|
|
236
|
-
return false;
|
|
237
|
-
if (!equalPairs(value, b.get(key), seen, opaque))
|
|
238
|
-
return false;
|
|
239
|
-
}
|
|
240
|
-
return true;
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Order-insensitive, deep per member. Quadratic in the worst case for sets of
|
|
244
|
-
* objects — a set of primitives (the common shape) is one `has` per member.
|
|
245
|
-
*/
|
|
246
|
-
function equalSets(a, b, seen, opaque) {
|
|
247
|
-
if (a.size !== b.size)
|
|
248
|
-
return false;
|
|
249
|
-
const unmatched = [...b];
|
|
250
|
-
for (const member of a) {
|
|
251
|
-
// SameValueZero first — primitives and shared references, one `has`.
|
|
252
|
-
// Each match retires its slot so two structurally-equal members of `a`
|
|
253
|
-
// cannot both claim the same member of `b`.
|
|
254
|
-
const at = unmatched.indexOf(member);
|
|
255
|
-
const found = at >= 0 ? at : unmatched.findIndex((candidate) => equalPairs(member, candidate, seen, opaque));
|
|
256
|
-
if (found < 0)
|
|
257
|
-
return false;
|
|
258
|
-
unmatched.splice(found, 1);
|
|
259
|
-
}
|
|
260
|
-
return true;
|
|
261
|
-
}
|
|
262
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFrQixNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1FRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxTQUFxQixVQUFVO0lBQ3ZFLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUE0QkQsU0FBUyxVQUFVLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxJQUEyQixFQUFFLE1BQWtCO0lBQ2pGLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLHdDQUF3QztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtJQUM3RSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBRWhGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLGtEQUFrRDtR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QU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVxdWFsaXR5LnRzIOKAlCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IG9mIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXM6IFRIRSBvd25lciBvZlxuICogXCJ3aGF0IGNvdW50cyBhcyBhIGNoYW5nZVwiLiBXaGF0IGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBuZXQtY2hhbmdlIGZpbHRlciwgdGhlXG4gKiBhZG1pdHRlZCByZWNvcmQncyBjb21wYXJlLCB0aGUgcmVhZCBtb2RlbCdzIHdyaXRlciBydWxlIGFuZCB0aGVcbiAqIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFsbCBhc2suIEl0cyBvbmUgaW1wb3J0IGlzIHRoZSBjbGFzc2lmaWVyIG9mIHZhbHVlXG4gKiBraW5kcyAoYGNhcHR1cmUvdmFsdWVLaW5kcy50c2AsIGEgbGVhZik7IHJlLWV4cG9ydGVkIGZyb20gYHV0aWxzLnRzYCwgc28gbm9cbiAqIGltcG9ydGVyIG1vdmVkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgVmFsdWVLaW5kLCBraW5kT2YgfSBmcm9tICcuLi9jYXB0dXJlL3ZhbHVlS2luZHMuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcCBlcXVhbGl0eSBmb3IgY29tbWl0dGVkLXN0YXRlIHZhbHVlcy5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gdG8gZGVjaWRlIHdoZXRoZXIgYSBzdGFnZSBhY3R1YWxseSBDSEFOR0VEXG4gKiBhIHBhdGggb3IgbWVyZWx5IHJlLXdyb3RlIC8gcmV2ZXJ0ZWQgaXQgdG8gdGhlIHZhbHVlIGl0IGFscmVhZHkgaGVsZCAoYVxuICogXCJuby1vcCB3cml0ZVwiKSwgYW5kIGJ5IGBib3Jyb3dlZE11dGF0aW9uLmZpcnN0RGlmZmVyaW5nUGF0aGAgdG8gZmluZCB3aGVyZSBhXG4gKiBib3Jyb3dlZCByZWFkIG1vdmVkLiBDb21taXR0ZWQgc3RhdGUgbXVzdCBzdXJ2aXZlIGBzdHJ1Y3R1cmVkQ2xvbmVgLCBzbyB0aGVcbiAqIHZhbHVlcyBpdCBjYW4gaG9sZCBhcmUgdGhlIGtpbmRzIHRoZSBjbG9uZSBrZWVwcywgYW5kIHR3byB2YWx1ZXMgYXJlIGVxdWFsXG4gKiB3aGVuIGEgcmVjb3JkIGhvbGRzIHRoZSBzYW1lIHRoaW5nIGZvciBib3RoLiBFdmVyeSBraW5kIGhhcyBPTkUgYXJtIGJlbG93XG4gKiAoYGVxdWFsUGFpcnNgJyBzd2l0Y2ggb3ZlciBgVmFsdWVLaW5kYCDigJQgYSBraW5kIGFkZGVkIHRvIHRoZSB1bmlvbiBkb2VzIG5vdFxuICogY29tcGlsZSB1bnRpbCBpdCBpcyBjb21wYXJlZCkuIEJlZm9yZSA5LjIyLjAgYSBEYXRlLCBNYXAgb3IgU2V0IHdhcyBjb21wYXJlZFxuICogYXMgYW4gb2JqZWN0IHdpdGggbm8gb3duIGtleXMsIGFuZCB1bnRpbCA5LjQ0LjIgc28gd2VyZSBhIFJlZ0V4cCwgYW4gRXJyb3IsXG4gKiBhIGJveGVkIHByaW1pdGl2ZSwgYW4gQXJyYXlCdWZmZXIsIGEgRGF0YVZpZXcgYW5kIGEgQmxvYjogYW55IHR3byBvZiBhIGtpbmRcbiAqIHdlcmUgXCJlcXVhbFwiLCBzbyBgJHNldFZhbHVlKCdyZScsIC95L2cpYCBvdmVyIGAveC9nYCBjb21taXR0ZWQgbm8gcm93IGFuZFxuICogbGl2ZSBzdGF0ZSBrZXB0IHRoZSBPTEQgdmFsdWUuXG4gKlxuICogU2VtYW50aWNzOlxuICogICAtIHJlZmVyZW5jZSAvIGlkZW50aWNhbC1wcmltaXRpdmUgc2hvcnQtY2lyY3VpdHMgZmlyc3QgKGNoZWFwIGZhc3QgcGF0aClcbiAqICAgLSBgTmFOYCBlcXVhbHMgYE5hTmAgKHByaW1pdGl2ZSBjb21wYXJlIGZhbGxzIGJhY2sgdG8gYE9iamVjdC5pc2ApXG4gKiAgIC0gdHdvIHZhbHVlcyBvZiBkaWZmZXJlbnQgS0lORFMgYXJlIG5ldmVyIGVxdWFsIChhIGBEYXRlYCBpcyBuZXZlciBge31gLFxuICogICAgIGFuIGFycmF5IG5ldmVyIGB7IDA6IOKApiB9YClcbiAqICAgLSBgRGF0ZWA6IHNhbWUgYGdldFRpbWUoKWAgKHR3byBpbnZhbGlkIGRhdGVzIGFyZSBlcXVhbClcbiAqICAgLSBgUmVnRXhwYDogc2FtZSBgc291cmNlYCBhbmQgYGZsYWdzYCAodGhlIGNsb25lIHJlc2V0cyBgbGFzdEluZGV4YClcbiAqICAgLSBgRXJyb3JgOiB0aGUgc2FtZSByZXN0b3JlZCBraW5kIChvbmUgb2YgdGhlIHNpeCBidWlsdC1pbiBlcnJvciBuYW1lcyxcbiAqICAgICBlbHNlIGBFcnJvcmApLCBvd24gYG1lc3NhZ2VgLCBgc3RhY2tgIGFuZCBvd24gYGNhdXNlYCAoZGVlcCkg4oCUIHdoYXQgdGhlXG4gKiAgICAgY2xvbmUga2VlcHM7IGFueSBvdGhlciBvd24gZmllbGQgaXMgZHJvcHBlZCBieSBpdCwgc28gaXQgbmV2ZXIgY291bnRzXG4gKiAgICAgKHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXcpXG4gKiAgIC0gYSBib3hlZCBwcmltaXRpdmU6IHRoZSBzYW1lIHdyYXBwZXIgdHlwZSBhbmQgdGhlIHNhbWUgcHJpbWl0aXZlIGluc2lkZVxuICogICAtIGFuIGBBcnJheUJ1ZmZlcmA6IGxlbmd0aCwgcmVzaXphYmlsaXR5IGFuZCBieXRlczsgYSB0eXBlZCBhcnJheSBvciBhXG4gKiAgICAgYERhdGFWaWV3YDogaXRzIHR5cGUgYW5kIHRoZSBieXRlcyBJVCB2aWV3cyDigJQgbmV2ZXIgdGhlIHJlc3Qgb2YgaXRzXG4gKiAgICAgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgYSBzbGljZSBvZiBhIHNoYXJlZCBwb29sLCBhbmQgdGhlIHJlY29yZFxuICogICAgIGtlZXBzIHRoZSB2aWV3J3MgYnl0ZXMgb25seTogYGNhcHR1cmUvZnJlZXplLnRzIMK3IGZyZWV6ZVJlY29yZGApXG4gKiAgIC0gYE1hcGA6IHNhbWUgc2l6ZSBBTkQsIHBlciBrZXkgb2YgYGFgLCBgYmAgaG9sZHMgYSBkZWVwLWVxdWFsIHZhbHVlIOKAlFxuICogICAgIGtleXMgYnkgYE1hcGAgaWRlbnRpdHkgKGBTYW1lVmFsdWVaZXJvYCksIHZhbHVlcyBkZWVwXG4gKiAgIC0gYFNldGA6IHNhbWUgc2l6ZSBBTkQgZXZlcnkgbWVtYmVyIG9mIGBhYCBpcyBkZWVwLWVxdWFsIHRvIFNPTUUgbWVtYmVyXG4gKiAgICAgb2YgYGJgIChvcmRlci1pbnNlbnNpdGl2ZSDigJQgYSBTZXQgaGFzIG5vIG9yZGVyIHRvIGNvbXBhcmUgYnkpXG4gKiAgIC0gYW4gT1BBUVVFIHZhbHVlIChhIEJsb2IsIGEgYERPTUV4Y2VwdGlvbmAg4oCUIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdFxuICogICAgIHJlYWQpOiBieSB0aGUgY2FsbGVyJ3Mge0BsaW5rIE9wYXF1ZVJ1bGV9IOKAlCBlcXVhbCBvbmx5IHRvIGl0c2VsZiBieVxuICogICAgIGRlZmF1bHQgKHJlcGxhY2luZyBvbmUgaXMgYWx3YXlzIGEgY2hhbmdlKSwgb3IsIHdoZW4gYm90aCBzaWRlcyBhcmVcbiAqICAgICBjb3BpZXMgb2Ygb25lIHJlY29yZCwgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kXG4gKiAgIC0gYXJyYXlzOiBlcXVhbCBsZW5ndGggQU5EIGRlZXAtZXF1YWwgZWxlbWVudC13aXNlIChvcmRlci1zZW5zaXRpdmU7IGFuXG4gKiAgICAgYXJyYXkncyBleHBhbmRvIGtleXMgYXJlIG91dCBvZiBjb250cmFjdCBhbmQgbm90IGNvbXBhcmVkKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBzZXQgb2Yga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSBBTkQgZGVlcC1lcXVhbCBwZXIga2V5LlxuICogICAgIEFuIG93biBrZXkgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgY291bnRzIGFzIEFCU0VOVDogaXQgaXMgdGhpc1xuICogICAgIGxpYnJhcnkncyBvdGhlciBzcGVsbGluZyBvZiBhIGRlbGV0ZWQga2V5IChgJ2Z1bGwnYCBtb2RlIGZsYXR0ZW5zXG4gKiAgICAgYGRlbGV0ZWAgaW50byBga2V5OiB1bmRlZmluZWRgOyBgJ2RlbHRhJ2AgbW9kZSdzIGBkZWxldGVgIHZlcmIgcmVtb3Zlc1xuICogICAgIHRoZSBrZXkpLCBhbmQgZXZlcnkgY29uc3VtZXIg4oCUIEpTT04sIHRoZSBmb2xkLCBgY29tbWl0VmFsdWVBdGAsIHRoZVxuICogICAgIG1pcnJvciDigJQgcmVhZHMgdGhlIHR3byBzcGVsbGluZ3MgYXMgb25lIHN0YXRlLiBTbyBtdXN0IHRoZSBuZXQtY2hhbmdlXG4gKiAgICAgZmlsdGVyICg5LjE5LjEpOiBge31gIGFuZCBgeyBrOiB1bmRlZmluZWQgfWAgYXJlIG5vdCBhIGNoYW5nZS4gQXJyYXlzXG4gKiAgICAgYXJlIHVudG91Y2hlZCDigJQgYSBzbG90IGhvbGRpbmcgYHVuZGVmaW5lZGAgaXMgc3RpbGwgYSBzbG90LlxuICpcbiAqIENvc3QgJiBzYWZldHk6XG4gKiAgIC0gQWxsb2NhdGVzIG9ubHkgdHJhbnNpZW50IGBPYmplY3Qua2V5c2AgYXJyYXlzLCBhbiBlcnJvcidzIHByb3BlcnR5XG4gKiAgICAgZGVzY3JpcHRvcnMgYW5kIGEgYnl0ZSB2aWV3IHBlciBjb21wYXJlZCBidWZmZXIg4oCUIG5vIGNsb25lcyAoYnV0IG9uZVxuICogICAgIHByb2JlIGNsb25lIHBlciBjbGFzcyBwcm90b3R5cGUsIHJlbWVtYmVyZWQ6IGBjYXB0dXJlL3ZhbHVlS2luZHMudHMgwrdcbiAqICAgICBraW5kT2ZgKS4gSXQgaXMgc3RyaWN0bHkgY2hlYXBlciB0aGFuIHRoZSBgc3RydWN0dXJlZENsb25lYCB0aGUgY29tbWl0XG4gKiAgICAgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBUZXJtaW5hdGVzIG9uIENZQ0xJQyB2YWx1ZXMgKDkuMTguMSk6IGEgc3RhdGUgdmFsdWUgbXVzdCBzdXJ2aXZlXG4gKiAgICAgYHN0cnVjdHVyZWRDbG9uZWAsIGFuZCBgc3RydWN0dXJlZENsb25lYCBwcmVzZXJ2ZXMgY3ljbGVzIOKAlCBzbyBhXG4gKiAgICAgc2VsZi1yZWZlcmVuY2luZyB2YWx1ZSBpcyBhIGxlZ2FsIHZhbHVlLCBub3QgYW4gb3V0LW9mLWNvbnRyYWN0IG9uZS4gQVxuICogICAgIHBhaXIgb2Ygb2JqZWN0cyBhbHJlYWR5IHVuZGVyIGNvbXBhcmlzb24gaXMgdHJlYXRlZCBhcyBlcXVhbCAodGhlXG4gKiAgICAgc3RydWN0dXJhbCBhbnN3ZXIsIGxvZGFzaCBgaXNFcXVhbGAgc2VtYW50aWNzKTsgYWN5Y2xpYyBpbnB1dHMgc2VlIG5vXG4gKiAgICAgY2hhbmdlLiBEZXYgbW9kZSBzdGlsbCB3YXJucyBhYm91dCBjeWNsZXMgYXQgd3JpdGUgdGltZVxuICogICAgIChgU2NvcGVGYWNhZGUuc2V0VmFsdWVgKSBiZWNhdXNlIHRoZXkgc3VycHJpc2UgbmFycmF0aXZlIGFuZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55LCBvcGFxdWU6IE9wYXF1ZVJ1bGUgPSAnaWRlbnRpdHknKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcXVhbFBhaXJzKGEsIGIsIHVuZGVmaW5lZCwgb3BhcXVlKTtcbn1cblxuLyoqXG4gKiBIb3cge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXMgdHdvIE9QQVFVRSB2YWx1ZXMgKGEgQmxvYiwgYSBgRE9NRXhjZXB0aW9uYCDigJRcbiAqIGNvbnRlbnQgdGhpcyBsaWJyYXJ5IGNhbm5vdCByZWFkKTpcbiAqXG4gKiAgIC0gYCdpZGVudGl0eSdgICh0aGUgZGVmYXVsdCkg4oCUIGVxdWFsIG9ubHkgdG8gaXRzZWxmLiBUaGUgYW5zd2VyIHdoZW4gb25lXG4gKiAgICAgc2lkZSBpcyBhIHZhbHVlIGEgc3RhZ2UgaGFuZGVkIGluOiB0aGUgbmV0LWNoYW5nZSBmaWx0ZXJcbiAqICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyYCksIHRoZSBhcHBlbmQgY2hlY2sgKGBkZWx0YUVuY29kaW5nYCkuIEEgbmV3IG9iamVjdFxuICogICAgIGlzIGEgY2hhbmdlLCBiZWNhdXNlIG5vdGhpbmcgY2FuIHNheSBpdCBpcyBub3QuXG4gKiAgIC0gYCdjb3BpZXMnYCDigJQgZXF1YWwgdG8gYW55IG90aGVyIG9mIGl0cyBraW5kLiBUaGUgYW5zd2VyIHdoZW4gQk9USCBzaWRlc1xuICogICAgIGFyZSBjb3BpZXMgb2Ygb25lIHJlY29yZGVkIHZhbHVlIOKAlCBhIGZvbGQncyBnZW5lcmF0aW9ucyAoYGxvZ01vZGVsYCxcbiAqICAgICBgZWxlbWVudFByb3ZlbmFuY2VgKSwgYSByZXRhaW5lZCByZWFkIGFnYWluc3QgbGl2ZSBzdGF0ZVxuICogICAgIChgYm9ycm93ZWRNdXRhdGlvbmApLCB0aGUgcmVjb3JkIHJlcGxheWVkIGFnYWluc3QgdGhlIHJlYWQtYmFja1xuICogICAgIChgYWRtaXNzaW9uYCk6IGNvcGllcyBuZXZlciBzaGFyZSBpZGVudGl0eSwgc28gaWRlbnRpdHkgd291bGQgY2FsbCBldmVyeVxuICogICAgIG9wYXF1ZSB2YWx1ZSBjaGFuZ2VkLlxuICovXG5leHBvcnQgdHlwZSBPcGFxdWVSdWxlID0gJ2lkZW50aXR5JyB8ICdjb3BpZXMnO1xuXG4vKipcbiAqIE9iamVjdCBwYWlycyBtZXQgc28gZmFyLCBrZXllZCBgYSDihpIgdGhlIGIncyBpdCBoYXMgYmVlbiBwYWlyZWQgd2l0aGAuIENyZWF0ZWRcbiAqIGxhemlseSBieSB0aGUgZmlyc3Qgb2JqZWN0IHBhaXIsIHNvIHByaW1pdGl2ZSBjb21wYXJlcyBhbGxvY2F0ZSBub3RoaW5nLlxuICogTmV2ZXIgcHJ1bmVkOiBldmVyeSBgZmFsc2VgIHJldHVybnMgc3RyYWlnaHQgdXAgdG8gdGhlIGNhbGxlciAoZWFjaCByZWN1cnNpdmVcbiAqIGNhbGwgc2hvcnQtY2lyY3VpdHMgb24gaXQpLCBzbyBub3RoaW5nIGlzIGxvb2tlZCB1cCBhZnRlciBhIG1pc21hdGNoIOKAlCBhXG4gKiBzdG9yZWQgcGFpciBpcyBlaXRoZXIgc3RpbGwgdW5kZXIgY29tcGFyaXNvbiBvciBhbHJlYWR5IGtub3duIGVxdWFsLlxuICovXG50eXBlIFNlZW5QYWlycyA9IFdlYWtNYXA8b2JqZWN0LCBXZWFrU2V0PG9iamVjdD4+O1xuXG5mdW5jdGlvbiBlcXVhbFBhaXJzKGE6IGFueSwgYjogYW55LCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7IC8vIHNhbWUgcmVmZXJlbmNlIG9yIGlkZW50aWNhbCBwcmltaXRpdmVcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuICBpZiAoYSA9PT0gbnVsbCB8fCBiID09PSBudWxsKSByZXR1cm4gYSA9PT0gYjsgLy8gb25lIGlzIG51bGwsIHRoZSBvdGhlciBpc24ndFxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmlzKGEsIGIpOyAvLyBOYU4tc2FmZSBwcmltaXRpdmUgY29tcGFyZVxuXG4gIGNvbnN0IGtpbmQgPSBraW5kT2YoYSk7XG4gIGlmIChraW5kICE9PSBraW5kT2YoYikpIHJldHVybiBmYWxzZTtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgLy8gQXRvbXM6IHRoZWlyIGNvbnRlbnQgaXMgYSBzbG90LCBub3QgdGhlaXIga2V5cy5cbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBPYmplY3QuaXMoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZS5jYWxsKGEpLCBEYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwoYikpO1xuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgY2FzZSAnYm94ZWQnOlxuICAgICAgcmV0dXJuIHRhZ09mKGEpID09PSB0YWdPZihiKSAmJiBlcXVhbFBhaXJzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSwgc2Vlbiwgb3BhcXVlKTtcbiAgICBjYXNlICdidWZmZXInOlxuICAgICAgcmV0dXJuIGVxdWFsQnVmZmVycyhhLCBiKTtcbiAgICBjYXNlICd2aWV3JzpcbiAgICAgIHJldHVybiBlcXVhbFZpZXdzKGEsIGIpO1xuICAgIGNhc2UgJ29wYXF1ZSc6XG4gICAgICByZXR1cm4gb3BhcXVlID09PSAnY29waWVzJyAmJiB0YWdPZihhKSA9PT0gdGFnT2YoYik7IC8vIGBhID09PSBiYCB3YXMgYW5zd2VyZWQgYWJvdmVcbiAgICBjYXNlICdwbGFpbic6XG4gICAgY2FzZSAnYXJyYXknOlxuICAgIGNhc2UgJ21hcCc6XG4gICAgY2FzZSAnc2V0JzpcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICByZXR1cm4gZXF1YWxDb250YWluZXJzKGEsIGIsIGtpbmQsIHNlZW4sIG9wYXF1ZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmtub3duS2luZChraW5kKTtcbiAgfVxufVxuXG4vKiogVGhlIGtpbmRzIHdob3NlIGNvbnRlbnQgaXMgb3RoZXIgdmFsdWVzOiBjb21wYXJlZCBwYXJ0IGJ5IHBhcnQsIHVuZGVyIHRoZSBjeWNsZSBndWFyZC4gKi9cbmZ1bmN0aW9uIGVxdWFsQ29udGFpbmVycyhhOiBhbnksIGI6IGFueSwga2luZDogVmFsdWVLaW5kLCBzZWVuOiBTZWVuUGFpcnMgfCB1bmRlZmluZWQsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICAvLyBDeWNsZSBndWFyZCDigJQgYSBwYWlyIHdlIGFyZSBhbHJlYWR5IGluc2lkZSBpcyBlcXVhbCBieSBhc3N1bXB0aW9uLlxuICBzZWVuID8/PSBuZXcgV2Vha01hcCgpO1xuICBsZXQgcGFydG5lcnMgPSBzZWVuLmdldChhKTtcbiAgaWYgKHBhcnRuZXJzPy5oYXMoYikpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhcnRuZXJzKSBzZWVuLnNldChhLCAocGFydG5lcnMgPSBuZXcgV2Vha1NldCgpKSk7XG4gIHBhcnRuZXJzLmFkZChiKTtcblxuICBpZiAoa2luZCA9PT0gJ21hcCcpIHJldHVybiBlcXVhbE1hcHMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdzZXQnKSByZXR1cm4gZXF1YWxTZXRzKGEsIGIsIHNlZW4sIG9wYXF1ZSk7XG4gIGlmIChraW5kID09PSAnZXJyb3InKSByZXR1cm4gZXF1YWxFcnJvcnMoYSwgYiwgc2Vlbiwgb3BhcXVlKTtcbiAgaWYgKGtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWVxdWFsUGFpcnMoYVtpXSwgYltpXSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9iamVjdHM6IG9ubHkga2V5cyB0aGF0IEhPTEQgYSB2YWx1ZSB0YWtlIHBhcnQg4oCUIGFuIG93biBgdW5kZWZpbmVkYCBpcyBhXG4gIC8vIGRlbGV0ZWQga2V5LCB0aGUgc2FtZSBzdGF0ZSBhcyBhbiBhYnNlbnQgb25lIChzZWUgdGhlIGNvbnRyYWN0IGFib3ZlKS5cbiAgbGV0IGFIZWxkID0gMDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYSkpIHtcbiAgICBpZiAoYVtrZXldID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGFIZWxkKys7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghZXF1YWxQYWlycyhhW2tleV0sIGJba2V5XSwgc2Vlbiwgb3BhcXVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBiSGVsZCA9IDA7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGIpKSBpZiAoYltrZXldICE9PSB1bmRlZmluZWQpIGJIZWxkKys7XG4gIHJldHVybiBhSGVsZCA9PT0gYkhlbGQ7XG59XG5cbmZ1bmN0aW9uIHVua25vd25LaW5kKGtpbmQ6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBkZWVwRXF1YWw6IG5vIGNvbXBhcmlzb24gZm9yIHRoZSB2YWx1ZSBraW5kICcke1N0cmluZyhraW5kKX0nYCk7XG59XG5cbi8qKiBgW29iamVjdCBOdW1iZXJdYCwgYFtvYmplY3QgVWludDhBcnJheV1gIOKApiDigJQgdGhlIGJ1aWx0LWluIHR5cGUgYSBib3hlZCB2YWx1ZSBvciBhIHZpZXcgY2Fycmllcy4gKi9cbmZ1bmN0aW9uIHRhZ09mKHZhbHVlOiBvYmplY3QpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuLyoqIFRoZSBzYW1lIHZpZXcgdHlwZSBvdmVyIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgYnl0ZXMgdGhlIHZpZXcgc2Vlcywgd2hlcmV2ZXIgdGhleSBzaXQgaW4gaXRzIGJ1ZmZlci4gKi9cbmZ1bmN0aW9uIGVxdWFsVmlld3MoYTogQXJyYXlCdWZmZXJWaWV3LCBiOiBBcnJheUJ1ZmZlclZpZXcpOiBib29sZWFuIHtcbiAgaWYgKHRhZ09mKGEpICE9PSB0YWdPZihiKSB8fCBhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5idWZmZXIgPT09IGIuYnVmZmVyICYmIGEuYnl0ZU9mZnNldCA9PT0gYi5ieXRlT2Zmc2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IG5ldyBVaW50OEFycmF5KGEuYnVmZmVyLCBhLmJ5dGVPZmZzZXQsIGEuYnl0ZUxlbmd0aCk7XG4gIGNvbnN0IHEgPSBuZXcgVWludDhBcnJheShiLmJ1ZmZlciwgYi5ieXRlT2Zmc2V0LCBiLmJ5dGVMZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNhbWUgbGVuZ3RoLCByZXNpemFiaWxpdHkgYW5kIGJ5dGVzLiAqL1xuZnVuY3Rpb24gZXF1YWxCdWZmZXJzKGE6IEFycmF5QnVmZmVyTGlrZSwgYjogQXJyYXlCdWZmZXJMaWtlKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeCA9IGEgYXMgQXJyYXlCdWZmZXJMaWtlICYgeyByZXNpemFibGU/OiBib29sZWFuOyBtYXhCeXRlTGVuZ3RoPzogbnVtYmVyIH07XG4gIGNvbnN0IHkgPSBiIGFzIHR5cGVvZiB4O1xuICBpZiAoeC5ieXRlTGVuZ3RoICE9PSB5LmJ5dGVMZW5ndGggfHwgeC5yZXNpemFibGUgIT09IHkucmVzaXphYmxlIHx8IHgubWF4Qnl0ZUxlbmd0aCAhPT0geS5tYXhCeXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHAgPSBuZXcgVWludDhBcnJheShhKTtcbiAgY29uc3QgcSA9IG5ldyBVaW50OEFycmF5KGIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChwW2ldICE9PSBxW2ldKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVGhlIHNpeCBlcnJvciBuYW1lcyBgc3RydWN0dXJlZENsb25lYCByZXN0b3JlczsgYW55IG90aGVyIG5hbWUgY29tZXMgYmFjayBhbiBgRXJyb3JgLiAqL1xuY29uc3QgRVJST1JfTkFNRVMgPSBuZXcgU2V0KFsnRXZhbEVycm9yJywgJ1JhbmdlRXJyb3InLCAnUmVmZXJlbmNlRXJyb3InLCAnU3ludGF4RXJyb3InLCAnVHlwZUVycm9yJywgJ1VSSUVycm9yJ10pO1xuXG4vKipcbiAqIFR3byBlcnJvcnMgYXMgdGhlIGNsb25lIGtlZXBzIHRoZW06IHRoZSByZXN0b3JlZCBraW5kLCB0aGUgb3duIGBtZXNzYWdlYCxcbiAqIHRoZSBgc3RhY2tgIGFuZCB0aGUgb3duIGBjYXVzZWAgKGRlZXApLiBBbnkgb3RoZXIgb3duIGZpZWxkIGlzIGRyb3BwZWQgYnlcbiAqIHRoZSBjbG9uZSwgc28gaXQgbmV2ZXIgY291bnRzLlxuICovXG5mdW5jdGlvbiBlcXVhbEVycm9ycyhhOiBFcnJvciwgYjogRXJyb3IsIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChlcnJvcktpbmRPZihhKSAhPT0gZXJyb3JLaW5kT2YoYikgfHwgc3RhY2tPZihhKSAhPT0gc3RhY2tPZihiKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBhTWVzc2FnZSA9IG93bkRhdGEoYSwgJ21lc3NhZ2UnKTtcbiAgY29uc3QgYk1lc3NhZ2UgPSBvd25EYXRhKGIsICdtZXNzYWdlJyk7XG4gIGlmIChTdHJpbmcoYU1lc3NhZ2U/LnZhbHVlKSAhPT0gU3RyaW5nKGJNZXNzYWdlPy52YWx1ZSkgfHwgIWFNZXNzYWdlICE9PSAhYk1lc3NhZ2UpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYUNhdXNlID0gb3duRGF0YShhLCAnY2F1c2UnKTtcbiAgY29uc3QgYkNhdXNlID0gb3duRGF0YShiLCAnY2F1c2UnKTtcbiAgaWYgKCFhQ2F1c2UgfHwgIWJDYXVzZSkgcmV0dXJuICFhQ2F1c2UgPT09ICFiQ2F1c2U7XG4gIHJldHVybiBlcXVhbFBhaXJzKGFDYXVzZS52YWx1ZSwgYkNhdXNlLnZhbHVlLCBzZWVuLCBvcGFxdWUpO1xufVxuXG5mdW5jdGlvbiBlcnJvcktpbmRPZihlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gU3RyaW5nKGVycm9yLm5hbWUpO1xuICByZXR1cm4gRVJST1JfTkFNRVMuaGFzKG5hbWUpID8gbmFtZSA6ICdFcnJvcic7XG59XG5cbmZ1bmN0aW9uIHN0YWNrT2YoZXJyb3I6IEVycm9yKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgcmV0dXJuIHR5cGVvZiBzdGFjayA9PT0gJ3N0cmluZycgPyBzdGFjayA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIEFuIG93biBEQVRBIHByb3BlcnR5LCBib3hlZCDigJQgaG93IHRoZSBjbG9uZSByZWFkcyBhbiBlcnJvcidzIGBtZXNzYWdlYCBhbmQgYGNhdXNlYC4gKi9cbmZ1bmN0aW9uIG93bkRhdGEodmFsdWU6IG9iamVjdCwga2V5OiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzY3JpcHRvciwgJ3ZhbHVlJylcbiAgICA/IHsgdmFsdWU6IGRlc2NyaXB0b3IudmFsdWUgfVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlcXVhbE1hcHMoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4sIHNlZW46IFNlZW5QYWlycywgb3BhcXVlOiBPcGFxdWVSdWxlKTogYm9vbGVhbiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFlcXVhbFBhaXJzKHZhbHVlLCBiLmdldChrZXkpLCBzZWVuLCBvcGFxdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogT3JkZXItaW5zZW5zaXRpdmUsIGRlZXAgcGVyIG1lbWJlci4gUXVhZHJhdGljIGluIHRoZSB3b3JzdCBjYXNlIGZvciBzZXRzIG9mXG4gKiBvYmplY3RzIOKAlCBhIHNldCBvZiBwcmltaXRpdmVzICh0aGUgY29tbW9uIHNoYXBlKSBpcyBvbmUgYGhhc2AgcGVyIG1lbWJlci5cbiAqL1xuZnVuY3Rpb24gZXF1YWxTZXRzKGE6IFNldDx1bmtub3duPiwgYjogU2V0PHVua25vd24+LCBzZWVuOiBTZWVuUGFpcnMsIG9wYXF1ZTogT3BhcXVlUnVsZSk6IGJvb2xlYW4ge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdW5tYXRjaGVkID0gWy4uLmJdO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhKSB7XG4gICAgLy8gU2FtZVZhbHVlWmVybyBmaXJzdCDigJQgcHJpbWl0aXZlcyBhbmQgc2hhcmVkIHJlZmVyZW5jZXMsIG9uZSBgaGFzYC5cbiAgICAvLyBFYWNoIG1hdGNoIHJldGlyZXMgaXRzIHNsb3Qgc28gdHdvIHN0cnVjdHVyYWxseS1lcXVhbCBtZW1iZXJzIG9mIGBhYFxuICAgIC8vIGNhbm5vdCBib3RoIGNsYWltIHRoZSBzYW1lIG1lbWJlciBvZiBgYmAuXG4gICAgY29uc3QgYXQgPSB1bm1hdGNoZWQuaW5kZXhPZihtZW1iZXIpO1xuICAgIGNvbnN0IGZvdW5kID0gYXQgPj0gMCA/IGF0IDogdW5tYXRjaGVkLmZpbmRJbmRleCgoY2FuZGlkYXRlKSA9PiBlcXVhbFBhaXJzKG1lbWJlciwgY2FuZGlkYXRlLCBzZWVuLCBvcGFxdWUpKTtcbiAgICBpZiAoZm91bmQgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdW5tYXRjaGVkLnNwbGljZShmb3VuZCwgMSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/** Coordinates of an existing log within a recording/session, not a second event timeline. */
|
|
2
|
-
export interface LogAddress {
|
|
3
|
-
/** Engine leg that first owned this log; unchanged by a same-executor root resume. */
|
|
4
|
-
readonly logRunId: string;
|
|
5
|
-
/** Actual mount runtime IDs, outermost first. Root log: []. Never static subflow IDs. */
|
|
6
|
-
readonly drillPath: readonly string[];
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* The committed prefix present when an event was emitted. Does NOT describe
|
|
10
|
-
* the emitter's staged writes, first-touch read view, or eventual own commit.
|
|
11
|
-
* Several events can share a position; this is not a total event order.
|
|
12
|
-
*/
|
|
13
|
-
export interface EmitSourcePosition extends LogAddress {
|
|
14
|
-
/** Engine leg that created the emitting frame (not the scope's memory namespace). */
|
|
15
|
-
readonly runId: string;
|
|
16
|
-
/** Inclusive index in the addressed log; -1 means only its fold base existed. */
|
|
17
|
-
readonly committedThroughIdx: number;
|
|
18
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRQb3NpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2V2ZW50UG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb29yZGluYXRlcyBvZiBhbiBleGlzdGluZyBsb2cgd2l0aGluIGEgcmVjb3JkaW5nL3Nlc3Npb24sIG5vdCBhIHNlY29uZCBldmVudCB0aW1lbGluZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQWRkcmVzcyB7XG4gIC8qKiBFbmdpbmUgbGVnIHRoYXQgZmlyc3Qgb3duZWQgdGhpcyBsb2c7IHVuY2hhbmdlZCBieSBhIHNhbWUtZXhlY3V0b3Igcm9vdCByZXN1bWUuICovXG4gIHJlYWRvbmx5IGxvZ1J1bklkOiBzdHJpbmc7XG4gIC8qKiBBY3R1YWwgbW91bnQgcnVudGltZSBJRHMsIG91dGVybW9zdCBmaXJzdC4gUm9vdCBsb2c6IFtdLiBOZXZlciBzdGF0aWMgc3ViZmxvdyBJRHMuICovXG4gIHJlYWRvbmx5IGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGNvbW1pdHRlZCBwcmVmaXggcHJlc2VudCB3aGVuIGFuIGV2ZW50IHdhcyBlbWl0dGVkLiBEb2VzIE5PVCBkZXNjcmliZVxuICogdGhlIGVtaXR0ZXIncyBzdGFnZWQgd3JpdGVzLCBmaXJzdC10b3VjaCByZWFkIHZpZXcsIG9yIGV2ZW50dWFsIG93biBjb21taXQuXG4gKiBTZXZlcmFsIGV2ZW50cyBjYW4gc2hhcmUgYSBwb3NpdGlvbjsgdGhpcyBpcyBub3QgYSB0b3RhbCBldmVudCBvcmRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWl0U291cmNlUG9zaXRpb24gZXh0ZW5kcyBMb2dBZGRyZXNzIHtcbiAgLyoqIEVuZ2luZSBsZWcgdGhhdCBjcmVhdGVkIHRoZSBlbWl0dGluZyBmcmFtZSAobm90IHRoZSBzY29wZSdzIG1lbW9yeSBuYW1lc3BhY2UpLiAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKiogSW5jbHVzaXZlIGluZGV4IGluIHRoZSBhZGRyZXNzZWQgbG9nOyAtMSBtZWFucyBvbmx5IGl0cyBmb2xkIGJhc2UgZXhpc3RlZC4gKi9cbiAgcmVhZG9ubHkgY29tbWl0dGVkVGhyb3VnaElkeDogbnVtYmVyO1xufVxuIl19
|