@workflow/web-shared 5.0.0-beta.41 → 5.0.0-beta.43
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/dist/components/event-list-view.d.ts +10 -2
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +52 -26
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
- package/dist/components/sidebar/attributes-block.js +3 -6
- package/dist/components/sidebar/conversation-view.d.ts.map +1 -1
- package/dist/components/sidebar/conversation-view.js +19 -36
- package/dist/components/sidebar/entity-detail-panel.d.ts +5 -0
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +2 -2
- package/dist/components/sidebar/events-list.d.ts +7 -1
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +6 -5
- package/dist/components/sidebar/resolve-hook-modal.d.ts.map +1 -1
- package/dist/components/sidebar/resolve-hook-modal.js +4 -145
- package/dist/components/sidebar/sidebar-data-context.d.ts +6 -0
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
- package/dist/components/sidebar/sidebar-data-context.js +1 -1
- package/dist/components/stream-viewer-skeleton.js +6 -6
- package/dist/components/stream-viewer.js +2 -2
- package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/detail-panel.js +2 -1
- package/dist/components/trace-viewer/components/middle-truncate/measurement-batch.d.ts +9 -0
- package/dist/components/trace-viewer/components/middle-truncate/measurement-batch.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/measurement-batch.js +29 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +16 -8
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +83 -19
- package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/timeline.js +13 -22
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +58 -18
- package/dist/components/trace-viewer/icons.js +5 -5
- package/dist/components/trace-viewer/utils.d.ts +6 -10
- package/dist/components/trace-viewer/utils.d.ts.map +1 -1
- package/dist/components/trace-viewer/utils.js +14 -24
- package/dist/components/trace-viewer.d.ts.map +1 -1
- package/dist/components/trace-viewer.js +12 -4
- package/dist/components/ui/context-card.d.ts.map +1 -1
- package/dist/components/ui/context-card.js +9 -21
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +8 -35
- package/dist/components/ui/duplicate-event-tooltip.d.ts +15 -0
- package/dist/components/ui/duplicate-event-tooltip.d.ts.map +1 -0
- package/dist/components/ui/duplicate-event-tooltip.js +19 -0
- package/dist/components/ui/menu-dropdown.d.ts.map +1 -1
- package/dist/components/ui/menu-dropdown.js +3 -19
- package/dist/components/ui/skeleton.js +2 -2
- package/dist/components/ui/spinner.d.ts.map +1 -1
- package/dist/components/ui/spinner.js +5 -11
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/lib/duplicate-events.d.ts +27 -0
- package/dist/lib/duplicate-events.d.ts.map +1 -0
- package/dist/lib/duplicate-events.js +166 -0
- package/dist/lib/event-materialization.d.ts +15 -2
- package/dist/lib/event-materialization.d.ts.map +1 -1
- package/dist/lib/event-materialization.js +19 -4
- package/dist/lib/trace-builder.d.ts +16 -1
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +23 -4
- package/package.json +4 -4
- package/src/components/event-list-view.tsx +70 -32
- package/src/components/sidebar/attributes-block.tsx +4 -11
- package/src/components/sidebar/conversation-view.tsx +25 -79
- package/src/components/sidebar/entity-detail-panel.tsx +6 -0
- package/src/components/sidebar/events-list.tsx +21 -3
- package/src/components/sidebar/resolve-hook-modal.tsx +23 -186
- package/src/components/sidebar/sidebar-data-context.tsx +6 -0
- package/src/components/stream-viewer-skeleton.tsx +5 -5
- package/src/components/stream-viewer.tsx +1 -1
- package/src/components/trace-viewer/components/detail-panel.tsx +1 -0
- package/src/components/trace-viewer/components/middle-truncate/measurement-batch.ts +47 -0
- package/src/components/trace-viewer/components/middle-truncate/middle-truncate.tsx +15 -7
- package/src/components/trace-viewer/components/middle-truncate/use-middle-truncate.ts +132 -38
- package/src/components/trace-viewer/components/timeline.tsx +21 -39
- package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +63 -35
- package/src/components/trace-viewer/icons.tsx +4 -4
- package/src/components/trace-viewer/utils.test.ts +5 -7
- package/src/components/trace-viewer/utils.ts +17 -31
- package/src/components/trace-viewer.tsx +15 -3
- package/src/components/ui/context-card.tsx +16 -26
- package/src/components/ui/data-inspector.tsx +20 -65
- package/src/components/ui/duplicate-event-tooltip.tsx +44 -0
- package/src/components/ui/menu-dropdown.tsx +8 -22
- package/src/components/ui/skeleton.tsx +2 -2
- package/src/components/ui/spinner.tsx +4 -8
- package/src/index.ts +4 -0
- package/src/lib/duplicate-events.test.ts +339 -0
- package/src/lib/duplicate-events.ts +188 -0
- package/src/lib/event-materialization.test.ts +117 -0
- package/src/lib/event-materialization.ts +23 -3
- package/src/lib/trace-builder.test.ts +74 -0
- package/src/lib/trace-builder.ts +30 -3
|
@@ -34,24 +34,18 @@ export function Spinner({ size = 14, color, }) {
|
|
|
34
34
|
lineW: size * 0.24,
|
|
35
35
|
lineH: size * 0.08,
|
|
36
36
|
};
|
|
37
|
-
return (_jsxs("span", { style: {
|
|
38
|
-
display: 'inline-flex',
|
|
39
|
-
position: 'relative',
|
|
37
|
+
return (_jsxs("span", { className: "relative inline-flex", style: {
|
|
40
38
|
width: size,
|
|
41
39
|
height: size,
|
|
42
|
-
}, children: [_jsx("style", { dangerouslySetInnerHTML: { __html: KEYFRAMES } }), config.delays.map((delay, i) => (_jsx("span", { style: {
|
|
43
|
-
position: 'absolute',
|
|
44
|
-
left: '50%',
|
|
45
|
-
top: '50%',
|
|
40
|
+
}, children: [_jsx("style", { dangerouslySetInnerHTML: { __html: KEYFRAMES } }), config.delays.map((delay, i) => (_jsx("span", { className: "absolute top-1/2 left-1/2 rounded-[1px] bg-gray-700 [animation-iteration-count:infinite] [animation-name:wf-spinner-fade] [animation-timing-function:linear]", style: {
|
|
46
41
|
width: config.lineW,
|
|
47
42
|
height: config.lineH,
|
|
48
43
|
marginLeft: -config.lineW / 2,
|
|
49
44
|
marginTop: -config.lineH / 2,
|
|
50
|
-
|
|
51
|
-
backgroundColor: color ?? 'var(--ds-gray-700)',
|
|
45
|
+
backgroundColor: color,
|
|
52
46
|
transform: `rotate(${i * config.angle}deg) translate(${size * 0.36}px)`,
|
|
53
|
-
|
|
47
|
+
animationDuration: `${config.duration}ms`,
|
|
54
48
|
animationDelay: `${delay}ms`,
|
|
55
49
|
} }, delay)))] }));
|
|
56
50
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3VpL3NwaW5uZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFNLFNBQVMsR0FBRyw0REFBNEQsQ0FBQztBQUUvRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEVBQ3RCLElBQUksR0FBRyxFQUFFLEVBQ1QsS0FBSyxHQUlOO0lBQ0MsTUFBTSxNQUFNLEdBQ1YsSUFBSSxJQUFJLEVBQUU7UUFDUixDQUFDLENBQUM7WUFDRSxLQUFLLEVBQUUsQ0FBQztZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLENBQUM7WUFDUixLQUFLLEVBQUUsR0FBRztTQUNYO1FBQ0gsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ1YsQ0FBQyxDQUFDO2dCQUNFLEtBQUssRUFBRSxFQUFFO2dCQUNULEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakUsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLEdBQUc7YUFDWDtZQUNILENBQUMsQ0FBQztnQkFDRSxLQUFLLEVBQUUsRUFBRTtnQkFDVCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxNQUFNLEVBQUU7b0JBQ04sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHO29CQUM1RCxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNSO2dCQUNELFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSTtnQkFDbEIsS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO2FBQ25CLENBQUM7SUFFVixPQUFPLENBQ0wsZ0JBQ0UsU0FBUyxFQUFDLHNCQUFzQixFQUNoQyxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU0sRUFBRSxJQUFJO1NBQ2IsYUFFRCxnQkFBTyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBSSxFQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQy9CLGVBRUUsU0FBUyxFQUFDLDhKQUE4SixFQUN4SyxLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ3BCLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQztvQkFDN0IsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDO29CQUM1QixlQUFlLEVBQUUsS0FBSztvQkFDdEIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLGtCQUFrQixJQUFJLEdBQUcsSUFBSSxLQUFLO29CQUN2RSxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUk7b0JBQ3pDLGNBQWMsRUFBRSxHQUFHLEtBQUssSUFBSTtpQkFDN0IsSUFYSSxLQUFLLENBWVYsQ0FDSCxDQUFDLElBQ0csQ0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEtFWUZSQU1FUyA9IGBAa2V5ZnJhbWVzIHdmLXNwaW5uZXItZmFkZXswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5Oi4xNX19YDtcblxuLyoqXG4gKiBTcGlubmVyIG1hdGNoaW5nIEdlaXN0J3MgbXVsdGktbGluZSBmYWRlIHNwaW5uZXIuXG4gKiBBdCBzaXplIOKJpDEyOiA4IGxpbmVzLCDiiaQxNjogMTAgbGluZXMsIGVsc2U6IDEyIGxpbmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU3Bpbm5lcih7XG4gIHNpemUgPSAxNCxcbiAgY29sb3IsXG59OiB7XG4gIHNpemU/OiBudW1iZXI7XG4gIGNvbG9yPzogc3RyaW5nO1xufSkge1xuICBjb25zdCBjb25maWcgPVxuICAgIHNpemUgPD0gMTJcbiAgICAgID8ge1xuICAgICAgICAgIGNvdW50OiA4LFxuICAgICAgICAgIGFuZ2xlOiA0NSxcbiAgICAgICAgICBkZWxheXM6IFstODc1LCAtNzUwLCAtNjI1LCAtNTAwLCAtMzc1LCAtMjUwLCAtMTI1LCAwXSxcbiAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgICBsaW5lVzogMyxcbiAgICAgICAgICBsaW5lSDogMS41LFxuICAgICAgICB9XG4gICAgICA6IHNpemUgPD0gMTZcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjb3VudDogMTAsXG4gICAgICAgICAgICBhbmdsZTogMzYsXG4gICAgICAgICAgICBkZWxheXM6IFstOTAwLCAtODAwLCAtNzAwLCAtNjAwLCAtNTAwLCAtNDAwLCAtMzAwLCAtMjAwLCAtMTAwLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgbGluZVc6IDQsXG4gICAgICAgICAgICBsaW5lSDogMS41LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb3VudDogMTIsXG4gICAgICAgICAgICBhbmdsZTogMzAsXG4gICAgICAgICAgICBkZWxheXM6IFtcbiAgICAgICAgICAgICAgLTExMDAsIC0xMDAwLCAtOTAwLCAtODAwLCAtNzAwLCAtNjAwLCAtNTAwLCAtNDAwLCAtMzAwLCAtMjAwLFxuICAgICAgICAgICAgICAtMTAwLCAwLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMjAwLFxuICAgICAgICAgICAgbGluZVc6IHNpemUgKiAwLjI0LFxuICAgICAgICAgICAgbGluZUg6IHNpemUgKiAwLjA4LFxuICAgICAgICAgIH07XG5cbiAgcmV0dXJuIChcbiAgICA8c3BhblxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaW5saW5lLWZsZXhcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPHN0eWxlIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogS0VZRlJBTUVTIH19IC8+XG4gICAgICB7Y29uZmlnLmRlbGF5cy5tYXAoKGRlbGF5LCBpKSA9PiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAga2V5PXtkZWxheX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGxlZnQtMS8yIHJvdW5kZWQtWzFweF0gYmctZ3JheS03MDAgW2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGVdIFthbmltYXRpb24tbmFtZTp3Zi1zcGlubmVyLWZhZGVdIFthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmxpbmVhcl1cIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogY29uZmlnLmxpbmVXLFxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcubGluZUgsXG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiAtY29uZmlnLmxpbmVXIC8gMixcbiAgICAgICAgICAgIG1hcmdpblRvcDogLWNvbmZpZy5saW5lSCAvIDIsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgcm90YXRlKCR7aSAqIGNvbmZpZy5hbmdsZX1kZWcpIHRyYW5zbGF0ZSgke3NpemUgKiAwLjM2fXB4KWAsXG4gICAgICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogYCR7Y29uZmlnLmR1cmF0aW9ufW1zYCxcbiAgICAgICAgICAgIGFuaW1hdGlvbkRlbGF5OiBgJHtkZWxheX1tc2AsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICkpfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { parseStepName, parseWorkflowName, } from '@workflow/utils/parse-name';
|
|
|
3
3
|
export type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
|
|
4
4
|
export * from './components';
|
|
5
5
|
export { hookEventsToHookEntity, stepEventsToStepEntity, waitEventsToWaitEntity, } from './components/workflow-traces/trace-span-construction';
|
|
6
|
+
export { DUPLICATE_EVENT_MESSAGE, findDuplicateEventIds, } from './lib/duplicate-events';
|
|
6
7
|
export type { EventAnalysis } from './lib/event-analysis';
|
|
7
8
|
export { analyzeEvents, hasPendingHooksFromEvents, hasPendingStepsFromEvents, isTerminalStatus, shouldShowReenqueueButton, } from './lib/event-analysis';
|
|
8
9
|
export type { MaterializedEntities, MaterializedHook, MaterializedStep, MaterializedWait, } from './lib/event-materialization';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export { parseStepName, parseWorkflowName, } from '@workflow/utils/parse-name';
|
|
2
2
|
export * from './components';
|
|
3
3
|
export { hookEventsToHookEntity, stepEventsToStepEntity, waitEventsToWaitEntity, } from './components/workflow-traces/trace-span-construction';
|
|
4
|
+
export { DUPLICATE_EVENT_MESSAGE, findDuplicateEventIds, } from './lib/duplicate-events';
|
|
4
5
|
export { analyzeEvents, hasPendingHooksFromEvents, hasPendingStepsFromEvents, isTerminalStatus, shouldShowReenqueueButton, } from './lib/event-analysis';
|
|
5
6
|
export { materializeAll, materializeHooks, materializeSteps, materializeWaits, } from './lib/event-materialization';
|
|
6
7
|
export { looksLikeWorkflowIdSearchInput, parseExactWorkflowSearchId, } from './lib/exact-event-search-id';
|
|
7
8
|
export { CLASS_INSTANCE_REF_TYPE, ClassInstanceRef, ENCRYPTED_PLACEHOLDER, extractStreamIds, getWebRevivers, hasEncryptedFields, hydrateResourceIO, hydrateResourceIOAsync, hydrateResourceIOWithKey, isClassInstanceRef, isEncryptedMarker, isStreamId, isStreamRef, STREAM_REF_TYPE, truncateId, } from './lib/hydration';
|
|
8
9
|
export { ToastProvider, useToast } from './lib/toast';
|
|
9
10
|
export { extractConversation, formatDuration, formatDurationPrecise, identifyStreamSteps, isDoStreamStep, } from './lib/utils';
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxzREFBc0QsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIseUJBQXlCLEdBQzFCLE1BQU0sc0JBQXNCLENBQUM7QUFPOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFJTCw4QkFBOEIsRUFDOUIsMEJBQTBCLEdBQzNCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YsVUFBVSxHQUNYLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdEQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixjQUFjLEdBQ2YsTUFBTSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEhlYWx0aENoZWNrUmVzdWx0IH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG5leHBvcnQge1xuICBwYXJzZVN0ZXBOYW1lLFxuICBwYXJzZVdvcmtmbG93TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuZXhwb3J0IHR5cGUgeyBFdmVudCwgSG9vaywgU3RlcCwgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzJztcbmV4cG9ydCB7XG4gIGhvb2tFdmVudHNUb0hvb2tFbnRpdHksXG4gIHN0ZXBFdmVudHNUb1N0ZXBFbnRpdHksXG4gIHdhaXRFdmVudHNUb1dhaXRFbnRpdHksXG59IGZyb20gJy4vY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24nO1xuZXhwb3J0IHtcbiAgRFVQTElDQVRFX0VWRU5UX01FU1NBR0UsXG4gIGZpbmREdXBsaWNhdGVFdmVudElkcyxcbn0gZnJvbSAnLi9saWIvZHVwbGljYXRlLWV2ZW50cyc7XG5leHBvcnQgdHlwZSB7IEV2ZW50QW5hbHlzaXMgfSBmcm9tICcuL2xpYi9ldmVudC1hbmFseXNpcyc7XG5leHBvcnQge1xuICBhbmFseXplRXZlbnRzLFxuICBoYXNQZW5kaW5nSG9va3NGcm9tRXZlbnRzLFxuICBoYXNQZW5kaW5nU3RlcHNGcm9tRXZlbnRzLFxuICBpc1Rlcm1pbmFsU3RhdHVzLFxuICBzaG91bGRTaG93UmVlbnF1ZXVlQnV0dG9uLFxufSBmcm9tICcuL2xpYi9ldmVudC1hbmFseXNpcyc7XG5leHBvcnQgdHlwZSB7XG4gIE1hdGVyaWFsaXplZEVudGl0aWVzLFxuICBNYXRlcmlhbGl6ZWRIb29rLFxuICBNYXRlcmlhbGl6ZWRTdGVwLFxuICBNYXRlcmlhbGl6ZWRXYWl0LFxufSBmcm9tICcuL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24nO1xuZXhwb3J0IHtcbiAgbWF0ZXJpYWxpemVBbGwsXG4gIG1hdGVyaWFsaXplSG9va3MsXG4gIG1hdGVyaWFsaXplU3RlcHMsXG4gIG1hdGVyaWFsaXplV2FpdHMsXG59IGZyb20gJy4vbGliL2V2ZW50LW1hdGVyaWFsaXphdGlvbic7XG5leHBvcnQge1xuICB0eXBlIEV4YWN0SWRTZWFyY2hSZXN1bHQsXG4gIHR5cGUgRXhhY3RXb3JrZmxvd1NlYXJjaElkLFxuICB0eXBlIEV4YWN0V29ya2Zsb3dTZWFyY2hJZEtpbmQsXG4gIGxvb2tzTGlrZVdvcmtmbG93SWRTZWFyY2hJbnB1dCxcbiAgcGFyc2VFeGFjdFdvcmtmbG93U2VhcmNoSWQsXG59IGZyb20gJy4vbGliL2V4YWN0LWV2ZW50LXNlYXJjaC1pZCc7XG5leHBvcnQgdHlwZSB7IFJldml2ZXJzLCBTdHJlYW1SZWYgfSBmcm9tICcuL2xpYi9oeWRyYXRpb24nO1xuZXhwb3J0IHtcbiAgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUsXG4gIENsYXNzSW5zdGFuY2VSZWYsXG4gIEVOQ1JZUFRFRF9QTEFDRUhPTERFUixcbiAgZXh0cmFjdFN0cmVhbUlkcyxcbiAgZ2V0V2ViUmV2aXZlcnMsXG4gIGhhc0VuY3J5cHRlZEZpZWxkcyxcbiAgaHlkcmF0ZVJlc291cmNlSU8sXG4gIGh5ZHJhdGVSZXNvdXJjZUlPQXN5bmMsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPV2l0aEtleSxcbiAgaXNDbGFzc0luc3RhbmNlUmVmLFxuICBpc0VuY3J5cHRlZE1hcmtlcixcbiAgaXNTdHJlYW1JZCxcbiAgaXNTdHJlYW1SZWYsXG4gIFNUUkVBTV9SRUZfVFlQRSxcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnLi9saWIvaHlkcmF0aW9uJztcbmV4cG9ydCB0eXBlIHsgRGVjb2RlZFN0cmVhbUNodW5rU291cmNlIH0gZnJvbSAnLi9saWIvc3RyZWFtLWRpc3BsYXknO1xuZXhwb3J0IHR5cGUgeyBUb2FzdEFkYXB0ZXIgfSBmcm9tICcuL2xpYi90b2FzdCc7XG5leHBvcnQgeyBUb2FzdFByb3ZpZGVyLCB1c2VUb2FzdCB9IGZyb20gJy4vbGliL3RvYXN0JztcbmV4cG9ydCB0eXBlIHsgU3RyZWFtU3RlcCB9IGZyb20gJy4vbGliL3V0aWxzJztcbmV4cG9ydCB7XG4gIGV4dHJhY3RDb252ZXJzYXRpb24sXG4gIGZvcm1hdER1cmF0aW9uLFxuICBmb3JtYXREdXJhdGlvblByZWNpc2UsXG4gIGlkZW50aWZ5U3RyZWFtU3RlcHMsXG4gIGlzRG9TdHJlYW1TdGVwLFxufSBmcm9tICcuL2xpYi91dGlscyc7XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Event } from '@workflow/world';
|
|
2
|
+
/**
|
|
3
|
+
* Shown against an event this module reports. Deliberately says what the log
|
|
4
|
+
* shows rather than what the runtime did with it: tolerating these repeats is
|
|
5
|
+
* recent, and on a run recorded before it a repeat no consumer claimed failed
|
|
6
|
+
* the replay instead of being passed over.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DUPLICATE_EVENT_MESSAGE = "Written by a concurrent replay after an event of the same kind was already recorded and acted on. The run follows the earlier one.";
|
|
9
|
+
/**
|
|
10
|
+
* The IDs of the events in `events` that repeat a class the log already
|
|
11
|
+
* records for the same entity, after that entity finished.
|
|
12
|
+
*
|
|
13
|
+
* `isCompleteHistory` must be false whenever the caller holds a subset of the
|
|
14
|
+
* run's log: one page of a paginated list, or the result of a search. Which
|
|
15
|
+
* occurrence of a class came first is a property of the whole log, so on a
|
|
16
|
+
* subset the earlier event may simply be missing, and the fold would report
|
|
17
|
+
* the surviving one. Nothing is classified in that case.
|
|
18
|
+
*
|
|
19
|
+
* Two other things make the answer unknowable and yield the same empty result:
|
|
20
|
+
* a log whose order cannot be recovered from the events (see
|
|
21
|
+
* {@link hasKnowableLogOrder}), and everything past the point the run
|
|
22
|
+
* diverged, since the run exited there and read no further.
|
|
23
|
+
*/
|
|
24
|
+
export declare function findDuplicateEventIds(events: readonly Event[], { isCompleteHistory }: {
|
|
25
|
+
isCompleteHistory: boolean;
|
|
26
|
+
}): Set<string>;
|
|
27
|
+
//# sourceMappingURL=duplicate-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-events.d.ts","sourceRoot":"","sources":["../../src/lib/duplicate-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EAGX,MAAM,iBAAiB,CAAC;AA2CzB;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,uIACkG,CAAC;AAsGvI;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,EAAE,iBAAiB,EAAE,EAAE;IAAE,iBAAiB,EAAE,OAAO,CAAA;CAAE,GACpD,GAAG,CAAC,MAAM,CAAC,CAYb"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { entityEventClass, isSlotEventId, } from '@workflow/world';
|
|
2
|
+
/**
|
|
3
|
+
* Identifies events a replay reads past.
|
|
4
|
+
*
|
|
5
|
+
* Concurrent replays of one run write to a shared log, so a replay working
|
|
6
|
+
* from a stale prefix can commit a second `step_created` / `step_started` /
|
|
7
|
+
* `wait_created` for an entity the log already records one of. Every replay
|
|
8
|
+
* reads the first event of that class at the same position, so a later one
|
|
9
|
+
* cannot change what the workflow observes.
|
|
10
|
+
*
|
|
11
|
+
* The classification mirrors `entityEventClass` in `@workflow/world`, which is
|
|
12
|
+
* what the runtime keys its own duplicate detection on. What it cannot mirror
|
|
13
|
+
* is consumer state: the runtime passes over an event only after every
|
|
14
|
+
* registered callback has declined it, and a callback registered for a
|
|
15
|
+
* still-open entity legitimately claims a repeat (each retry of a step writes
|
|
16
|
+
* another `step_started`, and a live step consumer absorbs a second
|
|
17
|
+
* `step_created`). So a repeat counts here only once a terminal event for the
|
|
18
|
+
* same entity sits earlier in the log, which is the point past which no
|
|
19
|
+
* consumer remains.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Classes whose event closes its entity: no consumer is left for it after.
|
|
23
|
+
*
|
|
24
|
+
* The run's own terminal events are absent because `entityEventClass` gives
|
|
25
|
+
* them no class. The runtime exits rather than replaying the body once the log
|
|
26
|
+
* holds one, so nothing ever consumes them and nothing can repeat them.
|
|
27
|
+
*/
|
|
28
|
+
const TERMINAL_EVENT_CLASSES = new Set([
|
|
29
|
+
'step_terminal',
|
|
30
|
+
'wait_completed',
|
|
31
|
+
'hook_disposed',
|
|
32
|
+
]);
|
|
33
|
+
/** Classes with no entity to close first: the log records one per run. */
|
|
34
|
+
const SINGLETON_EVENT_CLASSES = new Set([
|
|
35
|
+
'run_started',
|
|
36
|
+
]);
|
|
37
|
+
/** Entity key for events that carry no correlation ID (the run itself). */
|
|
38
|
+
const RUN_ENTITY_KEY = '';
|
|
39
|
+
/**
|
|
40
|
+
* Shown against an event this module reports. Deliberately says what the log
|
|
41
|
+
* shows rather than what the runtime did with it: tolerating these repeats is
|
|
42
|
+
* recent, and on a run recorded before it a repeat no consumer claimed failed
|
|
43
|
+
* the replay instead of being passed over.
|
|
44
|
+
*/
|
|
45
|
+
export const DUPLICATE_EVENT_MESSAGE = 'Written by a concurrent replay after an event of the same kind was already recorded and acted on. The run follows the earlier one.';
|
|
46
|
+
/**
|
|
47
|
+
* Candidate log order, by event ID.
|
|
48
|
+
*
|
|
49
|
+
* Event IDs are fixed-width and monotonic within a run under both the ULID and
|
|
50
|
+
* the slot scheme. Length is compared first so a shorter ID never sorts after
|
|
51
|
+
* a longer one on a log that mixes widths.
|
|
52
|
+
*
|
|
53
|
+
* Whether this *is* the log order depends on the ID scheme, which is why
|
|
54
|
+
* {@link hasKnowableLogOrder} gates the fold. See its doc.
|
|
55
|
+
*/
|
|
56
|
+
function compareEventId(a, b) {
|
|
57
|
+
if (a.eventId.length !== b.eventId.length) {
|
|
58
|
+
return a.eventId.length - b.eventId.length;
|
|
59
|
+
}
|
|
60
|
+
return a.eventId < b.eventId ? -1 : a.eventId > b.eventId ? 1 : 0;
|
|
61
|
+
}
|
|
62
|
+
function createdAtMs(event) {
|
|
63
|
+
const createdAt = event.createdAt;
|
|
64
|
+
return createdAt instanceof Date
|
|
65
|
+
? createdAt.getTime()
|
|
66
|
+
: new Date(createdAt).getTime();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Whether the order the run consumed its log in can be recovered from the
|
|
70
|
+
* events alone.
|
|
71
|
+
*
|
|
72
|
+
* Which occurrence of a class came first is the whole question here, so the
|
|
73
|
+
* fold needs the log's order, not an order. The backends do not agree on how
|
|
74
|
+
* to recover it for every ID scheme:
|
|
75
|
+
*
|
|
76
|
+
* - A **slot-numbered** run carries its position in the ID. The slot is drawn
|
|
77
|
+
* at the publish, which is the linearization point, so slot order is log
|
|
78
|
+
* order everywhere and the ID alone settles it.
|
|
79
|
+
* - A **ULID-numbered** run does not. One backend returns such a log in
|
|
80
|
+
* `(createdAt, eventId)` order while another returns it keyed on the ID, and
|
|
81
|
+
* `createdAt` is stamped when the write request arrives rather than when it
|
|
82
|
+
* commits. Concurrent writers can therefore produce opposite timestamp and
|
|
83
|
+
* ID orders, and the run consumed whichever its own backend served.
|
|
84
|
+
*
|
|
85
|
+
* So a ULID log is only knowable where the two orders agree. Where they
|
|
86
|
+
* contradict, the fold could name the surviving event and pass over the one
|
|
87
|
+
* the run acted on, which is worse than saying nothing.
|
|
88
|
+
*/
|
|
89
|
+
function hasKnowableLogOrder(orderedById) {
|
|
90
|
+
if (orderedById.every((event) => isSlotEventId(event.eventId)))
|
|
91
|
+
return true;
|
|
92
|
+
for (let index = 1; index < orderedById.length; index++) {
|
|
93
|
+
const previous = createdAtMs(orderedById[index - 1]);
|
|
94
|
+
const current = createdAtMs(orderedById[index]);
|
|
95
|
+
// A missing or unparseable timestamp leaves nothing to corroborate the ID
|
|
96
|
+
// order with, which is the same position as a contradiction.
|
|
97
|
+
if (Number.isNaN(previous) || Number.isNaN(current))
|
|
98
|
+
return false;
|
|
99
|
+
if (current < previous)
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/** The fold itself, over a log whose order is known. */
|
|
105
|
+
function foldDuplicates(ordered) {
|
|
106
|
+
const duplicates = new Set();
|
|
107
|
+
const seenClasses = new Set();
|
|
108
|
+
const closedEntities = new Set();
|
|
109
|
+
for (const event of ordered) {
|
|
110
|
+
const eventClass = entityEventClass(event.eventType);
|
|
111
|
+
if (eventClass === undefined)
|
|
112
|
+
continue;
|
|
113
|
+
const entity = event.correlationId ?? RUN_ENTITY_KEY;
|
|
114
|
+
const classKey = `${eventClass}:${entity}`;
|
|
115
|
+
const repeatsClass = seenClasses.has(classKey);
|
|
116
|
+
const entityWasClosed = closedEntities.has(entity);
|
|
117
|
+
if (TERMINAL_EVENT_CLASSES.has(eventClass)) {
|
|
118
|
+
closedEntities.add(entity);
|
|
119
|
+
}
|
|
120
|
+
if (!repeatsClass) {
|
|
121
|
+
// First of its class, but the entity already finished: no consumer is
|
|
122
|
+
// left to take it and it repeats nothing, so the runtime reports
|
|
123
|
+
// divergence here and exits. Everything past this point went unread, so
|
|
124
|
+
// the fold stops with it rather than recording the class and presenting
|
|
125
|
+
// a later event of it as a repeat the run passed over.
|
|
126
|
+
if (entityWasClosed)
|
|
127
|
+
break;
|
|
128
|
+
seenClasses.add(classKey);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// The entity is still open, so a consumer is registered for it and takes
|
|
132
|
+
// this event: another attempt, not a repeat read past.
|
|
133
|
+
if (entityWasClosed || SINGLETON_EVENT_CLASSES.has(eventClass)) {
|
|
134
|
+
duplicates.add(event.eventId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return duplicates;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The IDs of the events in `events` that repeat a class the log already
|
|
141
|
+
* records for the same entity, after that entity finished.
|
|
142
|
+
*
|
|
143
|
+
* `isCompleteHistory` must be false whenever the caller holds a subset of the
|
|
144
|
+
* run's log: one page of a paginated list, or the result of a search. Which
|
|
145
|
+
* occurrence of a class came first is a property of the whole log, so on a
|
|
146
|
+
* subset the earlier event may simply be missing, and the fold would report
|
|
147
|
+
* the surviving one. Nothing is classified in that case.
|
|
148
|
+
*
|
|
149
|
+
* Two other things make the answer unknowable and yield the same empty result:
|
|
150
|
+
* a log whose order cannot be recovered from the events (see
|
|
151
|
+
* {@link hasKnowableLogOrder}), and everything past the point the run
|
|
152
|
+
* diverged, since the run exited there and read no further.
|
|
153
|
+
*/
|
|
154
|
+
export function findDuplicateEventIds(events, { isCompleteHistory }) {
|
|
155
|
+
if (!isCompleteHistory || events.length < 2)
|
|
156
|
+
return new Set();
|
|
157
|
+
// Dropped before the sort, not during the fold: an event with no ID has no
|
|
158
|
+
// log position to order on, and the caller could not match it either.
|
|
159
|
+
const ordered = events
|
|
160
|
+
.filter((event) => Boolean(event.eventId))
|
|
161
|
+
.sort(compareEventId);
|
|
162
|
+
if (!hasKnowableLogOrder(ordered))
|
|
163
|
+
return new Set();
|
|
164
|
+
return foldDuplicates(ordered);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZHVwbGljYXRlLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLHNCQUFzQixHQUFrQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGVBQWU7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsMEVBQTBFO0FBQzFFLE1BQU0sdUJBQXVCLEdBQWtDLElBQUksR0FBRyxDQUFDO0lBQ3JFLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFFSCwyRUFBMkU7QUFDM0UsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRTFCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQ2xDLG9JQUFvSSxDQUFDO0FBRXZJOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsY0FBYyxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQ3hDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQVk7SUFDL0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNsQyxPQUFPLFNBQVMsWUFBWSxJQUFJO1FBQzlCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1FBQ3JCLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUE4QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsbUJBQW1CLENBQUMsV0FBNkI7SUFDeEQsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFNUUsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRCwwRUFBMEU7UUFDMUUsNkRBQTZEO1FBQzdELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xFLElBQUksT0FBTyxHQUFHLFFBQVE7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsd0RBQXdEO0FBQ3hELFNBQVMsY0FBYyxDQUFDLE9BQXlCO0lBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDckMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRXpDLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksVUFBVSxLQUFLLFNBQVM7WUFBRSxTQUFTO1FBRXZDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksY0FBYyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLEdBQUcsVUFBVSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRCxJQUFJLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixzRUFBc0U7WUFDdEUsaUVBQWlFO1lBQ2pFLHdFQUF3RTtZQUN4RSx3RUFBd0U7WUFDeEUsdURBQXVEO1lBQ3ZELElBQUksZUFBZTtnQkFBRSxNQUFNO1lBQzNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUIsU0FBUztRQUNYLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsdURBQXVEO1FBQ3ZELElBQUksZUFBZSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQy9ELFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUF3QixFQUN4QixFQUFFLGlCQUFpQixFQUFrQztJQUVyRCxJQUFJLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTlELDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTTtTQUNuQixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEQsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnRDbGFzcyxcbiAgdHlwZSBFdmVudCxcbiAgZW50aXR5RXZlbnRDbGFzcyxcbiAgaXNTbG90RXZlbnRJZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBJZGVudGlmaWVzIGV2ZW50cyBhIHJlcGxheSByZWFkcyBwYXN0LlxuICpcbiAqIENvbmN1cnJlbnQgcmVwbGF5cyBvZiBvbmUgcnVuIHdyaXRlIHRvIGEgc2hhcmVkIGxvZywgc28gYSByZXBsYXkgd29ya2luZ1xuICogZnJvbSBhIHN0YWxlIHByZWZpeCBjYW4gY29tbWl0IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIC8gYHN0ZXBfc3RhcnRlZGAgL1xuICogYHdhaXRfY3JlYXRlZGAgZm9yIGFuIGVudGl0eSB0aGUgbG9nIGFscmVhZHkgcmVjb3JkcyBvbmUgb2YuIEV2ZXJ5IHJlcGxheVxuICogcmVhZHMgdGhlIGZpcnN0IGV2ZW50IG9mIHRoYXQgY2xhc3MgYXQgdGhlIHNhbWUgcG9zaXRpb24sIHNvIGEgbGF0ZXIgb25lXG4gKiBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVzLlxuICpcbiAqIFRoZSBjbGFzc2lmaWNhdGlvbiBtaXJyb3JzIGBlbnRpdHlFdmVudENsYXNzYCBpbiBgQHdvcmtmbG93L3dvcmxkYCwgd2hpY2ggaXNcbiAqIHdoYXQgdGhlIHJ1bnRpbWUga2V5cyBpdHMgb3duIGR1cGxpY2F0ZSBkZXRlY3Rpb24gb24uIFdoYXQgaXQgY2Fubm90IG1pcnJvclxuICogaXMgY29uc3VtZXIgc3RhdGU6IHRoZSBydW50aW1lIHBhc3NlcyBvdmVyIGFuIGV2ZW50IG9ubHkgYWZ0ZXIgZXZlcnlcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIGl0LCBhbmQgYSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciBhXG4gKiBzdGlsbC1vcGVuIGVudGl0eSBsZWdpdGltYXRlbHkgY2xhaW1zIGEgcmVwZWF0IChlYWNoIHJldHJ5IG9mIGEgc3RlcCB3cml0ZXNcbiAqIGFub3RoZXIgYHN0ZXBfc3RhcnRlZGAsIGFuZCBhIGxpdmUgc3RlcCBjb25zdW1lciBhYnNvcmJzIGEgc2Vjb25kXG4gKiBgc3RlcF9jcmVhdGVkYCkuIFNvIGEgcmVwZWF0IGNvdW50cyBoZXJlIG9ubHkgb25jZSBhIHRlcm1pbmFsIGV2ZW50IGZvciB0aGVcbiAqIHNhbWUgZW50aXR5IHNpdHMgZWFybGllciBpbiB0aGUgbG9nLCB3aGljaCBpcyB0aGUgcG9pbnQgcGFzdCB3aGljaCBub1xuICogY29uc3VtZXIgcmVtYWlucy5cbiAqL1xuXG4vKipcbiAqIENsYXNzZXMgd2hvc2UgZXZlbnQgY2xvc2VzIGl0cyBlbnRpdHk6IG5vIGNvbnN1bWVyIGlzIGxlZnQgZm9yIGl0IGFmdGVyLlxuICpcbiAqIFRoZSBydW4ncyBvd24gdGVybWluYWwgZXZlbnRzIGFyZSBhYnNlbnQgYmVjYXVzZSBgZW50aXR5RXZlbnRDbGFzc2AgZ2l2ZXNcbiAqIHRoZW0gbm8gY2xhc3MuIFRoZSBydW50aW1lIGV4aXRzIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgYm9keSBvbmNlIHRoZSBsb2dcbiAqIGhvbGRzIG9uZSwgc28gbm90aGluZyBldmVyIGNvbnN1bWVzIHRoZW0gYW5kIG5vdGhpbmcgY2FuIHJlcGVhdCB0aGVtLlxuICovXG5jb25zdCBURVJNSU5BTF9FVkVOVF9DTEFTU0VTOiBSZWFkb25seVNldDxFbnRpdHlFdmVudENsYXNzPiA9IG5ldyBTZXQoW1xuICAnc3RlcF90ZXJtaW5hbCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdob29rX2Rpc3Bvc2VkJyxcbl0pO1xuXG4vKiogQ2xhc3NlcyB3aXRoIG5vIGVudGl0eSB0byBjbG9zZSBmaXJzdDogdGhlIGxvZyByZWNvcmRzIG9uZSBwZXIgcnVuLiAqL1xuY29uc3QgU0lOR0xFVE9OX0VWRU5UX0NMQVNTRVM6IFJlYWRvbmx5U2V0PEVudGl0eUV2ZW50Q2xhc3M+ID0gbmV3IFNldChbXG4gICdydW5fc3RhcnRlZCcsXG5dKTtcblxuLyoqIEVudGl0eSBrZXkgZm9yIGV2ZW50cyB0aGF0IGNhcnJ5IG5vIGNvcnJlbGF0aW9uIElEICh0aGUgcnVuIGl0c2VsZikuICovXG5jb25zdCBSVU5fRU5USVRZX0tFWSA9ICcnO1xuXG4vKipcbiAqIFNob3duIGFnYWluc3QgYW4gZXZlbnQgdGhpcyBtb2R1bGUgcmVwb3J0cy4gRGVsaWJlcmF0ZWx5IHNheXMgd2hhdCB0aGUgbG9nXG4gKiBzaG93cyByYXRoZXIgdGhhbiB3aGF0IHRoZSBydW50aW1lIGRpZCB3aXRoIGl0OiB0b2xlcmF0aW5nIHRoZXNlIHJlcGVhdHMgaXNcbiAqIHJlY2VudCwgYW5kIG9uIGEgcnVuIHJlY29yZGVkIGJlZm9yZSBpdCBhIHJlcGVhdCBubyBjb25zdW1lciBjbGFpbWVkIGZhaWxlZFxuICogdGhlIHJlcGxheSBpbnN0ZWFkIG9mIGJlaW5nIHBhc3NlZCBvdmVyLlxuICovXG5leHBvcnQgY29uc3QgRFVQTElDQVRFX0VWRU5UX01FU1NBR0UgPVxuICAnV3JpdHRlbiBieSBhIGNvbmN1cnJlbnQgcmVwbGF5IGFmdGVyIGFuIGV2ZW50IG9mIHRoZSBzYW1lIGtpbmQgd2FzIGFscmVhZHkgcmVjb3JkZWQgYW5kIGFjdGVkIG9uLiBUaGUgcnVuIGZvbGxvd3MgdGhlIGVhcmxpZXIgb25lLic7XG5cbi8qKlxuICogQ2FuZGlkYXRlIGxvZyBvcmRlciwgYnkgZXZlbnQgSUQuXG4gKlxuICogRXZlbnQgSURzIGFyZSBmaXhlZC13aWR0aCBhbmQgbW9ub3RvbmljIHdpdGhpbiBhIHJ1biB1bmRlciBib3RoIHRoZSBVTElEIGFuZFxuICogdGhlIHNsb3Qgc2NoZW1lLiBMZW5ndGggaXMgY29tcGFyZWQgZmlyc3Qgc28gYSBzaG9ydGVyIElEIG5ldmVyIHNvcnRzIGFmdGVyXG4gKiBhIGxvbmdlciBvbmUgb24gYSBsb2cgdGhhdCBtaXhlcyB3aWR0aHMuXG4gKlxuICogV2hldGhlciB0aGlzICppcyogdGhlIGxvZyBvcmRlciBkZXBlbmRzIG9uIHRoZSBJRCBzY2hlbWUsIHdoaWNoIGlzIHdoeVxuICoge0BsaW5rIGhhc0tub3dhYmxlTG9nT3JkZXJ9IGdhdGVzIHRoZSBmb2xkLiBTZWUgaXRzIGRvYy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUV2ZW50SWQoYTogRXZlbnQsIGI6IEV2ZW50KTogbnVtYmVyIHtcbiAgaWYgKGEuZXZlbnRJZC5sZW5ndGggIT09IGIuZXZlbnRJZC5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5ldmVudElkLmxlbmd0aCAtIGIuZXZlbnRJZC5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGEuZXZlbnRJZCA8IGIuZXZlbnRJZCA/IC0xIDogYS5ldmVudElkID4gYi5ldmVudElkID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZWRBdE1zKGV2ZW50OiBFdmVudCk6IG51bWJlciB7XG4gIGNvbnN0IGNyZWF0ZWRBdCA9IGV2ZW50LmNyZWF0ZWRBdDtcbiAgcmV0dXJuIGNyZWF0ZWRBdCBpbnN0YW5jZW9mIERhdGVcbiAgICA/IGNyZWF0ZWRBdC5nZXRUaW1lKClcbiAgICA6IG5ldyBEYXRlKGNyZWF0ZWRBdCBhcyB1bmtub3duIGFzIHN0cmluZykuZ2V0VGltZSgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG9yZGVyIHRoZSBydW4gY29uc3VtZWQgaXRzIGxvZyBpbiBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiBldmVudHMgYWxvbmUuXG4gKlxuICogV2hpY2ggb2NjdXJyZW5jZSBvZiBhIGNsYXNzIGNhbWUgZmlyc3QgaXMgdGhlIHdob2xlIHF1ZXN0aW9uIGhlcmUsIHNvIHRoZVxuICogZm9sZCBuZWVkcyB0aGUgbG9nJ3Mgb3JkZXIsIG5vdCBhbiBvcmRlci4gVGhlIGJhY2tlbmRzIGRvIG5vdCBhZ3JlZSBvbiBob3dcbiAqIHRvIHJlY292ZXIgaXQgZm9yIGV2ZXJ5IElEIHNjaGVtZTpcbiAqXG4gKiAtIEEgKipzbG90LW51bWJlcmVkKiogcnVuIGNhcnJpZXMgaXRzIHBvc2l0aW9uIGluIHRoZSBJRC4gVGhlIHNsb3QgaXMgZHJhd25cbiAqICAgYXQgdGhlIHB1Ymxpc2gsIHdoaWNoIGlzIHRoZSBsaW5lYXJpemF0aW9uIHBvaW50LCBzbyBzbG90IG9yZGVyIGlzIGxvZ1xuICogICBvcmRlciBldmVyeXdoZXJlIGFuZCB0aGUgSUQgYWxvbmUgc2V0dGxlcyBpdC5cbiAqIC0gQSAqKlVMSUQtbnVtYmVyZWQqKiBydW4gZG9lcyBub3QuIE9uZSBiYWNrZW5kIHJldHVybnMgc3VjaCBhIGxvZyBpblxuICogICBgKGNyZWF0ZWRBdCwgZXZlbnRJZClgIG9yZGVyIHdoaWxlIGFub3RoZXIgcmV0dXJucyBpdCBrZXllZCBvbiB0aGUgSUQsIGFuZFxuICogICBgY3JlYXRlZEF0YCBpcyBzdGFtcGVkIHdoZW4gdGhlIHdyaXRlIHJlcXVlc3QgYXJyaXZlcyByYXRoZXIgdGhhbiB3aGVuIGl0XG4gKiAgIGNvbW1pdHMuIENvbmN1cnJlbnQgd3JpdGVycyBjYW4gdGhlcmVmb3JlIHByb2R1Y2Ugb3Bwb3NpdGUgdGltZXN0YW1wIGFuZFxuICogICBJRCBvcmRlcnMsIGFuZCB0aGUgcnVuIGNvbnN1bWVkIHdoaWNoZXZlciBpdHMgb3duIGJhY2tlbmQgc2VydmVkLlxuICpcbiAqIFNvIGEgVUxJRCBsb2cgaXMgb25seSBrbm93YWJsZSB3aGVyZSB0aGUgdHdvIG9yZGVycyBhZ3JlZS4gV2hlcmUgdGhleVxuICogY29udHJhZGljdCwgdGhlIGZvbGQgY291bGQgbmFtZSB0aGUgc3Vydml2aW5nIGV2ZW50IGFuZCBwYXNzIG92ZXIgdGhlIG9uZVxuICogdGhlIHJ1biBhY3RlZCBvbiwgd2hpY2ggaXMgd29yc2UgdGhhbiBzYXlpbmcgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gaGFzS25vd2FibGVMb2dPcmRlcihvcmRlcmVkQnlJZDogcmVhZG9ubHkgRXZlbnRbXSk6IGJvb2xlYW4ge1xuICBpZiAob3JkZXJlZEJ5SWQuZXZlcnkoKGV2ZW50KSA9PiBpc1Nsb3RFdmVudElkKGV2ZW50LmV2ZW50SWQpKSkgcmV0dXJuIHRydWU7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IG9yZGVyZWRCeUlkLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3JlYXRlZEF0TXMob3JkZXJlZEJ5SWRbaW5kZXggLSAxXSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNyZWF0ZWRBdE1zKG9yZGVyZWRCeUlkW2luZGV4XSk7XG4gICAgLy8gQSBtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRpbWVzdGFtcCBsZWF2ZXMgbm90aGluZyB0byBjb3Jyb2JvcmF0ZSB0aGUgSURcbiAgICAvLyBvcmRlciB3aXRoLCB3aGljaCBpcyB0aGUgc2FtZSBwb3NpdGlvbiBhcyBhIGNvbnRyYWRpY3Rpb24uXG4gICAgaWYgKE51bWJlci5pc05hTihwcmV2aW91cykgfHwgTnVtYmVyLmlzTmFOKGN1cnJlbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnQgPCBwcmV2aW91cykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBUaGUgZm9sZCBpdHNlbGYsIG92ZXIgYSBsb2cgd2hvc2Ugb3JkZXIgaXMga25vd24uICovXG5mdW5jdGlvbiBmb2xkRHVwbGljYXRlcyhvcmRlcmVkOiByZWFkb25seSBFdmVudFtdKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBkdXBsaWNhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNlZW5DbGFzc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNsb3NlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBldmVudCBvZiBvcmRlcmVkKSB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICBpZiAoZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVudGl0eSA9IGV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gUlVOX0VOVElUWV9LRVk7XG4gICAgY29uc3QgY2xhc3NLZXkgPSBgJHtldmVudENsYXNzfToke2VudGl0eX1gO1xuICAgIGNvbnN0IHJlcGVhdHNDbGFzcyA9IHNlZW5DbGFzc2VzLmhhcyhjbGFzc0tleSk7XG4gICAgY29uc3QgZW50aXR5V2FzQ2xvc2VkID0gY2xvc2VkRW50aXRpZXMuaGFzKGVudGl0eSk7XG5cbiAgICBpZiAoVEVSTUlOQUxfRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGNsb3NlZEVudGl0aWVzLmFkZChlbnRpdHkpO1xuICAgIH1cblxuICAgIGlmICghcmVwZWF0c0NsYXNzKSB7XG4gICAgICAvLyBGaXJzdCBvZiBpdHMgY2xhc3MsIGJ1dCB0aGUgZW50aXR5IGFscmVhZHkgZmluaXNoZWQ6IG5vIGNvbnN1bWVyIGlzXG4gICAgICAvLyBsZWZ0IHRvIHRha2UgaXQgYW5kIGl0IHJlcGVhdHMgbm90aGluZywgc28gdGhlIHJ1bnRpbWUgcmVwb3J0c1xuICAgICAgLy8gZGl2ZXJnZW5jZSBoZXJlIGFuZCBleGl0cy4gRXZlcnl0aGluZyBwYXN0IHRoaXMgcG9pbnQgd2VudCB1bnJlYWQsIHNvXG4gICAgICAvLyB0aGUgZm9sZCBzdG9wcyB3aXRoIGl0IHJhdGhlciB0aGFuIHJlY29yZGluZyB0aGUgY2xhc3MgYW5kIHByZXNlbnRpbmdcbiAgICAgIC8vIGEgbGF0ZXIgZXZlbnQgb2YgaXQgYXMgYSByZXBlYXQgdGhlIHJ1biBwYXNzZWQgb3Zlci5cbiAgICAgIGlmIChlbnRpdHlXYXNDbG9zZWQpIGJyZWFrO1xuICAgICAgc2VlbkNsYXNzZXMuYWRkKGNsYXNzS2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBlbnRpdHkgaXMgc3RpbGwgb3Blbiwgc28gYSBjb25zdW1lciBpcyByZWdpc3RlcmVkIGZvciBpdCBhbmQgdGFrZXNcbiAgICAvLyB0aGlzIGV2ZW50OiBhbm90aGVyIGF0dGVtcHQsIG5vdCBhIHJlcGVhdCByZWFkIHBhc3QuXG4gICAgaWYgKGVudGl0eVdhc0Nsb3NlZCB8fCBTSU5HTEVUT05fRVZFTlRfQ0xBU1NFUy5oYXMoZXZlbnRDbGFzcykpIHtcbiAgICAgIGR1cGxpY2F0ZXMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkdXBsaWNhdGVzO1xufVxuXG4vKipcbiAqIFRoZSBJRHMgb2YgdGhlIGV2ZW50cyBpbiBgZXZlbnRzYCB0aGF0IHJlcGVhdCBhIGNsYXNzIHRoZSBsb2cgYWxyZWFkeVxuICogcmVjb3JkcyBmb3IgdGhlIHNhbWUgZW50aXR5LCBhZnRlciB0aGF0IGVudGl0eSBmaW5pc2hlZC5cbiAqXG4gKiBgaXNDb21wbGV0ZUhpc3RvcnlgIG11c3QgYmUgZmFsc2Ugd2hlbmV2ZXIgdGhlIGNhbGxlciBob2xkcyBhIHN1YnNldCBvZiB0aGVcbiAqIHJ1bidzIGxvZzogb25lIHBhZ2Ugb2YgYSBwYWdpbmF0ZWQgbGlzdCwgb3IgdGhlIHJlc3VsdCBvZiBhIHNlYXJjaC4gV2hpY2hcbiAqIG9jY3VycmVuY2Ugb2YgYSBjbGFzcyBjYW1lIGZpcnN0IGlzIGEgcHJvcGVydHkgb2YgdGhlIHdob2xlIGxvZywgc28gb24gYVxuICogc3Vic2V0IHRoZSBlYXJsaWVyIGV2ZW50IG1heSBzaW1wbHkgYmUgbWlzc2luZywgYW5kIHRoZSBmb2xkIHdvdWxkIHJlcG9ydFxuICogdGhlIHN1cnZpdmluZyBvbmUuIE5vdGhpbmcgaXMgY2xhc3NpZmllZCBpbiB0aGF0IGNhc2UuXG4gKlxuICogVHdvIG90aGVyIHRoaW5ncyBtYWtlIHRoZSBhbnN3ZXIgdW5rbm93YWJsZSBhbmQgeWllbGQgdGhlIHNhbWUgZW1wdHkgcmVzdWx0OlxuICogYSBsb2cgd2hvc2Ugb3JkZXIgY2Fubm90IGJlIHJlY292ZXJlZCBmcm9tIHRoZSBldmVudHMgKHNlZVxuICoge0BsaW5rIGhhc0tub3dhYmxlTG9nT3JkZXJ9KSwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgcG9pbnQgdGhlIHJ1blxuICogZGl2ZXJnZWQsIHNpbmNlIHRoZSBydW4gZXhpdGVkIHRoZXJlIGFuZCByZWFkIG5vIGZ1cnRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHVwbGljYXRlRXZlbnRJZHMoXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSxcbiAgeyBpc0NvbXBsZXRlSGlzdG9yeSB9OiB7IGlzQ29tcGxldGVIaXN0b3J5OiBib29sZWFuIH1cbik6IFNldDxzdHJpbmc+IHtcbiAgaWYgKCFpc0NvbXBsZXRlSGlzdG9yeSB8fCBldmVudHMubGVuZ3RoIDwgMikgcmV0dXJuIG5ldyBTZXQoKTtcblxuICAvLyBEcm9wcGVkIGJlZm9yZSB0aGUgc29ydCwgbm90IGR1cmluZyB0aGUgZm9sZDogYW4gZXZlbnQgd2l0aCBubyBJRCBoYXMgbm9cbiAgLy8gbG9nIHBvc2l0aW9uIHRvIG9yZGVyIG9uLCBhbmQgdGhlIGNhbGxlciBjb3VsZCBub3QgbWF0Y2ggaXQgZWl0aGVyLlxuICBjb25zdCBvcmRlcmVkID0gZXZlbnRzXG4gICAgLmZpbHRlcigoZXZlbnQpID0+IEJvb2xlYW4oZXZlbnQuZXZlbnRJZCkpXG4gICAgLnNvcnQoY29tcGFyZUV2ZW50SWQpO1xuXG4gIGlmICghaGFzS25vd2FibGVMb2dPcmRlcihvcmRlcmVkKSkgcmV0dXJuIG5ldyBTZXQoKTtcblxuICByZXR1cm4gZm9sZER1cGxpY2F0ZXMob3JkZXJlZCk7XG59XG4iXX0=
|
|
@@ -54,8 +54,19 @@ export interface MaterializedEntities {
|
|
|
54
54
|
*
|
|
55
55
|
* Handles partial event lists gracefully: a step may only have a
|
|
56
56
|
* step_created event with no completion yet.
|
|
57
|
+
*
|
|
58
|
+
* The derived status and timestamps come from the events the run acted on. A
|
|
59
|
+
* repeat of a class the log already records is read past by every replay, so
|
|
60
|
+
* a second terminal event written by a concurrent replay does not move a step
|
|
61
|
+
* off the outcome the first one recorded. Every event stays on the entity's
|
|
62
|
+
* `events` list.
|
|
63
|
+
*
|
|
64
|
+
* That reduction needs the whole log to be sound, so it only runs when
|
|
65
|
+
* `isCompleteHistory` says `events` is it. See {@link findDuplicateEventIds}.
|
|
57
66
|
*/
|
|
58
|
-
export declare function materializeSteps(events: Event[]
|
|
67
|
+
export declare function materializeSteps(events: Event[], { isCompleteHistory }?: {
|
|
68
|
+
isCompleteHistory?: boolean;
|
|
69
|
+
}): MaterializedStep[];
|
|
59
70
|
/**
|
|
60
71
|
* Group hook_* events by correlationId and build Hook-like entities.
|
|
61
72
|
*/
|
|
@@ -68,5 +79,7 @@ export declare function materializeWaits(events: Event[]): MaterializedWait[];
|
|
|
68
79
|
* Convenience function that materializes all entity types from a flat
|
|
69
80
|
* event list.
|
|
70
81
|
*/
|
|
71
|
-
export declare function materializeAll(events: Event[]
|
|
82
|
+
export declare function materializeAll(events: Event[], options?: {
|
|
83
|
+
isCompleteHistory?: boolean;
|
|
84
|
+
}): MaterializedEntities;
|
|
72
85
|
//# sourceMappingURL=event-materialization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-materialization.d.ts","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"event-materialization.d.ts","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAOzB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAqCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,KAAK,EAAE,EACf,EAAE,iBAAyB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,gBAAgB,EAAE,CA+DpB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA8BpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAyBpE;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5C,oBAAoB,CAMtB"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* of making separate API calls for each entity type.
|
|
11
11
|
*/
|
|
12
12
|
import { isHookLifecycleEventType, isStepEventType, isWaitEventType, } from '@workflow/world';
|
|
13
|
+
import { findDuplicateEventIds } from './duplicate-events';
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
// Helper: group events by correlationId
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -46,9 +47,21 @@ function getEventTimestamp(event) {
|
|
|
46
47
|
*
|
|
47
48
|
* Handles partial event lists gracefully: a step may only have a
|
|
48
49
|
* step_created event with no completion yet.
|
|
50
|
+
*
|
|
51
|
+
* The derived status and timestamps come from the events the run acted on. A
|
|
52
|
+
* repeat of a class the log already records is read past by every replay, so
|
|
53
|
+
* a second terminal event written by a concurrent replay does not move a step
|
|
54
|
+
* off the outcome the first one recorded. Every event stays on the entity's
|
|
55
|
+
* `events` list.
|
|
56
|
+
*
|
|
57
|
+
* That reduction needs the whole log to be sound, so it only runs when
|
|
58
|
+
* `isCompleteHistory` says `events` is it. See {@link findDuplicateEventIds}.
|
|
49
59
|
*/
|
|
50
|
-
export function materializeSteps(events) {
|
|
60
|
+
export function materializeSteps(events, { isCompleteHistory = false } = {}) {
|
|
51
61
|
const groups = groupByCorrelationId(events, isStepEventType);
|
|
62
|
+
const duplicateEventIds = findDuplicateEventIds(events, {
|
|
63
|
+
isCompleteHistory,
|
|
64
|
+
});
|
|
52
65
|
const steps = [];
|
|
53
66
|
for (const [correlationId, stepEvents] of groups) {
|
|
54
67
|
const created = stepEvents.find((e) => e.eventType === 'step_created');
|
|
@@ -60,6 +73,8 @@ export function materializeSteps(events) {
|
|
|
60
73
|
let completedAt;
|
|
61
74
|
let updatedAt = getEventTimestamp(created) ?? created.createdAt;
|
|
62
75
|
for (const e of stepEvents) {
|
|
76
|
+
if (duplicateEventIds.has(e.eventId))
|
|
77
|
+
continue;
|
|
63
78
|
switch (e.eventType) {
|
|
64
79
|
case 'step_started':
|
|
65
80
|
status = 'running';
|
|
@@ -169,11 +184,11 @@ export function materializeWaits(events) {
|
|
|
169
184
|
* Convenience function that materializes all entity types from a flat
|
|
170
185
|
* event list.
|
|
171
186
|
*/
|
|
172
|
-
export function materializeAll(events) {
|
|
187
|
+
export function materializeAll(events, options = {}) {
|
|
173
188
|
return {
|
|
174
|
-
steps: materializeSteps(events),
|
|
189
|
+
steps: materializeSteps(events, options),
|
|
175
190
|
hooks: materializeHooks(events),
|
|
176
191
|
waits: materializeWaits(events),
|
|
177
192
|
};
|
|
178
193
|
}
|
|
179
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWF0ZXJpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGVBQWUsR0FFaEIsTUFBTSxpQkFBaUIsQ0FBQztBQWlEekIsOEVBQThFO0FBQzlFLHdDQUF3QztBQUN4Qyw4RUFBOEU7QUFFOUUsU0FBUyxvQkFBb0IsQ0FDM0IsTUFBZSxFQUNmLGdCQUFnRDtJQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxTQUFTO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsU0FBUztRQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBd0I7SUFDakQsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENB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TyxDQUFDLEtBQUs7WUFDcEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUztZQUMxRCxRQUFRLEVBQ04sT0FBTyxDQUFDLFNBQVMsS0FBSyxjQUFjO2dCQUNsQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRO2dCQUM3QixDQUFDLENBQUMsU0FBUztZQUNmLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDekMsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxpQkFBaUI7QUFDakIsOEVBQThFO0FBRTlFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBZTtJQUM1QyxPQUFPO1FBQ0wsS0FBSyxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztRQUMvQixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7S0FDaEMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV2ZW50IG1hdGVyaWFsaXphdGlvbiBoZWxwZXJzLlxuICpcbiAqIFRoZXNlIGZ1bmN0aW9ucyBjb252ZXJ0IGEgZmxhdCBsaXN0IG9mIHdvcmtmbG93IGV2ZW50cyBpbnRvIGVudGl0eS1saWtlXG4gKiBvYmplY3RzIChzdGVwcywgaG9va3MsIHdhaXRzKSBieSBncm91cGluZyBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmRcbiAqIHN0aXRjaGluZyB0b2dldGhlciBsaWZlY3ljbGUgZXZlbnRzLlxuICpcbiAqIFRoaXMgZW5hYmxlcyBhIFwidG9wLWRvd25cIiBkYXRhIGZldGNoaW5nIHBhdHRlcm4gd2hlcmUgdGhlIGNsaWVudCBmZXRjaGVzXG4gKiBhbGwgZXZlbnRzIGZvciBhIHJ1biBvbmNlLCB0aGVuIG1hdGVyaWFsaXplcyBlbnRpdGllcyBjbGllbnQtc2lkZSBpbnN0ZWFkXG4gKiBvZiBtYWtpbmcgc2VwYXJhdGUgQVBJIGNhbGxzIGZvciBlYWNoIGVudGl0eSB0eXBlLlxuICovXG5cbmltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGlzSG9va0xpZmVjeWNsZUV2ZW50VHlwZSxcbiAgaXNTdGVwRXZlbnRUeXBlLFxuICBpc1dhaXRFdmVudFR5cGUsXG4gIHR5cGUgU3RlcFN0YXR1cyxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYXRlcmlhbGl6ZWQgZW50aXR5IHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRTdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcFN0YXR1cztcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHN0YXJ0ZWRBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBzdGVwLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZEhvb2sge1xuICBob29rSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVjZWl2ZWRDb3VudDogbnVtYmVyO1xuICBsYXN0UmVjZWl2ZWRBdD86IERhdGU7XG4gIGRpc3Bvc2VkQXQ/OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBob29rLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZFdhaXQge1xuICB3YWl0SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RhdHVzOiAnd2FpdGluZycgfCAnY29tcGxldGVkJztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICByZXN1bWVBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgLyoqIEFsbCBldmVudHMgZm9yIHRoaXMgd2FpdCwgaW4gaW5zZXJ0aW9uIG9yZGVyICovXG4gIGV2ZW50czogRXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRFbnRpdGllcyB7XG4gIHN0ZXBzOiBNYXRlcmlhbGl6ZWRTdGVwW107XG4gIGhvb2tzOiBNYXRlcmlhbGl6ZWRIb29rW107XG4gIHdhaXRzOiBNYXRlcmlhbGl6ZWRXYWl0W107XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyOiBncm91cCBldmVudHMgYnkgY29ycmVsYXRpb25JZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdyb3VwQnlDb3JyZWxhdGlvbklkKFxuICBldmVudHM6IEV2ZW50W10sXG4gIG1hdGNoZXNFdmVudFR5cGU6IChldmVudFR5cGU6IHN0cmluZykgPT4gYm9vbGVhblxuKTogTWFwPHN0cmluZywgRXZlbnRbXT4ge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBjaWQgPSBldmVudC5jb3JyZWxhdGlvbklkO1xuICAgIGlmICghY2lkKSBjb250aW51ZTtcbiAgICBpZiAoIW1hdGNoZXNFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkgY29udGludWU7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KGNpZCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBzLnNldChjaWQsIFtldmVudF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFRpbWVzdGFtcChldmVudDogRXZlbnQgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBldmVudD8ub2NjdXJyZWRBdCA/PyBldmVudD8uY3JlYXRlZEF0O1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiBkYXRlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplU3RlcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIHN0ZXBfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgU3RlcC1saWtlIGVudGl0aWVzLlxuICpcbiAqIEhhbmRsZXMgcGFydGlhbCBldmVudCBsaXN0cyBncmFjZWZ1bGx5OiBhIHN0ZXAgbWF5IG9ubHkgaGF2ZSBhXG4gKiBzdGVwX2NyZWF0ZWQgZXZlbnQgd2l0aCBubyBjb21wbGV0aW9uIHlldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplU3RlcHMoZXZlbnRzOiBFdmVudFtdKTogTWF0ZXJpYWxpemVkU3RlcFtdIHtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeUNvcnJlbGF0aW9uSWQoZXZlbnRzLCBpc1N0ZXBFdmVudFR5cGUpO1xuICBjb25zdCBzdGVwczogTWF0ZXJpYWxpemVkU3RlcFtdID0gW107XG5cbiAgZm9yIChjb25zdCBbY29ycmVsYXRpb25JZCwgc3RlcEV2ZW50c10gb2YgZ3JvdXBzKSB7XG4gICAgY29uc3QgY3JlYXRlZCA9IHN0ZXBFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKTtcbiAgICBpZiAoIWNyZWF0ZWQpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHN0YXR1czogU3RlcFN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgbGV0IHN0YXJ0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29tcGxldGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIHN0ZXBFdmVudHMpIHtcbiAgICAgIHN3aXRjaCAoZS5ldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgICAgYXR0ZW1wdCArPSAxO1xuICAgICAgICAgIGlmICghc3RhcnRlZEF0KSBzdGFydGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICBjb21wbGV0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB1cGRhdGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICAgIHN0YXR1cyA9ICdjb21wbGV0ZWQnO1xuICAgICAgICAgIGNvbXBsZXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgdXBkYXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0ZXBfZmFpbGVkJzpcbiAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGVwX3JldHJ5aW5nJzpcbiAgICAgICAgICBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdXBkYXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RlcHMucHVzaCh7XG4gICAgICBzdGVwSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZC5ydW5JZCxcbiAgICAgIHN0ZXBOYW1lOlxuICAgICAgICBjcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCdcbiAgICAgICAgICA/IChjcmVhdGVkLmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gY29ycmVsYXRpb25JZClcbiAgICAgICAgICA6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBzdGF0dXMsXG4gICAgICBhdHRlbXB0LFxuICAgICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkKSA/PyBjcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGNvbXBsZXRlZEF0LFxuICAgICAgdXBkYXRlZEF0LFxuICAgICAgZXZlbnRzOiBzdGVwRXZlbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0ZXBzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplSG9va3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIGhvb2tfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgSG9vay1saWtlIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVIb29rcyhldmVudHM6IEV2ZW50W10pOiBNYXRlcmlhbGl6ZWRIb29rW10ge1xuICBjb25zdCBncm91cHMgPSBncm91cEJ5Q29ycmVsYXRpb25JZChldmVudHMsIGlzSG9va0xpZmVjeWNsZUV2ZW50VHlwZSk7XG4gIGNvbnN0IGhvb2tzOiBNYXRlcmlhbGl6ZWRIb29rW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtjb3JyZWxhdGlvbklkLCBob29rRXZlbnRzXSBvZiBncm91cHMpIHtcbiAgICBjb25zdCBjcmVhdGVkID0gaG9va0V2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcpO1xuICAgIGlmICghY3JlYXRlZCkgY29udGludWU7XG5cbiAgICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IGhvb2tFdmVudHMuZmlsdGVyKFxuICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCdcbiAgICApO1xuICAgIGNvbnN0IGRpc3Bvc2VkID0gaG9va0V2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKTtcbiAgICBjb25zdCBsYXN0UmVjZWl2ZWQgPSByZWNlaXZlZEV2ZW50cy5hdCgtMSk7XG5cbiAgICBob29rcy5wdXNoKHtcbiAgICAgIGhvb2tJZDogY29ycmVsYXRpb25JZCxcbiAgICAgIHJ1bklkOiBjcmVhdGVkLnJ1bklkLFxuICAgICAgdG9rZW46XG4gICAgICAgIGNyZWF0ZWQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJ1xuICAgICAgICAgID8gY3JlYXRlZC5ldmVudERhdGE/LnRva2VuXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBjcmVhdGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0LFxuICAgICAgcmVjZWl2ZWRDb3VudDogcmVjZWl2ZWRFdmVudHMubGVuZ3RoLFxuICAgICAgbGFzdFJlY2VpdmVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGxhc3RSZWNlaXZlZCksXG4gICAgICBkaXNwb3NlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChkaXNwb3NlZCksXG4gICAgICBldmVudHM6IGhvb2tFdmVudHMsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gaG9va3M7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gbWF0ZXJpYWxpemVXYWl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogR3JvdXAgd2FpdF8qIGV2ZW50cyBieSBjb3JyZWxhdGlvbklkIGFuZCBidWlsZCBXYWl0LWxpa2UgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZVdhaXRzKGV2ZW50czogRXZlbnRbXSk6IE1hdGVyaWFsaXplZFdhaXRbXSB7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwQnlDb3JyZWxhdGlvbklkKGV2ZW50cywgaXNXYWl0RXZlbnRUeXBlKTtcbiAgY29uc3Qgd2FpdHM6IE1hdGVyaWFsaXplZFdhaXRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2NvcnJlbGF0aW9uSWQsIHdhaXRFdmVudHNdIG9mIGdyb3Vwcykge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSB3YWl0RXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyk7XG4gICAgaWYgKCFjcmVhdGVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNvbXBsZXRlZCA9IHdhaXRFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpO1xuXG4gICAgd2FpdHMucHVzaCh7XG4gICAgICB3YWl0SWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZC5ydW5JZCxcbiAgICAgIHN0YXR1czogY29tcGxldGVkID8gJ2NvbXBsZXRlZCcgOiAnd2FpdGluZycsXG4gICAgICBjcmVhdGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0LFxuICAgICAgcmVzdW1lQXQ6XG4gICAgICAgIGNyZWF0ZWQuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICAgICAgID8gY3JlYXRlZC5ldmVudERhdGE/LnJlc3VtZUF0XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBjb21wbGV0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoY29tcGxldGVkKSxcbiAgICAgIGV2ZW50czogd2FpdEV2ZW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB3YWl0cztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBtYXRlcmlhbGl6ZUFsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBtYXRlcmlhbGl6ZXMgYWxsIGVudGl0eSB0eXBlcyBmcm9tIGEgZmxhdFxuICogZXZlbnQgbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplQWxsKGV2ZW50czogRXZlbnRbXSk6IE1hdGVyaWFsaXplZEVudGl0aWVzIHtcbiAgcmV0dXJuIHtcbiAgICBzdGVwczogbWF0ZXJpYWxpemVTdGVwcyhldmVudHMpLFxuICAgIGhvb2tzOiBtYXRlcmlhbGl6ZUhvb2tzKGV2ZW50cyksXG4gICAgd2FpdHM6IG1hdGVyaWFsaXplV2FpdHMoZXZlbnRzKSxcbiAgfTtcbn1cbiJdfQ==
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWF0ZXJpYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9ldmVudC1tYXRlcmlhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGVBQWUsR0FFaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWlEM0QsOEVBQThFO0FBQzlFLHdDQUF3QztBQUN4Qyw4RUFBOEU7QUFFOUUsU0FBUyxvQkFBb0IsQ0FDM0IsTUFBZSxFQUNmLGdCQUFnRDtJQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztJQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxTQUFTO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsU0FBUztRQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBd0I7SUFDakQsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLEVBQUUsU0FB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VGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgYSBmbGF0IGxpc3Qgb2Ygd29ya2Zsb3cgZXZlbnRzIGludG8gZW50aXR5LWxpa2VcbiAqIG9iamVjdHMgKHN0ZXBzLCBob29rcywgd2FpdHMpIGJ5IGdyb3VwaW5nIGV2ZW50cyBieSBjb3JyZWxhdGlvbklkIGFuZFxuICogc3RpdGNoaW5nIHRvZ2V0aGVyIGxpZmVjeWNsZSBldmVudHMuXG4gKlxuICogVGhpcyBlbmFibGVzIGEgXCJ0b3AtZG93blwiIGRhdGEgZmV0Y2hpbmcgcGF0dGVybiB3aGVyZSB0aGUgY2xpZW50IGZldGNoZXNcbiAqIGFsbCBldmVudHMgZm9yIGEgcnVuIG9uY2UsIHRoZW4gbWF0ZXJpYWxpemVzIGVudGl0aWVzIGNsaWVudC1zaWRlIGluc3RlYWRcbiAqIG9mIG1ha2luZyBzZXBhcmF0ZSBBUEkgY2FsbHMgZm9yIGVhY2ggZW50aXR5IHR5cGUuXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNIb29rTGlmZWN5Y2xlRXZlbnRUeXBlLFxuICBpc1N0ZXBFdmVudFR5cGUsXG4gIGlzV2FpdEV2ZW50VHlwZSxcbiAgdHlwZSBTdGVwU3RhdHVzLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZmluZER1cGxpY2F0ZUV2ZW50SWRzIH0gZnJvbSAnLi9kdXBsaWNhdGUtZXZlbnRzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYXRlcmlhbGl6ZWQgZW50aXR5IHR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRTdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcFN0YXR1cztcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHN0YXJ0ZWRBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBzdGVwLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZEhvb2sge1xuICBob29rSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcmVjZWl2ZWRDb3VudDogbnVtYmVyO1xuICBsYXN0UmVjZWl2ZWRBdD86IERhdGU7XG4gIGRpc3Bvc2VkQXQ/OiBEYXRlO1xuICAvKiogQWxsIGV2ZW50cyBmb3IgdGhpcyBob29rLCBpbiBpbnNlcnRpb24gb3JkZXIgKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGVyaWFsaXplZFdhaXQge1xuICB3YWl0SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RhdHVzOiAnd2FpdGluZycgfCAnY29tcGxldGVkJztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICByZXN1bWVBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgLyoqIEFsbCBldmVudHMgZm9yIHRoaXMgd2FpdCwgaW4gaW5zZXJ0aW9uIG9yZGVyICovXG4gIGV2ZW50czogRXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXRlcmlhbGl6ZWRFbnRpdGllcyB7XG4gIHN0ZXBzOiBNYXRlcmlhbGl6ZWRTdGVwW107XG4gIGhvb2tzOiBNYXRlcmlhbGl6ZWRIb29rW107XG4gIHdhaXRzOiBNYXRlcmlhbGl6ZWRXYWl0W107XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyOiBncm91cCBldmVudHMgYnkgY29ycmVsYXRpb25JZFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdyb3VwQnlDb3JyZWxhdGlvbklkKFxuICBldmVudHM6IEV2ZW50W10sXG4gIG1hdGNoZXNFdmVudFR5cGU6IChldmVudFR5cGU6IHN0cmluZykgPT4gYm9vbGVhblxuKTogTWFwPHN0cmluZywgRXZlbnRbXT4ge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBjaWQgPSBldmVudC5jb3JyZWxhdGlvbklkO1xuICAgIGlmICghY2lkKSBjb250aW51ZTtcbiAgICBpZiAoIW1hdGNoZXNFdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkgY29udGludWU7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KGNpZCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBzLnNldChjaWQsIFtldmVudF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFRpbWVzdGFtcChldmVudDogRXZlbnQgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBldmVudD8ub2NjdXJyZWRBdCA/PyBldmVudD8uY3JlYXRlZEF0O1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyB1bmRlZmluZWQgOiBkYXRlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplU3RlcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIHN0ZXBfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgU3RlcC1saWtlIGVudGl0aWVzLlxuICpcbiAqIEhhbmRsZXMgcGFydGlhbCBldmVudCBsaXN0cyBncmFjZWZ1bGx5OiBhIHN0ZXAgbWF5IG9ubHkgaGF2ZSBhXG4gKiBzdGVwX2NyZWF0ZWQgZXZlbnQgd2l0aCBubyBjb21wbGV0aW9uIHlldC5cbiAqXG4gKiBUaGUgZGVyaXZlZCBzdGF0dXMgYW5kIHRpbWVzdGFtcHMgY29tZSBmcm9tIHRoZSBldmVudHMgdGhlIHJ1biBhY3RlZCBvbi4gQVxuICogcmVwZWF0IG9mIGEgY2xhc3MgdGhlIGxvZyBhbHJlYWR5IHJlY29yZHMgaXMgcmVhZCBwYXN0IGJ5IGV2ZXJ5IHJlcGxheSwgc29cbiAqIGEgc2Vjb25kIHRlcm1pbmFsIGV2ZW50IHdyaXR0ZW4gYnkgYSBjb25jdXJyZW50IHJlcGxheSBkb2VzIG5vdCBtb3ZlIGEgc3RlcFxuICogb2ZmIHRoZSBvdXRjb21lIHRoZSBmaXJzdCBvbmUgcmVjb3JkZWQuIEV2ZXJ5IGV2ZW50IHN0YXlzIG9uIHRoZSBlbnRpdHknc1xuICogYGV2ZW50c2AgbGlzdC5cbiAqXG4gKiBUaGF0IHJlZHVjdGlvbiBuZWVkcyB0aGUgd2hvbGUgbG9nIHRvIGJlIHNvdW5kLCBzbyBpdCBvbmx5IHJ1bnMgd2hlblxuICogYGlzQ29tcGxldGVIaXN0b3J5YCBzYXlzIGBldmVudHNgIGlzIGl0LiBTZWUge0BsaW5rIGZpbmREdXBsaWNhdGVFdmVudElkc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZVN0ZXBzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHsgaXNDb21wbGV0ZUhpc3RvcnkgPSBmYWxzZSB9OiB7IGlzQ29tcGxldGVIaXN0b3J5PzogYm9vbGVhbiB9ID0ge31cbik6IE1hdGVyaWFsaXplZFN0ZXBbXSB7XG4gIGNvbnN0IGdyb3VwcyA9IGdyb3VwQnlDb3JyZWxhdGlvbklkKGV2ZW50cywgaXNTdGVwRXZlbnRUeXBlKTtcbiAgY29uc3QgZHVwbGljYXRlRXZlbnRJZHMgPSBmaW5kRHVwbGljYXRlRXZlbnRJZHMoZXZlbnRzLCB7XG4gICAgaXNDb21wbGV0ZUhpc3RvcnksXG4gIH0pO1xuICBjb25zdCBzdGVwczogTWF0ZXJpYWxpemVkU3RlcFtdID0gW107XG5cbiAgZm9yIChjb25zdCBbY29ycmVsYXRpb25JZCwgc3RlcEV2ZW50c10gb2YgZ3JvdXBzKSB7XG4gICAgY29uc3QgY3JlYXRlZCA9IHN0ZXBFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKTtcbiAgICBpZiAoIWNyZWF0ZWQpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHN0YXR1czogU3RlcFN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgbGV0IHN0YXJ0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29tcGxldGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGNyZWF0ZWQpID8/IGNyZWF0ZWQuY3JlYXRlZEF0O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIHN0ZXBFdmVudHMpIHtcbiAgICAgIGlmIChkdXBsaWNhdGVFdmVudElkcy5oYXMoZS5ldmVudElkKSkgY29udGludWU7XG4gICAgICBzd2l0Y2ggKGUuZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0ZXBfc3RhcnRlZCc6XG4gICAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICAgIGF0dGVtcHQgKz0gMTtcbiAgICAgICAgICBpZiAoIXN0YXJ0ZWRBdCkgc3RhcnRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdXBkYXRlZEF0ID0gZ2V0RXZlbnRUaW1lc3RhbXAoZSkgPz8gZS5jcmVhdGVkQXQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzpcbiAgICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgY29tcGxldGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICB1cGRhdGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RlcF9yZXRyeWluZyc6XG4gICAgICAgICAgc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAgIGNvbXBsZXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHVwZGF0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN0ZXBzLnB1c2goe1xuICAgICAgc3RlcElkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgcnVuSWQ6IGNyZWF0ZWQucnVuSWQsXG4gICAgICBzdGVwTmFtZTpcbiAgICAgICAgY3JlYXRlZC5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnXG4gICAgICAgICAgPyAoY3JlYXRlZC5ldmVudERhdGE/LnN0ZXBOYW1lID8/IGNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgOiBjb3JyZWxhdGlvbklkLFxuICAgICAgc3RhdHVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIGNyZWF0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoY3JlYXRlZCkgPz8gY3JlYXRlZC5jcmVhdGVkQXQsXG4gICAgICBzdGFydGVkQXQsXG4gICAgICBjb21wbGV0ZWRBdCxcbiAgICAgIHVwZGF0ZWRBdCxcbiAgICAgIGV2ZW50czogc3RlcEV2ZW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGVwcztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBtYXRlcmlhbGl6ZUhvb2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBHcm91cCBob29rXyogZXZlbnRzIGJ5IGNvcnJlbGF0aW9uSWQgYW5kIGJ1aWxkIEhvb2stbGlrZSBlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplSG9va3MoZXZlbnRzOiBFdmVudFtdKTogTWF0ZXJpYWxpemVkSG9va1tdIHtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeUNvcnJlbGF0aW9uSWQoZXZlbnRzLCBpc0hvb2tMaWZlY3ljbGVFdmVudFR5cGUpO1xuICBjb25zdCBob29rczogTWF0ZXJpYWxpemVkSG9va1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbY29ycmVsYXRpb25JZCwgaG9va0V2ZW50c10gb2YgZ3JvdXBzKSB7XG4gICAgY29uc3QgY3JlYXRlZCA9IGhvb2tFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKTtcbiAgICBpZiAoIWNyZWF0ZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSBob29rRXZlbnRzLmZpbHRlcihcbiAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnXG4gICAgKTtcbiAgICBjb25zdCBkaXNwb3NlZCA9IGhvb2tFdmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJyk7XG4gICAgY29uc3QgbGFzdFJlY2VpdmVkID0gcmVjZWl2ZWRFdmVudHMuYXQoLTEpO1xuXG4gICAgaG9va3MucHVzaCh7XG4gICAgICBob29rSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZC5ydW5JZCxcbiAgICAgIHRva2VuOlxuICAgICAgICBjcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCdcbiAgICAgICAgICA/IGNyZWF0ZWQuZXZlbnREYXRhPy50b2tlblxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkKSA/PyBjcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgIHJlY2VpdmVkQ291bnQ6IHJlY2VpdmVkRXZlbnRzLmxlbmd0aCxcbiAgICAgIGxhc3RSZWNlaXZlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChsYXN0UmVjZWl2ZWQpLFxuICAgICAgZGlzcG9zZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoZGlzcG9zZWQpLFxuICAgICAgZXZlbnRzOiBob29rRXZlbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGhvb2tzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIG1hdGVyaWFsaXplV2FpdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEdyb3VwIHdhaXRfKiBldmVudHMgYnkgY29ycmVsYXRpb25JZCBhbmQgYnVpbGQgV2FpdC1saWtlIGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0ZXJpYWxpemVXYWl0cyhldmVudHM6IEV2ZW50W10pOiBNYXRlcmlhbGl6ZWRXYWl0W10ge1xuICBjb25zdCBncm91cHMgPSBncm91cEJ5Q29ycmVsYXRpb25JZChldmVudHMsIGlzV2FpdEV2ZW50VHlwZSk7XG4gIGNvbnN0IHdhaXRzOiBNYXRlcmlhbGl6ZWRXYWl0W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtjb3JyZWxhdGlvbklkLCB3YWl0RXZlbnRzXSBvZiBncm91cHMpIHtcbiAgICBjb25zdCBjcmVhdGVkID0gd2FpdEV2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcpO1xuICAgIGlmICghY3JlYXRlZCkgY29udGludWU7XG5cbiAgICBjb25zdCBjb21wbGV0ZWQgPSB3YWl0RXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKTtcblxuICAgIHdhaXRzLnB1c2goe1xuICAgICAgd2FpdElkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgcnVuSWQ6IGNyZWF0ZWQucnVuSWQsXG4gICAgICBzdGF0dXM6IGNvbXBsZXRlZCA/ICdjb21wbGV0ZWQnIDogJ3dhaXRpbmcnLFxuICAgICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkKSA/PyBjcmVhdGVkLmNyZWF0ZWRBdCxcbiAgICAgIHJlc3VtZUF0OlxuICAgICAgICBjcmVhdGVkLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICAgICAgICA/IGNyZWF0ZWQuZXZlbnREYXRhPy5yZXN1bWVBdFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgY29tcGxldGVkQXQ6IGdldEV2ZW50VGltZXN0YW1wKGNvbXBsZXRlZCksXG4gICAgICBldmVudHM6IHdhaXRFdmVudHMsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gd2FpdHM7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gbWF0ZXJpYWxpemVBbGxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgbWF0ZXJpYWxpemVzIGFsbCBlbnRpdHkgdHlwZXMgZnJvbSBhIGZsYXRcbiAqIGV2ZW50IGxpc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRlcmlhbGl6ZUFsbChcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBvcHRpb25zOiB7IGlzQ29tcGxldGVIaXN0b3J5PzogYm9vbGVhbiB9ID0ge31cbik6IE1hdGVyaWFsaXplZEVudGl0aWVzIHtcbiAgcmV0dXJuIHtcbiAgICBzdGVwczogbWF0ZXJpYWxpemVTdGVwcyhldmVudHMsIG9wdGlvbnMpLFxuICAgIGhvb2tzOiBtYXRlcmlhbGl6ZUhvb2tzKGV2ZW50cyksXG4gICAgd2FpdHM6IG1hdGVyaWFsaXplV2FpdHMoZXZlbnRzKSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -39,6 +39,21 @@ export interface TraceWithMeta {
|
|
|
39
39
|
}[];
|
|
40
40
|
/** Duration in ms from trace start to the latest known event. */
|
|
41
41
|
knownDurationMs: number;
|
|
42
|
+
/**
|
|
43
|
+
* The events left out of the span geometry as repeats. Empty unless the
|
|
44
|
+
* caller vouched for the log being complete. See
|
|
45
|
+
* {@link findDuplicateEventIds}.
|
|
46
|
+
*/
|
|
47
|
+
duplicateEventIds: ReadonlySet<string>;
|
|
42
48
|
}
|
|
43
|
-
export declare function buildTrace(run: WorkflowRun, events: Event[], now: Date
|
|
49
|
+
export declare function buildTrace(run: WorkflowRun, events: Event[], now: Date,
|
|
50
|
+
/**
|
|
51
|
+
* Whether `events` is the run's whole log. Defaults to false, which builds
|
|
52
|
+
* the trace from every event: on a subset there is no way to tell a repeat
|
|
53
|
+
* from the only copy the caller was given, and dropping the wrong one moves
|
|
54
|
+
* a span. See {@link findDuplicateEventIds}.
|
|
55
|
+
*/
|
|
56
|
+
{ isCompleteHistory }?: {
|
|
57
|
+
isCompleteHistory?: boolean;
|
|
58
|
+
}): TraceWithMeta;
|
|
44
59
|
//# sourceMappingURL=trace-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-builder.d.ts","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"trace-builder.d.ts","sourceRoot":"","sources":["../../src/lib/trace-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,KAAK,EAIV,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAWzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,OAIT,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,KAAK,EAAE,CAMT;AAMD,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,cAAc,EAAE,KAAK,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAeF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,CAgCvE;AAsED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EAAE,CAAC;IAClE,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,IAAI;AACT;;;;;GAKG;AACH,EAAE,iBAAyB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,aAAa,CA0Cf"}
|