footprintjs 9.32.0 → 9.33.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 +670 -194
- package/dist/esm/lib/capture/freeze.d.ts +47 -0
- package/dist/esm/lib/capture/freeze.js +60 -0
- package/dist/esm/lib/capture/index.d.ts +1 -0
- package/dist/esm/lib/capture/index.js +2 -1
- package/dist/esm/lib/detach/drivers/immediate.d.ts +25 -24
- package/dist/esm/lib/detach/drivers/immediate.js +26 -25
- package/dist/esm/lib/detach/drivers/microtaskBatch.d.ts +5 -4
- package/dist/esm/lib/detach/drivers/microtaskBatch.js +6 -5
- package/dist/esm/lib/memory/EventLog.d.ts +28 -3
- package/dist/esm/lib/memory/EventLog.js +31 -4
- package/dist/esm/lib/memory/StageContext.js +4 -5
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/esm/lib/memory/TransactionBuffer.js +6 -4
- package/dist/esm/lib/memory/backtrack.d.ts +24 -0
- package/dist/esm/lib/memory/backtrack.js +52 -41
- package/dist/esm/lib/memory/commitLogUtils.d.ts +129 -38
- package/dist/esm/lib/memory/commitLogUtils.js +252 -59
- package/dist/esm/lib/memory/deltaEncoding.d.ts +1 -1
- package/dist/esm/lib/memory/deltaEncoding.js +2 -2
- package/dist/esm/lib/memory/honesty.d.ts +5 -1
- package/dist/esm/lib/memory/honesty.js +11 -6
- package/dist/esm/lib/memory/index.d.ts +2 -2
- package/dist/esm/lib/memory/index.js +3 -3
- package/dist/esm/lib/memory/keyPaths.d.ts +125 -0
- package/dist/esm/lib/memory/keyPaths.js +227 -0
- package/dist/esm/lib/memory/logModel.d.ts +76 -0
- package/dist/esm/lib/memory/logModel.js +357 -0
- package/dist/esm/lib/memory/placeholders.d.ts +3 -3
- package/dist/esm/lib/memory/placeholders.js +4 -4
- package/dist/esm/lib/memory/redaction.d.ts +34 -1
- package/dist/esm/lib/memory/redaction.js +55 -4
- package/dist/esm/lib/memory/utils.d.ts +2 -6
- package/dist/esm/lib/memory/utils.js +4 -21
- package/dist/esm/lib/memory/verbs.d.ts +65 -22
- package/dist/esm/lib/memory/verbs.js +64 -23
- package/dist/esm/lib/runner/ExecutionRuntime.js +5 -3
- package/dist/esm/lib/runner/FlowChartExecutor.js +5 -5
- package/dist/esm/lib/scope/protection/readonlyInput.d.ts +2 -6
- package/dist/esm/lib/scope/protection/readonlyInput.js +4 -18
- package/dist/esm/lib/slice/elementProvenance.d.ts +4 -1
- package/dist/esm/lib/slice/elementProvenance.js +33 -15
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +4 -0
- package/dist/esm/lib/slice/forwardSliceForKey.js +32 -9
- package/dist/esm/lib/slice/keyIndex.d.ts +50 -8
- package/dist/esm/lib/slice/keyIndex.js +97 -16
- package/dist/esm/lib/slice/keyTimeline.js +11 -6
- package/dist/esm/lib/slice/serialize.js +8 -2
- package/dist/esm/lib/slice/sliceForKey.js +22 -6
- package/dist/esm/lib/slice/types.d.ts +53 -7
- package/dist/esm/lib/slice/types.js +1 -1
- package/dist/esm/lib/time-travel/stateAt.js +4 -14
- package/dist/esm/trace.d.ts +2 -1
- package/dist/esm/trace.js +2 -6
- package/dist/lib/capture/freeze.js +64 -0
- package/dist/lib/capture/index.js +4 -2
- package/dist/lib/detach/drivers/immediate.js +26 -25
- package/dist/lib/detach/drivers/microtaskBatch.js +6 -5
- package/dist/lib/memory/EventLog.js +31 -4
- package/dist/lib/memory/StageContext.js +3 -4
- package/dist/lib/memory/TransactionBuffer.js +6 -4
- package/dist/lib/memory/backtrack.js +52 -41
- package/dist/lib/memory/commitLogUtils.js +257 -61
- package/dist/lib/memory/deltaEncoding.js +2 -2
- package/dist/lib/memory/honesty.js +11 -6
- package/dist/lib/memory/index.js +3 -3
- package/dist/lib/memory/keyPaths.js +243 -0
- package/dist/lib/memory/logModel.js +365 -0
- package/dist/lib/memory/placeholders.js +4 -4
- package/dist/lib/memory/redaction.js +56 -3
- package/dist/lib/memory/utils.js +8 -26
- package/dist/lib/memory/verbs.js +64 -23
- package/dist/lib/runner/ExecutionRuntime.js +6 -4
- package/dist/lib/runner/FlowChartExecutor.js +6 -6
- package/dist/lib/scope/protection/readonlyInput.js +6 -21
- package/dist/lib/slice/elementProvenance.js +32 -14
- package/dist/lib/slice/forwardSliceForKey.js +31 -8
- package/dist/lib/slice/keyIndex.js +103 -17
- package/dist/lib/slice/keyTimeline.js +10 -5
- package/dist/lib/slice/serialize.js +8 -2
- package/dist/lib/slice/sliceForKey.js +21 -5
- package/dist/lib/slice/types.js +1 -1
- package/dist/lib/time-travel/stateAt.js +4 -14
- package/dist/trace.js +5 -7
- package/dist/types/lib/capture/freeze.d.ts +47 -0
- package/dist/types/lib/capture/index.d.ts +1 -0
- package/dist/types/lib/detach/drivers/immediate.d.ts +25 -24
- package/dist/types/lib/detach/drivers/microtaskBatch.d.ts +5 -4
- package/dist/types/lib/memory/EventLog.d.ts +28 -3
- package/dist/types/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/types/lib/memory/backtrack.d.ts +24 -0
- package/dist/types/lib/memory/commitLogUtils.d.ts +129 -38
- package/dist/types/lib/memory/deltaEncoding.d.ts +1 -1
- package/dist/types/lib/memory/honesty.d.ts +5 -1
- package/dist/types/lib/memory/index.d.ts +2 -2
- package/dist/types/lib/memory/keyPaths.d.ts +125 -0
- package/dist/types/lib/memory/logModel.d.ts +76 -0
- package/dist/types/lib/memory/placeholders.d.ts +3 -3
- package/dist/types/lib/memory/redaction.d.ts +34 -1
- package/dist/types/lib/memory/utils.d.ts +2 -6
- package/dist/types/lib/memory/verbs.d.ts +65 -22
- package/dist/types/lib/scope/protection/readonlyInput.d.ts +2 -6
- package/dist/types/lib/slice/elementProvenance.d.ts +4 -1
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +4 -0
- package/dist/types/lib/slice/keyIndex.d.ts +50 -8
- package/dist/types/lib/slice/types.d.ts +53 -7
- package/dist/types/trace.d.ts +2 -1
- package/package.json +2 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3).
|
|
3
|
+
*
|
|
4
|
+
* WHY HERE. Five places freeze a tree, all through this walk: run args (`readonlyInput ·
|
|
5
|
+
* createFrozenArgs`), the fold base served as `initialState` (`ExecutionRuntime · getFoldBase`), the
|
|
6
|
+
* dev-mode snapshot (`FlowChartExecutor · getSnapshot`), every state `stateAt` hands out
|
|
7
|
+
* (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
|
|
8
|
+
* not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
|
|
9
|
+
* walk lives in this leaf, which imports nothing.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { deepFreeze } from './freeze.js';
|
|
14
|
+
*
|
|
15
|
+
* const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
|
|
16
|
+
* Object.isFrozen(args.order.lines[0]); // true
|
|
17
|
+
* Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* How {@link deepFreeze} walks an ARRAY.
|
|
22
|
+
*
|
|
23
|
+
* - `'every-key'` (the default) — every own property, as for any other object: the index elements
|
|
24
|
+
* AND any expando (`arr.note = { … }`). The contract args protection and the dev-mode snapshot
|
|
25
|
+
* rely on.
|
|
26
|
+
* - `'indices'` — the index elements only, so no key string is allocated per element; this is what
|
|
27
|
+
* keeps freezing a 10,000-element commit inside its budget (`bench/element-writes.ts`). An object
|
|
28
|
+
* hung on an array EXPANDO is then left unfrozen — the commit log's named hole
|
|
29
|
+
* (`EventLog · record`).
|
|
30
|
+
*/
|
|
31
|
+
export type ArrayWalk = 'every-key' | 'indices';
|
|
32
|
+
/**
|
|
33
|
+
* Freezes `obj` and every object reachable through its own properties, and returns `obj`.
|
|
34
|
+
*
|
|
35
|
+
* - An object that is ALREADY frozen is left as it is, and not descended — 9.32.0's contract, kept:
|
|
36
|
+
* args may hold a caller's frozen object with live parts inside (a class instance a stage calls),
|
|
37
|
+
* and freezing past it would break them. It is also what ends a cycle. The commit log never meets
|
|
38
|
+
* one: its payloads are fresh `structuredClone`s.
|
|
39
|
+
* - ArrayBuffer views (typed arrays, `DataView`) are skipped: `Object.freeze` throws on a non-empty
|
|
40
|
+
* typed array, so a `Uint8Array` in state, args or the fold base used to fail the run or the
|
|
41
|
+
* snapshot here.
|
|
42
|
+
* - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
|
|
43
|
+
* bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
|
|
44
|
+
* taken from a frozen tree throws when `exec` or `replace` advance it.
|
|
45
|
+
* - Functions are not descended (they are not values the engine stores).
|
|
46
|
+
*/
|
|
47
|
+
export declare function deepFreeze<T>(obj: T, arrays?: ArrayWalk): T;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3).
|
|
3
|
+
*
|
|
4
|
+
* WHY HERE. Five places freeze a tree, all through this walk: run args (`readonlyInput ·
|
|
5
|
+
* createFrozenArgs`), the fold base served as `initialState` (`ExecutionRuntime · getFoldBase`), the
|
|
6
|
+
* dev-mode snapshot (`FlowChartExecutor · getSnapshot`), every state `stateAt` hands out
|
|
7
|
+
* (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
|
|
8
|
+
* not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
|
|
9
|
+
* walk lives in this leaf, which imports nothing.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { deepFreeze } from './freeze.js';
|
|
14
|
+
*
|
|
15
|
+
* const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
|
|
16
|
+
* Object.isFrozen(args.order.lines[0]); // true
|
|
17
|
+
* Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Freezes `obj` and every object reachable through its own properties, and returns `obj`.
|
|
22
|
+
*
|
|
23
|
+
* - An object that is ALREADY frozen is left as it is, and not descended — 9.32.0's contract, kept:
|
|
24
|
+
* args may hold a caller's frozen object with live parts inside (a class instance a stage calls),
|
|
25
|
+
* and freezing past it would break them. It is also what ends a cycle. The commit log never meets
|
|
26
|
+
* one: its payloads are fresh `structuredClone`s.
|
|
27
|
+
* - ArrayBuffer views (typed arrays, `DataView`) are skipped: `Object.freeze` throws on a non-empty
|
|
28
|
+
* typed array, so a `Uint8Array` in state, args or the fold base used to fail the run or the
|
|
29
|
+
* snapshot here.
|
|
30
|
+
* - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
|
|
31
|
+
* bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
|
|
32
|
+
* taken from a frozen tree throws when `exec` or `replace` advance it.
|
|
33
|
+
* - Functions are not descended (they are not values the engine stores).
|
|
34
|
+
*/
|
|
35
|
+
export function deepFreeze(obj, arrays = 'every-key') {
|
|
36
|
+
freezeValue(obj, arrays === 'indices');
|
|
37
|
+
return obj;
|
|
38
|
+
}
|
|
39
|
+
function freezeValue(value, indices) {
|
|
40
|
+
if (value === null || typeof value !== 'object' || ArrayBuffer.isView(value) || Object.isFrozen(value))
|
|
41
|
+
return;
|
|
42
|
+
Object.freeze(value);
|
|
43
|
+
// The two loops are written out rather than shared through a callback: this runs once per object of
|
|
44
|
+
// every commit, and a closure per object is measurable.
|
|
45
|
+
if (indices && Array.isArray(value)) {
|
|
46
|
+
for (let i = 0; i < value.length; i++) {
|
|
47
|
+
const child = value[i];
|
|
48
|
+
if (child !== null && typeof child === 'object')
|
|
49
|
+
freezeValue(child, indices);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const names = Object.getOwnPropertyNames(value);
|
|
54
|
+
for (let i = 0; i < names.length; i++) {
|
|
55
|
+
const child = value[names[i]];
|
|
56
|
+
if (child !== null && typeof child === 'object')
|
|
57
|
+
freezeValue(child, indices);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2ZyZWV6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBZUg7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFJLEdBQU0sRUFBRSxTQUFvQixXQUFXO0lBQ25FLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWMsRUFBRSxPQUFnQjtJQUNuRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQy9HLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsb0dBQW9HO0lBQ3BHLHdEQUF3RDtJQUN4RCxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBSSxLQUFpQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZnJlZXplLnRzIOKAlCB0aGUgT05FIGRlZXAtZnJlZXplIHdhbGsgKG1vdmVkIGhlcmUgZnJvbSBgc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LnRzYCBpbiBGMykuXG4gKlxuICogV0hZIEhFUkUuIEZpdmUgcGxhY2VzIGZyZWV6ZSBhIHRyZWUsIGFsbCB0aHJvdWdoIHRoaXMgd2FsazogcnVuIGFyZ3MgKGByZWFkb25seUlucHV0IMK3XG4gKiBjcmVhdGVGcm96ZW5BcmdzYCksIHRoZSBmb2xkIGJhc2Ugc2VydmVkIGFzIGBpbml0aWFsU3RhdGVgIChgRXhlY3V0aW9uUnVudGltZSDCtyBnZXRGb2xkQmFzZWApLCB0aGVcbiAqIGRldi1tb2RlIHNuYXBzaG90IChgRmxvd0NoYXJ0RXhlY3V0b3IgwrcgZ2V0U25hcHNob3RgKSwgZXZlcnkgc3RhdGUgYHN0YXRlQXRgIGhhbmRzIG91dFxuICogKGB0aW1lLXRyYXZlbC9zdGF0ZUF0LnRzYCkgYW5kLCBzaW5jZSBGMywgZXZlcnkgY29tbWl0IGJ1bmRsZSAoYEV2ZW50TG9nIMK3IHJlY29yZGApLiBgbWVtb3J5L2AgbXVzdFxuICogbm90IGltcG9ydCBgc2NvcGUvYCAodGhhdCBlZGdlIGNsb3NlZCB0aGUgbWVtb3J5IOKHhCBzY29wZSDih4QgcmVjb3JkZXIgbW9kdWxlIGN5Y2xlIEYwIHJlbW92ZWQpLCBzbyB0aGVcbiAqIHdhbGsgbGl2ZXMgaW4gdGhpcyBsZWFmLCB3aGljaCBpbXBvcnRzIG5vdGhpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuL2ZyZWV6ZS5qcyc7XG4gKlxuICogY29uc3QgYXJncyA9IGRlZXBGcmVlemUoeyBvcmRlcjogeyBsaW5lczogW3sgc2t1OiAnQScgfV0gfSwgYnl0ZXM6IG5ldyBVaW50OEFycmF5KFsxXSkgfSk7XG4gKiBPYmplY3QuaXNGcm96ZW4oYXJncy5vcmRlci5saW5lc1swXSk7IC8vIHRydWVcbiAqIE9iamVjdC5pc0Zyb3plbihhcmdzLmJ5dGVzKTsgLy8gZmFsc2Ug4oCUIGEgdHlwZWQgYXJyYXkgY2Fubm90IGJlIGZyb3plbjsgaXQgaXMgc2tpcHBlZFxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBIb3cge0BsaW5rIGRlZXBGcmVlemV9IHdhbGtzIGFuIEFSUkFZLlxuICpcbiAqIC0gYCdldmVyeS1rZXknYCAodGhlIGRlZmF1bHQpIOKAlCBldmVyeSBvd24gcHJvcGVydHksIGFzIGZvciBhbnkgb3RoZXIgb2JqZWN0OiB0aGUgaW5kZXggZWxlbWVudHNcbiAqICAgQU5EIGFueSBleHBhbmRvIChgYXJyLm5vdGUgPSB7IOKApiB9YCkuIFRoZSBjb250cmFjdCBhcmdzIHByb3RlY3Rpb24gYW5kIHRoZSBkZXYtbW9kZSBzbmFwc2hvdFxuICogICByZWx5IG9uLlxuICogLSBgJ2luZGljZXMnYCDigJQgdGhlIGluZGV4IGVsZW1lbnRzIG9ubHksIHNvIG5vIGtleSBzdHJpbmcgaXMgYWxsb2NhdGVkIHBlciBlbGVtZW50OyB0aGlzIGlzIHdoYXRcbiAqICAga2VlcHMgZnJlZXppbmcgYSAxMCwwMDAtZWxlbWVudCBjb21taXQgaW5zaWRlIGl0cyBidWRnZXQgKGBiZW5jaC9lbGVtZW50LXdyaXRlcy50c2ApLiBBbiBvYmplY3RcbiAqICAgaHVuZyBvbiBhbiBhcnJheSBFWFBBTkRPIGlzIHRoZW4gbGVmdCB1bmZyb3plbiDigJQgdGhlIGNvbW1pdCBsb2cncyBuYW1lZCBob2xlXG4gKiAgIChgRXZlbnRMb2cgwrcgcmVjb3JkYCkuXG4gKi9cbmV4cG9ydCB0eXBlIEFycmF5V2FsayA9ICdldmVyeS1rZXknIHwgJ2luZGljZXMnO1xuXG4vKipcbiAqIEZyZWV6ZXMgYG9iamAgYW5kIGV2ZXJ5IG9iamVjdCByZWFjaGFibGUgdGhyb3VnaCBpdHMgb3duIHByb3BlcnRpZXMsIGFuZCByZXR1cm5zIGBvYmpgLlxuICpcbiAqIC0gQW4gb2JqZWN0IHRoYXQgaXMgQUxSRUFEWSBmcm96ZW4gaXMgbGVmdCBhcyBpdCBpcywgYW5kIG5vdCBkZXNjZW5kZWQg4oCUIDkuMzIuMCdzIGNvbnRyYWN0LCBrZXB0OlxuICogICBhcmdzIG1heSBob2xkIGEgY2FsbGVyJ3MgZnJvemVuIG9iamVjdCB3aXRoIGxpdmUgcGFydHMgaW5zaWRlIChhIGNsYXNzIGluc3RhbmNlIGEgc3RhZ2UgY2FsbHMpLFxuICogICBhbmQgZnJlZXppbmcgcGFzdCBpdCB3b3VsZCBicmVhayB0aGVtLiBJdCBpcyBhbHNvIHdoYXQgZW5kcyBhIGN5Y2xlLiBUaGUgY29tbWl0IGxvZyBuZXZlciBtZWV0c1xuICogICBvbmU6IGl0cyBwYXlsb2FkcyBhcmUgZnJlc2ggYHN0cnVjdHVyZWRDbG9uZWBzLlxuICogLSBBcnJheUJ1ZmZlciB2aWV3cyAodHlwZWQgYXJyYXlzLCBgRGF0YVZpZXdgKSBhcmUgc2tpcHBlZDogYE9iamVjdC5mcmVlemVgIHRocm93cyBvbiBhIG5vbi1lbXB0eVxuICogICB0eXBlZCBhcnJheSwgc28gYSBgVWludDhBcnJheWAgaW4gc3RhdGUsIGFyZ3Mgb3IgdGhlIGZvbGQgYmFzZSB1c2VkIHRvIGZhaWwgdGhlIHJ1biBvciB0aGVcbiAqICAgc25hcHNob3QgaGVyZS5cbiAqIC0gV2hhdCBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHJlYWNoIHN0YXlzIG11dGFibGUg4oCUIE1hcCBhbmQgU2V0IGNvbnRlbnRzLCBhIERhdGUncyB0aW1lLCB0aGVcbiAqICAgYnl0ZXMgYmVoaW5kIGEgYnVmZmVyLiBBIGZyb3plbiBSZWdFeHAncyBgbGFzdEluZGV4YCBpcyByZWFkLW9ubHksIHNvIGEgYC9nYCBvciBgL3lgIHJlZ2V4XG4gKiAgIHRha2VuIGZyb20gYSBmcm96ZW4gdHJlZSB0aHJvd3Mgd2hlbiBgZXhlY2Agb3IgYHJlcGxhY2VgIGFkdmFuY2UgaXQuXG4gKiAtIEZ1bmN0aW9ucyBhcmUgbm90IGRlc2NlbmRlZCAodGhleSBhcmUgbm90IHZhbHVlcyB0aGUgZW5naW5lIHN0b3JlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRnJlZXplPFQ+KG9iajogVCwgYXJyYXlzOiBBcnJheVdhbGsgPSAnZXZlcnkta2V5Jyk6IFQge1xuICBmcmVlemVWYWx1ZShvYmosIGFycmF5cyA9PT0gJ2luZGljZXMnKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gZnJlZXplVmFsdWUodmFsdWU6IHVua25vd24sIGluZGljZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm47XG4gIE9iamVjdC5mcmVlemUodmFsdWUpO1xuICAvLyBUaGUgdHdvIGxvb3BzIGFyZSB3cml0dGVuIG91dCByYXRoZXIgdGhhbiBzaGFyZWQgdGhyb3VnaCBhIGNhbGxiYWNrOiB0aGlzIHJ1bnMgb25jZSBwZXIgb2JqZWN0IG9mXG4gIC8vIGV2ZXJ5IGNvbW1pdCwgYW5kIGEgY2xvc3VyZSBwZXIgb2JqZWN0IGlzIG1lYXN1cmFibGUuXG4gIGlmIChpbmRpY2VzICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQ6IHVua25vd24gPSB2YWx1ZVtpXTtcbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnKSBmcmVlemVWYWx1ZShjaGlsZCwgaW5kaWNlcyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtuYW1lc1tpXV07XG4gICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcpIGZyZWV6ZVZhbHVlKGNoaWxkLCBpbmRpY2VzKTtcbiAgfVxufVxuIl19
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* module — see the mapping notes in `policies.ts`.
|
|
17
17
|
*/
|
|
18
18
|
export { hasCircularReference } from './circular.js';
|
|
19
|
+
export { type ArrayWalk, deepFreeze } from './freeze.js';
|
|
19
20
|
export { invokeRecorderHook } from './invokeHook.js';
|
|
20
21
|
export type { RetentionPolicy } from './policies.js';
|
|
21
22
|
export type { ReadSummaryMarker, SummaryValueType, WriteSummaryMarker } from './summarize.js';
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* module — see the mapping notes in `policies.ts`.
|
|
18
18
|
*/
|
|
19
19
|
export { hasCircularReference } from './circular.js';
|
|
20
|
+
export { deepFreeze } from './freeze.js';
|
|
20
21
|
export { invokeRecorderHook } from './invokeHook.js';
|
|
21
22
|
export { READ_PREVIEW_LENGTH, summarizeReadValue, summarizeValue, summarizeWriteValue, SUMMARY_PREVIEW_LENGTH, } from './summarize.js';
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEJBQTBCO0FBQzFCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBa0IsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3JELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsc0JBQXNCLEdBQ3ZCLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuLyoqXG4gKiBjYXB0dXJlLyDigJQgU2hhcmVkIHZhbHVlLWNhcHR1cmUgLyByZXRlbnRpb24gcHJpbWl0aXZlcyAoemVybyBkZXBzLCBsZWFmXG4gKiBtb2R1bGUg4oCUIGBtZW1vcnkvYCBpbXBvcnRzIGl0LCBuZXZlciB0aGUgcmV2ZXJzZSkuXG4gKlxuICogT25lIGhvbWUgZm9yIFwid2hhdCBkbyB3ZSBrZWVwIGFib3V0IGEgdHJhY2tlZCBvcGVyYXRpb24ncyB2YWx1ZT9cIjpcbiAqICAgLSBgUmV0ZW50aW9uUG9saWN5YCDigJQgdGhlIGAnZnVsbCcgfCAnc3VtbWFyeScgfCAnb2ZmJ2AgZmFtaWx5IGJlaGluZCB0aGVcbiAqICAgICAjMTQgYHJlYWRUcmFja2luZ2AgYW5kICMxM2MtQSBgd3JpdGVUcmFja2luZ2AgZGlhbHMuXG4gKiAgIC0gYHN1bW1hcml6ZVJlYWRWYWx1ZWAgLyBgc3VtbWFyaXplV3JpdGVWYWx1ZWAg4oCUIHRoZSBwYXJhbWV0ZXJpemVkXG4gKiAgICAgc3VtbWFyeS1tYXJrZXIgYnVpbGRlcnMgc2hhcmluZyBvbmUgY2xhc3NpZmljYXRpb24gcGF0aC5cbiAqICAgLSBgc3VtbWFyaXplVmFsdWVgIOKAlCB0aGUgaHVtYW4tcmVhZGFibGUgbmFycmF0aXZlIG9uZS1saW5lci5cbiAqICAgLSBgaGFzQ2lyY3VsYXJSZWZlcmVuY2VgIOKAlCB0aGUgZGV2LW1vZGUgY3ljbGUgcHJvYmUgKGEgbGVhZikuXG4gKiAgIC0gYGludm9rZVJlY29yZGVySG9va2Ag4oCUIHRoZSBvbmUgXCJsb29rIHVwIHRoZSBob29rLCBiaW5kIGB0aGlzYCwgY2FsbCBpdFwiXG4gKiAgICAgcHJpbWl0aXZlIGJvdGggcmVjb3JkZXIgZGVsaXZlcnkgdGllcnMgc2hhcmUgKGEgbGVhZikuXG4gKlxuICogUkZDLTAwMSAoZGVmZXJyZWQgb2JzZXJ2ZXIgZGVsaXZlcnkpIGJ1aWxkcyBpdHMgY2FwdHVyZSB0aWVyIG9uIHRoaXNcbiAqIG1vZHVsZSDigJQgc2VlIHRoZSBtYXBwaW5nIG5vdGVzIGluIGBwb2xpY2llcy50c2AuXG4gKi9cblxuZXhwb3J0IHsgaGFzQ2lyY3VsYXJSZWZlcmVuY2UgfSBmcm9tICcuL2NpcmN1bGFyLmpzJztcbmV4cG9ydCB7IHR5cGUgQXJyYXlXYWxrLCBkZWVwRnJlZXplIH0gZnJvbSAnLi9mcmVlemUuanMnO1xuZXhwb3J0IHsgaW52b2tlUmVjb3JkZXJIb29rIH0gZnJvbSAnLi9pbnZva2VIb29rLmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi9wb2xpY2llcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBTdW1tYXJ5VmFsdWVUeXBlLCBXcml0ZVN1bW1hcnlNYXJrZXIgfSBmcm9tICcuL3N1bW1hcml6ZS5qcyc7XG5leHBvcnQge1xuICBSRUFEX1BSRVZJRVdfTEVOR1RILFxuICBzdW1tYXJpemVSZWFkVmFsdWUsXG4gIHN1bW1hcml6ZVZhbHVlLFxuICBzdW1tYXJpemVXcml0ZVZhbHVlLFxuICBTVU1NQVJZX1BSRVZJRVdfTEVOR1RILFxufSBmcm9tICcuL3N1bW1hcml6ZS5qcyc7XG4iXX0=
|
|
@@ -1,32 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* detach/drivers/immediate.ts —
|
|
2
|
+
* detach/drivers/immediate.ts — Start detached work at once: no batch, no timer.
|
|
3
3
|
*
|
|
4
|
-
* Pattern:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* for:
|
|
4
|
+
* Pattern: The thinnest driver. `schedule()` registers the handle, marks it
|
|
5
|
+
* `running` SYNCHRONOUSLY and starts `runChild` on the next
|
|
6
|
+
* microtask (`Promise.resolve().then(...)`) — one microtask per
|
|
7
|
+
* call, nothing shared with other calls. It keeps the API surface
|
|
8
|
+
* uniform so consumers can swap drivers without changing call sites.
|
|
9
|
+
* Role: Test fixture + opt-in for consumers who want the handle API
|
|
10
|
+
* without a queue to flush. Useful for:
|
|
11
11
|
*
|
|
12
|
-
* - unit tests where
|
|
13
|
-
* beats
|
|
14
|
-
* - very small detach payloads where
|
|
15
|
-
*
|
|
16
|
-
* - debugging — easier to step through with breakpoints
|
|
12
|
+
* - unit tests where a handle that reads `running` the moment
|
|
13
|
+
* `schedule()` returns beats waiting for a batch flush
|
|
14
|
+
* - very small detach payloads where batching buys nothing
|
|
15
|
+
* - debugging — fewer moving parts to step through
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
* -
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
17
|
+
* What is synchronous, and what is not (test/lib/detach/immediate.test.ts, P1, pins the `running` status):
|
|
18
|
+
* - SYNC: the registry entry exists and `_markRunning()` has run before
|
|
19
|
+
* `schedule()` returns, so the handle reads `running`.
|
|
20
|
+
* - LATER: `runChild` is called on the next microtask EVEN when it is a
|
|
21
|
+
* sync function, and the handle becomes terminal only after the
|
|
22
|
+
* returned promise settles. The `wait()` Promise is the same one
|
|
23
|
+
* consumers use for any other driver; behaviour is uniform.
|
|
23
24
|
*
|
|
24
|
-
* Caveat — this
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* Caveat — this does NOT run the work inside the parent's slice:
|
|
26
|
+
* The child starts once the parent's current synchronous code has
|
|
27
|
+
* finished, but it is neither batched nor deferred beyond that one
|
|
28
|
+
* microtask, so it can interleave with the parent's next `await`. For
|
|
29
|
+
* work that should leave the hot path as a single batch, pick
|
|
30
|
+
* `microtaskBatchDriver`.
|
|
30
31
|
*/
|
|
31
32
|
import { type ChildRunner } from '../runChild.js';
|
|
32
33
|
import type { DetachDriver } from '../types.js';
|
|
@@ -1,32 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* detach/drivers/immediate.ts —
|
|
2
|
+
* detach/drivers/immediate.ts — Start detached work at once: no batch, no timer.
|
|
3
3
|
*
|
|
4
|
-
* Pattern:
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* for:
|
|
4
|
+
* Pattern: The thinnest driver. `schedule()` registers the handle, marks it
|
|
5
|
+
* `running` SYNCHRONOUSLY and starts `runChild` on the next
|
|
6
|
+
* microtask (`Promise.resolve().then(...)`) — one microtask per
|
|
7
|
+
* call, nothing shared with other calls. It keeps the API surface
|
|
8
|
+
* uniform so consumers can swap drivers without changing call sites.
|
|
9
|
+
* Role: Test fixture + opt-in for consumers who want the handle API
|
|
10
|
+
* without a queue to flush. Useful for:
|
|
11
11
|
*
|
|
12
|
-
* - unit tests where
|
|
13
|
-
* beats
|
|
14
|
-
* - very small detach payloads where
|
|
15
|
-
*
|
|
16
|
-
* - debugging — easier to step through with breakpoints
|
|
12
|
+
* - unit tests where a handle that reads `running` the moment
|
|
13
|
+
* `schedule()` returns beats waiting for a batch flush
|
|
14
|
+
* - very small detach payloads where batching buys nothing
|
|
15
|
+
* - debugging — fewer moving parts to step through
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
* -
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
17
|
+
* What is synchronous, and what is not (test/lib/detach/immediate.test.ts, P1, pins the `running` status):
|
|
18
|
+
* - SYNC: the registry entry exists and `_markRunning()` has run before
|
|
19
|
+
* `schedule()` returns, so the handle reads `running`.
|
|
20
|
+
* - LATER: `runChild` is called on the next microtask EVEN when it is a
|
|
21
|
+
* sync function, and the handle becomes terminal only after the
|
|
22
|
+
* returned promise settles. The `wait()` Promise is the same one
|
|
23
|
+
* consumers use for any other driver; behaviour is uniform.
|
|
23
24
|
*
|
|
24
|
-
* Caveat — this
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* Caveat — this does NOT run the work inside the parent's slice:
|
|
26
|
+
* The child starts once the parent's current synchronous code has
|
|
27
|
+
* finished, but it is neither batched nor deferred beyond that one
|
|
28
|
+
* microtask, so it can interleave with the parent's next `await`. For
|
|
29
|
+
* work that should leave the hot path as a single batch, pick
|
|
30
|
+
* `microtaskBatchDriver`.
|
|
30
31
|
*/
|
|
31
32
|
import { asImpl, createHandle } from '../handle.js';
|
|
32
33
|
import { register, unregister } from '../registry.js';
|
|
@@ -63,4 +64,4 @@ export function createImmediateDriver(runChild = defaultRunChild) {
|
|
|
63
64
|
}
|
|
64
65
|
/** Default singleton — most consumers use this. */
|
|
65
66
|
export const immediateDriver = createImmediateDriver();
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1tZWRpYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kZXRhY2gvZHJpdmVycy9pbW1lZGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFvQixlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUduRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsV0FBd0IsZUFBZTtJQUMzRSxPQUFPO1FBQ0wsSUFBSSxFQUFFLFdBQVc7UUFDakIsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkUsUUFBUSxDQUFDLEtBQWdCLEVBQUUsS0FBYyxFQUFFLEtBQWE7WUFDdEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLGlFQUFpRTtZQUNqRSxpRUFBaUU7WUFDakUsa0VBQWtFO1lBQ2xFLGlFQUFpRTtZQUNqRSxPQUFPLENBQUMsT0FBTyxFQUFFO2lCQUNkLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNsQyxJQUFJLENBQ0gsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFDRCxDQUFDLEdBQVksRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsQ0FDRixDQUFDO1lBQ0osT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUIscUJBQXFCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGV0YWNoL2RyaXZlcnMvaW1tZWRpYXRlLnRzIOKAlCBTdGFydCBkZXRhY2hlZCB3b3JrIGF0IG9uY2U6IG5vIGJhdGNoLCBubyB0aW1lci5cbiAqXG4gKiBQYXR0ZXJuOiAgVGhlIHRoaW5uZXN0IGRyaXZlci4gYHNjaGVkdWxlKClgIHJlZ2lzdGVycyB0aGUgaGFuZGxlLCBtYXJrcyBpdFxuICogICAgICAgICAgIGBydW5uaW5nYCBTWU5DSFJPTk9VU0xZIGFuZCBzdGFydHMgYHJ1bkNoaWxkYCBvbiB0aGUgbmV4dFxuICogICAgICAgICAgIG1pY3JvdGFzayAoYFByb21pc2UucmVzb2x2ZSgpLnRoZW4oLi4uKWApIOKAlCBvbmUgbWljcm90YXNrIHBlclxuICogICAgICAgICAgIGNhbGwsIG5vdGhpbmcgc2hhcmVkIHdpdGggb3RoZXIgY2FsbHMuIEl0IGtlZXBzIHRoZSBBUEkgc3VyZmFjZVxuICogICAgICAgICAgIHVuaWZvcm0gc28gY29uc3VtZXJzIGNhbiBzd2FwIGRyaXZlcnMgd2l0aG91dCBjaGFuZ2luZyBjYWxsIHNpdGVzLlxuICogUm9sZTogICAgIFRlc3QgZml4dHVyZSArIG9wdC1pbiBmb3IgY29uc3VtZXJzIHdobyB3YW50IHRoZSBoYW5kbGUgQVBJXG4gKiAgICAgICAgICAgd2l0aG91dCBhIHF1ZXVlIHRvIGZsdXNoLiBVc2VmdWwgZm9yOlxuICpcbiAqICAgICAgICAgICAgIC0gdW5pdCB0ZXN0cyB3aGVyZSBhIGhhbmRsZSB0aGF0IHJlYWRzIGBydW5uaW5nYCB0aGUgbW9tZW50XG4gKiAgICAgICAgICAgICAgIGBzY2hlZHVsZSgpYCByZXR1cm5zIGJlYXRzIHdhaXRpbmcgZm9yIGEgYmF0Y2ggZmx1c2hcbiAqICAgICAgICAgICAgIC0gdmVyeSBzbWFsbCBkZXRhY2ggcGF5bG9hZHMgd2hlcmUgYmF0Y2hpbmcgYnV5cyBub3RoaW5nXG4gKiAgICAgICAgICAgICAtIGRlYnVnZ2luZyDigJQgZmV3ZXIgbW92aW5nIHBhcnRzIHRvIHN0ZXAgdGhyb3VnaFxuICpcbiAqIFdoYXQgaXMgc3luY2hyb25vdXMsIGFuZCB3aGF0IGlzIG5vdCAodGVzdC9saWIvZGV0YWNoL2ltbWVkaWF0ZS50ZXN0LnRzLCBQMSwgcGlucyB0aGUgYHJ1bm5pbmdgIHN0YXR1cyk6XG4gKiAgIC0gU1lOQzogIHRoZSByZWdpc3RyeSBlbnRyeSBleGlzdHMgYW5kIGBfbWFya1J1bm5pbmcoKWAgaGFzIHJ1biBiZWZvcmVcbiAqICAgICAgICAgICAgYHNjaGVkdWxlKClgIHJldHVybnMsIHNvIHRoZSBoYW5kbGUgcmVhZHMgYHJ1bm5pbmdgLlxuICogICAtIExBVEVSOiBgcnVuQ2hpbGRgIGlzIGNhbGxlZCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sgRVZFTiB3aGVuIGl0IGlzIGFcbiAqICAgICAgICAgICAgc3luYyBmdW5jdGlvbiwgYW5kIHRoZSBoYW5kbGUgYmVjb21lcyB0ZXJtaW5hbCBvbmx5IGFmdGVyIHRoZVxuICogICAgICAgICAgICByZXR1cm5lZCBwcm9taXNlIHNldHRsZXMuIFRoZSBgd2FpdCgpYCBQcm9taXNlIGlzIHRoZSBzYW1lIG9uZVxuICogICAgICAgICAgICBjb25zdW1lcnMgdXNlIGZvciBhbnkgb3RoZXIgZHJpdmVyOyBiZWhhdmlvdXIgaXMgdW5pZm9ybS5cbiAqXG4gKiBDYXZlYXQg4oCUIHRoaXMgZG9lcyBOT1QgcnVuIHRoZSB3b3JrIGluc2lkZSB0aGUgcGFyZW50J3Mgc2xpY2U6XG4gKiAgIFRoZSBjaGlsZCBzdGFydHMgb25jZSB0aGUgcGFyZW50J3MgY3VycmVudCBzeW5jaHJvbm91cyBjb2RlIGhhc1xuICogICBmaW5pc2hlZCwgYnV0IGl0IGlzIG5laXRoZXIgYmF0Y2hlZCBub3IgZGVmZXJyZWQgYmV5b25kIHRoYXQgb25lXG4gKiAgIG1pY3JvdGFzaywgc28gaXQgY2FuIGludGVybGVhdmUgd2l0aCB0aGUgcGFyZW50J3MgbmV4dCBgYXdhaXRgLiBGb3JcbiAqICAgd29yayB0aGF0IHNob3VsZCBsZWF2ZSB0aGUgaG90IHBhdGggYXMgYSBzaW5nbGUgYmF0Y2gsIHBpY2tcbiAqICAgYG1pY3JvdGFza0JhdGNoRHJpdmVyYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uLy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgYXNJbXBsLCBjcmVhdGVIYW5kbGUgfSBmcm9tICcuLi9oYW5kbGUuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciwgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIEJ1aWxkIGFuIGltbWVkaWF0ZSBkcml2ZXIgd2lyZWQgdG8gYSBjdXN0b20gY2hpbGQgcnVubmVyLiBNb3N0XG4gKiBjb25zdW1lcnMgd2FudCB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYGltbWVkaWF0ZURyaXZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbW1lZGlhdGVEcml2ZXIocnVuQ2hpbGQ6IENoaWxkUnVubmVyID0gZGVmYXVsdFJ1bkNoaWxkKTogRGV0YWNoRHJpdmVyIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnaW1tZWRpYXRlJyxcbiAgICBjYXBhYmlsaXRpZXM6IHsgYnJvd3NlclNhZmU6IHRydWUsIG5vZGVTYWZlOiB0cnVlLCBlZGdlU2FmZTogdHJ1ZSB9LFxuICAgIHNjaGVkdWxlKGNoaWxkOiBGbG93Q2hhcnQsIGlucHV0OiB1bmtub3duLCByZWZJZDogc3RyaW5nKTogRGV0YWNoSGFuZGxlIHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGNyZWF0ZUhhbmRsZShyZWZJZCk7XG4gICAgICByZWdpc3RlcihoYW5kbGUpO1xuICAgICAgY29uc3QgaW1wbCA9IGFzSW1wbChoYW5kbGUpO1xuICAgICAgaW1wbC5fbWFya1J1bm5pbmcoKTtcbiAgICAgIC8vIERvbid0IGF3YWl0IGhlcmUg4oCUIGRyaXZlciBzY2hlZHVsZSgpIG11c3QgcmV0dXJuIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIChwYXNzaXZlIHJlY29yZGVyIHJ1bGUpLiBUaGUgUHJvbWlzZSBmcm9tIHJ1bkNoaWxkIGhhbmRsZXMgdGhlXG4gICAgICAvLyByZXN0OyBpZiBpdCdzIGFscmVhZHktcmVzb2x2ZWQgKHN5bmMgcnVubmVyKSwgdGhlIC50aGVuIHJ1bnMgb25cbiAgICAgIC8vIHRoZSBuZXh0IG1pY3JvdGFzayBidXQgdGhlIHNjaGVkdWxlKCkgY2FsbCBzdGlsbCByZXR1cm5zIHN5bmMuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbigoKSA9PiBydW5DaGlsZChjaGlsZCwgaW5wdXQpKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpbXBsLl9tYXJrRG9uZShyZXN1bHQpO1xuICAgICAgICAgICAgdW5yZWdpc3RlcihpbXBsLmlkKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGltcGwuX21hcmtGYWlsZWQoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTtcbiAgICAgICAgICAgIHVucmVnaXN0ZXIoaW1wbC5pZCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIERlZmF1bHQgc2luZ2xldG9uIOKAlCBtb3N0IGNvbnN1bWVycyB1c2UgdGhpcy4gKi9cbmV4cG9ydCBjb25zdCBpbW1lZGlhdGVEcml2ZXI6IERldGFjaERyaXZlciA9IGNyZWF0ZUltbWVkaWF0ZURyaXZlcigpO1xuIl19
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* agentfootprint's `EventDispatcher` flush queue and the React
|
|
6
6
|
* reconciler's microtask scheduling — accumulate during the
|
|
7
7
|
* current sync slice, drain at the next microtask boundary.
|
|
8
|
-
* Role:
|
|
8
|
+
* Role: The in-process driver the docs name (no driver is the default:
|
|
9
|
+
* every detach call passes one). Cheapest scheduling
|
|
9
10
|
* primitive on V8/JSC: one `queueMicrotask` per batch
|
|
10
11
|
* regardless of how many work items, so the perf budget
|
|
11
12
|
* amortizes. Suitable for browser AND node AND edge runtimes
|
|
@@ -50,8 +51,8 @@ import type { DetachDriver } from '../types.js';
|
|
|
50
51
|
*/
|
|
51
52
|
export declare function createMicrotaskBatchDriver(runChild?: ChildRunner): DetachDriver;
|
|
52
53
|
/**
|
|
53
|
-
*
|
|
54
|
-
* `executor.detachAndJoinLater(child, input
|
|
55
|
-
*
|
|
54
|
+
* Ready-made singleton. Most consumers import this and pass it as the first
|
|
55
|
+
* argument: `executor.detachAndJoinLater(microtaskBatchDriver, child, input)`.
|
|
56
|
+
* It is not an implicit default — nothing picks a driver for you.
|
|
56
57
|
*/
|
|
57
58
|
export declare const microtaskBatchDriver: DetachDriver;
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* agentfootprint's `EventDispatcher` flush queue and the React
|
|
6
6
|
* reconciler's microtask scheduling — accumulate during the
|
|
7
7
|
* current sync slice, drain at the next microtask boundary.
|
|
8
|
-
* Role:
|
|
8
|
+
* Role: The in-process driver the docs name (no driver is the default:
|
|
9
|
+
* every detach call passes one). Cheapest scheduling
|
|
9
10
|
* primitive on V8/JSC: one `queueMicrotask` per batch
|
|
10
11
|
* regardless of how many work items, so the perf budget
|
|
11
12
|
* amortizes. Suitable for browser AND node AND edge runtimes
|
|
@@ -105,9 +106,9 @@ async function executeOne(item, runChild) {
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
/**
|
|
108
|
-
*
|
|
109
|
-
* `executor.detachAndJoinLater(child, input
|
|
110
|
-
*
|
|
109
|
+
* Ready-made singleton. Most consumers import this and pass it as the first
|
|
110
|
+
* argument: `executor.detachAndJoinLater(microtaskBatchDriver, child, input)`.
|
|
111
|
+
* It is not an implicit default — nothing picks a driver for you.
|
|
111
112
|
*/
|
|
112
113
|
export const microtaskBatchDriver = createMicrotaskBatchDriver();
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm90YXNrQmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RldGFjaC9kcml2ZXJzL21pY3JvdGFza0JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFvQixlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVNuRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsV0FBd0IsZUFBZTtJQUNoRix1RUFBdUU7SUFDdkUsb0VBQW9FO0lBQ3BFLCtEQUErRDtJQUMvRCxNQUFNLEtBQUssR0FBZSxFQUFFLENBQUM7SUFDN0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFNBQVMsS0FBSztRQUNaLGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsNkRBQTZEO1lBQzdELDBEQUEwRDtZQUMxRCxpRUFBaUU7WUFDakUsZ0VBQWdFO1lBQ2hFLGdFQUFnRTtZQUNoRSxnREFBZ0Q7WUFDaEQsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7UUFDbkUsUUFBUSxDQUFDLEtBQWdCLEVBQUUsS0FBYyxFQUFFLEtBQWE7WUFDdEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQWMsRUFBRSxRQUFxQjtJQUM3RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNwQixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztZQUFTLENBQUM7UUFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQiwwQkFBMEIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZXRhY2gvZHJpdmVycy9taWNyb3Rhc2tCYXRjaC50cyDigJQgQmF0Y2ggZGV0YWNoZWQgd29yayBpbnRvIE9ORSBtaWNyb3Rhc2suXG4gKlxuICogUGF0dGVybjogIFByb2R1Y2VyLWNvbnN1bWVyIHdpdGggYmF0Y2hlZCBmbHVzaC4gU2FtZSBzaGFwZSBhc1xuICogICAgICAgICAgIGFnZW50Zm9vdHByaW50J3MgYEV2ZW50RGlzcGF0Y2hlcmAgZmx1c2ggcXVldWUgYW5kIHRoZSBSZWFjdFxuICogICAgICAgICAgIHJlY29uY2lsZXIncyBtaWNyb3Rhc2sgc2NoZWR1bGluZyDigJQgYWNjdW11bGF0ZSBkdXJpbmcgdGhlXG4gKiAgICAgICAgICAgY3VycmVudCBzeW5jIHNsaWNlLCBkcmFpbiBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgYm91bmRhcnkuXG4gKiBSb2xlOiAgICAgVGhlIGluLXByb2Nlc3MgZHJpdmVyIHRoZSBkb2NzIG5hbWUgKG5vIGRyaXZlciBpcyB0aGUgZGVmYXVsdDpcbiAqICAgICAgICAgICBldmVyeSBkZXRhY2ggY2FsbCBwYXNzZXMgb25lKS4gQ2hlYXBlc3Qgc2NoZWR1bGluZ1xuICogICAgICAgICAgIHByaW1pdGl2ZSBvbiBWOC9KU0M6IG9uZSBgcXVldWVNaWNyb3Rhc2tgIHBlciBiYXRjaFxuICogICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgd29yayBpdGVtcywgc28gdGhlIHBlcmYgYnVkZ2V0XG4gKiAgICAgICAgICAgYW1vcnRpemVzLiBTdWl0YWJsZSBmb3IgYnJvd3NlciBBTkQgbm9kZSBBTkQgZWRnZSBydW50aW1lc1xuICogICAgICAgICAgIChxdWV1ZU1pY3JvdGFzayBpcyB1bml2ZXJzYWwgc2luY2UgMjAxOCkuXG4gKlxuICogTGlmZWN5Y2xlOlxuICpcbiAqICAgc2NoZWR1bGUoY2hpbGQsIGlucHV0LCByZWZJZCkgICAgICAgICAgICDihpAgZHJpdmVyIGVudHJ5XG4gKiAgICAg4pSU4pSAIGNyZWF0ZSBoYW5kbGUgKHF1ZXVlZClcbiAqICAgICDilJTilIAgcmVnaXN0ZXIgaW4gZGV0YWNoUmVnaXN0cnlcbiAqICAgICDilJTilIAgcHVzaCB3b3JrIGl0ZW0gb250byBsb2NhbCBxdWV1ZVxuICogICAgIOKUlOKUgCBpZiBubyBtaWNyb3Rhc2sgc2NoZWR1bGVkIHlldCDihpIgcXVldWVNaWNyb3Rhc2soZmx1c2gpXG4gKiAgICAg4pSU4pSAIHJldHVybiBoYW5kbGUgKHN5bmMg4oCUIHBhc3NpdmUgcmVjb3JkZXIgcnVsZSlcbiAqXG4gKiAgIGZsdXNoKCkgKG1pY3JvdGFzaykgICAgICAgICAgICAgICAgICAgICAgIOKGkCBkZWZlcnJlZFxuICogICAgIOKUlOKUgCBzd2FwIG91dCBxdWV1ZSAoZHJhaW4gcmFjZXMgc2FmZWx5KVxuICogICAgIOKUlOKUgCBmb3IgZWFjaCBpdGVtOiBfbWFya1J1bm5pbmcsIGF3YWl0IHJ1bkNoaWxkLCBfbWFya0RvbmUvX21hcmtGYWlsZWRcbiAqICAgICDilJTilIAgdW5yZWdpc3RlciBoYW5kbGUgZnJvbSBkZXRhY2hSZWdpc3RyeVxuICpcbiAqIFdoeSBtaWNyb3Rhc2sgKGFuZCBub3Qgc2V0SW1tZWRpYXRlIC8gc2V0VGltZW91dCk6XG4gKiAgIC0gTWljcm90YXNrcyBydW4gQkVGT1JFIHJldHVybmluZyB0byB0aGUgZXZlbnQgbG9vcCDigJQgZ3VhcmFudGVlc1xuICogICAgIHRoZSB3b3JrIGZpbmlzaGVzIHdpdGhpbiB0aGUgY3VycmVudCBcInRpY2tcIiBpZiB0aGUgcnVudGltZSBhbGxvd3NcbiAqICAgLSBMb3dlc3QgcG9zc2libGUgZGVmZXJyYWwgY29zdCAofjUwbnMgb24gbW9kZXJuIFY4KVxuICogICAtIFdvcmtzIGluIEVWRVJZIEpTIHJ1bnRpbWUgKGJyb3dzZXIsIG5vZGUsIGRlbm8sIGJ1biwgZWRnZSlcbiAqICAgLSBEb2Vzbid0IHJlcXVpcmUgYW55IHRpbWVyIGluZnJhc3RydWN0dXJlIOKGkiBubyBHQyBwcmVzc3VyZVxuICpcbiAqIFJlLWVudHJhbmN5OlxuICogICAtIElmIGBydW5DaGlsZGAgY2FsbHMgYHNjaGVkdWxlKClgIGZvciBuZXN0ZWQgZGV0YWNoLCB0aGUgbmV3IGl0ZW1cbiAqICAgICBsYW5kcyBvbiB0aGUgU0FNRSBxdWV1ZS4gQmVjYXVzZSBgc2NoZWR1bGVkYCBmbGlwcyBiYWNrIHRvIGZhbHNlXG4gKiAgICAgYXQgdGhlIHN0YXJ0IG9mIGBmbHVzaGAsIHRoZSBuZXcgaXRlbSB0cmlnZ2VycyBhIGZyZXNoIG1pY3JvdGFzay5cbiAqICAgLSBXb3JzdC1jYXNlOiBPKG4pIG1pY3JvdGFza3MgZm9yIG4gbmVzdGVkIGxldmVscy4gQWNjZXB0YWJsZSDigJRcbiAqICAgICByZWFsLXdvcmxkIGRldGFjaCB0cmVlcyBhcmUgc2hhbGxvdy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uLy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgYXNJbXBsLCBjcmVhdGVIYW5kbGUgfSBmcm9tICcuLi9oYW5kbGUuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuLi9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB0eXBlIENoaWxkUnVubmVyLCBkZWZhdWx0UnVuQ2hpbGQgfSBmcm9tICcuLi9ydW5DaGlsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciwgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbnRlcmZhY2UgV29ya0l0ZW0ge1xuICByZWFkb25seSBjaGlsZDogRmxvd0NoYXJ0O1xuICByZWFkb25seSBpbnB1dDogdW5rbm93bjtcbiAgcmVhZG9ubHkgaGFuZGxlOiBEZXRhY2hIYW5kbGU7XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaWNyb3Rhc2stYmF0Y2ggZHJpdmVyIHdpcmVkIHRvIGEgY3VzdG9tIGNoaWxkIHJ1bm5lci4gTW9zdFxuICogY29uc3VtZXJzIHdhbnQgdGhlIGRlZmF1bHQgc2luZ2xldG9uIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgaW5zdGVhZDtcbiAqIHRoaXMgZmFjdG9yeSBleGlzdHMgZm9yIHRlc3RzIGFuZCBmb3IgYWR2YW5jZWQgY29uc3VtZXJzIHdobyB3YW50IHRvXG4gKiBpbmplY3QgdGhlaXIgb3duIHJ1bm5lciAoZS5nLiwgYSBydW5uZXIgdGhhdCB3cmFwcyB0aGUgY2hpbGQgaW4gYVxuICogdHJhY2luZyBjb250ZXh0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1pY3JvdGFza0JhdGNoRHJpdmVyKHJ1bkNoaWxkOiBDaGlsZFJ1bm5lciA9IGRlZmF1bHRSdW5DaGlsZCk6IERldGFjaERyaXZlciB7XG4gIC8vIFBlci1kcml2ZXItaW5zdGFuY2UgcXVldWUgYW5kIGZsdXNoIGd1YXJkLiBDbG9zZWQgb3ZlciBieSBgc2NoZWR1bGVgXG4gIC8vIGFuZCBgZmx1c2hgIHNvIGVhY2ggY2FsbCB0byBgY3JlYXRlTWljcm90YXNrQmF0Y2hEcml2ZXJgIGdldHMgaXRzXG4gIC8vIG93biBpc29sYXRlZCBiYXRjaCAodGVzdCBpc29sYXRpb24sIG11bHRpLXRlbmFudCBzY2VuYXJpb3MpLlxuICBjb25zdCBxdWV1ZTogV29ya0l0ZW1bXSA9IFtdO1xuICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZmx1c2goKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgQkVGT1JFIGRyYWluaW5nIHNvIHJlLWVudHJhbnQgc2NoZWR1bGUoKXMgZHVyaW5nIHJ1bkNoaWxkXG4gICAgLy8gcXVldWUgYSBmcmVzaCBtaWNyb3Rhc2sgaW5zdGVhZCBvZiBqb2luaW5nIHRoZSBpbi1mbGlnaHQgZHJhaW4uXG4gICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXRlbXMgPSBxdWV1ZS5zcGxpY2UoMCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAvLyBFYWNoIGl0ZW0gcnVucyBjb25jdXJyZW50bHkg4oCUIG5vIGF3YWl0cyBoZXJlLCBzbyB0aGUgb3V0ZXJcbiAgICAgIC8vIGZvci1sb29wIGNvbXBsZXRlcyB3aXRoaW4gdGhpcyBtaWNyb3Rhc2suIEVycm9ycyBpbnNpZGVcbiAgICAgIC8vIGBleGVjdXRlT25lYCBhcmUgcm91dGVkIHRvIHRoZSBoYW5kbGUsIG5vdCB0aHJvd24uIFRoZSBwcm9taXNlXG4gICAgICAvLyBpcyBpbnRlbnRpb25hbGx5IG5vdCBhd2FpdGVkOyBpZ25vcmUtcHJvbWlzZS1yZXR1cm5lZCB2aWEgdGhlXG4gICAgICAvLyBleHBsaWNpdCBuby1vcCAudGhlbigpIHBhdHRlcm4gdGhhdCB0aGUgcHJvamVjdCdzIGxpbnQgY29uZmlnXG4gICAgICAvLyBhY2NlcHRzICh2cyBgdm9pZGAsIHdoaWNoIGBuby12b2lkYCByZWplY3RzKS5cbiAgICAgIGV4ZWN1dGVPbmUoaXRlbSwgcnVuQ2hpbGQpLnRoZW4odW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ21pY3JvdGFzay1iYXRjaCcsXG4gICAgY2FwYWJpbGl0aWVzOiB7IGJyb3dzZXJTYWZlOiB0cnVlLCBub2RlU2FmZTogdHJ1ZSwgZWRnZVNhZmU6IHRydWUgfSxcbiAgICBzY2hlZHVsZShjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dDogdW5rbm93biwgcmVmSWQ6IHN0cmluZyk6IERldGFjaEhhbmRsZSB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBjcmVhdGVIYW5kbGUocmVmSWQpO1xuICAgICAgcmVnaXN0ZXIoaGFuZGxlKTtcbiAgICAgIHF1ZXVlLnB1c2goeyBjaGlsZCwgaW5wdXQsIGhhbmRsZSB9KTtcbiAgICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGZsdXNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQZXItaXRlbSBleGVjdXRpb24uIE1hcmtzIHRoZSBoYW5kbGUgcnVubmluZywgYXdhaXRzIHRoZSBydW5uZXIsXG4gKiByb3V0ZXMgb3V0Y29tZSB0byB0aGUgaGFuZGxlLCBjbGVhbnMgdXAgdGhlIHJlZ2lzdHJ5IGVudHJ5LiBOZXZlclxuICogdGhyb3dzIOKAlCBlcnJvcnMgbGFuZCBvbiB0aGUgaGFuZGxlIChwYXNzaXZlIHJlY29yZGVyIHJ1bGUpLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlT25lKGl0ZW06IFdvcmtJdGVtLCBydW5DaGlsZDogQ2hpbGRSdW5uZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaW1wbCA9IGFzSW1wbChpdGVtLmhhbmRsZSk7XG4gIGltcGwuX21hcmtSdW5uaW5nKCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hpbGQoaXRlbS5jaGlsZCwgaXRlbS5pbnB1dCk7XG4gICAgaW1wbC5fbWFya0RvbmUocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaW1wbC5fbWFya0ZhaWxlZChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSkpO1xuICB9IGZpbmFsbHkge1xuICAgIHVucmVnaXN0ZXIoaW1wbC5pZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkeS1tYWRlIHNpbmdsZXRvbi4gTW9zdCBjb25zdW1lcnMgaW1wb3J0IHRoaXMgYW5kIHBhc3MgaXQgYXMgdGhlIGZpcnN0XG4gKiBhcmd1bWVudDogYGV4ZWN1dG9yLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgY2hpbGQsIGlucHV0KWAuXG4gKiBJdCBpcyBub3QgYW4gaW1wbGljaXQgZGVmYXVsdCDigJQgbm90aGluZyBwaWNrcyBhIGRyaXZlciBmb3IgeW91LlxuICovXG5leHBvcnQgY29uc3QgbWljcm90YXNrQmF0Y2hEcml2ZXI6IERldGFjaERyaXZlciA9IGNyZWF0ZU1pY3JvdGFza0JhdGNoRHJpdmVyKCk7XG4iXX0=
|
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
* EventLog — Time-travel snapshot storage for flowchart execution
|
|
3
3
|
*
|
|
4
4
|
* Like git history: stores commit bundles (diffs), not full snapshots.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* THE RECORD IS IMMUTABLE FROM `record` (F3, ruling R3). Every bundle is deep-frozen as it is
|
|
7
|
+
* recorded — the bundle, `overwrite` and `updates` at every depth, the trace and each row, the
|
|
8
|
+
* row's `readKeys`, `redactedPaths`, `tags`, `untrackedSources` — so a holder of a snapshot can no
|
|
9
|
+
* longer rewrite the history every later answer is folded from: an assignment into a bundle throws
|
|
10
|
+
* a `TypeError` in strict code. Safe because nothing outside the log holds a bundle's containers:
|
|
11
|
+
* the log's payload is the commit's own copy (`StageContext · commit` hands it the output of
|
|
12
|
+
* `scrubPatch`), and live state, the redacted mirror and write retention each take their own copy
|
|
13
|
+
* (`verbs.ts · foldRows` detaches, `StageContext · retainedForm` clones) — pinned by
|
|
14
|
+
* test/lib/memory/property/record-reachability.property.test.ts.
|
|
15
|
+
*
|
|
16
|
+
* Named holes — what `Object.freeze` cannot reach stays mutable: Map and Set contents, a Date's
|
|
17
|
+
* time, the bytes of a typed array (skipped: a non-empty one cannot be frozen), and an object hung
|
|
18
|
+
* on an array EXPANDO (arrays are walked by index — `deepFreeze`'s `'indices'` walk, which keeps
|
|
19
|
+
* the freeze inside its budget). A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y`
|
|
20
|
+
* regex read from a bundle throws when `exec` or `replace` advance it.
|
|
6
21
|
*/
|
|
7
22
|
import type { CommitBundle } from './types.js';
|
|
8
23
|
export declare class EventLog {
|
|
@@ -40,11 +55,21 @@ export declare class EventLog {
|
|
|
40
55
|
* below the root, 9.29.0, so the fold and the live state agree at every
|
|
41
56
|
* path). The result is the caller's: it shares nothing with the base or
|
|
42
57
|
* the log.
|
|
58
|
+
*
|
|
59
|
+
* @deprecated Since 9.33.0 — use `stateAt` from `footprintjs/trace`, which folds the same log
|
|
60
|
+
* from the same base (`RuntimeSnapshot.initialState`) and says how it was derived (`basis`).
|
|
61
|
+
* Nothing in the library calls this; it stays for one minor and is then removed. Mind the
|
|
62
|
+
* index: `materialise(n)` folds commits `0..n-1`, `stateAt(source, n - 1)` the same commits.
|
|
43
63
|
*/
|
|
44
64
|
materialise(stepIdx?: number): any;
|
|
45
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* Persists a commit bundle for a finished stage, and FREEZES it (see the module doc): the bundle
|
|
67
|
+
* is stamped with its position, then deep-frozen, then appended. The engine hands it a bundle
|
|
68
|
+
* built for the log alone; a caller of this class (`footprintjs/advanced`) hands over a bundle it
|
|
69
|
+
* will no longer edit — its own object is the one frozen.
|
|
70
|
+
*/
|
|
46
71
|
record(bundle: CommitBundle): void;
|
|
47
|
-
/** Gets all recorded commit bundles. */
|
|
72
|
+
/** Gets all recorded commit bundles — the live array; every bundle in it is frozen. */
|
|
48
73
|
list(): CommitBundle[];
|
|
49
74
|
/** Number of recorded commits. */
|
|
50
75
|
get length(): number;
|
|
@@ -2,8 +2,24 @@
|
|
|
2
2
|
* EventLog — Time-travel snapshot storage for flowchart execution
|
|
3
3
|
*
|
|
4
4
|
* Like git history: stores commit bundles (diffs), not full snapshots.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* THE RECORD IS IMMUTABLE FROM `record` (F3, ruling R3). Every bundle is deep-frozen as it is
|
|
7
|
+
* recorded — the bundle, `overwrite` and `updates` at every depth, the trace and each row, the
|
|
8
|
+
* row's `readKeys`, `redactedPaths`, `tags`, `untrackedSources` — so a holder of a snapshot can no
|
|
9
|
+
* longer rewrite the history every later answer is folded from: an assignment into a bundle throws
|
|
10
|
+
* a `TypeError` in strict code. Safe because nothing outside the log holds a bundle's containers:
|
|
11
|
+
* the log's payload is the commit's own copy (`StageContext · commit` hands it the output of
|
|
12
|
+
* `scrubPatch`), and live state, the redacted mirror and write retention each take their own copy
|
|
13
|
+
* (`verbs.ts · foldRows` detaches, `StageContext · retainedForm` clones) — pinned by
|
|
14
|
+
* test/lib/memory/property/record-reachability.property.test.ts.
|
|
15
|
+
*
|
|
16
|
+
* Named holes — what `Object.freeze` cannot reach stays mutable: Map and Set contents, a Date's
|
|
17
|
+
* time, the bytes of a typed array (skipped: a non-empty one cannot be frozen), and an object hung
|
|
18
|
+
* on an array EXPANDO (arrays are walked by index — `deepFreeze`'s `'indices'` walk, which keeps
|
|
19
|
+
* the freeze inside its budget). A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y`
|
|
20
|
+
* regex read from a bundle throws when `exec` or `replace` advance it.
|
|
6
21
|
*/
|
|
22
|
+
import { deepFreeze } from '../capture/freeze.js';
|
|
7
23
|
import { applySmartMergeInto } from './utils.js';
|
|
8
24
|
export class EventLog {
|
|
9
25
|
/** Base snapshot BEFORE the first stage mutates anything. */
|
|
@@ -48,6 +64,11 @@ export class EventLog {
|
|
|
48
64
|
* below the root, 9.29.0, so the fold and the live state agree at every
|
|
49
65
|
* path). The result is the caller's: it shares nothing with the base or
|
|
50
66
|
* the log.
|
|
67
|
+
*
|
|
68
|
+
* @deprecated Since 9.33.0 — use `stateAt` from `footprintjs/trace`, which folds the same log
|
|
69
|
+
* from the same base (`RuntimeSnapshot.initialState`) and says how it was derived (`basis`).
|
|
70
|
+
* Nothing in the library calls this; it stays for one minor and is then removed. Mind the
|
|
71
|
+
* index: `materialise(n)` folds commits `0..n-1`, `stateAt(source, n - 1)` the same commits.
|
|
51
72
|
*/
|
|
52
73
|
materialise(stepIdx = this.steps.length) {
|
|
53
74
|
const out = structuredClone(this.base);
|
|
@@ -57,12 +78,18 @@ export class EventLog {
|
|
|
57
78
|
}
|
|
58
79
|
return out;
|
|
59
80
|
}
|
|
60
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Persists a commit bundle for a finished stage, and FREEZES it (see the module doc): the bundle
|
|
83
|
+
* is stamped with its position, then deep-frozen, then appended. The engine hands it a bundle
|
|
84
|
+
* built for the log alone; a caller of this class (`footprintjs/advanced`) hands over a bundle it
|
|
85
|
+
* will no longer edit — its own object is the one frozen.
|
|
86
|
+
*/
|
|
61
87
|
record(bundle) {
|
|
62
88
|
bundle.idx = this.steps.length;
|
|
89
|
+
deepFreeze(bundle, 'indices');
|
|
63
90
|
this.steps.push(bundle);
|
|
64
91
|
}
|
|
65
|
-
/** Gets all recorded commit bundles. */
|
|
92
|
+
/** Gets all recorded commit bundles — the live array; every bundle in it is frozen. */
|
|
66
93
|
list() {
|
|
67
94
|
return this.steps;
|
|
68
95
|
}
|
|
@@ -75,4 +102,4 @@ export class EventLog {
|
|
|
75
102
|
this.steps = [];
|
|
76
103
|
}
|
|
77
104
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRMb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9FdmVudExvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELE1BQU0sT0FBTyxRQUFRO0lBQ25CLDZEQUE2RDtJQUNyRCxJQUFJLENBQU07SUFDbEIsc0NBQXNDO0lBQzlCLEtBQUssR0FBbUIsRUFBRSxDQUFDO0lBRW5DLFlBQVksYUFBa0I7UUFDNUIsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILGVBQWU7UUFDYixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9CRztJQUNILFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsbUJBQW1CLENBQUMsR0FBRyxFQUFFLE9BQXNCLEVBQUUsU0FBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsTUFBb0I7UUFDekIsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMvQixVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdmVudExvZyDigJQgVGltZS10cmF2ZWwgc25hcHNob3Qgc3RvcmFnZSBmb3IgZmxvd2NoYXJ0IGV4ZWN1dGlvblxuICpcbiAqIExpa2UgZ2l0IGhpc3Rvcnk6IHN0b3JlcyBjb21taXQgYnVuZGxlcyAoZGlmZnMpLCBub3QgZnVsbCBzbmFwc2hvdHMuXG4gKlxuICogVEhFIFJFQ09SRCBJUyBJTU1VVEFCTEUgRlJPTSBgcmVjb3JkYCAoRjMsIHJ1bGluZyBSMykuIEV2ZXJ5IGJ1bmRsZSBpcyBkZWVwLWZyb3plbiBhcyBpdCBpc1xuICogcmVjb3JkZWQg4oCUIHRoZSBidW5kbGUsIGBvdmVyd3JpdGVgIGFuZCBgdXBkYXRlc2AgYXQgZXZlcnkgZGVwdGgsIHRoZSB0cmFjZSBhbmQgZWFjaCByb3csIHRoZVxuICogcm93J3MgYHJlYWRLZXlzYCwgYHJlZGFjdGVkUGF0aHNgLCBgdGFnc2AsIGB1bnRyYWNrZWRTb3VyY2VzYCDigJQgc28gYSBob2xkZXIgb2YgYSBzbmFwc2hvdCBjYW4gbm9cbiAqIGxvbmdlciByZXdyaXRlIHRoZSBoaXN0b3J5IGV2ZXJ5IGxhdGVyIGFuc3dlciBpcyBmb2xkZWQgZnJvbTogYW4gYXNzaWdubWVudCBpbnRvIGEgYnVuZGxlIHRocm93c1xuICogYSBgVHlwZUVycm9yYCBpbiBzdHJpY3QgY29kZS4gU2FmZSBiZWNhdXNlIG5vdGhpbmcgb3V0c2lkZSB0aGUgbG9nIGhvbGRzIGEgYnVuZGxlJ3MgY29udGFpbmVyczpcbiAqIHRoZSBsb2cncyBwYXlsb2FkIGlzIHRoZSBjb21taXQncyBvd24gY29weSAoYFN0YWdlQ29udGV4dCDCtyBjb21taXRgIGhhbmRzIGl0IHRoZSBvdXRwdXQgb2ZcbiAqIGBzY3J1YlBhdGNoYCksIGFuZCBsaXZlIHN0YXRlLCB0aGUgcmVkYWN0ZWQgbWlycm9yIGFuZCB3cml0ZSByZXRlbnRpb24gZWFjaCB0YWtlIHRoZWlyIG93biBjb3B5XG4gKiAoYHZlcmJzLnRzIMK3IGZvbGRSb3dzYCBkZXRhY2hlcywgYFN0YWdlQ29udGV4dCDCtyByZXRhaW5lZEZvcm1gIGNsb25lcykg4oCUIHBpbm5lZCBieVxuICogdGVzdC9saWIvbWVtb3J5L3Byb3BlcnR5L3JlY29yZC1yZWFjaGFiaWxpdHkucHJvcGVydHkudGVzdC50cy5cbiAqXG4gKiBOYW1lZCBob2xlcyDigJQgd2hhdCBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHJlYWNoIHN0YXlzIG11dGFibGU6IE1hcCBhbmQgU2V0IGNvbnRlbnRzLCBhIERhdGUnc1xuICogdGltZSwgdGhlIGJ5dGVzIG9mIGEgdHlwZWQgYXJyYXkgKHNraXBwZWQ6IGEgbm9uLWVtcHR5IG9uZSBjYW5ub3QgYmUgZnJvemVuKSwgYW5kIGFuIG9iamVjdCBodW5nXG4gKiBvbiBhbiBhcnJheSBFWFBBTkRPIChhcnJheXMgYXJlIHdhbGtlZCBieSBpbmRleCDigJQgYGRlZXBGcmVlemVgJ3MgYCdpbmRpY2VzJ2Agd2Fsaywgd2hpY2gga2VlcHNcbiAqIHRoZSBmcmVlemUgaW5zaWRlIGl0cyBidWRnZXQpLiBBIGZyb3plbiBSZWdFeHAncyBgbGFzdEluZGV4YCBpcyByZWFkLW9ubHksIHNvIGEgYC9nYCBvciBgL3lgXG4gKiByZWdleCByZWFkIGZyb20gYSBidW5kbGUgdGhyb3dzIHdoZW4gYGV4ZWNgIG9yIGByZXBsYWNlYCBhZHZhbmNlIGl0LlxuICovXG5cbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGFwcGx5U21hcnRNZXJnZUludG8gfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIEV2ZW50TG9nIHtcbiAgLyoqIEJhc2Ugc25hcHNob3QgQkVGT1JFIHRoZSBmaXJzdCBzdGFnZSBtdXRhdGVzIGFueXRoaW5nLiAqL1xuICBwcml2YXRlIGJhc2U6IGFueTtcbiAgLyoqIE9yZGVyZWQgbGlzdCBvZiBjb21taXQgYnVuZGxlcy4gKi9cbiAgcHJpdmF0ZSBzdGVwczogQ29tbWl0QnVuZGxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsTWVtb3J5OiBhbnkpIHtcbiAgICAvLyBOb3JtYWxpc2VkIHRvIGFuIG9iamVjdDogdGhlIGJhc2UgaXMgYSBTVEFURSwgYW5kIGV2ZXJ5IGZvbGQgb3ZlciBpdFxuICAgIC8vIChgbWF0ZXJpYWxpc2VgLCBgc3RhdGVBdGApIGFwcGxpZXMgcGF0aCB3cml0ZXMgdG8gaXQuIGB1bmRlZmluZWRgIOKAlFxuICAgIC8vIHdoYXQgYSBydW4gd2l0aCBubyBgaW5pdGlhbENvbnRleHRgIHVzZWQgdG8gc3RvcmUgaGVyZSDigJQgbWFkZSBldmVyeVxuICAgIC8vIG9uZSBvZiB0aG9zZSBmb2xkcyB0aHJvdyBvbiB0aGUgZmlyc3QgYHNldGAuXG4gICAgdGhpcy5iYXNlID0gaW5pdGlhbE1lbW9yeSA9PT0gdW5kZWZpbmVkID8ge30gOiBzdHJ1Y3R1cmVkQ2xvbmUoaW5pdGlhbE1lbW9yeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvbGQgQkFTRSDigJQgdGhlIHN0YXRlIGFzIGl0IHN0b29kIGJlZm9yZSB0aGUgZmlyc3QgY29tbWl0LlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBjb21taXQgbG9nOiBidW5kbGVzIGFyZSBESUZGUywgc28gYSBsb2dcbiAgICogYWxvbmUgY2Fubm90IHJlY29uc3RydWN0IHN0YXRlIHRoYXQgd2FzIHNlZWRlZCBiZWZvcmUgdGhlIHJ1biAoYW5cbiAgICogZXhlY3V0b3IgYGluaXRpYWxDb250ZXh0YCwgYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgYSByZXN1bWUnc1xuICAgKiBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAsIGEgc3ViZmxvdydzIGBpbnB1dE1hcHBlcmAgc2VlZCkuIFRyYXZlbGxpbmdcbiAgICogd2l0aCB0aGUgbG9nIOKAlCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAg4oCUIGlzIHdoYXQgbGV0cyBhbiBPRkZMSU5FXG4gICAqIGNvbnN1bWVyIGZvbGQ7IHdpdGhvdXQgaXQgdGhlIGhvbmVzdCBhbnN3ZXIgaXMgYSBwYXJ0aWFsIG9uZVxuICAgKiAoYHN0YXRlQXRgJ3MgYGJhc2lzOiAnbG9nLW9ubHknYCkuXG4gICAqXG4gICAqIFJldHVybnMgYSBmcmVzaCBkZXRhY2hlZCBjbG9uZSBvbiBldmVyeSBjYWxsIOKAlCB0aGUgY2FsbGVyIG93bnMgaXQuXG4gICAqL1xuICBnZXRJbml0aWFsU3RhdGUoKTogYW55IHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHRoaXMuYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25zdHJ1Y3RzIHRoZSBmdWxsIHN0YXRlIGF0IGFueSBnaXZlbiBzdGVwLlxuICAgKiBSZXBsYXlzIGNvbW1pdHMgZnJvbSB0aGUgYmVnaW5uaW5nIOKAlCBPKG4pIGJ1dCBsb3cgbWVtb3J5IGZvb3RwcmludC5cbiAgICpcbiAgICogSU5ERVggQ09OVkVOVElPTiDigJQgYHN0ZXBJZHhgIGlzIEVYQ0xVU0lWRTogYG1hdGVyaWFsaXNlKDMpYCBmb2xkcyBjb21taXRzXG4gICAqIDAsIDEgYW5kIDIuIGBzdGF0ZUF0KHNvdXJjZSwgY29tbWl0SWR4KWAgKGZvb3RwcmludGpzL3RyYWNlKSBmb2xkcyB0aGVcbiAgICogc2FtZSBsb2cgYnV0IGl0cyBgY29tbWl0SWR4YCBpcyBJTkNMVVNJVkUsIGJlY2F1c2UgYSByZWFkZXIncyBjdXJzb3IgYXNrc1xuICAgKiBcInRoZSBzdGF0ZSBBVCB0aGlzIHN0b3BcIiwgd2hpY2ggbXVzdCBpbmNsdWRlIHRoYXQgc3RvcCdzIG93biBjb21taXQuIFR3b1xuICAgKiBmb2xkcyBvdmVyIG9uZSBsb2cgd2l0aCBvcHBvc2l0ZSBjb252ZW50aW9uczogY2hlY2sgd2hpY2ggb25lIHlvdSBob2xkLlxuICAgKlxuICAgKiBPbmUgY2xvbmUgb2YgdGhlIGJhc2UgcGVyIGNhbGwsIHRoZW4gZXZlcnkgYnVuZGxlIHJlcGxheWVkIElOVE8gdGhhdFxuICAgKiBwcml2YXRlIGNvcHkgKGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCDigJQgdGhlIGxpdmUgY29tbWl0J3MgY29weS1vbi13cml0ZSBsYXdcbiAgICogYmVsb3cgdGhlIHJvb3QsIDkuMjkuMCwgc28gdGhlIGZvbGQgYW5kIHRoZSBsaXZlIHN0YXRlIGFncmVlIGF0IGV2ZXJ5XG4gICAqIHBhdGgpLiBUaGUgcmVzdWx0IGlzIHRoZSBjYWxsZXInczogaXQgc2hhcmVzIG5vdGhpbmcgd2l0aCB0aGUgYmFzZSBvclxuICAgKiB0aGUgbG9nLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSA5LjMzLjAg4oCUIHVzZSBgc3RhdGVBdGAgZnJvbSBgZm9vdHByaW50anMvdHJhY2VgLCB3aGljaCBmb2xkcyB0aGUgc2FtZSBsb2dcbiAgICogZnJvbSB0aGUgc2FtZSBiYXNlIChgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWApIGFuZCBzYXlzIGhvdyBpdCB3YXMgZGVyaXZlZCAoYGJhc2lzYCkuXG4gICAqIE5vdGhpbmcgaW4gdGhlIGxpYnJhcnkgY2FsbHMgdGhpczsgaXQgc3RheXMgZm9yIG9uZSBtaW5vciBhbmQgaXMgdGhlbiByZW1vdmVkLiBNaW5kIHRoZVxuICAgKiBpbmRleDogYG1hdGVyaWFsaXNlKG4pYCBmb2xkcyBjb21taXRzIGAwLi5uLTFgLCBgc3RhdGVBdChzb3VyY2UsIG4gLSAxKWAgdGhlIHNhbWUgY29tbWl0cy5cbiAgICovXG4gIG1hdGVyaWFsaXNlKHN0ZXBJZHggPSB0aGlzLnN0ZXBzLmxlbmd0aCk6IGFueSB7XG4gICAgY29uc3Qgb3V0ID0gc3RydWN0dXJlZENsb25lKHRoaXMuYmFzZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwSWR4OyBpKyspIHtcbiAgICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gdGhpcy5zdGVwc1tpXTtcbiAgICAgIGFwcGx5U21hcnRNZXJnZUludG8ob3V0LCB1cGRhdGVzIGFzIE1lbW9yeVBhdGNoLCBvdmVyd3JpdGUgYXMgTWVtb3J5UGF0Y2gsIHRyYWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0cyBhIGNvbW1pdCBidW5kbGUgZm9yIGEgZmluaXNoZWQgc3RhZ2UsIGFuZCBGUkVFWkVTIGl0IChzZWUgdGhlIG1vZHVsZSBkb2MpOiB0aGUgYnVuZGxlXG4gICAqIGlzIHN0YW1wZWQgd2l0aCBpdHMgcG9zaXRpb24sIHRoZW4gZGVlcC1mcm96ZW4sIHRoZW4gYXBwZW5kZWQuIFRoZSBlbmdpbmUgaGFuZHMgaXQgYSBidW5kbGVcbiAgICogYnVpbHQgZm9yIHRoZSBsb2cgYWxvbmU7IGEgY2FsbGVyIG9mIHRoaXMgY2xhc3MgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApIGhhbmRzIG92ZXIgYSBidW5kbGUgaXRcbiAgICogd2lsbCBubyBsb25nZXIgZWRpdCDigJQgaXRzIG93biBvYmplY3QgaXMgdGhlIG9uZSBmcm96ZW4uXG4gICAqL1xuICByZWNvcmQoYnVuZGxlOiBDb21taXRCdW5kbGUpOiB2b2lkIHtcbiAgICBidW5kbGUuaWR4ID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgZGVlcEZyZWV6ZShidW5kbGUsICdpbmRpY2VzJyk7XG4gICAgdGhpcy5zdGVwcy5wdXNoKGJ1bmRsZSk7XG4gIH1cblxuICAvKiogR2V0cyBhbGwgcmVjb3JkZWQgY29tbWl0IGJ1bmRsZXMg4oCUIHRoZSBsaXZlIGFycmF5OyBldmVyeSBidW5kbGUgaW4gaXQgaXMgZnJvemVuLiAqL1xuICBsaXN0KCk6IENvbW1pdEJ1bmRsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwcztcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgcmVjb3JkZWQgY29tbWl0cy4gKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0ZXBzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBXaXBlcyBoaXN0b3J5ICh1c2VmdWwgZm9yIHRlc3QgcmVzZXRzKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdGVwcyA9IFtdO1xuICB9XG59XG4iXX0=
|