@scalebun/web 1.2.4 → 1.3.1-beta.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/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +6 -3
- package/dist/browser.js.map +1 -1
- package/dist/config/schema.d.ts +4 -4
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +25 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/core/pageContext.js +17 -1
- package/dist/core/pageContext.js.map +1 -1
- package/dist/features/bugreport/collect.d.ts +13 -1
- package/dist/features/bugreport/collect.d.ts.map +1 -1
- package/dist/features/bugreport/collect.js +4 -1
- package/dist/features/bugreport/collect.js.map +1 -1
- package/dist/features/inapp/blocks/heavy/steps.d.ts.map +1 -1
- package/dist/features/inapp/blocks/heavy/steps.js +9 -1
- package/dist/features/inapp/blocks/heavy/steps.js.map +1 -1
- package/dist/features/inapp/inappContract.web.d.ts.map +1 -1
- package/dist/features/inapp/inappContract.web.js +12 -1
- package/dist/features/inapp/inappContract.web.js.map +1 -1
- package/dist/features/journey/InteractionTracker.d.ts.map +1 -1
- package/dist/features/journey/InteractionTracker.js +20 -12
- package/dist/features/journey/InteractionTracker.js.map +1 -1
- package/dist/features/journey/positionContext.d.ts +34 -0
- package/dist/features/journey/positionContext.d.ts.map +1 -0
- package/dist/features/journey/positionContext.js +43 -0
- package/dist/features/journey/positionContext.js.map +1 -0
- package/dist/features/replay/engine/interactions.d.ts +28 -2
- package/dist/features/replay/engine/interactions.d.ts.map +1 -1
- package/dist/features/replay/engine/interactions.js +44 -9
- package/dist/features/replay/engine/interactions.js.map +1 -1
- package/dist/features/replay/lifecycle/deltaBatcher.d.ts +31 -0
- package/dist/features/replay/lifecycle/deltaBatcher.d.ts.map +1 -0
- package/dist/features/replay/lifecycle/deltaBatcher.js +32 -0
- package/dist/features/replay/lifecycle/deltaBatcher.js.map +1 -0
- package/dist/features/replay/lifecycle/recorder.d.ts +14 -0
- package/dist/features/replay/lifecycle/recorder.d.ts.map +1 -1
- package/dist/features/replay/lifecycle/recorder.js +76 -10
- package/dist/features/replay/lifecycle/recorder.js.map +1 -1
- package/dist/features/scroll/index.d.ts +2 -0
- package/dist/features/scroll/index.d.ts.map +1 -1
- package/dist/features/scroll/index.js +6 -2
- package/dist/features/scroll/index.js.map +1 -1
- package/dist/public/ScaleBunFacade.d.ts.map +1 -1
- package/dist/public/ScaleBunFacade.js +9 -3
- package/dist/public/ScaleBunFacade.js.map +1 -1
- package/dist/scalebun.min.js +26 -26
- package/dist/scalebun.min.js.map +4 -4
- package/package.json +3 -3
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
* - input: masked value (password → empty)
|
|
11
11
|
* - viewport: on resize
|
|
12
12
|
*
|
|
13
|
-
* Events are batched and flushed
|
|
14
|
-
*
|
|
13
|
+
* Events are batched and flushed by semantic lane — click/deadclick immediately, scroll/input/viewport
|
|
14
|
+
* on the `flushMs` tick, pure cursor moves pooled to `moveFlushMs` (see `queue`) — and on demand via
|
|
15
|
+
* flush(). Dead-click detection uses `notifyDomActivity()`, called on every mutation/navigation.
|
|
15
16
|
*/
|
|
16
17
|
import { NodeRegistry } from './nodeRegistry.js';
|
|
17
18
|
export interface ClickTarget {
|
|
@@ -79,12 +80,26 @@ export interface InteractionOptions {
|
|
|
79
80
|
moveThrottleMs?: number;
|
|
80
81
|
scrollThrottleMs?: number;
|
|
81
82
|
flushMs?: number;
|
|
83
|
+
/**
|
|
84
|
+
* How long a MOVE-ONLY batch may accumulate before it ships. Cursor positions are the highest-volume,
|
|
85
|
+
* lowest-signal stream: flushing them on the generic `flushMs` cadence produced a frame every 100ms
|
|
86
|
+
* for the entire time the mouse was moving (~10/sec of near-empty envelopes). Moves now pool until
|
|
87
|
+
* this window elapses — or instantly when a semantic event (click/deadclick) joins the batch, so the
|
|
88
|
+
* cursor trail leading INTO a click still ships with full fidelity, in the same frame.
|
|
89
|
+
*/
|
|
90
|
+
moveFlushMs?: number;
|
|
82
91
|
deadMs?: number;
|
|
83
92
|
rageWindowMs?: number;
|
|
84
93
|
rageRadius?: number;
|
|
85
94
|
rageMin?: number;
|
|
86
95
|
maskInputs?: boolean;
|
|
87
96
|
maskText?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Called right before an IMMEDIATE flush (click/deadclick). The recorder wires this to the DOM
|
|
99
|
+
* DeltaBatcher's flush so a click on a just-added node never ships before the mutation that adds it —
|
|
100
|
+
* the batching windows must not be allowed to reorder cause and effect.
|
|
101
|
+
*/
|
|
102
|
+
beforeImmediateFlush?: () => void;
|
|
88
103
|
}
|
|
89
104
|
export declare class InteractionRecorder {
|
|
90
105
|
private readonly reg;
|
|
@@ -100,11 +115,22 @@ export declare class InteractionRecorder {
|
|
|
100
115
|
private clickHistory;
|
|
101
116
|
private startHref;
|
|
102
117
|
private frameOffsets;
|
|
118
|
+
private pendingSince;
|
|
103
119
|
private readonly o;
|
|
104
120
|
constructor(reg: NodeRegistry, onEvents: (events: Interaction[]) => void, opts?: InteractionOptions);
|
|
105
121
|
/** Fed by the ReplayFeature on every mutation/navigation — powers dead-click detection. */
|
|
106
122
|
notifyDomActivity(t?: number): void;
|
|
107
123
|
observe(): void;
|
|
124
|
+
/**
|
|
125
|
+
* Flush policy — events have different semantic weight, so they flush on different lanes:
|
|
126
|
+
* - immediate (click/deadclick): flush NOW, after draining the DOM batcher (see beforeImmediateFlush).
|
|
127
|
+
* - fast (scroll/input/viewport): next `flushMs` tick (≤100ms) — latest-state streams where a small
|
|
128
|
+
* delay is imperceptible but per-event frames would explode (a keystroke or resize-drag burst).
|
|
129
|
+
* - move: pool until `moveFlushMs` — pure cursor trail, the lowest-signal stream.
|
|
130
|
+
* A mixed batch flushes at the fastest lane present, in arrival order, as ONE frame.
|
|
131
|
+
*/
|
|
132
|
+
private queue;
|
|
133
|
+
private onTick;
|
|
108
134
|
/** Also capture interactions inside a same-origin iframe document; `getOffset` maps its viewport
|
|
109
135
|
* coords into the top document's space (computed live — the iframe can move/scroll). */
|
|
110
136
|
observeFrame(doc: Document, getOffset: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/engine/interactions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/engine/interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,14 +10,16 @@
|
|
|
10
10
|
* - input: masked value (password → empty)
|
|
11
11
|
* - viewport: on resize
|
|
12
12
|
*
|
|
13
|
-
* Events are batched and flushed
|
|
14
|
-
*
|
|
13
|
+
* Events are batched and flushed by semantic lane — click/deadclick immediately, scroll/input/viewport
|
|
14
|
+
* on the `flushMs` tick, pure cursor moves pooled to `moveFlushMs` (see `queue`) — and on demand via
|
|
15
|
+
* flush(). Dead-click detection uses `notifyDomActivity()`, called on every mutation/navigation.
|
|
15
16
|
*/
|
|
16
17
|
import { maskText, maskSecret, isPasswordField } from './snapshot.js';
|
|
17
18
|
const DEFAULTS = {
|
|
18
19
|
moveThrottleMs: 50,
|
|
19
20
|
scrollThrottleMs: 100,
|
|
20
21
|
flushMs: 100,
|
|
22
|
+
moveFlushMs: 300,
|
|
21
23
|
deadMs: 700,
|
|
22
24
|
rageWindowMs: 800,
|
|
23
25
|
rageRadius: 30,
|
|
@@ -42,6 +44,15 @@ export class InteractionRecorder {
|
|
|
42
44
|
// F-IFR: per-document coordinate offset so clicks/moves inside a same-origin iframe land in the
|
|
43
45
|
// TOP document's space (the overlay lives there). Top document has no entry → offset {0,0}.
|
|
44
46
|
this.frameOffsets = new Map();
|
|
47
|
+
this.pendingSince = 0; // when the oldest event entered `pending` (drives the move-only window)
|
|
48
|
+
this.onTick = () => {
|
|
49
|
+
if (!this.pending.length)
|
|
50
|
+
return;
|
|
51
|
+
// A move-only batch keeps pooling until its window elapses; anything else flushes on this tick.
|
|
52
|
+
if (this.pending.every((e) => e.k === 'move') && Date.now() - this.pendingSince < this.o.moveFlushMs)
|
|
53
|
+
return;
|
|
54
|
+
this.flush();
|
|
55
|
+
};
|
|
45
56
|
this.onMove = (e) => {
|
|
46
57
|
const me = e;
|
|
47
58
|
const t = Date.now();
|
|
@@ -50,7 +61,7 @@ export class InteractionRecorder {
|
|
|
50
61
|
this.lastMoveT = t;
|
|
51
62
|
const off = this.offsetFor(e.target);
|
|
52
63
|
const s = this.rootScroll(e.target);
|
|
53
|
-
this.
|
|
64
|
+
this.queue({ k: 'move', x: me.clientX + off.x, y: me.clientY + off.y, sx: s.sx, sy: s.sy, t }, 'move');
|
|
54
65
|
};
|
|
55
66
|
this.onClick = (e) => {
|
|
56
67
|
const me = e;
|
|
@@ -70,7 +81,7 @@ export class InteractionRecorder {
|
|
|
70
81
|
const path = e.composedPath?.();
|
|
71
82
|
const rawTarget = (path && path.length ? path[0] : e.target);
|
|
72
83
|
const el = describeTarget(rawTarget, this.o.maskText);
|
|
73
|
-
this.
|
|
84
|
+
this.queue({ k: 'click', x, y, sx: s.sx, sy: s.sy, id, t, ...(rage ? { rage: true } : {}), ...(el ? { el } : {}) }, 'immediate');
|
|
74
85
|
// Dead-click: no RELEVANT response within deadMs. Target-scoped so background churn (animations,
|
|
75
86
|
// spinners, polling) doesn't mask real dead clicks — the flaw that made almost every click read blue.
|
|
76
87
|
this.armDeadCheck(rawTarget, { x, y, sx: s.sx, sy: s.sy, id, at: t, el });
|
|
@@ -83,7 +94,7 @@ export class InteractionRecorder {
|
|
|
83
94
|
const target = e.target;
|
|
84
95
|
const el = (target.documentElement ?? target);
|
|
85
96
|
const id = this.reg.getId(el) ?? 0;
|
|
86
|
-
this.
|
|
97
|
+
this.queue({ k: 'scroll', id, x: el.scrollLeft ?? 0, y: el.scrollTop ?? 0, t }, 'fast');
|
|
87
98
|
};
|
|
88
99
|
this.onInput = (e) => {
|
|
89
100
|
const el = e.target;
|
|
@@ -97,10 +108,12 @@ export class InteractionRecorder {
|
|
|
97
108
|
value = maskSecret(value);
|
|
98
109
|
else if (this.o.maskInputs)
|
|
99
110
|
value = maskText(value);
|
|
100
|
-
this.
|
|
111
|
+
this.queue({ k: 'input', id, value, t: Date.now() }, 'fast');
|
|
101
112
|
};
|
|
102
113
|
this.onResize = () => {
|
|
103
|
-
|
|
114
|
+
// 'fast', not 'immediate': a drag-resize fires dozens of resize events per second, and each frame
|
|
115
|
+
// only needs the LATEST size — the ≤flushMs tick coalesces the burst without losing the end state.
|
|
116
|
+
this.queue({ k: 'viewport', w: window.innerWidth, h: window.innerHeight, t: Date.now() }, 'fast');
|
|
104
117
|
};
|
|
105
118
|
this.o = { ...DEFAULTS, ...opts };
|
|
106
119
|
}
|
|
@@ -118,7 +131,29 @@ export class InteractionRecorder {
|
|
|
118
131
|
this.add(document, 'input', this.onInput, true);
|
|
119
132
|
if (typeof window !== 'undefined')
|
|
120
133
|
this.add(window, 'resize', this.onResize, true);
|
|
121
|
-
this.timer = setInterval(
|
|
134
|
+
this.timer = setInterval(this.onTick, this.o.flushMs);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Flush policy — events have different semantic weight, so they flush on different lanes:
|
|
138
|
+
* - immediate (click/deadclick): flush NOW, after draining the DOM batcher (see beforeImmediateFlush).
|
|
139
|
+
* - fast (scroll/input/viewport): next `flushMs` tick (≤100ms) — latest-state streams where a small
|
|
140
|
+
* delay is imperceptible but per-event frames would explode (a keystroke or resize-drag burst).
|
|
141
|
+
* - move: pool until `moveFlushMs` — pure cursor trail, the lowest-signal stream.
|
|
142
|
+
* A mixed batch flushes at the fastest lane present, in arrival order, as ONE frame.
|
|
143
|
+
*/
|
|
144
|
+
queue(ev, lane) {
|
|
145
|
+
if (!this.pending.length)
|
|
146
|
+
this.pendingSince = Date.now();
|
|
147
|
+
this.pending.push(ev);
|
|
148
|
+
if (lane === 'immediate') {
|
|
149
|
+
try {
|
|
150
|
+
this.o.beforeImmediateFlush?.();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
/* the DOM drain must never break interaction capture */
|
|
154
|
+
}
|
|
155
|
+
this.flush();
|
|
156
|
+
}
|
|
122
157
|
}
|
|
123
158
|
/** Also capture interactions inside a same-origin iframe document; `getOffset` maps its viewport
|
|
124
159
|
* coords into the top document's space (computed live — the iframe can move/scroll). */
|
|
@@ -277,7 +312,7 @@ export class InteractionRecorder {
|
|
|
277
312
|
this.deadTimers.delete(timer);
|
|
278
313
|
finish();
|
|
279
314
|
if (!responded && safeHref() === this.startHref) {
|
|
280
|
-
this.
|
|
315
|
+
this.queue({ k: 'deadclick', x, y, sx: c.sx, sy: c.sy, id, t: at, ...(el ? { el } : {}) }, 'immediate');
|
|
281
316
|
}
|
|
282
317
|
}, this.o.deadMs);
|
|
283
318
|
this.deadTimers.add(timer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../src/features/replay/engine/interactions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../src/features/replay/engine/interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeltaBatcher — the single packaging point for DOM-shaped delta ops (mutations, CSSOM, iframe
|
|
3
|
+
* mutations). Producers keep their own capture cadence (MutationRecorder serializes per rAF so node
|
|
4
|
+
* state is read close to the change; CssomRecorder coalesces per microtask) but no longer decide
|
|
5
|
+
* frame boundaries: they APPEND ops here, and one frame ships per `windowMs` window.
|
|
6
|
+
*
|
|
7
|
+
* Why: a frame is the unit of meaningful replay state, not the unit of browser scheduling. Before
|
|
8
|
+
* this, every rAF with DOM activity produced its own frame — a 60fps DOM animation became 60
|
|
9
|
+
* frames/sec, and a CSSOM change in the same tick as a DOM change shipped as a second envelope.
|
|
10
|
+
* Batching here caps the DOM lane at ~1000/windowMs frames/sec while losing NO ops — only the
|
|
11
|
+
* packaging changes. Ordering is preserved (ops are appended in arrival order and applied in order
|
|
12
|
+
* by the player), which is also what lets DOM and CSSOM ops share one frame safely.
|
|
13
|
+
*
|
|
14
|
+
* `flush()` is synchronous for the moments that need a hard boundary: before a checkpoint snapshot
|
|
15
|
+
* (pending ops must ship as deltas against the OLD keyframe) and before an immediate interaction
|
|
16
|
+
* frame (a click on a just-added node must not precede the mutation that adds it).
|
|
17
|
+
*/
|
|
18
|
+
import type { Mutation } from '../engine/types.js';
|
|
19
|
+
export declare class DeltaBatcher {
|
|
20
|
+
private readonly windowMs;
|
|
21
|
+
private readonly emit;
|
|
22
|
+
private pending;
|
|
23
|
+
private timer;
|
|
24
|
+
constructor(windowMs: number, emit: (mutations: Mutation[]) => void);
|
|
25
|
+
append(muts: Mutation[]): void;
|
|
26
|
+
/** Synchronously package everything pending into one frame (no-op when empty). */
|
|
27
|
+
flush(): void;
|
|
28
|
+
/** Flush the tail and stop — captured ops are never dropped on pause/teardown. */
|
|
29
|
+
dispose(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=deltaBatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deltaBatcher.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/lifecycle/deltaBatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAA8C;gBAGxC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI;IAGxD,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI;IAM9B,kFAAkF;IAClF,KAAK,IAAI,IAAI;IAWb,kFAAkF;IAClF,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export class DeltaBatcher {
|
|
2
|
+
constructor(windowMs, emit) {
|
|
3
|
+
this.windowMs = windowMs;
|
|
4
|
+
this.emit = emit;
|
|
5
|
+
this.pending = [];
|
|
6
|
+
this.timer = null;
|
|
7
|
+
}
|
|
8
|
+
append(muts) {
|
|
9
|
+
if (!muts.length)
|
|
10
|
+
return;
|
|
11
|
+
this.pending.push(...muts);
|
|
12
|
+
if (this.timer == null)
|
|
13
|
+
this.timer = setTimeout(() => this.flush(), this.windowMs);
|
|
14
|
+
}
|
|
15
|
+
/** Synchronously package everything pending into one frame (no-op when empty). */
|
|
16
|
+
flush() {
|
|
17
|
+
if (this.timer != null) {
|
|
18
|
+
clearTimeout(this.timer);
|
|
19
|
+
this.timer = null;
|
|
20
|
+
}
|
|
21
|
+
if (!this.pending.length)
|
|
22
|
+
return;
|
|
23
|
+
const batch = this.pending;
|
|
24
|
+
this.pending = [];
|
|
25
|
+
this.emit(batch);
|
|
26
|
+
}
|
|
27
|
+
/** Flush the tail and stop — captured ops are never dropped on pause/teardown. */
|
|
28
|
+
dispose() {
|
|
29
|
+
this.flush();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=deltaBatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deltaBatcher.js","sourceRoot":"","sources":["../../../../src/features/replay/lifecycle/deltaBatcher.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,YAAY;IAIvB,YACmB,QAAgB,EAChB,IAAqC;QADrC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAAiC;QALhD,YAAO,GAAe,EAAE,CAAC;QACzB,UAAK,GAAyC,IAAI,CAAC;IAKxD,CAAC;IAEJ,MAAM,CAAC,IAAgB;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC;IAED,kFAAkF;IAClF,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,kFAAkF;IAClF,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF"}
|
|
@@ -40,6 +40,18 @@ export interface ReplayStats {
|
|
|
40
40
|
bufferBytes: number;
|
|
41
41
|
droppedSegments: number;
|
|
42
42
|
shedFrames: number;
|
|
43
|
+
/**
|
|
44
|
+
* Cumulative per-producer frame/byte counters for THIS session (what actually shipped or was
|
|
45
|
+
* buffered — adaptive-shed frames are excluded; they're in `shedFrames`). Bytes are approxBytes
|
|
46
|
+
* at push time, i.e. pre-gzip for keyframes. The point is attribution, not accounting: "62% of
|
|
47
|
+
* frames were cursor moves" is the measurement the flush-policy tuning is judged against.
|
|
48
|
+
* Producers: keyframe | mutation (DOM+CSSOM lane) | canvas | interaction (click/deadclick/input)
|
|
49
|
+
* | scroll (scroll/viewport) | move.
|
|
50
|
+
*/
|
|
51
|
+
producers: Record<string, {
|
|
52
|
+
frames: number;
|
|
53
|
+
bytes: number;
|
|
54
|
+
}>;
|
|
43
55
|
}
|
|
44
56
|
export declare function createRecorder(ctx: FeatureContext, decision: SampleDecision): Promise<RecorderController>;
|
|
45
57
|
export declare class RecorderController {
|
|
@@ -75,6 +87,8 @@ export declare class RecorderController {
|
|
|
75
87
|
private readonly pendingEncodes;
|
|
76
88
|
private adaptive?;
|
|
77
89
|
private shed;
|
|
90
|
+
private deltaBatcher?;
|
|
91
|
+
private readonly producerCounts;
|
|
78
92
|
private readonly persistBuffer;
|
|
79
93
|
private replayStore?;
|
|
80
94
|
private onPageHide?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/lifecycle/recorder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../../../src/features/replay/lifecycle/recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { uuid, now } from '../../../core/index.js';
|
|
|
2
2
|
import { PersistentBuffer } from '../../../storage/idb.js';
|
|
3
3
|
import { capBytes, PERSIST_MAX_BYTES } from '../../../core/prune.js';
|
|
4
4
|
import { approxBytes } from './segmentBuffer.js';
|
|
5
|
+
import { DeltaBatcher } from './deltaBatcher.js';
|
|
5
6
|
import { AdaptiveController, adapt } from './adaptive.js';
|
|
6
7
|
import { redactFrame } from './pii.js';
|
|
7
8
|
import { shouldDeferHeavyEgress } from './deviceSignals.js';
|
|
@@ -27,6 +28,30 @@ const KEYFRAME_INTERVAL_MS = 30000; // periodic checkpoint cadence (also drains
|
|
|
27
28
|
// B1: even on a genuinely idle page, force a keyframe at least this often so a long session keeps a
|
|
28
29
|
// recent checkpoint (durable crash-mirror freshness + backend retention windows stay seekable).
|
|
29
30
|
const MAX_IDLE_KEYFRAME_MS = 5 * 60000;
|
|
31
|
+
// Packaging window for the DOM lane (mutations + CSSOM + iframe ops, via DeltaBatcher): producers keep
|
|
32
|
+
// their capture cadence, frames ship at most every this-many ms. Caps the worst case (a 60fps DOM
|
|
33
|
+
// animation) at ~10 frames/sec instead of 60 — no ops are lost, only the envelopes.
|
|
34
|
+
const DELTA_BATCH_MS = 100;
|
|
35
|
+
// Move-only interaction batches pool this long before shipping (clicks flush them instantly — see
|
|
36
|
+
// InteractionRecorder.queue). ~3 cursor frames/sec instead of 10 during continuous movement.
|
|
37
|
+
const MOVE_FLUSH_MS = 300;
|
|
38
|
+
/** Attribute a frame to the producer lane it came from (for the stats counters). */
|
|
39
|
+
function classifyFrame(frame) {
|
|
40
|
+
if (frame.frameType === 'keyframe')
|
|
41
|
+
return 'keyframe';
|
|
42
|
+
const muts = frame.mutations;
|
|
43
|
+
if (muts?.length)
|
|
44
|
+
return muts.every((m) => m.op === 'canvas') ? 'canvas' : 'mutation';
|
|
45
|
+
const events = frame.events;
|
|
46
|
+
if (events?.length) {
|
|
47
|
+
if (events.some((e) => e.k === 'click' || e.k === 'deadclick' || e.k === 'input'))
|
|
48
|
+
return 'interaction';
|
|
49
|
+
if (events.some((e) => e.k === 'scroll' || e.k === 'viewport'))
|
|
50
|
+
return 'scroll';
|
|
51
|
+
return 'move';
|
|
52
|
+
}
|
|
53
|
+
return 'other';
|
|
54
|
+
}
|
|
30
55
|
export async function createRecorder(ctx, decision) {
|
|
31
56
|
const c = new RecorderController(ctx, decision);
|
|
32
57
|
await c.init();
|
|
@@ -69,6 +94,7 @@ export class RecorderController {
|
|
|
69
94
|
this.streamChainFrames = 0;
|
|
70
95
|
this.pendingEncodes = new Set();
|
|
71
96
|
this.shed = 0; // delta frames dropped by adaptive quality (for stats in M7)
|
|
97
|
+
this.producerCounts = {};
|
|
72
98
|
this.redactPII = false; // strict privacy on UNMASKED replay (M8)
|
|
73
99
|
this.paused = false; // runtime pause() — capture disarmed, session/buffer retained
|
|
74
100
|
this.streaming = decision.streamFromStart; // 'sampled'/'always' → emit live from frame 0
|
|
@@ -100,6 +126,7 @@ export class RecorderController {
|
|
|
100
126
|
bufferBytes: b?.totalBytes ?? 0,
|
|
101
127
|
droppedSegments: b?.dropped ?? 0,
|
|
102
128
|
shedFrames: this.shed,
|
|
129
|
+
producers: Object.fromEntries(Object.entries(this.producerCounts).map(([k, v]) => [k, { ...v }])),
|
|
103
130
|
};
|
|
104
131
|
}
|
|
105
132
|
/** Force a re-keyframe (e.g. ScaleBun.replay.checkpoint() before a risky flow). */
|
|
@@ -183,20 +210,31 @@ export class RecorderController {
|
|
|
183
210
|
this.persistPreRoll(); // make the very first pre-roll durable too (before the 1st checkpoint)
|
|
184
211
|
this.dirtySinceKeyframe = false; // B1: fresh keyframe = clean baseline
|
|
185
212
|
this.lastKeyframeAt = now();
|
|
213
|
+
// The DOM lane's single packaging point: mutation/CSSOM/iframe producers keep their capture
|
|
214
|
+
// cadence but append ops HERE; one delta frame ships per DELTA_BATCH_MS window (ops in arrival
|
|
215
|
+
// order, so DOM and CSSOM changes from the same tick share one envelope).
|
|
216
|
+
const batcher = new DeltaBatcher(DELTA_BATCH_MS, (mutations) => this.push(this.delta({ mutations })));
|
|
217
|
+
this.deltaBatcher = batcher;
|
|
186
218
|
const interactions = new InteractionRecorder(reg, (events) => {
|
|
187
219
|
this.push(this.delta({ events }));
|
|
188
|
-
}, {
|
|
220
|
+
}, {
|
|
221
|
+
maskText: !!snapOpts.maskAllText, // click labels omit page text when replay text is masked
|
|
222
|
+
moveFlushMs: MOVE_FLUSH_MS,
|
|
223
|
+
// A click frame flushes synchronously; drain the DOM lane first so a click on a just-added
|
|
224
|
+
// node never ships before the mutation that adds it.
|
|
225
|
+
beforeImmediateFlush: () => batcher.flush(),
|
|
226
|
+
});
|
|
189
227
|
const recorder = new MutationRecorder(reg, (mutations) => {
|
|
190
|
-
interactions.notifyDomActivity(); // a real DOM change → not a dead click
|
|
191
|
-
|
|
228
|
+
interactions.notifyDomActivity(); // a real DOM change → not a dead click (never delayed by batching)
|
|
229
|
+
batcher.append(mutations);
|
|
192
230
|
}, snapOpts);
|
|
193
231
|
const cssom = new CssomRecorder(reg, (mutations) => {
|
|
194
232
|
interactions.notifyDomActivity(); // a style change is a real visual effect, not a dead click
|
|
195
|
-
|
|
233
|
+
batcher.append(mutations);
|
|
196
234
|
});
|
|
197
235
|
const iframes = new IframeManager(reg, (mutations) => {
|
|
198
236
|
interactions.notifyDomActivity();
|
|
199
|
-
|
|
237
|
+
batcher.append(mutations);
|
|
200
238
|
}, snapOpts, {
|
|
201
239
|
onFrame: (doc, getOffset) => interactions.observeFrame(doc, getOffset),
|
|
202
240
|
onUnframe: (doc) => interactions.unobserveFrame(doc),
|
|
@@ -240,6 +278,17 @@ export class RecorderController {
|
|
|
240
278
|
* state, WITHOUT touching the segment buffer / crash-mirror / encoder / session (those survive a
|
|
241
279
|
* pause). The inverse of `arm()`; shared by pause() and teardown(). Idempotent. */
|
|
242
280
|
disarm() {
|
|
281
|
+
// Drain captured-but-unpackaged work BEFORE disconnecting (disconnect drops producer queues):
|
|
282
|
+
// pending ops become a final delta frame, so a pause/teardown never loses observed changes.
|
|
283
|
+
try {
|
|
284
|
+
this.mutationRec?.flush();
|
|
285
|
+
this.cssomRec?.flush();
|
|
286
|
+
this.deltaBatcher?.dispose();
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
/* best-effort tail drain */
|
|
290
|
+
}
|
|
291
|
+
this.deltaBatcher = undefined;
|
|
243
292
|
this.disconnectRecorder?.();
|
|
244
293
|
this.disconnectInteractions?.();
|
|
245
294
|
this.disconnectCssom?.();
|
|
@@ -311,6 +360,7 @@ export class RecorderController {
|
|
|
311
360
|
};
|
|
312
361
|
}
|
|
313
362
|
push(frame) {
|
|
363
|
+
var _a;
|
|
314
364
|
// B1: any delta (even one later shed by adaptive quality) means the page changed since the last
|
|
315
365
|
// keyframe → the next 'time' checkpoint must actually re-snapshot.
|
|
316
366
|
if (frame.frameType === 'delta')
|
|
@@ -328,6 +378,12 @@ export class RecorderController {
|
|
|
328
378
|
}
|
|
329
379
|
frame = adapted;
|
|
330
380
|
}
|
|
381
|
+
// Per-producer attribution of everything that actually ships/buffers (post-shed) — the
|
|
382
|
+
// measurement the flush-policy tuning is judged against.
|
|
383
|
+
const producer = classifyFrame(frame);
|
|
384
|
+
const pc = ((_a = this.producerCounts)[producer] ?? (_a[producer] = { frames: 0, bytes: 0 }));
|
|
385
|
+
pc.frames++;
|
|
386
|
+
pc.bytes += approxBytes(frame);
|
|
331
387
|
if (this.streaming) {
|
|
332
388
|
this.ctx.emit(frame);
|
|
333
389
|
// R0.6: bound the LIVE delta chain the same way the buffered path bounds an open segment — force a
|
|
@@ -362,15 +418,24 @@ export class RecorderController {
|
|
|
362
418
|
checkpoint(reason) {
|
|
363
419
|
if (this.checkpointing || !this.reg || !this.takeSnapshotFn || typeof document === 'undefined')
|
|
364
420
|
return;
|
|
365
|
-
// B1: the periodic 'time' checkpoint is a no-op on a genuinely idle page — skip the redundant full
|
|
366
|
-
// re-snapshot when nothing changed since the last keyframe (bounded by MAX_IDLE_KEYFRAME_MS). Every
|
|
367
|
-
// other reason (visible / url / segment-* / manual) always re-keyframes.
|
|
368
|
-
if (reason === 'time' && !this.dirtySinceKeyframe && now() - this.lastKeyframeAt < MAX_IDLE_KEYFRAME_MS)
|
|
369
|
-
return;
|
|
370
421
|
this.checkpointing = true;
|
|
371
422
|
try {
|
|
423
|
+
// Drain producers + the DOM batcher FIRST, for two reasons: pending ops must ship as deltas
|
|
424
|
+
// against the OLD keyframe (they describe changes the new snapshot will already contain), and
|
|
425
|
+
// the idle check below is only honest after the drain — a hidden-tab pile that hasn't been
|
|
426
|
+
// packaged yet still counts as "the page changed".
|
|
372
427
|
this.mutationRec?.flush();
|
|
373
428
|
this.cssomRec?.flush();
|
|
429
|
+
this.deltaBatcher?.flush();
|
|
430
|
+
// B1: the periodic 'time' checkpoint — and a tab-return 'visible' — are no-ops on a genuinely
|
|
431
|
+
// idle page: skip the redundant full re-snapshot when nothing changed since the last keyframe
|
|
432
|
+
// (bounded by MAX_IDLE_KEYFRAME_MS). Alt-tabbing used to cost a full DOM snapshot per return.
|
|
433
|
+
// url / segment-* / manual always re-keyframe.
|
|
434
|
+
if ((reason === 'time' || reason === 'visible') &&
|
|
435
|
+
!this.dirtySinceKeyframe &&
|
|
436
|
+
now() - this.lastKeyframeAt < MAX_IDLE_KEYFRAME_MS) {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
374
439
|
const snapshot = this.takeSnapshotFn(document, this.reg, this.snapOpts);
|
|
375
440
|
const id = `f_${uuid()}`;
|
|
376
441
|
this.keyframeId = id;
|
|
@@ -476,6 +541,7 @@ export class RecorderController {
|
|
|
476
541
|
flush() {
|
|
477
542
|
this.mutationRec?.flush();
|
|
478
543
|
this.cssomRec?.flush();
|
|
544
|
+
this.deltaBatcher?.flush(); // package the drained ops before the pre-roll ships
|
|
479
545
|
if (this.segBuf)
|
|
480
546
|
for (const f of this.segBuf.drainFrames())
|
|
481
547
|
this.ctx.emit(f);
|