@lvce-editor/renderer-process 30.58.1 → 30.58.2
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/rendererProcessMain.js +11406 -144
- package/dist/sessionReplayWorkerMain.js +196 -95
- package/package.json +1 -1
|
@@ -4,30 +4,79 @@ var __export = (target, all) => {
|
|
|
4
4
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
-
// ../session-replay-worker/src/
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
// ../session-replay-worker/src/parts/ReplayCommand/ReplayCommand.ts
|
|
8
|
+
var replayCommands = [
|
|
9
|
+
"Css.addCssStyleSheet",
|
|
10
|
+
"Css.removeCssStyleSheet",
|
|
11
|
+
"Viewlet.addCss",
|
|
12
|
+
"Viewlet.append",
|
|
13
|
+
"Viewlet.appendToBody",
|
|
14
|
+
"Viewlet.appendToRoot",
|
|
15
|
+
"Viewlet.commitPending",
|
|
16
|
+
"Viewlet.create",
|
|
17
|
+
"Viewlet.createFunctionalRoot",
|
|
18
|
+
"Viewlet.createPlaceholder",
|
|
19
|
+
"Viewlet.dispose",
|
|
20
|
+
"Viewlet.executeCommands",
|
|
21
|
+
"Viewlet.patchCss",
|
|
22
|
+
"Viewlet.queueCommands",
|
|
23
|
+
"Viewlet.replaceChildren",
|
|
24
|
+
"Viewlet.scrollSelectorBy",
|
|
25
|
+
"Viewlet.sendMultiple",
|
|
26
|
+
"Viewlet.setBounds",
|
|
27
|
+
"Viewlet.setCheckBoxValue",
|
|
28
|
+
"Viewlet.setComponentDom",
|
|
29
|
+
"Viewlet.setCss",
|
|
30
|
+
"Viewlet.setDom",
|
|
31
|
+
"Viewlet.setDom2",
|
|
32
|
+
"Viewlet.setInputValues",
|
|
33
|
+
"Viewlet.setPatches",
|
|
34
|
+
"Viewlet.setProperty",
|
|
35
|
+
"Viewlet.setTreePatches",
|
|
36
|
+
"Viewlet.setValueByName",
|
|
37
|
+
"Viewlet.show"
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
// ../session-replay-worker/src/parts/FilterReplayMessage/FilterReplayMessage.ts
|
|
41
|
+
var createReplayMessageFilter = () => {
|
|
42
|
+
const replies = /* @__PURE__ */ Object.create(null);
|
|
43
|
+
return ({ connection, direction, message, renderer }) => {
|
|
44
|
+
if (!renderer || !message || typeof message !== "object") return false;
|
|
45
|
+
const { id, method } = message;
|
|
46
|
+
if (direction === "to-renderer") {
|
|
47
|
+
if (!replayCommands.includes(method)) return false;
|
|
48
|
+
if (method === "Viewlet.queueCommands" && id !== void 0) {
|
|
49
|
+
const pending3 = replies[connection] ||= [];
|
|
50
|
+
if (!pending3.includes(id)) pending3.push(id);
|
|
24
51
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (method || id === void 0) return false;
|
|
55
|
+
const pending2 = replies[connection];
|
|
56
|
+
const index = pending2?.indexOf(id) ?? -1;
|
|
57
|
+
if (index === -1) return false;
|
|
58
|
+
pending2.splice(index, 1);
|
|
59
|
+
if (pending2.length === 0) delete replies[connection];
|
|
60
|
+
return true;
|
|
28
61
|
};
|
|
29
|
-
|
|
30
|
-
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// ../session-replay-worker/src/parts/Activity/Activity.ts
|
|
65
|
+
var getActivity = (events, duration) => {
|
|
66
|
+
const length = Math.max(1, Math.min(240, Math.ceil(duration / 250)));
|
|
67
|
+
const counts = Array.from({ length });
|
|
68
|
+
counts.fill(0);
|
|
69
|
+
if (duration <= 0) return counts;
|
|
70
|
+
let initialFrame = true;
|
|
71
|
+
for (const event of events) {
|
|
72
|
+
if (event.type === "frame" && initialFrame) {
|
|
73
|
+
initialFrame = false;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const index = Math.min(counts.length - 1, Math.floor(event.timestamp / duration * counts.length));
|
|
77
|
+
counts[index]++;
|
|
78
|
+
}
|
|
79
|
+
return counts;
|
|
31
80
|
};
|
|
32
81
|
|
|
33
82
|
// ../../node_modules/@lvce-editor/constants/dist/parts/ElementTagMap/ElementTagMap.js
|
|
@@ -374,9 +423,9 @@ var getElementTag = (type) => {
|
|
|
374
423
|
throw new Error(`element tag not found ${type}`);
|
|
375
424
|
};
|
|
376
425
|
|
|
377
|
-
// ../session-replay-worker/src/
|
|
426
|
+
// ../session-replay-worker/src/parts/VisualDom/VisualDom.ts
|
|
378
427
|
var element = (tag = "div") => ({ attrs: {}, children: [], tag });
|
|
379
|
-
var styleKeys =
|
|
428
|
+
var styleKeys = ["width", "height", "top", "left", "translate", "marginTop", "paddingLeft", "paddingRight"];
|
|
380
429
|
var attributes = { className: "class", htmlFor: "for", inputType: "type" };
|
|
381
430
|
var setStyle = (node, key, value) => {
|
|
382
431
|
node.attrs ||= {};
|
|
@@ -402,7 +451,7 @@ var property = (node, key, value) => {
|
|
|
402
451
|
default:
|
|
403
452
|
break;
|
|
404
453
|
}
|
|
405
|
-
if (styleKeys.
|
|
454
|
+
if (styleKeys.includes(key)) {
|
|
406
455
|
setStyle(
|
|
407
456
|
node,
|
|
408
457
|
key.replaceAll(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),
|
|
@@ -444,7 +493,7 @@ var expandPatches = (patches) => patches.flatMap((value) => {
|
|
|
444
493
|
return result;
|
|
445
494
|
});
|
|
446
495
|
var createVisualDom = () => {
|
|
447
|
-
const views = /* @__PURE__ */
|
|
496
|
+
const views = /* @__PURE__ */ Object.create(null);
|
|
448
497
|
const parents = /* @__PURE__ */ new WeakMap();
|
|
449
498
|
const owners = /* @__PURE__ */ new WeakMap();
|
|
450
499
|
let nodeCount = 0;
|
|
@@ -477,14 +526,14 @@ var createVisualDom = () => {
|
|
|
477
526
|
if (parent) append(parent, next, index);
|
|
478
527
|
const uid = owners.get(node);
|
|
479
528
|
if (uid !== void 0) {
|
|
480
|
-
views
|
|
529
|
+
views[uid] = next;
|
|
481
530
|
owners.set(next, uid);
|
|
482
531
|
}
|
|
483
532
|
return next;
|
|
484
533
|
};
|
|
485
534
|
const renderNode = (value) => {
|
|
486
535
|
let node;
|
|
487
|
-
if (value.type === VirtualDomElements_exports.Reference) node = views
|
|
536
|
+
if (value.type === VirtualDomElements_exports.Reference) node = views[value.uid] || { text: "Reference node not found" };
|
|
488
537
|
else if (value.type === VirtualDomElements_exports.Text) node = { text: value.text };
|
|
489
538
|
else {
|
|
490
539
|
node = element(ElementTagMap_exports.getElementTag(value.type));
|
|
@@ -513,7 +562,7 @@ var createVisualDom = () => {
|
|
|
513
562
|
};
|
|
514
563
|
const patch = (uid, input) => {
|
|
515
564
|
const patches = expandPatches(input);
|
|
516
|
-
let current = views
|
|
565
|
+
let current = views[uid];
|
|
517
566
|
if (!current) return;
|
|
518
567
|
owners.set(current, uid);
|
|
519
568
|
const mutations = {
|
|
@@ -523,7 +572,7 @@ var createVisualDom = () => {
|
|
|
523
572
|
},
|
|
524
573
|
10: (node, value) => parents.get(node)?.children?.[value.index],
|
|
525
574
|
11: (node, value) => {
|
|
526
|
-
const next = views
|
|
575
|
+
const next = views[value.uid];
|
|
527
576
|
return next ? replace(node, next) : node;
|
|
528
577
|
},
|
|
529
578
|
2: (node, value) => {
|
|
@@ -563,21 +612,21 @@ var createVisualDom = () => {
|
|
|
563
612
|
return { append, clear, detach, element, find, patch, property, render, replace, views };
|
|
564
613
|
};
|
|
565
614
|
|
|
566
|
-
// ../session-replay-worker/src/
|
|
615
|
+
// ../session-replay-worker/src/parts/VisualState/VisualState.ts
|
|
567
616
|
var createVisualState = (initial) => {
|
|
568
617
|
const frame = structuredClone(initial);
|
|
569
618
|
const dom = createVisualDom();
|
|
570
619
|
const { append, clear, detach, element: element2, find: find2, patch, property: property2, render, replace, views } = dom;
|
|
571
|
-
|
|
572
|
-
const calls = /* @__PURE__ */
|
|
573
|
-
const batches =
|
|
620
|
+
let sheets = (frame.styles || []).map((text, index) => ({ text, uid: `initial-${index}` }));
|
|
621
|
+
const calls = /* @__PURE__ */ Object.create(null);
|
|
622
|
+
const batches = [];
|
|
574
623
|
const setDom = (uid, nodes) => {
|
|
575
|
-
const view = views
|
|
624
|
+
const view = views[uid];
|
|
576
625
|
if (!view) return;
|
|
577
626
|
const next = render(nodes)[0];
|
|
578
627
|
if (next) {
|
|
579
628
|
replace(view, next);
|
|
580
|
-
views
|
|
629
|
+
views[uid] = next;
|
|
581
630
|
}
|
|
582
631
|
};
|
|
583
632
|
const apply = (method, params = []) => {
|
|
@@ -587,26 +636,28 @@ var createVisualState = (initial) => {
|
|
|
587
636
|
for (const [method, ...params] of commands2) apply(method, params);
|
|
588
637
|
};
|
|
589
638
|
const commit = (uid, transaction) => {
|
|
590
|
-
const batch = batches.
|
|
639
|
+
const batch = batches.find((entry) => entry.transaction === transaction);
|
|
591
640
|
if (!batch || batch.uid !== uid) return;
|
|
592
641
|
batch.committed = true;
|
|
593
|
-
for (
|
|
642
|
+
for (let index = 0; index < batches.length; index++) {
|
|
643
|
+
const pending2 = batches[index];
|
|
594
644
|
if (pending2.uid !== uid) continue;
|
|
595
645
|
if (!pending2.committed) return;
|
|
596
646
|
execute(pending2.commands);
|
|
597
|
-
batches.
|
|
647
|
+
batches.splice(index, 1);
|
|
648
|
+
index--;
|
|
598
649
|
}
|
|
599
650
|
};
|
|
600
651
|
const appendView = (uid, childId, references) => {
|
|
601
|
-
const view = views
|
|
602
|
-
const child = views
|
|
652
|
+
const view = views[uid];
|
|
653
|
+
const child = views[childId];
|
|
603
654
|
if (!view || !child) return;
|
|
604
655
|
const nextReferences = references?.slice(references.indexOf(childId) + 1) || [];
|
|
605
|
-
const next = nextReferences.map((id) => views
|
|
656
|
+
const next = nextReferences.map((id) => views[id]).find((node) => node && view.children?.includes(node));
|
|
606
657
|
append(view, child, next ? view.children.indexOf(next) : void 0);
|
|
607
658
|
};
|
|
608
659
|
const setProperty = (uid, selector, key, value) => {
|
|
609
|
-
const view = views
|
|
660
|
+
const view = views[uid];
|
|
610
661
|
const node = view && find2(view, selector);
|
|
611
662
|
if (!node) return;
|
|
612
663
|
if (key === "textContent") {
|
|
@@ -615,29 +666,31 @@ var createVisualState = (initial) => {
|
|
|
615
666
|
} else property2(node, key, value);
|
|
616
667
|
};
|
|
617
668
|
const setBounds = (uid, left, top, width, height) => {
|
|
618
|
-
const view = views
|
|
669
|
+
const view = views[uid];
|
|
619
670
|
const bounds = Object.entries({ height, left, top, width });
|
|
620
671
|
for (const [key, value] of bounds) property2(view, key, value);
|
|
621
672
|
};
|
|
622
673
|
const setCss = (uid, text) => {
|
|
623
|
-
sheets.
|
|
674
|
+
const sheet = sheets.find((entry) => [entry.uid].includes(uid));
|
|
675
|
+
if (sheet) sheet.text = text;
|
|
676
|
+
else sheets.push({ text, uid });
|
|
624
677
|
};
|
|
625
678
|
const create = (_id, uid = Number(_id)) => {
|
|
626
|
-
views
|
|
679
|
+
views[uid] = element2();
|
|
627
680
|
};
|
|
628
681
|
const handlers = {
|
|
629
682
|
"Css.addCssStyleSheet": setCss,
|
|
630
683
|
"Css.removeCssStyleSheet": (uid) => {
|
|
631
|
-
sheets.
|
|
684
|
+
sheets = sheets.filter((entry) => ![entry.uid].includes(uid));
|
|
632
685
|
},
|
|
633
686
|
"Viewlet.addCss": setCss,
|
|
634
687
|
"Viewlet.append": appendView,
|
|
635
688
|
"Viewlet.appendToBody": (uid) => {
|
|
636
|
-
const view = views
|
|
689
|
+
const view = views[uid];
|
|
637
690
|
if (view) append(frame.dom, view);
|
|
638
691
|
},
|
|
639
692
|
"Viewlet.appendToRoot": (uid, root) => {
|
|
640
|
-
const view = views
|
|
693
|
+
const view = views[uid];
|
|
641
694
|
const parent = find2(frame.dom, `#${root}`);
|
|
642
695
|
if (view && parent) append(parent, view);
|
|
643
696
|
},
|
|
@@ -645,33 +698,33 @@ var createVisualState = (initial) => {
|
|
|
645
698
|
"Viewlet.create": create,
|
|
646
699
|
"Viewlet.createFunctionalRoot": create,
|
|
647
700
|
"Viewlet.createPlaceholder": (uid, parentId, top, left, width, height) => {
|
|
648
|
-
views
|
|
649
|
-
property2(views
|
|
701
|
+
views[uid] = element2();
|
|
702
|
+
property2(views[uid], "className", `Viewlet ${uid}`);
|
|
650
703
|
setBounds(uid, left, top, width, height);
|
|
651
704
|
appendView(parentId, uid);
|
|
652
705
|
},
|
|
653
706
|
"Viewlet.dispose": (uid) => {
|
|
654
|
-
const view = views
|
|
707
|
+
const view = views[uid];
|
|
655
708
|
if (view) detach(view);
|
|
656
|
-
views
|
|
657
|
-
sheets.
|
|
709
|
+
delete views[uid];
|
|
710
|
+
sheets = sheets.filter((entry) => ![entry.uid].includes(uid));
|
|
658
711
|
},
|
|
659
712
|
"Viewlet.executeCommands": execute,
|
|
660
713
|
"Viewlet.patchCss": (uid, start, count, replacement) => {
|
|
661
|
-
const
|
|
662
|
-
if (
|
|
714
|
+
const sheet = sheets.find((entry) => [entry.uid].includes(uid));
|
|
715
|
+
if (sheet) sheet.text = sheet.text.slice(0, start) + replacement + sheet.text.slice(start + count);
|
|
663
716
|
},
|
|
664
717
|
"Viewlet.replaceChildren": (uid, children) => {
|
|
665
|
-
const view = views
|
|
718
|
+
const view = views[uid];
|
|
666
719
|
if (!view) return;
|
|
667
720
|
clear(view);
|
|
668
721
|
for (const id of children) {
|
|
669
|
-
const child = views
|
|
722
|
+
const child = views[id];
|
|
670
723
|
if (child) append(view, child);
|
|
671
724
|
}
|
|
672
725
|
},
|
|
673
726
|
"Viewlet.scrollSelectorBy": (uid, selector, delta) => {
|
|
674
|
-
const view = views
|
|
727
|
+
const view = views[uid];
|
|
675
728
|
const node = view && find2(view, selector);
|
|
676
729
|
if (node) property2(node, "scrollLeft", (node.scroll?.[0] || 0) + delta);
|
|
677
730
|
},
|
|
@@ -681,7 +734,7 @@ var createVisualState = (initial) => {
|
|
|
681
734
|
"Viewlet.setComponentDom": setDom,
|
|
682
735
|
"Viewlet.setCss": setCss,
|
|
683
736
|
"Viewlet.setDom": (uid, nodes) => {
|
|
684
|
-
const view = views
|
|
737
|
+
const view = views[uid];
|
|
685
738
|
if (!view) return;
|
|
686
739
|
clear(view);
|
|
687
740
|
const children = render(nodes);
|
|
@@ -699,7 +752,7 @@ var createVisualState = (initial) => {
|
|
|
699
752
|
"Viewlet.setTreePatches": patch,
|
|
700
753
|
"Viewlet.setValueByName": (uid, name, value) => setProperty(uid, `[name="${name}"]`, "value", value),
|
|
701
754
|
"Viewlet.show": (uid) => {
|
|
702
|
-
const view = views
|
|
755
|
+
const view = views[uid];
|
|
703
756
|
if (view) append(find2(frame.dom, "#Workbench") || frame.dom, view);
|
|
704
757
|
}
|
|
705
758
|
};
|
|
@@ -709,21 +762,27 @@ var createVisualState = (initial) => {
|
|
|
709
762
|
const { connection, direction, message } = data;
|
|
710
763
|
const key = `${connection}:${message.id}`;
|
|
711
764
|
if (direction === "to-renderer") {
|
|
712
|
-
if (message.method === "Viewlet.queueCommands") calls
|
|
765
|
+
if (message.method === "Viewlet.queueCommands") calls[key] = message.params;
|
|
713
766
|
else apply(message.method, message.params);
|
|
714
|
-
} else if (
|
|
715
|
-
const [uid, commands2] = calls
|
|
716
|
-
calls
|
|
717
|
-
if (Number.isSafeInteger(message.result))
|
|
767
|
+
} else if (Object.hasOwn(calls, key)) {
|
|
768
|
+
const [uid, commands2] = calls[key];
|
|
769
|
+
delete calls[key];
|
|
770
|
+
if (Number.isSafeInteger(message.result)) {
|
|
771
|
+
const transaction = message.result;
|
|
772
|
+
const batch = { commands: commands2, committed: false, transaction, uid };
|
|
773
|
+
const index = batches.findIndex((entry) => entry.transaction === transaction);
|
|
774
|
+
if (index === -1) batches.push(batch);
|
|
775
|
+
else batches[index] = batch;
|
|
776
|
+
}
|
|
718
777
|
}
|
|
719
778
|
},
|
|
720
779
|
frame() {
|
|
721
|
-
return { ...frame, styles:
|
|
780
|
+
return { ...frame, styles: sheets.map((sheet) => sheet.text) };
|
|
722
781
|
}
|
|
723
782
|
};
|
|
724
783
|
};
|
|
725
784
|
|
|
726
|
-
// ../session-replay-worker/src/
|
|
785
|
+
// ../session-replay-worker/src/parts/Protocol/Protocol.ts
|
|
727
786
|
var version = 1;
|
|
728
787
|
var maxEventBytes = 75e4;
|
|
729
788
|
var maxSessionBytes = 64 * 1024 * 1024;
|
|
@@ -774,19 +833,46 @@ var loadContent = (value) => {
|
|
|
774
833
|
}
|
|
775
834
|
return { duration, frame: frames[Math.max(0, low - 1)].data, position };
|
|
776
835
|
};
|
|
777
|
-
return { duration, seek };
|
|
836
|
+
return { activity: getActivity(session.events, duration), duration, seek };
|
|
778
837
|
};
|
|
779
838
|
|
|
780
|
-
// ../session-replay-worker/src/
|
|
781
|
-
var
|
|
839
|
+
// ../session-replay-worker/src/parts/Transfer/Transfer.ts
|
|
840
|
+
var getTransferrables = (value) => {
|
|
841
|
+
const seen = [];
|
|
842
|
+
const result = [];
|
|
843
|
+
const visit = (item) => {
|
|
844
|
+
if (!item || typeof item !== "object" || seen.includes(item)) return;
|
|
845
|
+
seen.push(item);
|
|
846
|
+
if (Object.prototype.toString.call(item) === "[object ArrayBuffer]") result.push(item);
|
|
847
|
+
else if (ArrayBuffer.isView(item)) visit(item.buffer);
|
|
848
|
+
else if (["MessagePort", "OffscreenCanvas", "ImageBitmap", "AudioData", "VideoFrame", "ReadableStream", "WritableStream", "TransformStream"].some(
|
|
849
|
+
(name) => typeof globalThis[name] === "function" && item instanceof globalThis[name]
|
|
850
|
+
))
|
|
851
|
+
result.push(item);
|
|
852
|
+
else if (Object.prototype.toString.call(item) === "[object Map]") {
|
|
853
|
+
for (const [key, entry] of item) {
|
|
854
|
+
visit(key);
|
|
855
|
+
visit(entry);
|
|
856
|
+
}
|
|
857
|
+
} else if (Object.prototype.toString.call(item) === "[object Set]") {
|
|
858
|
+
for (const entry of item) visit(entry);
|
|
859
|
+
} else for (const entry of Object.values(item)) visit(entry);
|
|
860
|
+
};
|
|
861
|
+
visit(value);
|
|
862
|
+
return result;
|
|
863
|
+
};
|
|
864
|
+
|
|
865
|
+
// ../session-replay-worker/src/parts/Proxy/Proxy.ts
|
|
866
|
+
var wrapPorts = (value, replacePort, seen = []) => {
|
|
782
867
|
if (!value || typeof value !== "object") return value;
|
|
783
|
-
|
|
868
|
+
const previous = seen.find((entry) => entry.original === value);
|
|
869
|
+
if (previous) return previous.replacement;
|
|
784
870
|
if (value instanceof MessagePort) {
|
|
785
871
|
const replacement = replacePort(value);
|
|
786
|
-
seen.
|
|
872
|
+
seen.push({ original: value, replacement });
|
|
787
873
|
return replacement;
|
|
788
874
|
}
|
|
789
|
-
seen.
|
|
875
|
+
seen.push({ original: value, replacement: value });
|
|
790
876
|
if (value instanceof Map) {
|
|
791
877
|
const entries = [...value];
|
|
792
878
|
value.clear();
|
|
@@ -801,12 +887,18 @@ var wrapPorts = (value, replacePort, seen = /* @__PURE__ */ new Map()) => {
|
|
|
801
887
|
}
|
|
802
888
|
return value;
|
|
803
889
|
};
|
|
890
|
+
var consumeReply = (replies, id) => {
|
|
891
|
+
const index = replies.findIndex((reply) => [reply].includes(id));
|
|
892
|
+
if (index === -1) return false;
|
|
893
|
+
replies.splice(index, 1);
|
|
894
|
+
return true;
|
|
895
|
+
};
|
|
804
896
|
var createProxyRegistry = ({
|
|
805
897
|
record,
|
|
806
898
|
report: report2 = () => {
|
|
807
899
|
}
|
|
808
900
|
}) => {
|
|
809
|
-
const connections = /* @__PURE__ */
|
|
901
|
+
const connections = /* @__PURE__ */ Object.create(null);
|
|
810
902
|
let nextId = 0;
|
|
811
903
|
const createNestedPort = (connection, renderer, port) => create(port, `${connection}/port`, renderer);
|
|
812
904
|
const create = (port, label = "renderer", renderer = true) => {
|
|
@@ -820,16 +912,16 @@ var createProxyRegistry = ({
|
|
|
820
912
|
endpoint.onmessageerror = null;
|
|
821
913
|
endpoint.close();
|
|
822
914
|
}
|
|
823
|
-
connections
|
|
915
|
+
delete connections[connection];
|
|
824
916
|
};
|
|
825
|
-
connections
|
|
826
|
-
const ignoredReplies = { "from-renderer":
|
|
917
|
+
connections[connection] = close;
|
|
918
|
+
const ignoredReplies = { "from-renderer": [], "to-renderer": [] };
|
|
827
919
|
const forward = (source, target, direction) => {
|
|
828
920
|
source.onmessage = ({ data }) => {
|
|
829
921
|
const opposite = direction === "to-renderer" ? "from-renderer" : "to-renderer";
|
|
830
922
|
const ignored = typeof data?.method === "string" && data.method.startsWith("SessionReplay.");
|
|
831
|
-
if (ignored && data.id !== void 0) ignoredReplies[opposite].
|
|
832
|
-
const ignoredReply = !data?.method && ignoredReplies[direction]
|
|
923
|
+
if (ignored && data.id !== void 0 && !ignoredReplies[opposite].includes(data.id)) ignoredReplies[opposite].push(data.id);
|
|
924
|
+
const ignoredReply = !data?.method && consumeReply(ignoredReplies[direction], data?.id);
|
|
833
925
|
if (!ignored && !ignoredReply) {
|
|
834
926
|
try {
|
|
835
927
|
record({ connection, direction, label, message: data, renderer });
|
|
@@ -853,14 +945,15 @@ var createProxyRegistry = ({
|
|
|
853
945
|
return {
|
|
854
946
|
create,
|
|
855
947
|
dispose() {
|
|
856
|
-
for (const close of connections) close();
|
|
948
|
+
for (const close of Object.values(connections)) close();
|
|
857
949
|
}
|
|
858
950
|
};
|
|
859
951
|
};
|
|
860
952
|
|
|
861
|
-
// ../session-replay-worker/src/
|
|
953
|
+
// ../session-replay-worker/src/parts/Recorder/Recorder.ts
|
|
862
954
|
var createRecorder = ({
|
|
863
955
|
fetch: request = globalThis.fetch,
|
|
956
|
+
navigator = globalThis.navigator,
|
|
864
957
|
now = () => performance.now(),
|
|
865
958
|
storage: storage2
|
|
866
959
|
}) => {
|
|
@@ -879,7 +972,13 @@ var createRecorder = ({
|
|
|
879
972
|
if (metadata) throw new Error("A session is already recording");
|
|
880
973
|
options = config;
|
|
881
974
|
origin = now();
|
|
882
|
-
metadata = {
|
|
975
|
+
metadata = {
|
|
976
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
977
|
+
id: crypto.randomUUID(),
|
|
978
|
+
platform: navigator?.platform || "",
|
|
979
|
+
userAgent: navigator?.userAgent || "",
|
|
980
|
+
version
|
|
981
|
+
};
|
|
883
982
|
if (options.local) await storage2.save(metadata, []);
|
|
884
983
|
return metadata.id;
|
|
885
984
|
};
|
|
@@ -913,7 +1012,8 @@ var createRecorder = ({
|
|
|
913
1012
|
if (!response.ok) throw new Error(`Session replay upload failed (${response.status})`);
|
|
914
1013
|
return response.json();
|
|
915
1014
|
};
|
|
916
|
-
if (!remote)
|
|
1015
|
+
if (!remote)
|
|
1016
|
+
remote = await send(endpoint, { createdAt: metadata.createdAt, platform: metadata.platform, userAgent: metadata.userAgent, version });
|
|
917
1017
|
while (pending2.length > 0) {
|
|
918
1018
|
const batch = [];
|
|
919
1019
|
let batchBytes = 0;
|
|
@@ -961,7 +1061,7 @@ var createRecorder = ({
|
|
|
961
1061
|
};
|
|
962
1062
|
};
|
|
963
1063
|
|
|
964
|
-
// ../session-replay-worker/src/
|
|
1064
|
+
// ../session-replay-worker/src/parts/Capture/Capture.ts
|
|
965
1065
|
var serializeMessage = (message) => {
|
|
966
1066
|
const ancestors = [];
|
|
967
1067
|
let count = 0;
|
|
@@ -982,13 +1082,13 @@ var serializeMessage = (message) => {
|
|
|
982
1082
|
);
|
|
983
1083
|
};
|
|
984
1084
|
|
|
985
|
-
// ../session-replay-worker/src/
|
|
1085
|
+
// ../session-replay-worker/src/parts/SerializeProxyMessage/SerializeProxyMessage.ts
|
|
986
1086
|
var redacted = "[redacted]";
|
|
987
1087
|
var isMasked = (node) => node.inputType === "password" || Object.hasOwn(node, "data-session-replay-mask") || Object.hasOwn(node, "data-session-replay-ignore");
|
|
988
|
-
var structuralKeys =
|
|
1088
|
+
var structuralKeys = ["type", "childCount", "uid"];
|
|
989
1089
|
var redactNode = (node) => {
|
|
990
1090
|
for (const key of Object.keys(node)) {
|
|
991
|
-
if (structuralKeys.
|
|
1091
|
+
if (structuralKeys.includes(key)) continue;
|
|
992
1092
|
if (["text", "value", "textContent"].includes(key)) node[key] = redacted;
|
|
993
1093
|
else if (key === "inputType" && node[key] === "password") continue;
|
|
994
1094
|
else if (["data-session-replay-mask", "data-session-replay-ignore"].includes(key)) node[key] = "";
|
|
@@ -1007,14 +1107,14 @@ var redactUpdates = (method, params) => {
|
|
|
1007
1107
|
}
|
|
1008
1108
|
};
|
|
1009
1109
|
var createMessageSerializer = () => {
|
|
1010
|
-
const maskedViews = /* @__PURE__ */
|
|
1110
|
+
const maskedViews = /* @__PURE__ */ Object.create(null);
|
|
1011
1111
|
const sanitizeCommand = (method, params, masked) => {
|
|
1012
1112
|
if (!method.startsWith("Viewlet.") || typeof params[0] !== "number") return;
|
|
1013
1113
|
const uid = params[0];
|
|
1014
1114
|
const patches = params[1];
|
|
1015
1115
|
const masksInput = Array.isArray(patches) && patches.some((patch) => patch?.key === "inputType" && patch.value === "password");
|
|
1016
|
-
if (masked || masksInput) maskedViews
|
|
1017
|
-
if (maskedViews
|
|
1116
|
+
if (masked || masksInput) maskedViews[uid] = true;
|
|
1117
|
+
if (maskedViews[uid]) redactUpdates(method, params);
|
|
1018
1118
|
};
|
|
1019
1119
|
const sanitizeArray = (array) => {
|
|
1020
1120
|
let remaining = 0;
|
|
@@ -1054,7 +1154,7 @@ var createMessageSerializer = () => {
|
|
|
1054
1154
|
};
|
|
1055
1155
|
};
|
|
1056
1156
|
|
|
1057
|
-
// ../session-replay-worker/src/
|
|
1157
|
+
// ../session-replay-worker/src/parts/Storage/Storage.ts
|
|
1058
1158
|
var withoutSessionId = ({ sessionId, ...event }) => event;
|
|
1059
1159
|
var open = () => new Promise((resolve, reject) => {
|
|
1060
1160
|
const request = indexedDB.open("lvce-session-replays", 1);
|
|
@@ -1089,7 +1189,7 @@ var createStorage = async () => {
|
|
|
1089
1189
|
};
|
|
1090
1190
|
};
|
|
1091
1191
|
|
|
1092
|
-
// ../session-replay-worker/src/
|
|
1192
|
+
// ../session-replay-worker/src/parts/Worker/Worker.ts
|
|
1093
1193
|
var storage;
|
|
1094
1194
|
var recorder;
|
|
1095
1195
|
var content;
|
|
@@ -1105,9 +1205,10 @@ var report = (error) => {
|
|
|
1105
1205
|
recording = false;
|
|
1106
1206
|
};
|
|
1107
1207
|
var serializeMessage2 = createMessageSerializer();
|
|
1208
|
+
var shouldRecord = createReplayMessageFilter();
|
|
1108
1209
|
var proxies = createProxyRegistry({
|
|
1109
1210
|
record(message) {
|
|
1110
|
-
if (!recording) return;
|
|
1211
|
+
if (!recording || !shouldRecord(message)) return;
|
|
1111
1212
|
if (pending >= 500) {
|
|
1112
1213
|
report(new Error("Recording cannot keep up with worker messages"));
|
|
1113
1214
|
return;
|
|
@@ -1139,7 +1240,7 @@ var commands = {
|
|
|
1139
1240
|
session = await response.json();
|
|
1140
1241
|
} else ({ session } = source);
|
|
1141
1242
|
content = loadContent(session);
|
|
1142
|
-
return content.seek(0);
|
|
1243
|
+
return { ...content.seek(0), activity: content.activity };
|
|
1143
1244
|
},
|
|
1144
1245
|
proxy: (port) => proxies.create(port),
|
|
1145
1246
|
record: (...params) => recorder.record(...params),
|