@highlight-run/rrweb 1.2.0 → 2.0.1

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 (185) hide show
  1. package/dist/plugins/console-record.js +655 -0
  2. package/dist/plugins/console-record.min.js +1 -1
  3. package/dist/plugins/console-record.min.js.map +1 -1
  4. package/dist/plugins/console-replay.js +293 -0
  5. package/dist/plugins/console-replay.min.js +16 -0
  6. package/dist/plugins/console-replay.min.js.map +1 -0
  7. package/dist/plugins/sequential-id-record.js +33 -0
  8. package/dist/plugins/sequential-id-record.min.js +2 -0
  9. package/dist/plugins/sequential-id-record.min.js.map +1 -0
  10. package/dist/plugins/sequential-id-replay.js +37 -0
  11. package/dist/plugins/sequential-id-replay.min.js +2 -0
  12. package/dist/plugins/sequential-id-replay.min.js.map +1 -0
  13. package/dist/record/rrweb-record-pack.js +747 -0
  14. package/dist/record/rrweb-record-pack.min.js +16 -0
  15. package/dist/record/rrweb-record-pack.min.js.map +1 -0
  16. package/dist/record/rrweb-record.js +3318 -0
  17. package/dist/record/rrweb-record.min.js +16 -0
  18. package/dist/record/rrweb-record.min.js.map +1 -0
  19. package/dist/replay/rrweb-replay-unpack.js +4626 -0
  20. package/dist/replay/rrweb-replay-unpack.min.css +2 -0
  21. package/dist/replay/rrweb-replay-unpack.min.css.map +1 -0
  22. package/dist/replay/rrweb-replay-unpack.min.js +30 -0
  23. package/dist/replay/rrweb-replay-unpack.min.js.map +1 -0
  24. package/dist/replay/rrweb-replay.js +4216 -0
  25. package/dist/replay/rrweb-replay.min.css +2 -0
  26. package/dist/replay/rrweb-replay.min.css.map +1 -0
  27. package/dist/replay/rrweb-replay.min.js +30 -0
  28. package/dist/replay/rrweb-replay.min.js.map +1 -0
  29. package/dist/rrweb-all.js +8708 -0
  30. package/dist/rrweb-all.min.css +2 -0
  31. package/dist/rrweb-all.min.css.map +1 -0
  32. package/dist/rrweb-all.min.js +30 -0
  33. package/dist/rrweb-all.min.js.map +1 -0
  34. package/dist/rrweb.js +7294 -0
  35. package/dist/rrweb.min.css +2 -0
  36. package/dist/rrweb.min.css.map +1 -0
  37. package/dist/rrweb.min.js +2 -2
  38. package/dist/rrweb.min.js.map +1 -1
  39. package/es/rrweb/ext/@xstate/fsm/es/index.js +17 -0
  40. package/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js +49 -0
  41. package/es/rrweb/ext/fflate/esm/browser.js +777 -0
  42. package/es/rrweb/ext/mitt/dist/mitt.es.js +63 -0
  43. package/es/rrweb/packages/rrweb/ext/tslib/tslib.es6.js +78 -0
  44. package/es/rrweb/packages/rrweb/src/entries/all.js +13 -0
  45. package/es/rrweb/packages/rrweb/src/index.js +12 -0
  46. package/es/rrweb/packages/rrweb/src/packer/base.js +3 -0
  47. package/es/rrweb/packages/rrweb/src/packer/pack.js +10 -0
  48. package/es/rrweb/packages/rrweb/src/packer/unpack.js +29 -0
  49. package/es/rrweb/packages/rrweb/src/plugins/console/record/error-stack-parser.js +179 -0
  50. package/es/rrweb/packages/rrweb/src/plugins/console/record/index.js +134 -0
  51. package/es/rrweb/packages/rrweb/src/plugins/console/record/stringify.js +141 -0
  52. package/es/rrweb/packages/rrweb/src/plugins/console/replay/index.js +111 -0
  53. package/es/rrweb/packages/rrweb/src/plugins/sequential-id/record/index.js +23 -0
  54. package/es/rrweb/packages/rrweb/src/plugins/sequential-id/replay/index.js +28 -0
  55. package/es/rrweb/packages/rrweb/src/record/iframe-manager.js +32 -0
  56. package/es/rrweb/packages/rrweb/src/record/index.js +381 -0
  57. package/es/rrweb/packages/rrweb/src/record/mutation.js +532 -0
  58. package/es/rrweb/packages/rrweb/src/record/observer.js +665 -0
  59. package/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js +78 -0
  60. package/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js +93 -0
  61. package/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js +30 -0
  62. package/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js +116 -0
  63. package/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js +78 -0
  64. package/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js +45 -0
  65. package/es/rrweb/packages/rrweb/src/replay/canvas/2d.js +25 -0
  66. package/es/rrweb/packages/rrweb/src/replay/canvas/index.js +35 -0
  67. package/es/rrweb/packages/rrweb/src/replay/canvas/webgl.js +124 -0
  68. package/es/rrweb/packages/rrweb/src/replay/index.js +1864 -0
  69. package/es/rrweb/packages/rrweb/src/replay/machine.js +321 -0
  70. package/es/rrweb/packages/rrweb/src/replay/smoothscroll.js +221 -0
  71. package/es/rrweb/packages/rrweb/src/replay/styles/inject-style.js +8 -0
  72. package/es/rrweb/packages/rrweb/src/replay/timer.js +96 -0
  73. package/es/rrweb/packages/rrweb/src/replay/virtual-styles.js +121 -0
  74. package/es/rrweb/packages/rrweb/src/types.js +75 -0
  75. package/es/rrweb/packages/rrweb/src/utils.js +509 -0
  76. package/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js +1697 -0
  77. package/lib/plugins/console-record.js +650 -0
  78. package/lib/plugins/console-replay.js +288 -0
  79. package/lib/plugins/sequential-id-record.js +28 -0
  80. package/lib/plugins/sequential-id-replay.js +32 -0
  81. package/lib/record/rrweb-record-pack.js +742 -0
  82. package/lib/record/rrweb-record.js +3315 -0
  83. package/lib/replay/rrweb-replay-unpack.js +4621 -0
  84. package/lib/replay/rrweb-replay.js +4211 -0
  85. package/lib/rrweb-all.js +8703 -0
  86. package/lib/rrweb.js +7289 -0
  87. package/package.json +41 -43
  88. package/typings/entries/all.d.ts +6 -0
  89. package/{dist → typings}/entries/record-pack.d.ts +0 -0
  90. package/{dist → typings}/entries/replay-unpack.d.ts +0 -0
  91. package/{dist → typings}/index.d.ts +1 -2
  92. package/{dist → typings}/packer/base.d.ts +0 -0
  93. package/{dist → typings}/packer/index.d.ts +0 -0
  94. package/{dist → typings}/packer/pack.d.ts +0 -0
  95. package/{dist → typings}/packer/unpack.d.ts +0 -0
  96. package/{dist → typings}/plugins/console/record/error-stack-parser.d.ts +0 -0
  97. package/{dist → typings}/plugins/console/record/index.d.ts +3 -2
  98. package/{dist → typings}/plugins/console/record/stringify.d.ts +0 -0
  99. package/{dist → typings}/plugins/console/replay/index.d.ts +2 -2
  100. package/{dist → typings}/plugins/sequential-id/record/index.d.ts +0 -0
  101. package/{dist → typings}/plugins/sequential-id/replay/index.d.ts +0 -0
  102. package/{dist → typings}/record/iframe-manager.d.ts +1 -1
  103. package/{dist → typings}/record/index.d.ts +0 -0
  104. package/{dist → typings}/record/mutation.d.ts +5 -8
  105. package/typings/record/observer.d.ts +7 -0
  106. package/{dist → typings}/record/observers/canvas/2d.d.ts +0 -0
  107. package/{dist → typings}/record/observers/canvas/canvas-manager.d.ts +0 -0
  108. package/{dist → typings}/record/observers/canvas/canvas.d.ts +0 -0
  109. package/{dist → typings}/record/observers/canvas/serialize-args.d.ts +1 -1
  110. package/{dist → typings}/record/observers/canvas/webgl.d.ts +0 -0
  111. package/typings/record/observers/canvas/webgl2.d.ts +2 -0
  112. package/typings/record/shadow-dom-manager.d.ts +21 -0
  113. package/{dist → typings}/replay/canvas/2d.d.ts +0 -0
  114. package/{dist → typings}/replay/canvas/index.d.ts +0 -0
  115. package/{dist → typings}/replay/canvas/webgl.d.ts +0 -0
  116. package/{dist → typings}/replay/index.d.ts +1 -0
  117. package/{dist → typings}/replay/machine.d.ts +0 -0
  118. package/{dist → typings}/replay/smoothscroll.d.ts +0 -0
  119. package/{dist → typings}/replay/styles/inject-style.d.ts +0 -0
  120. package/{dist → typings}/replay/timer.d.ts +0 -0
  121. package/{dist → typings}/replay/virtual-styles.d.ts +1 -1
  122. package/{dist → typings}/rrdom/index.d.ts +0 -0
  123. package/{dist → typings}/rrdom/tree-node.d.ts +0 -0
  124. package/{dist → typings}/types.d.ts +7 -8
  125. package/{dist → typings}/utils.d.ts +3 -4
  126. package/CHANGELOG.md +0 -26
  127. package/README.md +0 -124
  128. package/README.zh_CN.md +0 -122
  129. package/dist/entries/all.d.ts +0 -4
  130. package/dist/index.css +0 -82
  131. package/dist/index.css.map +0 -1
  132. package/dist/index.js +0 -3
  133. package/dist/index.js.LICENSE.txt +0 -14
  134. package/dist/index.js.map +0 -1
  135. package/dist/plugins/entries/all.d.ts +0 -4
  136. package/dist/plugins/entries/record-pack.d.ts +0 -2
  137. package/dist/plugins/entries/replay-unpack.d.ts +0 -2
  138. package/dist/plugins/index.d.ts +0 -9
  139. package/dist/plugins/packer/base.d.ts +0 -7
  140. package/dist/plugins/packer/index.d.ts +0 -2
  141. package/dist/plugins/packer/pack.d.ts +0 -2
  142. package/dist/plugins/packer/unpack.d.ts +0 -2
  143. package/dist/plugins/plugins/console/record/error-stack-parser.d.ts +0 -37
  144. package/dist/plugins/plugins/console/record/index.d.ts +0 -41
  145. package/dist/plugins/plugins/console/record/stringify.d.ts +0 -2
  146. package/dist/plugins/plugins/console/replay/index.d.ts +0 -9
  147. package/dist/plugins/plugins/sequential-id/record/index.d.ts +0 -6
  148. package/dist/plugins/plugins/sequential-id/replay/index.d.ts +0 -7
  149. package/dist/plugins/record/iframe-manager.d.ts +0 -13
  150. package/dist/plugins/record/index.d.ts +0 -9
  151. package/dist/plugins/record/mutation.d.ts +0 -45
  152. package/dist/plugins/record/observer.d.ts +0 -11
  153. package/dist/plugins/record/observers/canvas/2d.d.ts +0 -2
  154. package/dist/plugins/record/observers/canvas/canvas-manager.d.ts +0 -32
  155. package/dist/plugins/record/observers/canvas/canvas.d.ts +0 -2
  156. package/dist/plugins/record/observers/canvas/serialize-args.d.ts +0 -6
  157. package/dist/plugins/record/observers/canvas/webgl.d.ts +0 -2
  158. package/dist/plugins/record/shadow-dom-manager.d.ts +0 -34
  159. package/dist/plugins/replay/canvas/2d.d.ts +0 -9
  160. package/dist/plugins/replay/canvas/index.d.ts +0 -9
  161. package/dist/plugins/replay/canvas/webgl.d.ts +0 -11
  162. package/dist/plugins/replay/index.d.ts +0 -82
  163. package/dist/plugins/replay/machine.d.ts +0 -85
  164. package/dist/plugins/replay/smoothscroll.d.ts +0 -1
  165. package/dist/plugins/replay/styles/inject-style.d.ts +0 -2
  166. package/dist/plugins/replay/timer.d.ts +0 -19
  167. package/dist/plugins/replay/virtual-styles.d.ts +0 -43
  168. package/dist/plugins/rrdom/index.d.ts +0 -1
  169. package/dist/plugins/rrdom/tree-node.d.ts +0 -20
  170. package/dist/plugins/snapshot/css.d.ts +0 -92
  171. package/dist/plugins/snapshot/index.d.ts +0 -5
  172. package/dist/plugins/snapshot/rebuild.d.ts +0 -19
  173. package/dist/plugins/snapshot/snapshot.d.ts +0 -49
  174. package/dist/plugins/snapshot/types.d.ts +0 -99
  175. package/dist/plugins/snapshot/utils.d.ts +0 -11
  176. package/dist/plugins/types.d.ts +0 -509
  177. package/dist/plugins/utils.d.ts +0 -71
  178. package/dist/record/observer.d.ts +0 -11
  179. package/dist/record/shadow-dom-manager.d.ts +0 -34
  180. package/dist/snapshot/css.d.ts +0 -92
  181. package/dist/snapshot/index.d.ts +0 -5
  182. package/dist/snapshot/rebuild.d.ts +0 -19
  183. package/dist/snapshot/snapshot.d.ts +0 -49
  184. package/dist/snapshot/types.d.ts +0 -99
  185. package/dist/snapshot/utils.d.ts +0 -11
