footprintjs 9.48.3 → 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 -18
- package/dist/esm/lib/capture/ownData.js +0 -36
- 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 -947
- 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 -52
- package/dist/esm/lib/memory/pathOps.d.ts +0 -118
- package/dist/esm/lib/memory/pathOps.js +0 -293
- 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 -151
- 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 -41
- 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 -951
- 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 -56
- package/dist/lib/memory/pathOps.js +0 -309
- 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 -170
- 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 -18
- 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 -118
- 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
package/dist/esm/write.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* footprintjs/write — the public way to write a record.
|
|
3
|
-
*
|
|
4
|
-
* A record is what a run wrote: a frozen base and an append-only log of bundles, one per step
|
|
5
|
-
* (docs/guides/record-contract.md). This door hands out the classes the engine itself writes one
|
|
6
|
-
* with — there is no wrapper, so a record written here and one a flowchart wrote come from the same
|
|
7
|
-
* code and the same bytes:
|
|
8
|
-
*
|
|
9
|
-
* - `SharedMemory` — the heap: live state, one generation per commit (copy-on-write);
|
|
10
|
-
* - `EventLog` — the log: the fold base and the bundles, frozen as they are recorded;
|
|
11
|
-
* - `RecordFrame` — one step's frame: what it read (`read`, `noteRead`), what it staged
|
|
12
|
-
* (`write`, with a redaction verdict's bytes as `WriteScrub`), and its
|
|
13
|
-
* commit onto the heap and the log (`commit`, named by a `CommitStamp`).
|
|
14
|
-
*
|
|
15
|
-
* The step's encoding is two dials (`RecordEncoding`): `commitValues` (`'full'` | `'delta'`) and
|
|
16
|
-
* `writeProvenance` (`'off'` | `'reads-prefix'`, `WriteProvenanceMode`).
|
|
17
|
-
*
|
|
18
|
-
* Every type this door names is the record's own: nothing here loads or names the engine
|
|
19
|
-
* (test/architecture/write-door.test.ts). Its names and the bytes they write are promised under the
|
|
20
|
-
* record fixtures' re-pin policy (test/fixtures/README.md): a refactor never moves a byte.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* import { EventLog, RecordFrame, SharedMemory } from 'footprintjs/write';
|
|
25
|
-
* import { stateAt } from 'footprintjs/trace';
|
|
26
|
-
*
|
|
27
|
-
* const state = new SharedMemory(undefined, { count: 0 }); // the heap, seeded
|
|
28
|
-
* const log = new EventLog(state.getState()); // its fold base is the seed
|
|
29
|
-
*
|
|
30
|
-
* const frame = new RecordFrame(state, log); // one step, at the root
|
|
31
|
-
* frame.useEncoding({ commitValues: 'full', writeProvenance: 'reads-prefix' });
|
|
32
|
-
* const count = frame.read([], 'count') as number;
|
|
33
|
-
* frame.noteRead([], 'count'); // the bundle names the read
|
|
34
|
-
* frame.write(frame.at([], 'count'), count + 1, 'set');
|
|
35
|
-
* frame.commit(() => ({ stage: 'Increment', stageId: 'increment', runtimeStageId: 'increment#0' }));
|
|
36
|
-
*
|
|
37
|
-
* stateAt({ initialState: log.getInitialState(), commitLog: log.list() }, 0).state; // { count: 1 }
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @module write
|
|
41
|
-
*/
|
|
42
|
-
// The heap and the log.
|
|
43
|
-
export { EventLog } from './lib/memory/EventLog.js';
|
|
44
|
-
export { SharedMemory } from './lib/memory/SharedMemory.js';
|
|
45
|
-
export { RecordFrame } from './lib/memory/RecordFrame.js';
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd3JpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFFSCx3QkFBd0I7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUs1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL3dyaXRlIOKAlCB0aGUgcHVibGljIHdheSB0byB3cml0ZSBhIHJlY29yZC5cbiAqXG4gKiBBIHJlY29yZCBpcyB3aGF0IGEgcnVuIHdyb3RlOiBhIGZyb3plbiBiYXNlIGFuZCBhbiBhcHBlbmQtb25seSBsb2cgb2YgYnVuZGxlcywgb25lIHBlciBzdGVwXG4gKiAoZG9jcy9ndWlkZXMvcmVjb3JkLWNvbnRyYWN0Lm1kKS4gVGhpcyBkb29yIGhhbmRzIG91dCB0aGUgY2xhc3NlcyB0aGUgZW5naW5lIGl0c2VsZiB3cml0ZXMgb25lXG4gKiB3aXRoIOKAlCB0aGVyZSBpcyBubyB3cmFwcGVyLCBzbyBhIHJlY29yZCB3cml0dGVuIGhlcmUgYW5kIG9uZSBhIGZsb3djaGFydCB3cm90ZSBjb21lIGZyb20gdGhlIHNhbWVcbiAqIGNvZGUgYW5kIHRoZSBzYW1lIGJ5dGVzOlxuICpcbiAqICAgLSBgU2hhcmVkTWVtb3J5YCDigJQgdGhlIGhlYXA6IGxpdmUgc3RhdGUsIG9uZSBnZW5lcmF0aW9uIHBlciBjb21taXQgKGNvcHktb24td3JpdGUpO1xuICogICAtIGBFdmVudExvZ2AgICAgIOKAlCB0aGUgbG9nOiB0aGUgZm9sZCBiYXNlIGFuZCB0aGUgYnVuZGxlcywgZnJvemVuIGFzIHRoZXkgYXJlIHJlY29yZGVkO1xuICogICAtIGBSZWNvcmRGcmFtZWAgIOKAlCBvbmUgc3RlcCdzIGZyYW1lOiB3aGF0IGl0IHJlYWQgKGByZWFkYCwgYG5vdGVSZWFkYCksIHdoYXQgaXQgc3RhZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAoYHdyaXRlYCwgd2l0aCBhIHJlZGFjdGlvbiB2ZXJkaWN0J3MgYnl0ZXMgYXMgYFdyaXRlU2NydWJgKSwgYW5kIGl0c1xuICogICAgICAgICAgICAgICAgICAgICAgY29tbWl0IG9udG8gdGhlIGhlYXAgYW5kIHRoZSBsb2cgKGBjb21taXRgLCBuYW1lZCBieSBhIGBDb21taXRTdGFtcGApLlxuICpcbiAqIFRoZSBzdGVwJ3MgZW5jb2RpbmcgaXMgdHdvIGRpYWxzIChgUmVjb3JkRW5jb2RpbmdgKTogYGNvbW1pdFZhbHVlc2AgKGAnZnVsbCdgIHwgYCdkZWx0YSdgKSBhbmRcbiAqIGB3cml0ZVByb3ZlbmFuY2VgIChgJ29mZidgIHwgYCdyZWFkcy1wcmVmaXgnYCwgYFdyaXRlUHJvdmVuYW5jZU1vZGVgKS5cbiAqXG4gKiBFdmVyeSB0eXBlIHRoaXMgZG9vciBuYW1lcyBpcyB0aGUgcmVjb3JkJ3Mgb3duOiBub3RoaW5nIGhlcmUgbG9hZHMgb3IgbmFtZXMgdGhlIGVuZ2luZVxuICogKHRlc3QvYXJjaGl0ZWN0dXJlL3dyaXRlLWRvb3IudGVzdC50cykuIEl0cyBuYW1lcyBhbmQgdGhlIGJ5dGVzIHRoZXkgd3JpdGUgYXJlIHByb21pc2VkIHVuZGVyIHRoZVxuICogcmVjb3JkIGZpeHR1cmVzJyByZS1waW4gcG9saWN5ICh0ZXN0L2ZpeHR1cmVzL1JFQURNRS5tZCk6IGEgcmVmYWN0b3IgbmV2ZXIgbW92ZXMgYSBieXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFdmVudExvZywgUmVjb3JkRnJhbWUsIFNoYXJlZE1lbW9yeSB9IGZyb20gJ2Zvb3RwcmludGpzL3dyaXRlJztcbiAqIGltcG9ydCB7IHN0YXRlQXQgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3Qgc3RhdGUgPSBuZXcgU2hhcmVkTWVtb3J5KHVuZGVmaW5lZCwgeyBjb3VudDogMCB9KTsgLy8gdGhlIGhlYXAsIHNlZWRlZFxuICogY29uc3QgbG9nID0gbmV3IEV2ZW50TG9nKHN0YXRlLmdldFN0YXRlKCkpOyAgICAgICAgICAgICAgLy8gaXRzIGZvbGQgYmFzZSBpcyB0aGUgc2VlZFxuICpcbiAqIGNvbnN0IGZyYW1lID0gbmV3IFJlY29yZEZyYW1lKHN0YXRlLCBsb2cpOyAgICAgICAgICAgICAgIC8vIG9uZSBzdGVwLCBhdCB0aGUgcm9vdFxuICogZnJhbWUudXNlRW5jb2RpbmcoeyBjb21taXRWYWx1ZXM6ICdmdWxsJywgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4JyB9KTtcbiAqIGNvbnN0IGNvdW50ID0gZnJhbWUucmVhZChbXSwgJ2NvdW50JykgYXMgbnVtYmVyO1xuICogZnJhbWUubm90ZVJlYWQoW10sICdjb3VudCcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJ1bmRsZSBuYW1lcyB0aGUgcmVhZFxuICogZnJhbWUud3JpdGUoZnJhbWUuYXQoW10sICdjb3VudCcpLCBjb3VudCArIDEsICdzZXQnKTtcbiAqIGZyYW1lLmNvbW1pdCgoKSA9PiAoeyBzdGFnZTogJ0luY3JlbWVudCcsIHN0YWdlSWQ6ICdpbmNyZW1lbnQnLCBydW50aW1lU3RhZ2VJZDogJ2luY3JlbWVudCMwJyB9KSk7XG4gKlxuICogc3RhdGVBdCh7IGluaXRpYWxTdGF0ZTogbG9nLmdldEluaXRpYWxTdGF0ZSgpLCBjb21taXRMb2c6IGxvZy5saXN0KCkgfSwgMCkuc3RhdGU7IC8vIHsgY291bnQ6IDEgfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSB3cml0ZVxuICovXG5cbi8vIFRoZSBoZWFwIGFuZCB0aGUgbG9nLlxuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL2xpYi9tZW1vcnkvRXZlbnRMb2cuanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5L1NoYXJlZE1lbW9yeS5qcyc7XG5cbi8vIE9uZSBzdGVwJ3MgZnJhbWUsIGFuZCB3aGF0IGl0IHRha2VzOiB0aGUgZGlhbHMsIHRoZSB2ZXJicywgYSB2ZXJkaWN0J3MgYnl0ZXMsIHRoZSBuYW1lcyBvbiBpdHMgYnVuZGxlLlxuZXhwb3J0IHR5cGUgeyBDb21taXRTdGFtcCB9IGZyb20gJy4vbGliL21lbW9yeS9yZWNvcmRDb21taXQuanMnO1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRFbmNvZGluZywgV3JpdGVTY3J1YiwgV3JpdGVWZXJiIH0gZnJvbSAnLi9saWIvbWVtb3J5L1JlY29yZEZyYW1lLmpzJztcbmV4cG9ydCB7IFJlY29yZEZyYW1lIH0gZnJvbSAnLi9saWIvbWVtb3J5L1JlY29yZEZyYW1lLmpzJztcbmV4cG9ydCB0eXBlIHsgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS90eXBlcy5qcyc7XG4iXX0=
|
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3),
|
|
4
|
-
* and the serve-time law for the commit log (9.44.2).
|
|
5
|
-
*
|
|
6
|
-
* WHY HERE. Saved trees freeze through this walk: the fold base served as
|
|
7
|
-
* `initialState` (`ExecutionRuntime · getFoldBase`), the
|
|
8
|
-
* dev-mode snapshot (`runner/snapshot.ts · servedSnapshot`), every state `stateAt` hands out
|
|
9
|
-
* (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
|
|
10
|
-
* not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
|
|
11
|
-
* walk lives in this leaf folder, which imports nothing outside itself. Args use an ownership snapshot
|
|
12
|
-
* instead (`scope/protection/readonlyInput.ts · createFrozenArgs`): never freeze borrowed caller values.
|
|
13
|
-
*
|
|
14
|
-
* FREEZE WHAT CAN BE FROZEN, COPY WHAT CAN'T (9.44.2). `Object.freeze` cannot seal a Date's time, a
|
|
15
|
-
* Map's or Set's entries, a buffer's bytes, a RegExp (`compile()` rewrites a frozen one) or an Error
|
|
16
|
-
* (V8's own `stack` accessor writes through a frozen one). A fresh tree handed to one caller (a `stateAt`
|
|
17
|
-
* state, the dev-mode snapshot) is that caller's own, so freezing it is a guard and nothing more. The
|
|
18
|
-
* COMMIT LOG — each bundle, and the fold base — is served to every reader, so {@link freezeRecord}
|
|
19
|
-
* remembers that a record holds such a value, its first serve maps the containers on the way to each
|
|
20
|
-
* one (its open PATHS), and {@link serveRecord} hands a reader a copy of those paths only: a fresh copy
|
|
21
|
-
* of each such value, fresh frozen containers on the way to it, and every other part shared, frozen, as
|
|
22
|
-
* it is. Until 9.44.2 `snapshot.commitLog[i].overwrite.when.setTime(0)` rewrote every later snapshot,
|
|
23
|
-
* `stateAt`, `commitValueAt`, slice and cursor answer.
|
|
24
|
-
*
|
|
25
|
-
* Every walk here is ITERATIVE (an explicit stack): a record's depth is not bounded by the call stack.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```typescript
|
|
29
|
-
* import { deepFreeze, freezeRecord, serveRecord } from './freeze.js';
|
|
30
|
-
*
|
|
31
|
-
* const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
|
|
32
|
-
* Object.isFrozen(args.order.lines[0]); // true
|
|
33
|
-
* Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
|
|
34
|
-
*
|
|
35
|
-
* const record = freezeRecord({ when: new Date(0), tags: ['a'] });
|
|
36
|
-
* const served = serveRecord(record);
|
|
37
|
-
* served.when.setTime(5); // changes the reader's copy
|
|
38
|
-
* serveRecord(record).when.getTime(); // 0 — every serve is the record as recorded
|
|
39
|
-
* served.tags === record.tags; // true — the sealed part is shared, not copied
|
|
40
|
-
* serveRecord(freezeRecord({ n: 1 })); // a record freezing sealed whole: served as itself
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.serveRecord = exports.freezeRecord = exports.deepFreeze = void 0;
|
|
45
|
-
const ownData_js_1 = require("./ownData.js");
|
|
46
|
-
const valueKinds_js_1 = require("./valueKinds.js");
|
|
47
|
-
/**
|
|
48
|
-
* Freezes `obj` and every object reachable through its own properties, and returns `obj`.
|
|
49
|
-
*
|
|
50
|
-
* - An object that is ALREADY frozen is left as it is, and not descended — 9.32.0's contract, kept:
|
|
51
|
-
* args may hold a caller's frozen object with live parts inside (a class instance a stage calls),
|
|
52
|
-
* and freezing past it would break them. It is also what ends a cycle. The commit log never meets
|
|
53
|
-
* one: its payloads are fresh `structuredClone`s.
|
|
54
|
-
* - ArrayBuffer views (typed arrays, `DataView`) are skipped: `Object.freeze` throws on a non-empty
|
|
55
|
-
* typed array, so a `Uint8Array` in state, args or the fold base used to fail the run or the
|
|
56
|
-
* snapshot here.
|
|
57
|
-
* - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
|
|
58
|
-
* bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
|
|
59
|
-
* taken from a frozen tree throws when `exec` or `replace` advance it. The commit log goes through
|
|
60
|
-
* {@link freezeRecord} and {@link serveRecord} instead.
|
|
61
|
-
* - Functions are not descended (they are not values the engine stores).
|
|
62
|
-
*/
|
|
63
|
-
function deepFreeze(obj, arrays = 'every-key') {
|
|
64
|
-
if (obj !== null && typeof obj === 'object')
|
|
65
|
-
walkAndFreeze(obj, arrays === 'indices', false);
|
|
66
|
-
return obj;
|
|
67
|
-
}
|
|
68
|
-
exports.deepFreeze = deepFreeze;
|
|
69
|
-
/**
|
|
70
|
-
* Containers of a record that hold — on some path below them — a value freezing cannot seal: `true` once
|
|
71
|
-
* mapped (the container is on an open path), `false` for a record {@link freezeRecord} found open whose
|
|
72
|
-
* paths no serve has mapped yet. A container absent here is sealed whole.
|
|
73
|
-
*/
|
|
74
|
-
const OPEN = new WeakMap();
|
|
75
|
-
/**
|
|
76
|
-
* {@link deepFreeze} for a record many readers are SERVED (a commit bundle, the fold base), and two more
|
|
77
|
-
* things on the same walk:
|
|
78
|
-
*
|
|
79
|
-
* - it remembers THAT the record holds a value freezing cannot seal — one flag; the record's first
|
|
80
|
-
* serve maps WHERE (the containers on the way to each such value, its open paths), so the run pays
|
|
81
|
-
* nothing more and {@link serveRecord} copies those paths and nothing else;
|
|
82
|
-
* - a typed array or `DataView` that views a SLICE of a bigger buffer (a Node `Buffer` views its
|
|
83
|
-
* shared pool) is replaced, in the record, by a copy of the bytes it views — the record keeps the
|
|
84
|
-
* view's bytes, never the rest of the buffer (a resizable or shared buffer is kept as it is).
|
|
85
|
-
*
|
|
86
|
-
* A part frozen before is not frozen past (deepFreeze's contract) but is looked through, so a value
|
|
87
|
-
* freezing cannot seal inside it still opens the record. Returns `record`.
|
|
88
|
-
*/
|
|
89
|
-
function freezeRecord(record, arrays = 'every-key') {
|
|
90
|
-
if (!OPEN.has(record) && walkAndFreeze(record, arrays === 'indices', true))
|
|
91
|
-
OPEN.set(record, false);
|
|
92
|
-
return record;
|
|
93
|
-
}
|
|
94
|
-
exports.freezeRecord = freezeRecord;
|
|
95
|
-
/**
|
|
96
|
-
* The record as a reader may hold it — THE serve-time law: a record freezing sealed whole is served as
|
|
97
|
-
* itself (shared, no cost); any other as a copy of its open paths ({@link freezeRecord}): fresh frozen
|
|
98
|
-
* containers down to each value freezing cannot seal, a fresh copy of that value, and every other part
|
|
99
|
-
* shared, frozen, as it is. A copy is served the same way again.
|
|
100
|
-
*/
|
|
101
|
-
function serveRecord(record) {
|
|
102
|
-
if (record === null || typeof record !== 'object')
|
|
103
|
-
return record;
|
|
104
|
-
const mapped = OPEN.get(record);
|
|
105
|
-
if (mapped === undefined)
|
|
106
|
-
return record;
|
|
107
|
-
if (!mapped)
|
|
108
|
-
mapOpenPaths(record);
|
|
109
|
-
return OPEN.get(record) === true ? copyOpenPaths(record) : record;
|
|
110
|
-
}
|
|
111
|
-
exports.serveRecord = serveRecord;
|
|
112
|
-
/** A value freezing cannot seal — a view, or a kind `SEALABLE` says no to (a Date, a Map, an Error …). */
|
|
113
|
-
function isUnsealable(value) {
|
|
114
|
-
return ArrayBuffer.isView(value) || !valueKinds_js_1.SEALABLE[(0, valueKinds_js_1.kindOf)(value)];
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Freeze `root` and every container under it, iteratively; `record` adds the look-through of parts
|
|
118
|
-
* frozen before and the compaction of views over a slice. `true` when something under `root` (or `root`
|
|
119
|
-
* itself) cannot be sealed.
|
|
120
|
-
*/
|
|
121
|
-
function walkAndFreeze(root, indices, record) {
|
|
122
|
-
let open = false;
|
|
123
|
-
let lookedThrough;
|
|
124
|
-
const stack = [root];
|
|
125
|
-
while (stack.length > 0) {
|
|
126
|
-
const node = stack.pop();
|
|
127
|
-
if (ArrayBuffer.isView(node)) {
|
|
128
|
-
open = true; // its bytes — and a non-empty one cannot be frozen at all
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
const frozenBefore = Object.isFrozen(node);
|
|
132
|
-
if (frozenBefore) {
|
|
133
|
-
if (!record || OPEN.has(node)) {
|
|
134
|
-
open ||= record;
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if ((lookedThrough ??= new Set()).has(node))
|
|
138
|
-
continue;
|
|
139
|
-
lookedThrough.add(node); // a part frozen before: looked through, never frozen past
|
|
140
|
-
}
|
|
141
|
-
if (record && !open && !valueKinds_js_1.SEALABLE[(0, valueKinds_js_1.kindOf)(node)])
|
|
142
|
-
open = true;
|
|
143
|
-
// Children first, while `node` is still open to the compaction below; then the freeze.
|
|
144
|
-
const compacting = record && !frozenBefore;
|
|
145
|
-
if (indices && Array.isArray(node)) {
|
|
146
|
-
for (let i = 0; i < node.length; i++) {
|
|
147
|
-
const child = node[i];
|
|
148
|
-
if (child === null || typeof child !== 'object')
|
|
149
|
-
continue;
|
|
150
|
-
stack.push(compacting && ArrayBuffer.isView(child) ? compact(node, i, child) : child);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
const names = Object.getOwnPropertyNames(node);
|
|
155
|
-
for (let i = 0; i < names.length; i++) {
|
|
156
|
-
const child = node[names[i]];
|
|
157
|
-
if (child === null || typeof child !== 'object')
|
|
158
|
-
continue;
|
|
159
|
-
stack.push(compacting && ArrayBuffer.isView(child) ? compact(node, names[i], child) : child);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
if (!frozenBefore)
|
|
163
|
-
Object.freeze(node);
|
|
164
|
-
}
|
|
165
|
-
return open;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* A view over a SLICE of a bigger buffer, replaced in `container` by a copy of the bytes it views
|
|
169
|
-
* (the type it is — a Node `Buffer` comes out a `Uint8Array`, as a clone of it does). Anything else is
|
|
170
|
-
* returned as it is. A resizable or shared buffer is kept: a copy would change what it is.
|
|
171
|
-
*/
|
|
172
|
-
function compact(container, key, child) {
|
|
173
|
-
const buffer = child.buffer;
|
|
174
|
-
if (child.byteOffset === 0 && child.byteLength === buffer.byteLength)
|
|
175
|
-
return child;
|
|
176
|
-
if (buffer.resizable === true || !(buffer instanceof ArrayBuffer))
|
|
177
|
-
return child;
|
|
178
|
-
const bytes = buffer.slice(child.byteOffset, child.byteOffset + child.byteLength);
|
|
179
|
-
const tag = Object.prototype.toString.call(child).slice(8, -1);
|
|
180
|
-
const Ctor = globalThis[tag];
|
|
181
|
-
if (typeof Ctor !== 'function')
|
|
182
|
-
return child;
|
|
183
|
-
const copy = new Ctor(bytes);
|
|
184
|
-
try {
|
|
185
|
-
container[key] = copy;
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
return child; // a property the record does not let be replaced (a hand-built bundle)
|
|
189
|
-
}
|
|
190
|
-
return copy;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Map the open paths of `root` — mark every container that reaches a value freezing cannot seal, so a
|
|
194
|
-
* serve copies exactly those (DAGs and cycles included: the marks run UP the reverse edges from each
|
|
195
|
-
* such value). Runs once per open record, at its first serve. A node's first holder is kept in one map;
|
|
196
|
-
* any other holder (a shared part, a cycle) in a second, made only when there is one.
|
|
197
|
-
*/
|
|
198
|
-
function mapOpenPaths(root) {
|
|
199
|
-
const holder = new Map();
|
|
200
|
-
let moreHolders;
|
|
201
|
-
const leaves = [];
|
|
202
|
-
const stack = [root];
|
|
203
|
-
while (stack.length > 0) {
|
|
204
|
-
const node = stack.pop();
|
|
205
|
-
if (isUnsealable(node)) {
|
|
206
|
-
leaves.push(node); // a leaf: its contents are copied with it
|
|
207
|
-
continue;
|
|
208
|
-
}
|
|
209
|
-
const names = Object.keys(node);
|
|
210
|
-
for (let i = 0; i < names.length; i++) {
|
|
211
|
-
const child = node[names[i]];
|
|
212
|
-
if (child === null || typeof child !== 'object')
|
|
213
|
-
continue;
|
|
214
|
-
if (child !== root && !holder.has(child)) {
|
|
215
|
-
holder.set(child, node);
|
|
216
|
-
stack.push(child);
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
const more = (moreHolders ??= new Map()).get(child);
|
|
220
|
-
if (more === undefined)
|
|
221
|
-
moreHolders.set(child, [node]);
|
|
222
|
-
else
|
|
223
|
-
more.push(node);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
// Marked in THIS map, not by an earlier one: a part another record already mapped still opens
|
|
227
|
-
// every container of this record on the way to it.
|
|
228
|
-
const marked = new Set();
|
|
229
|
-
const up = [];
|
|
230
|
-
const holdersOf = (node) => {
|
|
231
|
-
const first = holder.get(node);
|
|
232
|
-
if (first !== undefined)
|
|
233
|
-
up.push(first);
|
|
234
|
-
const more = moreHolders?.get(node);
|
|
235
|
-
// One push per holder: a spread passes every holder as a call argument, and one object held by
|
|
236
|
-
// 120,000 containers overflowed the stack.
|
|
237
|
-
if (more !== undefined)
|
|
238
|
-
for (let i = 0; i < more.length; i++)
|
|
239
|
-
up.push(more[i]);
|
|
240
|
-
};
|
|
241
|
-
for (const leaf of leaves) {
|
|
242
|
-
if (leaf === root)
|
|
243
|
-
marked.add(root);
|
|
244
|
-
holdersOf(leaf);
|
|
245
|
-
}
|
|
246
|
-
while (up.length > 0) {
|
|
247
|
-
const node = up.pop();
|
|
248
|
-
if (marked.has(node))
|
|
249
|
-
continue;
|
|
250
|
-
marked.add(node);
|
|
251
|
-
holdersOf(node);
|
|
252
|
-
}
|
|
253
|
-
// Only now, the walk done, does the record's flag give way to its map: a mapping that throws leaves
|
|
254
|
-
// the record flagged, so the next serve maps again — it never hands out the record itself.
|
|
255
|
-
if (!marked.has(root))
|
|
256
|
-
OPEN.delete(root);
|
|
257
|
-
for (const node of marked)
|
|
258
|
-
OPEN.set(node, true);
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* The served copy of an open record: its open containers copied (fresh, then frozen, and themselves
|
|
262
|
-
* open — a copy is served by copy again), each value freezing cannot seal copied, every sealed part
|
|
263
|
-
* shared. Iterative; one copy per original, so containers shared or cyclic stay shared in the copy. The
|
|
264
|
-
* values freezing cannot seal are copied ONE BY ONE: two of them that share a part (an `ArrayBuffer`
|
|
265
|
-
* and a view of it, an error whose `cause` is another key's Date) come out as separate copies — equal
|
|
266
|
-
* values, the sharing between them not kept.
|
|
267
|
-
*/
|
|
268
|
-
function copyOpenPaths(root) {
|
|
269
|
-
const copies = new Map();
|
|
270
|
-
const shells = [];
|
|
271
|
-
const copyOf = (value, pending) => {
|
|
272
|
-
const done = copies.get(value);
|
|
273
|
-
if (done !== undefined)
|
|
274
|
-
return done;
|
|
275
|
-
let copy;
|
|
276
|
-
if (isUnsealable(value)) {
|
|
277
|
-
copy = copyLeaf(value);
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
copy = Array.isArray(value) ? new Array(value.length) : {};
|
|
281
|
-
shells.push(copy);
|
|
282
|
-
pending.push(value);
|
|
283
|
-
}
|
|
284
|
-
copies.set(value, copy);
|
|
285
|
-
return copy;
|
|
286
|
-
};
|
|
287
|
-
const pending = [];
|
|
288
|
-
const out = copyOf(root, pending);
|
|
289
|
-
while (pending.length > 0) {
|
|
290
|
-
const node = pending.pop();
|
|
291
|
-
const copy = copies.get(node);
|
|
292
|
-
for (const name of Object.keys(node)) {
|
|
293
|
-
const child = node[name];
|
|
294
|
-
(0, ownData_js_1.putOwn)(copy, name, child !== null && typeof child === 'object' && (OPEN.has(child) || isUnsealable(child))
|
|
295
|
-
? copyOf(child, pending)
|
|
296
|
-
: child);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
for (const shell of shells) {
|
|
300
|
-
Object.freeze(shell);
|
|
301
|
-
OPEN.set(shell, true);
|
|
302
|
-
}
|
|
303
|
-
// A leaf copy is the reader's own; frozen where freezing reaches, as the record's parts are.
|
|
304
|
-
for (const copy of copies.values())
|
|
305
|
-
if (!ArrayBuffer.isView(copy))
|
|
306
|
-
Object.freeze(copy);
|
|
307
|
-
return out;
|
|
308
|
-
}
|
|
309
|
-
/** A fresh copy of a value freezing cannot seal. One the clone refuses (hand-built) is served as it is. */
|
|
310
|
-
function copyLeaf(value) {
|
|
311
|
-
if ((0, valueKinds_js_1.kindOf)(value) === 'date')
|
|
312
|
-
return new Date(Date.prototype.getTime.call(value));
|
|
313
|
-
try {
|
|
314
|
-
return structuredClone(value);
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
return value;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2ZyZWV6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7OztBQUVILDZDQUFzQztBQUN0QyxtREFBbUQ7QUFjbkQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFJLEdBQU0sRUFBRSxTQUFvQixXQUFXO0lBQ25FLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdGLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUhELGdDQUdDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixZQUFZLENBQW1CLE1BQVMsRUFBRSxTQUFvQixXQUFXO0lBQ3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxJQUFJLENBQUM7UUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBSEQsb0NBR0M7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBSSxNQUFTO0lBQ3RDLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJ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S0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2dCQUN4QixDQUFDLENBQUMsS0FBSyxDQUNWLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUNELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsNkZBQTZGO0lBQzdGLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkYsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsMkdBQTJHO0FBQzNHLFNBQVMsUUFBUSxDQUFDLEtBQWE7SUFDN0IsSUFBSSxJQUFBLHNCQUFNLEVBQUMsS0FBSyxDQUFDLEtBQUssTUFBTTtRQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZyZWV6ZS50cyDigJQgdGhlIE9ORSBkZWVwLWZyZWV6ZSB3YWxrIChtb3ZlZCBoZXJlIGZyb20gYHNjb3BlL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50c2AgaW4gRjMpLFxuICogYW5kIHRoZSBzZXJ2ZS10aW1lIGxhdyBmb3IgdGhlIGNvbW1pdCBsb2cgKDkuNDQuMikuXG4gKlxuICogV0hZIEhFUkUuIFNhdmVkIHRyZWVzIGZyZWV6ZSB0aHJvdWdoIHRoaXMgd2FsazogdGhlIGZvbGQgYmFzZSBzZXJ2ZWQgYXNcbiAqIGBpbml0aWFsU3RhdGVgIChgRXhlY3V0aW9uUnVudGltZSDCtyBnZXRGb2xkQmFzZWApLCB0aGVcbiAqIGRldi1tb2RlIHNuYXBzaG90IChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCksIGV2ZXJ5IHN0YXRlIGBzdGF0ZUF0YCBoYW5kcyBvdXRcbiAqIChgdGltZS10cmF2ZWwvc3RhdGVBdC50c2ApIGFuZCwgc2luY2UgRjMsIGV2ZXJ5IGNvbW1pdCBidW5kbGUgKGBFdmVudExvZyDCtyByZWNvcmRgKS4gYG1lbW9yeS9gIG11c3RcbiAqIG5vdCBpbXBvcnQgYHNjb3BlL2AgKHRoYXQgZWRnZSBjbG9zZWQgdGhlIG1lbW9yeSDih4Qgc2NvcGUg4oeEIHJlY29yZGVyIG1vZHVsZSBjeWNsZSBGMCByZW1vdmVkKSwgc28gdGhlXG4gKiB3YWxrIGxpdmVzIGluIHRoaXMgbGVhZiBmb2xkZXIsIHdoaWNoIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZi4gQXJncyB1c2UgYW4gb3duZXJzaGlwIHNuYXBzaG90XG4gKiBpbnN0ZWFkIChgc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LnRzIMK3IGNyZWF0ZUZyb3plbkFyZ3NgKTogbmV2ZXIgZnJlZXplIGJvcnJvd2VkIGNhbGxlciB2YWx1ZXMuXG4gKlxuICogRlJFRVpFIFdIQVQgQ0FOIEJFIEZST1pFTiwgQ09QWSBXSEFUIENBTidUICg5LjQ0LjIpLiBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHNlYWwgYSBEYXRlJ3MgdGltZSwgYVxuICogTWFwJ3Mgb3IgU2V0J3MgZW50cmllcywgYSBidWZmZXIncyBieXRlcywgYSBSZWdFeHAgKGBjb21waWxlKClgIHJld3JpdGVzIGEgZnJvemVuIG9uZSkgb3IgYW4gRXJyb3JcbiAqIChWOCdzIG93biBgc3RhY2tgIGFjY2Vzc29yIHdyaXRlcyB0aHJvdWdoIGEgZnJvemVuIG9uZSkuIEEgZnJlc2ggdHJlZSBoYW5kZWQgdG8gb25lIGNhbGxlciAoYSBgc3RhdGVBdGBcbiAqIHN0YXRlLCB0aGUgZGV2LW1vZGUgc25hcHNob3QpIGlzIHRoYXQgY2FsbGVyJ3Mgb3duLCBzbyBmcmVlemluZyBpdCBpcyBhIGd1YXJkIGFuZCBub3RoaW5nIG1vcmUuIFRoZVxuICogQ09NTUlUIExPRyDigJQgZWFjaCBidW5kbGUsIGFuZCB0aGUgZm9sZCBiYXNlIOKAlCBpcyBzZXJ2ZWQgdG8gZXZlcnkgcmVhZGVyLCBzbyB7QGxpbmsgZnJlZXplUmVjb3JkfVxuICogcmVtZW1iZXJzIHRoYXQgYSByZWNvcmQgaG9sZHMgc3VjaCBhIHZhbHVlLCBpdHMgZmlyc3Qgc2VydmUgbWFwcyB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGVhY2hcbiAqIG9uZSAoaXRzIG9wZW4gUEFUSFMpLCBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBoYW5kcyBhIHJlYWRlciBhIGNvcHkgb2YgdGhvc2UgcGF0aHMgb25seTogYSBmcmVzaCBjb3B5XG4gKiBvZiBlYWNoIHN1Y2ggdmFsdWUsIGZyZXNoIGZyb3plbiBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gaXQsIGFuZCBldmVyeSBvdGhlciBwYXJ0IHNoYXJlZCwgZnJvemVuLCBhc1xuICogaXQgaXMuIFVudGlsIDkuNDQuMiBgc25hcHNob3QuY29tbWl0TG9nW2ldLm92ZXJ3cml0ZS53aGVuLnNldFRpbWUoMClgIHJld3JvdGUgZXZlcnkgbGF0ZXIgc25hcHNob3QsXG4gKiBgc3RhdGVBdGAsIGBjb21taXRWYWx1ZUF0YCwgc2xpY2UgYW5kIGN1cnNvciBhbnN3ZXIuXG4gKlxuICogRXZlcnkgd2FsayBoZXJlIGlzIElURVJBVElWRSAoYW4gZXhwbGljaXQgc3RhY2spOiBhIHJlY29yZCdzIGRlcHRoIGlzIG5vdCBib3VuZGVkIGJ5IHRoZSBjYWxsIHN0YWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBkZWVwRnJlZXplLCBmcmVlemVSZWNvcmQsIHNlcnZlUmVjb3JkIH0gZnJvbSAnLi9mcmVlemUuanMnO1xuICpcbiAqIGNvbnN0IGFyZ3MgPSBkZWVwRnJlZXplKHsgb3JkZXI6IHsgbGluZXM6IFt7IHNrdTogJ0EnIH1dIH0sIGJ5dGVzOiBuZXcgVWludDhBcnJheShbMV0pIH0pO1xuICogT2JqZWN0LmlzRnJvemVuKGFyZ3Mub3JkZXIubGluZXNbMF0pOyAvLyB0cnVlXG4gKiBPYmplY3QuaXNGcm96ZW4oYXJncy5ieXRlcyk7IC8vIGZhbHNlIOKAlCBhIHR5cGVkIGFycmF5IGNhbm5vdCBiZSBmcm96ZW47IGl0IGlzIHNraXBwZWRcbiAqXG4gKiBjb25zdCByZWNvcmQgPSBmcmVlemVSZWNvcmQoeyB3aGVuOiBuZXcgRGF0ZSgwKSwgdGFnczogWydhJ10gfSk7XG4gKiBjb25zdCBzZXJ2ZWQgPSBzZXJ2ZVJlY29yZChyZWNvcmQpO1xuICogc2VydmVkLndoZW4uc2V0VGltZSg1KTsgLy8gY2hhbmdlcyB0aGUgcmVhZGVyJ3MgY29weVxuICogc2VydmVSZWNvcmQocmVjb3JkKS53aGVuLmdldFRpbWUoKTsgLy8gMCDigJQgZXZlcnkgc2VydmUgaXMgdGhlIHJlY29yZCBhcyByZWNvcmRlZFxuICogc2VydmVkLnRhZ3MgPT09IHJlY29yZC50YWdzOyAvLyB0cnVlIOKAlCB0aGUgc2VhbGVkIHBhcnQgaXMgc2hhcmVkLCBub3QgY29waWVkXG4gKiBzZXJ2ZVJlY29yZChmcmVlemVSZWNvcmQoeyBuOiAxIH0pKTsgLy8gYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlOiBzZXJ2ZWQgYXMgaXRzZWxmXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBwdXRPd24gfSBmcm9tICcuL293bkRhdGEuanMnO1xuaW1wb3J0IHsga2luZE9mLCBTRUFMQUJMRSB9IGZyb20gJy4vdmFsdWVLaW5kcy5qcyc7XG5cbi8qKlxuICogSG93IHtAbGluayBkZWVwRnJlZXplfSB3YWxrcyBhbiBBUlJBWS5cbiAqXG4gKiAtIGAnZXZlcnkta2V5J2AgKHRoZSBkZWZhdWx0KSDigJQgZXZlcnkgb3duIHByb3BlcnR5LCBhcyBmb3IgYW55IG90aGVyIG9iamVjdDogdGhlIGluZGV4IGVsZW1lbnRzXG4gKiAgIEFORCBhbnkgZXhwYW5kbyAoYGFyci5ub3RlID0geyDigKYgfWApLiBUaGUgZGV2LW1vZGUgc25hcHNob3QgcmVsaWVzIG9uIHRoaXMgY29udHJhY3QuXG4gKiAtIGAnaW5kaWNlcydgIOKAlCB0aGUgaW5kZXggZWxlbWVudHMgb25seSwgc28gbm8ga2V5IHN0cmluZyBpcyBhbGxvY2F0ZWQgcGVyIGVsZW1lbnQ7IHRoaXMgaXMgd2hhdFxuICogICBrZWVwcyBmcmVlemluZyBhIDEwLDAwMC1lbGVtZW50IGNvbW1pdCBpbnNpZGUgaXRzIGJ1ZGdldCAoYGJlbmNoL2VsZW1lbnQtd3JpdGVzLnRzYCkuIEFuIG9iamVjdFxuICogICBodW5nIG9uIGFuIGFycmF5IEVYUEFORE8gaXMgdGhlbiBsZWZ0IHVuZnJvemVuLCBhbmQgdW5zZWVuIGJ5IHtAbGluayBzZXJ2ZVJlY29yZH0g4oCUIHRoZSBjb21taXRcbiAqICAgbG9nJ3MgbmFtZWQgaG9sZSAoYEV2ZW50TG9nIMK3IHJlY29yZGA7IGFuIGFycmF5IGV4cGFuZG8gaXMgb3V0IG9mIGNvbnRyYWN0IGZvciBzdGF0ZSkuXG4gKi9cbmV4cG9ydCB0eXBlIEFycmF5V2FsayA9ICdldmVyeS1rZXknIHwgJ2luZGljZXMnO1xuXG4vKipcbiAqIEZyZWV6ZXMgYG9iamAgYW5kIGV2ZXJ5IG9iamVjdCByZWFjaGFibGUgdGhyb3VnaCBpdHMgb3duIHByb3BlcnRpZXMsIGFuZCByZXR1cm5zIGBvYmpgLlxuICpcbiAqIC0gQW4gb2JqZWN0IHRoYXQgaXMgQUxSRUFEWSBmcm96ZW4gaXMgbGVmdCBhcyBpdCBpcywgYW5kIG5vdCBkZXNjZW5kZWQg4oCUIDkuMzIuMCdzIGNvbnRyYWN0LCBrZXB0OlxuICogICBhcmdzIG1heSBob2xkIGEgY2FsbGVyJ3MgZnJvemVuIG9iamVjdCB3aXRoIGxpdmUgcGFydHMgaW5zaWRlIChhIGNsYXNzIGluc3RhbmNlIGEgc3RhZ2UgY2FsbHMpLFxuICogICBhbmQgZnJlZXppbmcgcGFzdCBpdCB3b3VsZCBicmVhayB0aGVtLiBJdCBpcyBhbHNvIHdoYXQgZW5kcyBhIGN5Y2xlLiBUaGUgY29tbWl0IGxvZyBuZXZlciBtZWV0c1xuICogICBvbmU6IGl0cyBwYXlsb2FkcyBhcmUgZnJlc2ggYHN0cnVjdHVyZWRDbG9uZWBzLlxuICogLSBBcnJheUJ1ZmZlciB2aWV3cyAodHlwZWQgYXJyYXlzLCBgRGF0YVZpZXdgKSBhcmUgc2tpcHBlZDogYE9iamVjdC5mcmVlemVgIHRocm93cyBvbiBhIG5vbi1lbXB0eVxuICogICB0eXBlZCBhcnJheSwgc28gYSBgVWludDhBcnJheWAgaW4gc3RhdGUsIGFyZ3Mgb3IgdGhlIGZvbGQgYmFzZSB1c2VkIHRvIGZhaWwgdGhlIHJ1biBvciB0aGVcbiAqICAgc25hcHNob3QgaGVyZS5cbiAqIC0gV2hhdCBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHJlYWNoIHN0YXlzIG11dGFibGUg4oCUIE1hcCBhbmQgU2V0IGNvbnRlbnRzLCBhIERhdGUncyB0aW1lLCB0aGVcbiAqICAgYnl0ZXMgYmVoaW5kIGEgYnVmZmVyLiBBIGZyb3plbiBSZWdFeHAncyBgbGFzdEluZGV4YCBpcyByZWFkLW9ubHksIHNvIGEgYC9nYCBvciBgL3lgIHJlZ2V4XG4gKiAgIHRha2VuIGZyb20gYSBmcm96ZW4gdHJlZSB0aHJvd3Mgd2hlbiBgZXhlY2Agb3IgYHJlcGxhY2VgIGFkdmFuY2UgaXQuIFRoZSBjb21taXQgbG9nIGdvZXMgdGhyb3VnaFxuICogICB7QGxpbmsgZnJlZXplUmVjb3JkfSBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBpbnN0ZWFkLlxuICogLSBGdW5jdGlvbnMgYXJlIG5vdCBkZXNjZW5kZWQgKHRoZXkgYXJlIG5vdCB2YWx1ZXMgdGhlIGVuZ2luZSBzdG9yZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZTxUPihvYmo6IFQsIGFycmF5czogQXJyYXlXYWxrID0gJ2V2ZXJ5LWtleScpOiBUIHtcbiAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykgd2Fsa0FuZEZyZWV6ZShvYmosIGFycmF5cyA9PT0gJ2luZGljZXMnLCBmYWxzZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ29udGFpbmVycyBvZiBhIHJlY29yZCB0aGF0IGhvbGQg4oCUIG9uIHNvbWUgcGF0aCBiZWxvdyB0aGVtIOKAlCBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsOiBgdHJ1ZWAgb25jZVxuICogbWFwcGVkICh0aGUgY29udGFpbmVyIGlzIG9uIGFuIG9wZW4gcGF0aCksIGBmYWxzZWAgZm9yIGEgcmVjb3JkIHtAbGluayBmcmVlemVSZWNvcmR9IGZvdW5kIG9wZW4gd2hvc2VcbiAqIHBhdGhzIG5vIHNlcnZlIGhhcyBtYXBwZWQgeWV0LiBBIGNvbnRhaW5lciBhYnNlbnQgaGVyZSBpcyBzZWFsZWQgd2hvbGUuXG4gKi9cbmNvbnN0IE9QRU4gPSBuZXcgV2Vha01hcDxvYmplY3QsIGJvb2xlYW4+KCk7XG5cbi8qKlxuICoge0BsaW5rIGRlZXBGcmVlemV9IGZvciBhIHJlY29yZCBtYW55IHJlYWRlcnMgYXJlIFNFUlZFRCAoYSBjb21taXQgYnVuZGxlLCB0aGUgZm9sZCBiYXNlKSwgYW5kIHR3byBtb3JlXG4gKiB0aGluZ3Mgb24gdGhlIHNhbWUgd2FsazpcbiAqXG4gKiAgIC0gaXQgcmVtZW1iZXJzIFRIQVQgdGhlIHJlY29yZCBob2xkcyBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsIOKAlCBvbmUgZmxhZzsgdGhlIHJlY29yZCdzIGZpcnN0XG4gKiAgICAgc2VydmUgbWFwcyBXSEVSRSAodGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0byBlYWNoIHN1Y2ggdmFsdWUsIGl0cyBvcGVuIHBhdGhzKSwgc28gdGhlIHJ1biBwYXlzXG4gKiAgICAgbm90aGluZyBtb3JlIGFuZCB7QGxpbmsgc2VydmVSZWNvcmR9IGNvcGllcyB0aG9zZSBwYXRocyBhbmQgbm90aGluZyBlbHNlO1xuICogICAtIGEgdHlwZWQgYXJyYXkgb3IgYERhdGFWaWV3YCB0aGF0IHZpZXdzIGEgU0xJQ0Ugb2YgYSBiaWdnZXIgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgaXRzXG4gKiAgICAgc2hhcmVkIHBvb2wpIGlzIHJlcGxhY2VkLCBpbiB0aGUgcmVjb3JkLCBieSBhIGNvcHkgb2YgdGhlIGJ5dGVzIGl0IHZpZXdzIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHRoZVxuICogICAgIHZpZXcncyBieXRlcywgbmV2ZXIgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciAoYSByZXNpemFibGUgb3Igc2hhcmVkIGJ1ZmZlciBpcyBrZXB0IGFzIGl0IGlzKS5cbiAqXG4gKiBBIHBhcnQgZnJvemVuIGJlZm9yZSBpcyBub3QgZnJvemVuIHBhc3QgKGRlZXBGcmVlemUncyBjb250cmFjdCkgYnV0IGlzIGxvb2tlZCB0aHJvdWdoLCBzbyBhIHZhbHVlXG4gKiBmcmVlemluZyBjYW5ub3Qgc2VhbCBpbnNpZGUgaXQgc3RpbGwgb3BlbnMgdGhlIHJlY29yZC4gUmV0dXJucyBgcmVjb3JkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZWV6ZVJlY29yZDxUIGV4dGVuZHMgb2JqZWN0PihyZWNvcmQ6IFQsIGFycmF5czogQXJyYXlXYWxrID0gJ2V2ZXJ5LWtleScpOiBUIHtcbiAgaWYgKCFPUEVOLmhhcyhyZWNvcmQpICYmIHdhbGtBbmRGcmVlemUocmVjb3JkLCBhcnJheXMgPT09ICdpbmRpY2VzJywgdHJ1ZSkpIE9QRU4uc2V0KHJlY29yZCwgZmFsc2UpO1xuICByZXR1cm4gcmVjb3JkO1xufVxuXG4vKipcbiAqIFRoZSByZWNvcmQgYXMgYSByZWFkZXIgbWF5IGhvbGQgaXQg4oCUIFRIRSBzZXJ2ZS10aW1lIGxhdzogYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlIGlzIHNlcnZlZCBhc1xuICogaXRzZWxmIChzaGFyZWQsIG5vIGNvc3QpOyBhbnkgb3RoZXIgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzICh7QGxpbmsgZnJlZXplUmVjb3JkfSk6IGZyZXNoIGZyb3plblxuICogY29udGFpbmVycyBkb3duIHRvIGVhY2ggdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwsIGEgZnJlc2ggY29weSBvZiB0aGF0IHZhbHVlLCBhbmQgZXZlcnkgb3RoZXIgcGFydFxuICogc2hhcmVkLCBmcm96ZW4sIGFzIGl0IGlzLiBBIGNvcHkgaXMgc2VydmVkIHRoZSBzYW1lIHdheSBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlUmVjb3JkPFQ+KHJlY29yZDogVCk6IFQge1xuICBpZiAocmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnKSByZXR1cm4gcmVjb3JkO1xuICBjb25zdCBtYXBwZWQgPSBPUEVOLmdldChyZWNvcmQpO1xuICBpZiAobWFwcGVkID09PSB1bmRlZmluZWQpIHJldHVybiByZWNvcmQ7XG4gIGlmICghbWFwcGVkKSBtYXBPcGVuUGF0aHMocmVjb3JkKTtcbiAgcmV0dXJuIE9QRU4uZ2V0KHJlY29yZCkgPT09IHRydWUgPyAoY29weU9wZW5QYXRocyhyZWNvcmQpIGFzIFQpIDogcmVjb3JkO1xufVxuXG4vKiogQSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCDigJQgYSB2aWV3LCBvciBhIGtpbmQgYFNFQUxBQkxFYCBzYXlzIG5vIHRvIChhIERhdGUsIGEgTWFwLCBhbiBFcnJvciDigKYpLiAqL1xuZnVuY3Rpb24gaXNVbnNlYWxhYmxlKHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgfHwgIVNFQUxBQkxFW2tpbmRPZih2YWx1ZSldO1xufVxuXG4vKipcbiAqIEZyZWV6ZSBgcm9vdGAgYW5kIGV2ZXJ5IGNvbnRhaW5lciB1bmRlciBpdCwgaXRlcmF0aXZlbHk7IGByZWNvcmRgIGFkZHMgdGhlIGxvb2stdGhyb3VnaCBvZiBwYXJ0c1xuICogZnJvemVuIGJlZm9yZSBhbmQgdGhlIGNvbXBhY3Rpb24gb2Ygdmlld3Mgb3ZlciBhIHNsaWNlLiBgdHJ1ZWAgd2hlbiBzb21ldGhpbmcgdW5kZXIgYHJvb3RgIChvciBgcm9vdGBcbiAqIGl0c2VsZikgY2Fubm90IGJlIHNlYWxlZC5cbiAqL1xuZnVuY3Rpb24gd2Fsa0FuZEZyZWV6ZShyb290OiBvYmplY3QsIGluZGljZXM6IGJvb2xlYW4sIHJlY29yZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBsZXQgb3BlbiA9IGZhbHNlO1xuICBsZXQgbG9va2VkVGhyb3VnaDogU2V0PG9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcobm9kZSkpIHtcbiAgICAgIG9wZW4gPSB0cnVlOyAvLyBpdHMgYnl0ZXMg4oCUIGFuZCBhIG5vbi1lbXB0eSBvbmUgY2Fubm90IGJlIGZyb3plbiBhdCBhbGxcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmcm96ZW5CZWZvcmUgPSBPYmplY3QuaXNGcm96ZW4obm9kZSk7XG4gICAgaWYgKGZyb3plbkJlZm9yZSkge1xuICAgICAgaWYgKCFyZWNvcmQgfHwgT1BFTi5oYXMobm9kZSkpIHtcbiAgICAgICAgb3BlbiB8fD0gcmVjb3JkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgobG9va2VkVGhyb3VnaCA/Pz0gbmV3IFNldCgpKS5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgbG9va2VkVGhyb3VnaC5hZGQobm9kZSk7IC8vIGEgcGFydCBmcm96ZW4gYmVmb3JlOiBsb29rZWQgdGhyb3VnaCwgbmV2ZXIgZnJvemVuIHBhc3RcbiAgICB9XG4gICAgaWYgKHJlY29yZCAmJiAhb3BlbiAmJiAhU0VBTEFCTEVba2luZE9mKG5vZGUpXSkgb3BlbiA9IHRydWU7XG4gICAgLy8gQ2hpbGRyZW4gZmlyc3QsIHdoaWxlIGBub2RlYCBpcyBzdGlsbCBvcGVuIHRvIHRoZSBjb21wYWN0aW9uIGJlbG93OyB0aGVuIHRoZSBmcmVlemUuXG4gICAgY29uc3QgY29tcGFjdGluZyA9IHJlY29yZCAmJiAhZnJvemVuQmVmb3JlO1xuICAgIGlmIChpbmRpY2VzICYmIEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZDogdW5rbm93biA9IG5vZGVbaV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaChjb21wYWN0aW5nICYmIEFycmF5QnVmZmVyLmlzVmlldyhjaGlsZCkgPyBjb21wYWN0KG5vZGUsIGksIGNoaWxkKSA6IGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhub2RlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZXNbaV1dO1xuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goY29tcGFjdGluZyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoY2hpbGQpID8gY29tcGFjdChub2RlLCBuYW1lc1tpXSwgY2hpbGQpIDogY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZyb3plbkJlZm9yZSkgT2JqZWN0LmZyZWV6ZShub2RlKTtcbiAgfVxuICByZXR1cm4gb3Blbjtcbn1cblxuLyoqXG4gKiBBIHZpZXcgb3ZlciBhIFNMSUNFIG9mIGEgYmlnZ2VyIGJ1ZmZlciwgcmVwbGFjZWQgaW4gYGNvbnRhaW5lcmAgYnkgYSBjb3B5IG9mIHRoZSBieXRlcyBpdCB2aWV3c1xuICogKHRoZSB0eXBlIGl0IGlzIOKAlCBhIE5vZGUgYEJ1ZmZlcmAgY29tZXMgb3V0IGEgYFVpbnQ4QXJyYXlgLCBhcyBhIGNsb25lIG9mIGl0IGRvZXMpLiBBbnl0aGluZyBlbHNlIGlzXG4gKiByZXR1cm5lZCBhcyBpdCBpcy4gQSByZXNpemFibGUgb3Igc2hhcmVkIGJ1ZmZlciBpcyBrZXB0OiBhIGNvcHkgd291bGQgY2hhbmdlIHdoYXQgaXQgaXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhY3QoY29udGFpbmVyOiBvYmplY3QsIGtleTogc3RyaW5nIHwgbnVtYmVyLCBjaGlsZDogQXJyYXlCdWZmZXJWaWV3KTogb2JqZWN0IHtcbiAgY29uc3QgYnVmZmVyID0gY2hpbGQuYnVmZmVyIGFzIEFycmF5QnVmZmVyICYgeyByZXNpemFibGU/OiBib29sZWFuIH07XG4gIGlmIChjaGlsZC5ieXRlT2Zmc2V0ID09PSAwICYmIGNoaWxkLmJ5dGVMZW5ndGggPT09IGJ1ZmZlci5ieXRlTGVuZ3RoKSByZXR1cm4gY2hpbGQ7XG4gIGlmIChidWZmZXIucmVzaXphYmxlID09PSB0cnVlIHx8ICEoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSByZXR1cm4gY2hpbGQ7XG4gIGNvbnN0IGJ5dGVzID0gYnVmZmVyLnNsaWNlKGNoaWxkLmJ5dGVPZmZzZXQsIGNoaWxkLmJ5dGVPZmZzZXQgKyBjaGlsZC5ieXRlTGVuZ3RoKTtcbiAgY29uc3QgdGFnID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNoaWxkKS5zbGljZSg4LCAtMSk7XG4gIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG5ldyAoYnVmZmVyOiBBcnJheUJ1ZmZlcikgPT4gQXJyYXlCdWZmZXJWaWV3PilbdGFnXTtcbiAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gY2hpbGQ7XG4gIGNvbnN0IGNvcHkgPSBuZXcgQ3RvcihieXRlcyk7XG4gIHRyeSB7XG4gICAgKGNvbnRhaW5lciBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XSA9IGNvcHk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjaGlsZDsgLy8gYSBwcm9wZXJ0eSB0aGUgcmVjb3JkIGRvZXMgbm90IGxldCBiZSByZXBsYWNlZCAoYSBoYW5kLWJ1aWx0IGJ1bmRsZSlcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBNYXAgdGhlIG9wZW4gcGF0aHMgb2YgYHJvb3RgIOKAlCBtYXJrIGV2ZXJ5IGNvbnRhaW5lciB0aGF0IHJlYWNoZXMgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCwgc28gYVxuICogc2VydmUgY29waWVzIGV4YWN0bHkgdGhvc2UgKERBR3MgYW5kIGN5Y2xlcyBpbmNsdWRlZDogdGhlIG1hcmtzIHJ1biBVUCB0aGUgcmV2ZXJzZSBlZGdlcyBmcm9tIGVhY2hcbiAqIHN1Y2ggdmFsdWUpLiBSdW5zIG9uY2UgcGVyIG9wZW4gcmVjb3JkLCBhdCBpdHMgZmlyc3Qgc2VydmUuIEEgbm9kZSdzIGZpcnN0IGhvbGRlciBpcyBrZXB0IGluIG9uZSBtYXA7XG4gKiBhbnkgb3RoZXIgaG9sZGVyIChhIHNoYXJlZCBwYXJ0LCBhIGN5Y2xlKSBpbiBhIHNlY29uZCwgbWFkZSBvbmx5IHdoZW4gdGhlcmUgaXMgb25lLlxuICovXG5mdW5jdGlvbiBtYXBPcGVuUGF0aHMocm9vdDogb2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IGhvbGRlciA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG4gIGxldCBtb3JlSG9sZGVyczogTWFwPG9iamVjdCwgb2JqZWN0W10+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBsZWF2ZXM6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgIGlmIChpc1Vuc2VhbGFibGUobm9kZSkpIHtcbiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpOyAvLyBhIGxlYWY6IGl0cyBjb250ZW50cyBhcmUgY29waWVkIHdpdGggaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVzW2ldXTtcbiAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAhaG9sZGVyLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgaG9sZGVyLnNldChjaGlsZCwgbm9kZSk7XG4gICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vcmUgPSAobW9yZUhvbGRlcnMgPz89IG5ldyBNYXAoKSkuZ2V0KGNoaWxkKTtcbiAgICAgIGlmIChtb3JlID09PSB1bmRlZmluZWQpIG1vcmVIb2xkZXJzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgIGVsc2UgbW9yZS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICAvLyBNYXJrZWQgaW4gVEhJUyBtYXAsIG5vdCBieSBhbiBlYXJsaWVyIG9uZTogYSBwYXJ0IGFub3RoZXIgcmVjb3JkIGFscmVhZHkgbWFwcGVkIHN0aWxsIG9wZW5zXG4gIC8vIGV2ZXJ5IGNvbnRhaW5lciBvZiB0aGlzIHJlY29yZCBvbiB0aGUgd2F5IHRvIGl0LlxuICBjb25zdCBtYXJrZWQgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdXA6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IGhvbGRlcnNPZiA9IChub2RlOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICBjb25zdCBmaXJzdCA9IGhvbGRlci5nZXQobm9kZSk7XG4gICAgaWYgKGZpcnN0ICE9PSB1bmRlZmluZWQpIHVwLnB1c2goZmlyc3QpO1xuICAgIGNvbnN0IG1vcmUgPSBtb3JlSG9sZGVycz8uZ2V0KG5vZGUpO1xuICAgIC8vIE9uZSBwdXNoIHBlciBob2xkZXI6IGEgc3ByZWFkIHBhc3NlcyBldmVyeSBob2xkZXIgYXMgYSBjYWxsIGFyZ3VtZW50LCBhbmQgb25lIG9iamVjdCBoZWxkIGJ5XG4gICAgLy8gMTIwLDAwMCBjb250YWluZXJzIG92ZXJmbG93ZWQgdGhlIHN0YWNrLlxuICAgIGlmIChtb3JlICE9PSB1bmRlZmluZWQpIGZvciAobGV0IGkgPSAwOyBpIDwgbW9yZS5sZW5ndGg7IGkrKykgdXAucHVzaChtb3JlW2ldKTtcbiAgfTtcbiAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgIGlmIChsZWFmID09PSByb290KSBtYXJrZWQuYWRkKHJvb3QpO1xuICAgIGhvbGRlcnNPZihsZWFmKTtcbiAgfVxuICB3aGlsZSAodXAubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSB1cC5wb3AoKSE7XG4gICAgaWYgKG1hcmtlZC5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgIG1hcmtlZC5hZGQobm9kZSk7XG4gICAgaG9sZGVyc09mKG5vZGUpO1xuICB9XG4gIC8vIE9ubHkgbm93LCB0aGUgd2FsayBkb25lLCBkb2VzIHRoZSByZWNvcmQncyBmbGFnIGdpdmUgd2F5IHRvIGl0cyBtYXA6IGEgbWFwcGluZyB0aGF0IHRocm93cyBsZWF2ZXNcbiAgLy8gdGhlIHJlY29yZCBmbGFnZ2VkLCBzbyB0aGUgbmV4dCBzZXJ2ZSBtYXBzIGFnYWluIOKAlCBpdCBuZXZlciBoYW5kcyBvdXQgdGhlIHJlY29yZCBpdHNlbGYuXG4gIGlmICghbWFya2VkLmhhcyhyb290KSkgT1BFTi5kZWxldGUocm9vdCk7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXJrZWQpIE9QRU4uc2V0KG5vZGUsIHRydWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBhbiBvcGVuIHJlY29yZDogaXRzIG9wZW4gY29udGFpbmVycyBjb3BpZWQgKGZyZXNoLCB0aGVuIGZyb3plbiwgYW5kIHRoZW1zZWx2ZXNcbiAqIG9wZW4g4oCUIGEgY29weSBpcyBzZXJ2ZWQgYnkgY29weSBhZ2FpbiksIGVhY2ggdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwgY29waWVkLCBldmVyeSBzZWFsZWQgcGFydFxuICogc2hhcmVkLiBJdGVyYXRpdmU7IG9uZSBjb3B5IHBlciBvcmlnaW5hbCwgc28gY29udGFpbmVycyBzaGFyZWQgb3IgY3ljbGljIHN0YXkgc2hhcmVkIGluIHRoZSBjb3B5LiBUaGVcbiAqIHZhbHVlcyBmcmVlemluZyBjYW5ub3Qgc2VhbCBhcmUgY29waWVkIE9ORSBCWSBPTkU6IHR3byBvZiB0aGVtIHRoYXQgc2hhcmUgYSBwYXJ0IChhbiBgQXJyYXlCdWZmZXJgXG4gKiBhbmQgYSB2aWV3IG9mIGl0LCBhbiBlcnJvciB3aG9zZSBgY2F1c2VgIGlzIGFub3RoZXIga2V5J3MgRGF0ZSkgY29tZSBvdXQgYXMgc2VwYXJhdGUgY29waWVzIOKAlCBlcXVhbFxuICogdmFsdWVzLCB0aGUgc2hhcmluZyBiZXR3ZWVuIHRoZW0gbm90IGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPcGVuUGF0aHMocm9vdDogb2JqZWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIG9iamVjdD4oKTtcbiAgY29uc3Qgc2hlbGxzOiBvYmplY3RbXSA9IFtdO1xuICBjb25zdCBjb3B5T2YgPSAodmFsdWU6IG9iamVjdCwgcGVuZGluZzogb2JqZWN0W10pOiBvYmplY3QgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBjb3BpZXMuZ2V0KHZhbHVlKTtcbiAgICBpZiAoZG9uZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZG9uZTtcbiAgICBsZXQgY29weTogb2JqZWN0O1xuICAgIGlmIChpc1Vuc2VhbGFibGUodmFsdWUpKSB7XG4gICAgICBjb3B5ID0gY29weUxlYWYodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBuZXcgQXJyYXkodmFsdWUubGVuZ3RoKSA6IHt9O1xuICAgICAgc2hlbGxzLnB1c2goY29weSk7XG4gICAgICBwZW5kaW5nLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb3BpZXMuc2V0KHZhbHVlLCBjb3B5KTtcbiAgICByZXR1cm4gY29weTtcbiAgfTtcbiAgY29uc3QgcGVuZGluZzogb2JqZWN0W10gPSBbXTtcbiAgY29uc3Qgb3V0ID0gY29weU9mKHJvb3QsIHBlbmRpbmcpO1xuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBlbmRpbmcucG9wKCkhO1xuICAgIGNvbnN0IGNvcHkgPSBjb3BpZXMuZ2V0KG5vZGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgY29uc3QgY2hpbGQgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV07XG4gICAgICBwdXRPd24oXG4gICAgICAgIGNvcHksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgKE9QRU4uaGFzKGNoaWxkKSB8fCBpc1Vuc2VhbGFibGUoY2hpbGQpKVxuICAgICAgICAgID8gY29weU9mKGNoaWxkLCBwZW5kaW5nKVxuICAgICAgICAgIDogY2hpbGQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHNoZWxsIG9mIHNoZWxscykge1xuICAgIE9iamVjdC5mcmVlemUoc2hlbGwpO1xuICAgIE9QRU4uc2V0KHNoZWxsLCB0cnVlKTtcbiAgfVxuICAvLyBBIGxlYWYgY29weSBpcyB0aGUgcmVhZGVyJ3Mgb3duOyBmcm96ZW4gd2hlcmUgZnJlZXppbmcgcmVhY2hlcywgYXMgdGhlIHJlY29yZCdzIHBhcnRzIGFyZS5cbiAgZm9yIChjb25zdCBjb3B5IG9mIGNvcGllcy52YWx1ZXMoKSkgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcoY29weSkpIE9iamVjdC5mcmVlemUoY29weSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBBIGZyZXNoIGNvcHkgb2YgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbC4gT25lIHRoZSBjbG9uZSByZWZ1c2VzIChoYW5kLWJ1aWx0KSBpcyBzZXJ2ZWQgYXMgaXQgaXMuICovXG5mdW5jdGlvbiBjb3B5TGVhZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgaWYgKGtpbmRPZih2YWx1ZSkgPT09ICdkYXRlJykgcmV0dXJuIG5ldyBEYXRlKERhdGUucHJvdG90eXBlLmdldFRpbWUuY2FsbCh2YWx1ZSkpO1xuICB0cnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* The private L0 owner of own-slot writes. Selector validation belongs to
|
|
4
|
-
* pathOps: payload names (including `__proto__`) are ordinary data here.
|
|
5
|
-
* Neither operation flattens an existing own accessor or changes its flags.
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.setOwnValue = exports.putOwn = void 0;
|
|
9
|
-
/**
|
|
10
|
-
* `target[name] = value`, preserving existing own-slot behavior while making
|
|
11
|
-
* a missing inherited name an OWN data property. Payload names such as
|
|
12
|
-
* `__proto__` are data, not setters or selector instructions. Shared by the
|
|
13
|
-
* record-serving and copy-on-write copies; this is not a public helper.
|
|
14
|
-
*/
|
|
15
|
-
function putOwn(target, name, value) {
|
|
16
|
-
if (!Object.prototype.hasOwnProperty.call(target, name) && Reflect.has(target, name)) {
|
|
17
|
-
defineOwnData(target, name, value);
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
target[name] = value;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
exports.putOwn = putOwn;
|
|
24
|
-
/**
|
|
25
|
-
* Nested diagnostic writers require a missing slot to be CREATED, not merely
|
|
26
|
-
* assigned. Keep that contract separate from putOwn: an out-of-range typed
|
|
27
|
-
* array index is an assignment no-op, but cannot be defined as an own slot.
|
|
28
|
-
*/
|
|
29
|
-
function setOwnValue(target, name, value) {
|
|
30
|
-
if (Object.prototype.hasOwnProperty.call(target, name)) {
|
|
31
|
-
putOwn(target, name, value);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
defineOwnData(target, name, value);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
exports.setOwnValue = setOwnValue;
|
|
38
|
-
function defineOwnData(target, name, value) {
|
|
39
|
-
Object.defineProperty(target, name, { value, enumerable: true, writable: true, configurable: true });
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3duRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9vd25EYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7QUFFSDs7Ozs7R0FLRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxNQUErQixFQUFFLElBQXFCLEVBQUUsS0FBYztJQUMzRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JGLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQztBQU5ELHdCQU1DO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxNQUErQixFQUFFLElBQXFCLEVBQUUsS0FBYztJQUNoRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2RCxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO1NBQU0sQ0FBQztRQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7QUFDSCxDQUFDO0FBTkQsa0NBTUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxNQUErQixFQUFFLElBQXFCLEVBQUUsS0FBYztJQUMzRixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBwcml2YXRlIEwwIG93bmVyIG9mIG93bi1zbG90IHdyaXRlcy4gU2VsZWN0b3IgdmFsaWRhdGlvbiBiZWxvbmdzIHRvXG4gKiBwYXRoT3BzOiBwYXlsb2FkIG5hbWVzIChpbmNsdWRpbmcgYF9fcHJvdG9fX2ApIGFyZSBvcmRpbmFyeSBkYXRhIGhlcmUuXG4gKiBOZWl0aGVyIG9wZXJhdGlvbiBmbGF0dGVucyBhbiBleGlzdGluZyBvd24gYWNjZXNzb3Igb3IgY2hhbmdlcyBpdHMgZmxhZ3MuXG4gKi9cblxuLyoqXG4gKiBgdGFyZ2V0W25hbWVdID0gdmFsdWVgLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIG93bi1zbG90IGJlaGF2aW9yIHdoaWxlIG1ha2luZ1xuICogYSBtaXNzaW5nIGluaGVyaXRlZCBuYW1lIGFuIE9XTiBkYXRhIHByb3BlcnR5LiBQYXlsb2FkIG5hbWVzIHN1Y2ggYXNcbiAqIGBfX3Byb3RvX19gIGFyZSBkYXRhLCBub3Qgc2V0dGVycyBvciBzZWxlY3RvciBpbnN0cnVjdGlvbnMuIFNoYXJlZCBieSB0aGVcbiAqIHJlY29yZC1zZXJ2aW5nIGFuZCBjb3B5LW9uLXdyaXRlIGNvcGllczsgdGhpcyBpcyBub3QgYSBwdWJsaWMgaGVscGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHV0T3duKHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWU6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBuYW1lKSAmJiBSZWZsZWN0Lmhhcyh0YXJnZXQsIG5hbWUpKSB7XG4gICAgZGVmaW5lT3duRGF0YSh0YXJnZXQsIG5hbWUsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIE5lc3RlZCBkaWFnbm9zdGljIHdyaXRlcnMgcmVxdWlyZSBhIG1pc3Npbmcgc2xvdCB0byBiZSBDUkVBVEVELCBub3QgbWVyZWx5XG4gKiBhc3NpZ25lZC4gS2VlcCB0aGF0IGNvbnRyYWN0IHNlcGFyYXRlIGZyb20gcHV0T3duOiBhbiBvdXQtb2YtcmFuZ2UgdHlwZWRcbiAqIGFycmF5IGluZGV4IGlzIGFuIGFzc2lnbm1lbnQgbm8tb3AsIGJ1dCBjYW5ub3QgYmUgZGVmaW5lZCBhcyBhbiBvd24gc2xvdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE93blZhbHVlKHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWU6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIG5hbWUpKSB7XG4gICAgcHV0T3duKHRhcmdldCwgbmFtZSwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZU93bkRhdGEodGFyZ2V0LCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lT3duRGF0YSh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lOiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG5hbWUsIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG59XG4iXX0=
|