@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.
Files changed (49) hide show
  1. package/dist/browser.d.ts +2 -2
  2. package/dist/browser.d.ts.map +1 -1
  3. package/dist/browser.js +6 -3
  4. package/dist/browser.js.map +1 -1
  5. package/dist/config/schema.d.ts +4 -4
  6. package/dist/config/schema.d.ts.map +1 -1
  7. package/dist/config/schema.js +25 -6
  8. package/dist/config/schema.js.map +1 -1
  9. package/dist/core/pageContext.js +17 -1
  10. package/dist/core/pageContext.js.map +1 -1
  11. package/dist/features/bugreport/collect.d.ts +13 -1
  12. package/dist/features/bugreport/collect.d.ts.map +1 -1
  13. package/dist/features/bugreport/collect.js +4 -1
  14. package/dist/features/bugreport/collect.js.map +1 -1
  15. package/dist/features/inapp/blocks/heavy/steps.d.ts.map +1 -1
  16. package/dist/features/inapp/blocks/heavy/steps.js +9 -1
  17. package/dist/features/inapp/blocks/heavy/steps.js.map +1 -1
  18. package/dist/features/inapp/inappContract.web.d.ts.map +1 -1
  19. package/dist/features/inapp/inappContract.web.js +12 -1
  20. package/dist/features/inapp/inappContract.web.js.map +1 -1
  21. package/dist/features/journey/InteractionTracker.d.ts.map +1 -1
  22. package/dist/features/journey/InteractionTracker.js +20 -12
  23. package/dist/features/journey/InteractionTracker.js.map +1 -1
  24. package/dist/features/journey/positionContext.d.ts +34 -0
  25. package/dist/features/journey/positionContext.d.ts.map +1 -0
  26. package/dist/features/journey/positionContext.js +43 -0
  27. package/dist/features/journey/positionContext.js.map +1 -0
  28. package/dist/features/replay/engine/interactions.d.ts +28 -2
  29. package/dist/features/replay/engine/interactions.d.ts.map +1 -1
  30. package/dist/features/replay/engine/interactions.js +44 -9
  31. package/dist/features/replay/engine/interactions.js.map +1 -1
  32. package/dist/features/replay/lifecycle/deltaBatcher.d.ts +31 -0
  33. package/dist/features/replay/lifecycle/deltaBatcher.d.ts.map +1 -0
  34. package/dist/features/replay/lifecycle/deltaBatcher.js +32 -0
  35. package/dist/features/replay/lifecycle/deltaBatcher.js.map +1 -0
  36. package/dist/features/replay/lifecycle/recorder.d.ts +14 -0
  37. package/dist/features/replay/lifecycle/recorder.d.ts.map +1 -1
  38. package/dist/features/replay/lifecycle/recorder.js +76 -10
  39. package/dist/features/replay/lifecycle/recorder.js.map +1 -1
  40. package/dist/features/scroll/index.d.ts +2 -0
  41. package/dist/features/scroll/index.d.ts.map +1 -1
  42. package/dist/features/scroll/index.js +6 -2
  43. package/dist/features/scroll/index.js.map +1 -1
  44. package/dist/public/ScaleBunFacade.d.ts.map +1 -1
  45. package/dist/public/ScaleBunFacade.js +9 -3
  46. package/dist/public/ScaleBunFacade.js.map +1 -1
  47. package/dist/scalebun.min.js +26 -26
  48. package/dist/scalebun.min.js.map +4 -4
  49. 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 on an interval (and on demand via flush() for tests). Dead-click
14
- * detection uses `notifyDomActivity()`, which the ReplayFeature calls on every mutation/navigation.
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":"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"}
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 on an interval (and on demand via flush() for tests). Dead-click
14
- * detection uses `notifyDomActivity()`, which the ReplayFeature calls on every mutation/navigation.
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.pending.push({ k: 'move', x: me.clientX + off.x, y: me.clientY + off.y, sx: s.sx, sy: s.sy, t });
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.pending.push({ k: 'click', x, y, sx: s.sx, sy: s.sy, id, t, ...(rage ? { rage: true } : {}), ...(el ? { el } : {}) });
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.pending.push({ k: 'scroll', id, x: el.scrollLeft ?? 0, y: el.scrollTop ?? 0, t });
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.pending.push({ k: 'input', id, value, t: Date.now() });
111
+ this.queue({ k: 'input', id, value, t: Date.now() }, 'fast');
101
112
  };
102
113
  this.onResize = () => {
103
- this.pending.push({ k: 'viewport', w: window.innerWidth, h: window.innerHeight, t: Date.now() });
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(() => this.flush(), this.o.flushMs);
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.pending.push({ k: 'deadclick', x, y, sx: c.sx, sy: c.sy, id, t: at, ...(el ? { el } : {}) });
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":"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"}
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
- }, { maskText: !!snapOpts.maskAllText });
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
- this.push(this.delta({ mutations }));
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
- this.push(this.delta({ mutations }));
233
+ batcher.append(mutations);
196
234
  });
197
235
  const iframes = new IframeManager(reg, (mutations) => {
198
236
  interactions.notifyDomActivity();
199
- this.push(this.delta({ mutations }));
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);