@@ -0,0 +1,78 @@
1
+ import { __values, __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';
2
+ import { CanvasContext } from '../../../types.js';
3
+ import { patch, isBlocked, hookSetter } from '../../../utils.js';
4
+
5
+ function initCanvas2DMutationObserver(cb, win, blockClass, mirror) {
6
+ var e_1, _a;
7
+ var handlers = [];
8
+ var props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);
9
+ var _loop_1 = function (prop) {
10
+ try {
11
+ if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {
12
+ return "continue";
13
+ }
14
+ var restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {
15
+ return function () {
16
+ var _this = this;
17
+ var args = [];
18
+ for (var _i = 0; _i < arguments.length; _i++) {
19
+ args[_i] = arguments[_i];
20
+ }
21
+ if (!isBlocked(this.canvas, blockClass)) {
22
+ setTimeout(function () {
23
+ var recordArgs = __spreadArray([], __read(args), false);
24
+ if (prop === 'drawImage') {
25
+ if (recordArgs[0] &&
26
+ recordArgs[0] instanceof HTMLCanvasElement) {
27
+ var canvas = recordArgs[0];
28
+ var ctx = canvas.getContext('2d');
29
+ var imgd = ctx === null || ctx === void 0 ? void 0 : ctx.getImageData(0, 0, canvas.width, canvas.height);
30
+ var pix = imgd === null || imgd === void 0 ? void 0 : imgd.data;
31
+ recordArgs[0] = JSON.stringify(pix);
32
+ }
33
+ }
34
+ cb(_this.canvas, {
35
+ type: CanvasContext['2D'],
36
+ property: prop,
37
+ args: recordArgs,
38
+ });
39
+ }, 0);
40
+ }
41
+ return original.apply(this, args);
42
+ };
43
+ });
44
+ handlers.push(restoreHandler);
45
+ }
46
+ catch (_b) {
47
+ var hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {
48
+ set: function (v) {
49
+ cb(this.canvas, {
50
+ type: CanvasContext['2D'],
51
+ property: prop,
52
+ args: [v],
53
+ setter: true,
54
+ });
55
+ },
56
+ });
57
+ handlers.push(hookHandler);
58
+ }
59
+ };
60
+ try {
61
+ for (var props2D_1 = __values(props2D), props2D_1_1 = props2D_1.next(); !props2D_1_1.done; props2D_1_1 = props2D_1.next()) {
62
+ var prop = props2D_1_1.value;
63
+ _loop_1(prop);
64
+ }
65
+ }
66
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
67
+ finally {
68
+ try {
69
+ if (props2D_1_1 && !props2D_1_1.done && (_a = props2D_1.return)) _a.call(props2D_1);
70
+ }
71
+ finally { if (e_1) throw e_1.error; }
72
+ }
73
+ return function () {
74
+ handlers.forEach(function (h) { return h(); });
75
+ };
76
+ }
77
+
78
+ export default initCanvas2DMutationObserver;
@@ -0,0 +1,93 @@
1
+ import { __rest } from '../../../../ext/tslib/tslib.es6.js';
2
+ import initCanvas2DMutationObserver from './2d.js';
3
+ import initCanvasContextObserver from './canvas.js';
4
+ import initCanvasWebGLMutationObserver from './webgl.js';
5
+
6
+ var CanvasManager = (function () {
7
+ function CanvasManager(options) {
8
+ this.pendingCanvasMutations = new Map();
9
+ this.rafStamps = { latestId: 0, invokeId: null };
10
+ this.frozen = false;
11
+ this.locked = false;
12
+ this.processMutation = function (target, mutation) {
13
+ var newFrame = this.rafStamps.invokeId &&
14
+ this.rafStamps.latestId !== this.rafStamps.invokeId;
15
+ if (newFrame || !this.rafStamps.invokeId)
16
+ this.rafStamps.invokeId = this.rafStamps.latestId;
17
+ if (!this.pendingCanvasMutations.has(target)) {
18
+ this.pendingCanvasMutations.set(target, []);
19
+ }
20
+ this.pendingCanvasMutations.get(target).push(mutation);
21
+ };
22
+ this.mutationCb = options.mutationCb;
23
+ this.mirror = options.mirror;
24
+ if (options.recordCanvas === true)
25
+ this.initCanvasMutationObserver(options.win, options.blockClass);
26
+ }
27
+ CanvasManager.prototype.reset = function () {
28
+ this.pendingCanvasMutations.clear();
29
+ this.resetObservers && this.resetObservers();
30
+ };
31
+ CanvasManager.prototype.freeze = function () {
32
+ this.frozen = true;
33
+ };
34
+ CanvasManager.prototype.unfreeze = function () {
35
+ this.frozen = false;
36
+ };
37
+ CanvasManager.prototype.lock = function () {
38
+ this.locked = true;
39
+ };
40
+ CanvasManager.prototype.unlock = function () {
41
+ this.locked = false;
42
+ };
43
+ CanvasManager.prototype.initCanvasMutationObserver = function (win, blockClass) {
44
+ this.startRAFTimestamping();
45
+ this.startPendingCanvasMutationFlusher();
46
+ var canvasContextReset = initCanvasContextObserver(win, blockClass);
47
+ var canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, this.mirror);
48
+ var canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, this.mirror);
49
+ this.resetObservers = function () {
50
+ canvasContextReset();
51
+ canvas2DReset();
52
+ canvasWebGL1and2Reset();
53
+ };
54
+ };
55
+ CanvasManager.prototype.startPendingCanvasMutationFlusher = function () {
56
+ var _this = this;
57
+ requestAnimationFrame(function () { return _this.flushPendingCanvasMutations(); });
58
+ };
59
+ CanvasManager.prototype.startRAFTimestamping = function () {
60
+ var _this = this;
61
+ var setLatestRAFTimestamp = function (timestamp) {
62
+ _this.rafStamps.latestId = timestamp;
63
+ requestAnimationFrame(setLatestRAFTimestamp);
64
+ };
65
+ requestAnimationFrame(setLatestRAFTimestamp);
66
+ };
67
+ CanvasManager.prototype.flushPendingCanvasMutations = function () {
68
+ var _this = this;
69
+ this.pendingCanvasMutations.forEach(function (values, canvas) {
70
+ var id = _this.mirror.getId(canvas);
71
+ _this.flushPendingCanvasMutationFor(canvas, id);
72
+ });
73
+ requestAnimationFrame(function () { return _this.flushPendingCanvasMutations(); });
74
+ };
75
+ CanvasManager.prototype.flushPendingCanvasMutationFor = function (canvas, id) {
76
+ if (this.frozen || this.locked) {
77
+ return;
78
+ }
79
+ var valuesWithType = this.pendingCanvasMutations.get(canvas);
80
+ if (!valuesWithType || id === -1)
81
+ return;
82
+ var values = valuesWithType.map(function (value) {
83
+ value.type; var rest = __rest(value, ["type"]);
84
+ return rest;
85
+ });
86
+ var type = valuesWithType[0].type;
87
+ this.mutationCb({ id: id, type: type, commands: values });
88
+ this.pendingCanvasMutations.delete(canvas);
89
+ };
90
+ return CanvasManager;
91
+ }());
92
+
93
+ export { CanvasManager };
@@ -0,0 +1,30 @@
1
+ import { __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';
2
+ import { patch, isBlocked } from '../../../utils.js';
3
+
4
+ function initCanvasContextObserver(win, blockClass) {
5
+ var handlers = [];
6
+ try {
7
+ var restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {
8
+ return function (contextType) {
9
+ var args = [];
10
+ for (var _i = 1; _i < arguments.length; _i++) {
11
+ args[_i - 1] = arguments[_i];
12
+ }
13
+ if (!isBlocked(this, blockClass)) {
14
+ if (!('__context' in this))
15
+ this.__context = contextType;
16
+ }
17
+ return original.apply(this, __spreadArray([contextType], __read(args), false));
18
+ };
19
+ });
20
+ handlers.push(restoreHandler);
21
+ }
22
+ catch (_a) {
23
+ console.error('failed to patch HTMLCanvasElement.prototype.getContext');
24
+ }
25
+ return function () {
26
+ handlers.forEach(function (h) { return h(); });
27
+ };
28
+ }
29
+
30
+ export default initCanvasContextObserver;
@@ -0,0 +1,116 @@
1
+ import { __spreadArray, __read } from '../../../../ext/tslib/tslib.es6.js';
2
+ import { encode } from '../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';
3
+
4
+ var webGLVarMap = new Map();
5
+ function variableListFor(ctx, ctor) {
6
+ var contextMap = webGLVarMap.get(ctx);
7
+ if (!contextMap) {
8
+ contextMap = new Map();
9
+ webGLVarMap.set(ctx, contextMap);
10
+ }
11
+ if (!contextMap.has(ctor)) {
12
+ contextMap.set(ctor, []);
13
+ }
14
+ return contextMap.get(ctor);
15
+ }
16
+ var saveWebGLVar = function (value, win, ctx) {
17
+ if (!value ||
18
+ !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))
19
+ return;
20
+ var name = value.constructor.name;
21
+ var list = variableListFor(ctx, name);
22
+ var index = list.indexOf(value);
23
+ if (index === -1) {
24
+ index = list.length;
25
+ list.push(value);
26
+ }
27
+ return index;
28
+ };
29
+ function serializeArg(value, win, ctx) {
30
+ if (value instanceof Array) {
31
+ return value.map(function (arg) { return serializeArg(arg, win, ctx); });
32
+ }
33
+ else if (value === null) {
34
+ return value;
35
+ }
36
+ else if (value instanceof Float32Array ||
37
+ value instanceof Float64Array ||
38
+ value instanceof Int32Array ||
39
+ value instanceof Uint32Array ||
40
+ value instanceof Uint8Array ||
41
+ value instanceof Uint16Array ||
42
+ value instanceof Int16Array ||
43
+ value instanceof Int8Array ||
44
+ value instanceof Uint8ClampedArray) {
45
+ var name_1 = value.constructor.name;
46
+ return {
47
+ rr_type: name_1,
48
+ args: [Object.values(value)],
49
+ };
50
+ }
51
+ else if (value instanceof ArrayBuffer) {
52
+ var name_2 = value.constructor.name;
53
+ var base64 = encode(value);
54
+ return {
55
+ rr_type: name_2,
56
+ base64: base64,
57
+ };
58
+ }
59
+ else if (value instanceof DataView) {
60
+ var name_3 = value.constructor.name;
61
+ return {
62
+ rr_type: name_3,
63
+ args: [
64
+ serializeArg(value.buffer, win, ctx),
65
+ value.byteOffset,
66
+ value.byteLength,
67
+ ],
68
+ };
69
+ }
70
+ else if (value instanceof HTMLImageElement) {
71
+ var name_4 = value.constructor.name;
72
+ var src = value.src;
73
+ return {
74
+ rr_type: name_4,
75
+ src: src,
76
+ };
77
+ }
78
+ else if (value instanceof ImageData) {
79
+ var name_5 = value.constructor.name;
80
+ return {
81
+ rr_type: name_5,
82
+ args: [serializeArg(value.data, win, ctx), value.width, value.height],
83
+ };
84
+ }
85
+ else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {
86
+ var name_6 = value.constructor.name;
87
+ var index = saveWebGLVar(value, win, ctx);
88
+ return {
89
+ rr_type: name_6,
90
+ index: index,
91
+ };
92
+ }
93
+ return value;
94
+ }
95
+ var serializeArgs = function (args, win, ctx) {
96
+ return __spreadArray([], __read(args), false).map(function (arg) { return serializeArg(arg, win, ctx); });
97
+ };
98
+ var isInstanceOfWebGLObject = function (value, win) {
99
+ var webGLConstructorNames = [
100
+ 'WebGLActiveInfo',
101
+ 'WebGLBuffer',
102
+ 'WebGLFramebuffer',
103
+ 'WebGLProgram',
104
+ 'WebGLRenderbuffer',
105
+ 'WebGLShader',
106
+ 'WebGLShaderPrecisionFormat',
107
+ 'WebGLTexture',
108
+ 'WebGLUniformLocation',
109
+ 'WebGLVertexArrayObject',
110
+ 'WebGLVertexArrayObjectOES',
111
+ ];
112
+ var supportedWebGLConstructorNames = webGLConstructorNames.filter(function (name) { return typeof win[name] === 'function'; });
113
+ return Boolean(supportedWebGLConstructorNames.find(function (name) { return value instanceof win[name]; }));
114
+ };
115
+
116
+ export { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };
@@ -0,0 +1,78 @@
1
+ import { __spreadArray, __read, __values } from '../../../../ext/tslib/tslib.es6.js';
2
+ import { CanvasContext } from '../../../types.js';
3
+ import { patch, isBlocked, hookSetter } from '../../../utils.js';
4
+ import { saveWebGLVar, serializeArgs } from './serialize-args.js';
5
+
6
+ function patchGLPrototype(prototype, type, cb, blockClass, mirror, win) {
7
+ var e_1, _a;
8
+ var handlers = [];
9
+ var props = Object.getOwnPropertyNames(prototype);
10
+ var _loop_1 = function (prop) {
11
+ try {
12
+ if (typeof prototype[prop] !== 'function') {
13
+ return "continue";
14
+ }
15
+ var restoreHandler = patch(prototype, prop, function (original) {
16
+ return function () {
17
+ var args = [];
18
+ for (var _i = 0; _i < arguments.length; _i++) {
19
+ args[_i] = arguments[_i];
20
+ }
21
+ var result = original.apply(this, args);
22
+ saveWebGLVar(result, win, prototype);
23
+ if (!isBlocked(this.canvas, blockClass)) {
24
+ var id = mirror.getId(this.canvas);
25
+ var recordArgs = serializeArgs(__spreadArray([], __read(args), false), win, prototype);
26
+ var mutation = {
27
+ type: type,
28
+ property: prop,
29
+ args: recordArgs,
30
+ };
31
+ cb(this.canvas, mutation);
32
+ }
33
+ return result;
34
+ };
35
+ });
36
+ handlers.push(restoreHandler);
37
+ }
38
+ catch (_b) {
39
+ var hookHandler = hookSetter(prototype, prop, {
40
+ set: function (v) {
41
+ cb(this.canvas, {
42
+ type: type,
43
+ property: prop,
44
+ args: [v],
45
+ setter: true,
46
+ });
47
+ },
48
+ });
49
+ handlers.push(hookHandler);
50
+ }
51
+ };
52
+ try {
53
+ for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {
54
+ var prop = props_1_1.value;
55
+ _loop_1(prop);
56
+ }
57
+ }
58
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
59
+ finally {
60
+ try {
61
+ if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);
62
+ }
63
+ finally { if (e_1) throw e_1.error; }
64
+ }
65
+ return handlers;
66
+ }
67
+ function initCanvasWebGLMutationObserver(cb, win, blockClass, mirror) {
68
+ var handlers = [];
69
+ handlers.push.apply(handlers, __spreadArray([], __read(patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, mirror, win)), false));
70
+ if (typeof win.WebGL2RenderingContext !== 'undefined') {
71
+ handlers.push.apply(handlers, __spreadArray([], __read(patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, mirror, win)), false));
72
+ }
73
+ return function () {
74
+ handlers.forEach(function (h) { return h(); });
75
+ };
76
+ }
77
+
78
+ export default initCanvasWebGLMutationObserver;
@@ -0,0 +1,45 @@
1
+ import { __assign } from '../../ext/tslib/tslib.es6.js';
2
+ import { initMutationObserver, initScrollObserver } from './observer.js';
3
+ import { patch } from '../utils.js';
4
+
5
+ var ShadowDomManager = (function () {
6
+ function ShadowDomManager(options) {
7
+ this.restorePatches = [];
8
+ this.mutationCb = options.mutationCb;
9
+ this.scrollCb = options.scrollCb;
10
+ this.bypassOptions = options.bypassOptions;
11
+ this.mirror = options.mirror;
12
+ var manager = this;
13
+ this.restorePatches.push(patch(HTMLElement.prototype, 'attachShadow', function (original) {
14
+ return function () {
15
+ var shadowRoot = original.apply(this, arguments);
16
+ if (this.shadowRoot)
17
+ manager.addShadowRoot(this.shadowRoot, this.ownerDocument);
18
+ return shadowRoot;
19
+ };
20
+ }));
21
+ }
22
+ ShadowDomManager.prototype.addShadowRoot = function (shadowRoot, doc) {
23
+ initMutationObserver(__assign(__assign({}, this.bypassOptions), { doc: doc, mutationCb: this.mutationCb, mirror: this.mirror, shadowDomManager: this }), shadowRoot);
24
+ initScrollObserver(__assign(__assign({}, this.bypassOptions), { scrollCb: this.scrollCb, doc: shadowRoot, mirror: this.mirror }));
25
+ };
26
+ ShadowDomManager.prototype.observeAttachShadow = function (iframeElement) {
27
+ if (iframeElement.contentWindow) {
28
+ var manager_1 = this;
29
+ this.restorePatches.push(patch(iframeElement.contentWindow.HTMLElement.prototype, 'attachShadow', function (original) {
30
+ return function () {
31
+ var shadowRoot = original.apply(this, arguments);
32
+ if (this.shadowRoot)
33
+ manager_1.addShadowRoot(this.shadowRoot, iframeElement.contentDocument);
34
+ return shadowRoot;
35
+ };
36
+ }));
37
+ }
38
+ };
39
+ ShadowDomManager.prototype.reset = function () {
40
+ this.restorePatches.forEach(function (restorePatch) { return restorePatch(); });
41
+ };
42
+ return ShadowDomManager;
43
+ }());
44
+
45
+ export { ShadowDomManager };
@@ -0,0 +1,25 @@
1
+ function canvasMutation(_a) {
2
+ var event = _a.event, mutation = _a.mutation, target = _a.target, imageMap = _a.imageMap, errorHandler = _a.errorHandler;
3
+ try {
4
+ var ctx = target.getContext('2d');
5
+ if (mutation.setter) {
6
+ ctx[mutation.property] = mutation.args[0];
7
+ return;
8
+ }
9
+ var original = ctx[mutation.property];
10
+ if (mutation.property === 'drawImage' &&
11
+ typeof mutation.args[0] === 'string') {
12
+ var image = imageMap.get(event);
13
+ mutation.args[0] = image;
14
+ original.apply(ctx, mutation.args);
15
+ }
16
+ else {
17
+ original.apply(ctx, mutation.args);
18
+ }
19
+ }
20
+ catch (error) {
21
+ errorHandler(mutation, error);
22
+ }
23
+ }
24
+
25
+ export default canvasMutation;
@@ -0,0 +1,35 @@
1
+ import { CanvasContext } from '../../types.js';
2
+ import webglMutation from './webgl.js';
3
+ import canvasMutation$1 from './2d.js';
4
+
5
+ function canvasMutation(_a) {
6
+ var event = _a.event, mutation = _a.mutation, target = _a.target, imageMap = _a.imageMap, errorHandler = _a.errorHandler;
7
+ try {
8
+ var mutations = 'commands' in mutation ? mutation.commands : [mutation];
9
+ if ([CanvasContext.WebGL, CanvasContext.WebGL2].includes(mutation.type)) {
10
+ return mutations.forEach(function (command) {
11
+ webglMutation({
12
+ mutation: command,
13
+ type: mutation.type,
14
+ target: target,
15
+ imageMap: imageMap,
16
+ errorHandler: errorHandler,
17
+ });
18
+ });
19
+ }
20
+ return mutations.forEach(function (command) {
21
+ canvasMutation$1({
22
+ event: event,
23
+ mutation: command,
24
+ target: target,
25
+ imageMap: imageMap,
26
+ errorHandler: errorHandler,
27
+ });
28
+ });
29
+ }
30
+ catch (error) {
31
+ errorHandler(mutation, error);
32
+ }
33
+ }
34
+
35
+ export default canvasMutation;
@@ -0,0 +1,124 @@
1
+ import { __spreadArray, __read } from '../../../ext/tslib/tslib.es6.js';
2
+ import { decode } from '../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';
3
+ import { CanvasContext } from '../../types.js';
4
+
5
+ var webGLVarMap = new Map();
6
+ function variableListFor(ctx, ctor) {
7
+ var contextMap = webGLVarMap.get(ctx);
8
+ if (!contextMap) {
9
+ contextMap = new Map();
10
+ webGLVarMap.set(ctx, contextMap);
11
+ }
12
+ if (!contextMap.has(ctor)) {
13
+ contextMap.set(ctor, []);
14
+ }
15
+ return contextMap.get(ctor);
16
+ }
17
+ function getContext(target, type) {
18
+ try {
19
+ if (type === CanvasContext.WebGL) {
20
+ return (target.getContext('webgl') || target.getContext('experimental-webgl'));
21
+ }
22
+ return target.getContext('webgl2');
23
+ }
24
+ catch (e) {
25
+ return null;
26
+ }
27
+ }
28
+ var WebGLVariableConstructorsNames = [
29
+ 'WebGLActiveInfo',
30
+ 'WebGLBuffer',
31
+ 'WebGLFramebuffer',
32
+ 'WebGLProgram',
33
+ 'WebGLRenderbuffer',
34
+ 'WebGLShader',
35
+ 'WebGLShaderPrecisionFormat',
36
+ 'WebGLTexture',
37
+ 'WebGLUniformLocation',
38
+ 'WebGLVertexArrayObject',
39
+ ];
40
+ function saveToWebGLVarMap(ctx, result) {
41
+ if (!(result === null || result === void 0 ? void 0 : result.constructor))
42
+ return;
43
+ var name = result.constructor.name;
44
+ if (!WebGLVariableConstructorsNames.includes(name))
45
+ return;
46
+ var variables = variableListFor(ctx, name);
47
+ if (!variables.includes(result))
48
+ variables.push(result);
49
+ }
50
+ function deserializeArg(imageMap, ctx) {
51
+ return function (arg) {
52
+ if (arg && typeof arg === 'object' && 'rr_type' in arg) {
53
+ if ('index' in arg) {
54
+ var name_1 = arg.rr_type, index = arg.index;
55
+ return variableListFor(ctx, name_1)[index];
56
+ }
57
+ else if ('args' in arg) {
58
+ var name_2 = arg.rr_type, args = arg.args;
59
+ var ctor = window[name_2];
60
+ return new (ctor.bind.apply(ctor, __spreadArray([void 0], __read(args.map(deserializeArg(imageMap, ctx))), false)))();
61
+ }
62
+ else if ('base64' in arg) {
63
+ return decode(arg.base64);
64
+ }
65
+ else if ('src' in arg) {
66
+ var image = imageMap.get(arg.src);
67
+ if (image) {
68
+ return image;
69
+ }
70
+ else {
71
+ var image_1 = new Image();
72
+ image_1.src = arg.src;
73
+ imageMap.set(arg.src, image_1);
74
+ return image_1;
75
+ }
76
+ }
77
+ }
78
+ else if (Array.isArray(arg)) {
79
+ return arg.map(deserializeArg(imageMap, ctx));
80
+ }
81
+ return arg;
82
+ };
83
+ }
84
+ function webglMutation(_a) {
85
+ var mutation = _a.mutation, target = _a.target, type = _a.type, imageMap = _a.imageMap, errorHandler = _a.errorHandler;
86
+ try {
87
+ var ctx = getContext(target, type);
88
+ if (!ctx)
89
+ return;
90
+ if (mutation.setter) {
91
+ ctx[mutation.property] = mutation.args[0];
92
+ return;
93
+ }
94
+ var original = ctx[mutation.property];
95
+ var args = mutation.args.map(deserializeArg(imageMap, ctx));
96
+ var result = original.apply(ctx, args);
97
+ saveToWebGLVarMap(ctx, result);
98
+ var debugMode = false;
99
+ if (debugMode) {
100
+ if (mutation.property === 'compileShader') {
101
+ if (!ctx.getShaderParameter(args[0], ctx.COMPILE_STATUS))
102
+ console.warn('something went wrong in replay', ctx.getShaderInfoLog(args[0]));
103
+ }
104
+ else if (mutation.property === 'linkProgram') {
105
+ ctx.validateProgram(args[0]);
106
+ if (!ctx.getProgramParameter(args[0], ctx.LINK_STATUS))
107
+ console.warn('something went wrong in replay', ctx.getProgramInfoLog(args[0]));
108
+ }
109
+ var webglError = ctx.getError();
110
+ if (webglError !== ctx.NO_ERROR) {
111
+ console.warn.apply(console, __spreadArray(['WEBGL ERROR',
112
+ webglError,
113
+ 'on command:',
114
+ mutation.property], __read(args), false));
115
+ }
116
+ }
117
+ }
118
+ catch (error) {
119
+ errorHandler(mutation, error);
120
+ }
121
+ }
122
+
123
+ export default webglMutation;
124
+ export { deserializeArg, variableListFor };