@highlight-run/rrweb 2.0.1 → 2.0.4

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 (117) hide show
  1. package/dist/plugins/console-record.js +408 -609
  2. package/dist/plugins/console-record.min.js +12 -15
  3. package/dist/plugins/console-record.min.js.map +1 -1
  4. package/dist/plugins/console-replay.js +142 -271
  5. package/dist/plugins/console-replay.min.js +4 -15
  6. package/dist/plugins/console-replay.min.js.map +1 -1
  7. package/dist/plugins/sequential-id-record.js +23 -26
  8. package/dist/plugins/sequential-id-record.min.js +1 -1
  9. package/dist/plugins/sequential-id-record.min.js.map +1 -1
  10. package/dist/plugins/sequential-id-replay.js +26 -30
  11. package/dist/plugins/sequential-id-replay.min.js +1 -1
  12. package/dist/plugins/sequential-id-replay.min.js.map +1 -1
  13. package/dist/record/rrweb-record-pack.js +63 -146
  14. package/dist/record/rrweb-record-pack.min.js +3 -15
  15. package/dist/record/rrweb-record-pack.min.js.map +1 -1
  16. package/dist/record/rrweb-record.js +3002 -3118
  17. package/dist/record/rrweb-record.min.js +4 -15
  18. package/dist/record/rrweb-record.min.js.map +1 -1
  19. package/dist/replay/rrweb-replay-unpack.js +4354 -4054
  20. package/dist/replay/rrweb-replay-unpack.min.js +5 -17
  21. package/dist/replay/rrweb-replay-unpack.min.js.map +1 -1
  22. package/dist/replay/rrweb-replay.js +4286 -3984
  23. package/dist/replay/rrweb-replay.min.js +5 -17
  24. package/dist/replay/rrweb-replay.min.js.map +1 -1
  25. package/dist/rrweb-all.js +7634 -7453
  26. package/dist/rrweb-all.min.js +16 -17
  27. package/dist/rrweb-all.min.js.map +1 -1
  28. package/dist/rrweb.js +7339 -7075
  29. package/dist/rrweb.min.js +6 -17
  30. package/dist/rrweb.min.js.map +1 -1
  31. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +12 -0
  32. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +7 -0
  33. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +31 -0
  34. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +11 -0
  35. package/es/rrweb/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +18 -0
  36. package/es/rrweb/_virtual/image-bitmap-data-url-worker.js +6 -0
  37. package/es/rrweb/ext/mitt/dist/mitt.es.js +1 -1
  38. package/es/rrweb/ext/tslib/tslib.es6.js +38 -0
  39. package/es/rrweb/packages/rrdom/es/virtual-dom.js +1099 -0
  40. package/es/rrweb/packages/rrweb/src/index.js +6 -4
  41. package/es/rrweb/packages/rrweb/src/packer/base.js +1 -1
  42. package/es/rrweb/packages/rrweb/src/packer/pack.js +4 -5
  43. package/es/rrweb/packages/rrweb/src/packer/unpack.js +24 -24
  44. package/es/rrweb/packages/rrweb/src/plugins/console/record/error-stack-parser.js +175 -176
  45. package/es/rrweb/packages/rrweb/src/plugins/console/record/index.js +109 -128
  46. package/es/rrweb/packages/rrweb/src/plugins/console/record/stringify.js +125 -138
  47. package/es/rrweb/packages/rrweb/src/plugins/console/replay/index.js +88 -105
  48. package/es/rrweb/packages/rrweb/src/plugins/sequential-id/record/index.js +19 -20
  49. package/es/rrweb/packages/rrweb/src/plugins/sequential-id/replay/index.js +25 -25
  50. package/es/rrweb/packages/rrweb/src/record/iframe-manager.js +29 -30
  51. package/es/rrweb/packages/rrweb/src/record/index.js +348 -373
  52. package/es/rrweb/packages/rrweb/src/record/mutation.js +487 -528
  53. package/es/rrweb/packages/rrweb/src/record/observer.js +584 -659
  54. package/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js +44 -73
  55. package/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js +166 -87
  56. package/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js +21 -26
  57. package/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js +119 -112
  58. package/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js +53 -72
  59. package/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js +38 -40
  60. package/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js +31 -0
  61. package/es/rrweb/packages/rrweb/src/replay/canvas/2d.js +27 -23
  62. package/es/rrweb/packages/rrweb/src/replay/canvas/deserialize-args.js +67 -0
  63. package/es/rrweb/packages/rrweb/src/replay/canvas/index.js +37 -29
  64. package/es/rrweb/packages/rrweb/src/replay/canvas/webgl.js +58 -120
  65. package/es/rrweb/packages/rrweb/src/replay/index.js +1545 -1854
  66. package/es/rrweb/packages/rrweb/src/replay/machine.js +275 -315
  67. package/es/rrweb/packages/rrweb/src/replay/smoothscroll.js +216 -218
  68. package/es/rrweb/packages/rrweb/src/replay/styles/inject-style.js +7 -7
  69. package/es/rrweb/packages/rrweb/src/replay/timer.js +87 -91
  70. package/es/rrweb/packages/rrweb/src/types.js +72 -72
  71. package/es/rrweb/packages/rrweb/src/utils.js +312 -506
  72. package/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js +195 -71
  73. package/lib/plugins/console-record.js +469 -627
  74. package/lib/plugins/console-replay.js +198 -268
  75. package/lib/plugins/sequential-id-record.js +19 -20
  76. package/lib/plugins/sequential-id-replay.js +25 -25
  77. package/lib/record/rrweb-record-pack.js +184 -139
  78. package/lib/record/rrweb-record.js +2473 -2425
  79. package/lib/replay/rrweb-replay-unpack.js +3797 -3343
  80. package/lib/replay/rrweb-replay.js +3742 -3288
  81. package/lib/rrweb-all.js +6725 -6247
  82. package/lib/rrweb.js +6157 -5632
  83. package/package.json +14 -13
  84. package/typings/packer/base.d.ts +1 -1
  85. package/typings/plugins/console/record/index.d.ts +1 -1
  86. package/typings/plugins/console/record/stringify.d.ts +1 -1
  87. package/typings/plugins/sequential-id/record/index.d.ts +1 -1
  88. package/typings/plugins/sequential-id/replay/index.d.ts +1 -1
  89. package/typings/record/iframe-manager.d.ts +3 -3
  90. package/typings/record/index.d.ts +1 -1
  91. package/typings/record/mutation.d.ts +2 -1
  92. package/typings/record/observers/canvas/2d.d.ts +2 -1
  93. package/typings/record/observers/canvas/canvas-manager.d.ts +5 -2
  94. package/typings/record/observers/canvas/canvas.d.ts +1 -1
  95. package/typings/record/observers/canvas/serialize-args.d.ts +5 -5
  96. package/typings/record/observers/canvas/webgl.d.ts +2 -1
  97. package/typings/record/shadow-dom-manager.d.ts +2 -1
  98. package/typings/record/stylesheet-manager.d.ts +12 -0
  99. package/typings/record/workers/image-bitmap-data-url-worker.d.ts +5 -0
  100. package/typings/replay/canvas/2d.d.ts +3 -3
  101. package/typings/replay/canvas/deserialize-args.d.ts +7 -0
  102. package/typings/replay/canvas/index.d.ts +4 -3
  103. package/typings/replay/canvas/webgl.d.ts +3 -5
  104. package/typings/replay/index.d.ts +7 -10
  105. package/typings/types.d.ts +45 -17
  106. package/typings/utils.d.ts +17 -44
  107. package/dist/replay/rrweb-replay-unpack.min.css +0 -2
  108. package/dist/replay/rrweb-replay-unpack.min.css.map +0 -1
  109. package/dist/replay/rrweb-replay.min.css +0 -2
  110. package/dist/replay/rrweb-replay.min.css.map +0 -1
  111. package/dist/rrweb-all.min.css +0 -2
  112. package/dist/rrweb-all.min.css.map +0 -1
  113. package/dist/rrweb.min.css +0 -2
  114. package/dist/rrweb.min.css.map +0 -1
  115. package/es/rrweb/packages/rrweb/ext/tslib/tslib.es6.js +0 -78
  116. package/es/rrweb/packages/rrweb/src/replay/virtual-styles.js +0 -121
  117. package/typings/replay/virtual-styles.d.ts +0 -43
@@ -1,321 +1,281 @@
1
- import { __assign, __values } from '../../ext/tslib/tslib.es6.js';
2
- import { interpret as v, createMachine as s, assign as o } from '../../../../ext/@xstate/fsm/es/index.js';
1
+ import { interpret as v, createMachine as s, assign as o } from './../../../../ext/@xstate/fsm/es/index.js';
3
2
  import { EventType, IncrementalSource, ReplayerEvents } from '../types.js';
4
3
  import { addDelay } from './timer.js';
5
4
 
6
- function discardPriorSnapshots(events, baselineTime) {
7
- for (var idx = events.length - 1; idx >= 0; idx--) {
8
- var event_1 = events[idx];
9
- if (event_1.type === EventType.Meta) {
10
- if (event_1.timestamp <= baselineTime) {
11
- return events.slice(idx);
12
- }
13
- }
14
- }
15
- return events;
16
- }
17
- function createPlayerService(context, _a) {
18
- var getCastFn = _a.getCastFn, applyEventsSynchronously = _a.applyEventsSynchronously, emitter = _a.emitter;
19
- var playerMachine = s({
20
- id: 'player',
21
- context: context,
22
- initial: 'paused',
23
- states: {
24
- playing: {
25
- on: {
26
- PAUSE: {
27
- target: 'paused',
28
- actions: ['pause'],
29
- },
30
- CAST_EVENT: {
31
- target: 'playing',
32
- actions: 'castEvent',
33
- },
34
- END: {
35
- target: 'paused',
36
- actions: ['resetLastPlayedEvent', 'pause'],
37
- },
38
- ADD_EVENT: {
39
- target: 'playing',
40
- actions: ['addEvent'],
41
- },
42
- REPLACE_EVENTS: {
43
- target: 'playing',
44
- actions: ['replaceEvents'],
45
- },
46
- },
47
- },
48
- paused: {
49
- on: {
50
- PLAY: {
51
- target: 'playing',
52
- actions: ['recordTimeOffset', 'play'],
53
- },
54
- CAST_EVENT: {
55
- target: 'paused',
56
- actions: 'castEvent',
57
- },
58
- TO_LIVE: {
59
- target: 'live',
60
- actions: ['startLive'],
61
- },
62
- ADD_EVENT: {
63
- target: 'paused',
64
- actions: ['addEvent'],
65
- },
66
- REPLACE_EVENTS: {
67
- target: 'paused',
68
- actions: ['replaceEvents'],
69
- },
70
- },
71
- },
72
- live: {
73
- on: {
74
- ADD_EVENT: {
75
- target: 'live',
76
- actions: ['addEvent'],
77
- },
78
- CAST_EVENT: {
79
- target: 'live',
80
- actions: ['castEvent'],
81
- },
82
- },
83
- },
84
- },
85
- }, {
86
- actions: {
87
- castEvent: o({
88
- lastPlayedEvent: function (ctx, event) {
89
- if (event.type === 'CAST_EVENT') {
90
- return event.payload.event;
91
- }
92
- return ctx.lastPlayedEvent;
93
- },
94
- }),
95
- recordTimeOffset: o(function (ctx, event) {
96
- var timeOffset = ctx.timeOffset;
97
- if ('payload' in event && 'timeOffset' in event.payload) {
98
- timeOffset = event.payload.timeOffset;
99
- }
100
- return __assign(__assign({}, ctx), { timeOffset: timeOffset, baselineTime: ctx.events[0].timestamp + timeOffset });
101
- }),
102
- play: function (ctx) {
103
- var e_1, _a, e_2, _b;
104
- var _c;
105
- var timer = ctx.timer, events = ctx.events, baselineTime = ctx.baselineTime, lastPlayedEvent = ctx.lastPlayedEvent;
106
- timer.clear();
107
- try {
108
- for (var events_1 = __values(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) {
109
- var event_2 = events_1_1.value;
110
- addDelay(event_2, baselineTime);
111
- }
112
- }
113
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
114
- finally {
115
- try {
116
- if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);
117
- }
118
- finally { if (e_1) throw e_1.error; }
119
- }
120
- var neededEvents = discardPriorSnapshots(events, baselineTime);
121
- var lastPlayedTimestamp = lastPlayedEvent === null || lastPlayedEvent === void 0 ? void 0 : lastPlayedEvent.timestamp;
122
- if ((lastPlayedEvent === null || lastPlayedEvent === void 0 ? void 0 : lastPlayedEvent.type) === EventType.IncrementalSnapshot &&
123
- lastPlayedEvent.data.source === IncrementalSource.MouseMove) {
124
- lastPlayedTimestamp =
125
- lastPlayedEvent.timestamp +
126
- ((_c = lastPlayedEvent.data.positions[0]) === null || _c === void 0 ? void 0 : _c.timeOffset);
127
- }
128
- if (baselineTime < (lastPlayedTimestamp || 0)) {
129
- emitter.emit(ReplayerEvents.PlayBack);
130
- }
131
- var syncEvents = new Array();
132
- var actions = new Array();
133
- var _loop_1 = function (event_3) {
134
- if (lastPlayedTimestamp &&
135
- lastPlayedTimestamp < baselineTime &&
136
- (event_3.timestamp <= lastPlayedTimestamp ||
137
- event_3 === lastPlayedEvent)) {
138
- return "continue";
139
- }
140
- if (event_3.timestamp < baselineTime) {
141
- syncEvents.push(event_3);
142
- }
143
- else {
144
- var castFn_1 = getCastFn(event_3, false);
145
- actions.push({
146
- doAction: function () {
147
- castFn_1();
148
- },
149
- delay: event_3.delay,
150
- });
151
- }
152
- };
153
- try {
154
- for (var neededEvents_1 = __values(neededEvents), neededEvents_1_1 = neededEvents_1.next(); !neededEvents_1_1.done; neededEvents_1_1 = neededEvents_1.next()) {
155
- var event_3 = neededEvents_1_1.value;
156
- _loop_1(event_3);
157
- }
158
- }
159
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
160
- finally {
161
- try {
162
- if (neededEvents_1_1 && !neededEvents_1_1.done && (_b = neededEvents_1.return)) _b.call(neededEvents_1);
163
- }
164
- finally { if (e_2) throw e_2.error; }
165
- }
166
- applyEventsSynchronously(syncEvents);
167
- emitter.emit(ReplayerEvents.Flush);
168
- timer.addActions(actions);
169
- timer.start();
170
- },
171
- pause: function (ctx) {
172
- ctx.timer.clear();
173
- },
174
- resetLastPlayedEvent: o(function (ctx) {
175
- return __assign(__assign({}, ctx), { lastPlayedEvent: null });
176
- }),
177
- startLive: o({
178
- baselineTime: function (ctx, event) {
179
- ctx.timer.toggleLiveMode(true);
180
- ctx.timer.start();
181
- if (event.type === 'TO_LIVE' && event.payload.baselineTime) {
182
- return event.payload.baselineTime;
183
- }
184
- return Date.now();
185
- },
186
- }),
187
- replaceEvents: o(function (ctx, machineEvent) {
188
- var e_3, _a;
189
- var curEvents = ctx.events, timer = ctx.timer, baselineTime = ctx.baselineTime;
190
- if (machineEvent.type === 'REPLACE_EVENTS') {
191
- var newEvents = machineEvent.payload.events;
192
- curEvents.length = 0;
193
- var actions = [];
194
- var _loop_2 = function (event_4) {
195
- addDelay(event_4, baselineTime);
196
- curEvents.push(event_4);
197
- if (event_4.timestamp >= timer.timeOffset + baselineTime) {
198
- var castFn_2 = getCastFn(event_4, false);
199
- actions.push({
200
- doAction: function () {
201
- castFn_2();
202
- },
203
- delay: event_4.delay,
204
- });
205
- }
206
- };
207
- try {
208
- for (var newEvents_1 = __values(newEvents), newEvents_1_1 = newEvents_1.next(); !newEvents_1_1.done; newEvents_1_1 = newEvents_1.next()) {
209
- var event_4 = newEvents_1_1.value;
210
- _loop_2(event_4);
211
- }
212
- }
213
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
214
- finally {
215
- try {
216
- if (newEvents_1_1 && !newEvents_1_1.done && (_a = newEvents_1.return)) _a.call(newEvents_1);
217
- }
218
- finally { if (e_3) throw e_3.error; }
219
- }
220
- if (timer.isActive()) {
221
- timer.replaceActions(actions);
222
- }
223
- }
224
- return __assign(__assign({}, ctx), { events: curEvents });
225
- }),
226
- addEvent: o(function (ctx, machineEvent) {
227
- var baselineTime = ctx.baselineTime, timer = ctx.timer, events = ctx.events;
228
- if (machineEvent.type === 'ADD_EVENT') {
229
- var event_5 = machineEvent.payload.event;
230
- addDelay(event_5, baselineTime);
231
- var end = events.length - 1;
232
- if (!events[end] || events[end].timestamp <= event_5.timestamp) {
233
- events.push(event_5);
234
- }
235
- else {
236
- var insertionIndex = -1;
237
- var start = 0;
238
- while (start <= end) {
239
- var mid = Math.floor((start + end) / 2);
240
- if (events[mid].timestamp <= event_5.timestamp) {
241
- start = mid + 1;
242
- }
243
- else {
244
- end = mid - 1;
245
- }
246
- }
247
- if (insertionIndex === -1) {
248
- insertionIndex = start;
249
- }
250
- events.splice(insertionIndex, 0, event_5);
251
- }
252
- var isSync = event_5.timestamp < baselineTime;
253
- var castFn_3 = getCastFn(event_5, isSync);
254
- if (isSync) {
255
- castFn_3();
256
- }
257
- else if (timer.isActive()) {
258
- timer.addAction({
259
- doAction: function () {
260
- castFn_3();
261
- },
262
- delay: event_5.delay,
263
- });
264
- }
265
- }
266
- return __assign(__assign({}, ctx), { events: events });
267
- }),
268
- },
269
- });
270
- return v(playerMachine);
271
- }
272
- function createSpeedService(context) {
273
- var speedMachine = s({
274
- id: 'speed',
275
- context: context,
276
- initial: 'normal',
277
- states: {
278
- normal: {
279
- on: {
280
- FAST_FORWARD: {
281
- target: 'skipping',
282
- actions: ['recordSpeed', 'setSpeed'],
283
- },
284
- SET_SPEED: {
285
- target: 'normal',
286
- actions: ['setSpeed'],
287
- },
288
- },
289
- },
290
- skipping: {
291
- on: {
292
- BACK_TO_NORMAL: {
293
- target: 'normal',
294
- actions: ['restoreSpeed'],
295
- },
296
- SET_SPEED: {
297
- target: 'normal',
298
- actions: ['setSpeed'],
299
- },
300
- },
301
- },
302
- },
303
- }, {
304
- actions: {
305
- setSpeed: function (ctx, event) {
306
- if ('payload' in event) {
307
- ctx.timer.setSpeed(event.payload.speed);
308
- }
309
- },
310
- recordSpeed: o({
311
- normalSpeed: function (ctx) { return ctx.timer.speed; },
312
- }),
313
- restoreSpeed: function (ctx) {
314
- ctx.timer.setSpeed(ctx.normalSpeed);
315
- },
316
- },
317
- });
318
- return v(speedMachine);
5
+ function discardPriorSnapshots(events, baselineTime) {
6
+ for (let idx = events.length - 1; idx >= 0; idx--) {
7
+ const event = events[idx];
8
+ if (event.type === EventType.Meta) {
9
+ if (event.timestamp <= baselineTime) {
10
+ return events.slice(idx);
11
+ }
12
+ }
13
+ }
14
+ return events;
15
+ }
16
+ function createPlayerService(context, { getCastFn, applyEventsSynchronously, emitter }) {
17
+ const playerMachine = s({
18
+ id: 'player',
19
+ context,
20
+ initial: 'paused',
21
+ states: {
22
+ playing: {
23
+ on: {
24
+ PAUSE: {
25
+ target: 'paused',
26
+ actions: ['pause'],
27
+ },
28
+ CAST_EVENT: {
29
+ target: 'playing',
30
+ actions: 'castEvent',
31
+ },
32
+ END: {
33
+ target: 'paused',
34
+ actions: ['resetLastPlayedEvent', 'pause'],
35
+ },
36
+ ADD_EVENT: {
37
+ target: 'playing',
38
+ actions: ['addEvent'],
39
+ },
40
+ REPLACE_EVENTS: {
41
+ target: 'playing',
42
+ actions: ['replaceEvents'],
43
+ },
44
+ },
45
+ },
46
+ paused: {
47
+ on: {
48
+ PLAY: {
49
+ target: 'playing',
50
+ actions: ['recordTimeOffset', 'play'],
51
+ },
52
+ CAST_EVENT: {
53
+ target: 'paused',
54
+ actions: 'castEvent',
55
+ },
56
+ TO_LIVE: {
57
+ target: 'live',
58
+ actions: ['startLive'],
59
+ },
60
+ ADD_EVENT: {
61
+ target: 'paused',
62
+ actions: ['addEvent'],
63
+ },
64
+ REPLACE_EVENTS: {
65
+ target: 'paused',
66
+ actions: ['replaceEvents'],
67
+ },
68
+ },
69
+ },
70
+ live: {
71
+ on: {
72
+ ADD_EVENT: {
73
+ target: 'live',
74
+ actions: ['addEvent'],
75
+ },
76
+ CAST_EVENT: {
77
+ target: 'live',
78
+ actions: ['castEvent'],
79
+ },
80
+ },
81
+ },
82
+ },
83
+ }, {
84
+ actions: {
85
+ castEvent: o({
86
+ lastPlayedEvent: (ctx, event) => {
87
+ if (event.type === 'CAST_EVENT') {
88
+ return event.payload.event;
89
+ }
90
+ return ctx.lastPlayedEvent;
91
+ },
92
+ }),
93
+ recordTimeOffset: o((ctx, event) => {
94
+ let timeOffset = ctx.timeOffset;
95
+ if ('payload' in event && 'timeOffset' in event.payload) {
96
+ timeOffset = event.payload.timeOffset;
97
+ }
98
+ return Object.assign(Object.assign({}, ctx), { timeOffset, baselineTime: ctx.events[0].timestamp + timeOffset });
99
+ }),
100
+ play(ctx) {
101
+ var _a;
102
+ const { timer, events, baselineTime, lastPlayedEvent } = ctx;
103
+ timer.clear();
104
+ for (const event of events) {
105
+ addDelay(event, baselineTime);
106
+ }
107
+ const neededEvents = discardPriorSnapshots(events, baselineTime);
108
+ let lastPlayedTimestamp = lastPlayedEvent === null || lastPlayedEvent === void 0 ? void 0 : lastPlayedEvent.timestamp;
109
+ if ((lastPlayedEvent === null || lastPlayedEvent === void 0 ? void 0 : lastPlayedEvent.type) === EventType.IncrementalSnapshot &&
110
+ lastPlayedEvent.data.source === IncrementalSource.MouseMove) {
111
+ lastPlayedTimestamp =
112
+ lastPlayedEvent.timestamp +
113
+ ((_a = lastPlayedEvent.data.positions[0]) === null || _a === void 0 ? void 0 : _a.timeOffset);
114
+ }
115
+ if (baselineTime < (lastPlayedTimestamp || 0)) {
116
+ emitter.emit(ReplayerEvents.PlayBack);
117
+ }
118
+ const syncEvents = new Array();
119
+ const actions = new Array();
120
+ for (const event of neededEvents) {
121
+ if (lastPlayedTimestamp &&
122
+ lastPlayedTimestamp < baselineTime &&
123
+ (event.timestamp <= lastPlayedTimestamp ||
124
+ event === lastPlayedEvent)) {
125
+ continue;
126
+ }
127
+ if (event.timestamp < baselineTime) {
128
+ syncEvents.push(event);
129
+ }
130
+ else {
131
+ const castFn = getCastFn(event, false);
132
+ actions.push({
133
+ doAction: () => {
134
+ castFn();
135
+ },
136
+ delay: event.delay,
137
+ });
138
+ }
139
+ }
140
+ applyEventsSynchronously(syncEvents);
141
+ emitter.emit(ReplayerEvents.Flush);
142
+ timer.addActions(actions);
143
+ timer.start();
144
+ },
145
+ pause(ctx) {
146
+ ctx.timer.clear();
147
+ },
148
+ resetLastPlayedEvent: o((ctx) => {
149
+ return Object.assign(Object.assign({}, ctx), { lastPlayedEvent: null });
150
+ }),
151
+ startLive: o({
152
+ baselineTime: (ctx, event) => {
153
+ ctx.timer.toggleLiveMode(true);
154
+ ctx.timer.start();
155
+ if (event.type === 'TO_LIVE' && event.payload.baselineTime) {
156
+ return event.payload.baselineTime;
157
+ }
158
+ return Date.now();
159
+ },
160
+ }),
161
+ replaceEvents: o((ctx, machineEvent) => {
162
+ const { events: curEvents, timer, baselineTime } = ctx;
163
+ if (machineEvent.type === 'REPLACE_EVENTS') {
164
+ const { events: newEvents } = machineEvent.payload;
165
+ curEvents.length = 0;
166
+ const actions = [];
167
+ for (const event of newEvents) {
168
+ addDelay(event, baselineTime);
169
+ curEvents.push(event);
170
+ if (event.timestamp >= timer.timeOffset + baselineTime) {
171
+ const castFn = getCastFn(event, false);
172
+ actions.push({
173
+ doAction: () => {
174
+ castFn();
175
+ },
176
+ delay: event.delay,
177
+ });
178
+ }
179
+ }
180
+ if (timer.isActive()) {
181
+ timer.replaceActions(actions);
182
+ }
183
+ }
184
+ return Object.assign(Object.assign({}, ctx), { events: curEvents });
185
+ }),
186
+ addEvent: o((ctx, machineEvent) => {
187
+ const { baselineTime, timer, events } = ctx;
188
+ if (machineEvent.type === 'ADD_EVENT') {
189
+ const { event } = machineEvent.payload;
190
+ addDelay(event, baselineTime);
191
+ let end = events.length - 1;
192
+ if (!events[end] || events[end].timestamp <= event.timestamp) {
193
+ events.push(event);
194
+ }
195
+ else {
196
+ let insertionIndex = -1;
197
+ let start = 0;
198
+ while (start <= end) {
199
+ const mid = Math.floor((start + end) / 2);
200
+ if (events[mid].timestamp <= event.timestamp) {
201
+ start = mid + 1;
202
+ }
203
+ else {
204
+ end = mid - 1;
205
+ }
206
+ }
207
+ if (insertionIndex === -1) {
208
+ insertionIndex = start;
209
+ }
210
+ events.splice(insertionIndex, 0, event);
211
+ }
212
+ const isSync = event.timestamp < baselineTime;
213
+ const castFn = getCastFn(event, isSync);
214
+ if (isSync) {
215
+ castFn();
216
+ }
217
+ else if (timer.isActive()) {
218
+ timer.addAction({
219
+ doAction: () => {
220
+ castFn();
221
+ },
222
+ delay: event.delay,
223
+ });
224
+ }
225
+ }
226
+ return Object.assign(Object.assign({}, ctx), { events });
227
+ }),
228
+ },
229
+ });
230
+ return v(playerMachine);
231
+ }
232
+ function createSpeedService(context) {
233
+ const speedMachine = s({
234
+ id: 'speed',
235
+ context,
236
+ initial: 'normal',
237
+ states: {
238
+ normal: {
239
+ on: {
240
+ FAST_FORWARD: {
241
+ target: 'skipping',
242
+ actions: ['recordSpeed', 'setSpeed'],
243
+ },
244
+ SET_SPEED: {
245
+ target: 'normal',
246
+ actions: ['setSpeed'],
247
+ },
248
+ },
249
+ },
250
+ skipping: {
251
+ on: {
252
+ BACK_TO_NORMAL: {
253
+ target: 'normal',
254
+ actions: ['restoreSpeed'],
255
+ },
256
+ SET_SPEED: {
257
+ target: 'normal',
258
+ actions: ['setSpeed'],
259
+ },
260
+ },
261
+ },
262
+ },
263
+ }, {
264
+ actions: {
265
+ setSpeed: (ctx, event) => {
266
+ if ('payload' in event) {
267
+ ctx.timer.setSpeed(event.payload.speed);
268
+ }
269
+ },
270
+ recordSpeed: o({
271
+ normalSpeed: (ctx) => ctx.timer.speed,
272
+ }),
273
+ restoreSpeed: (ctx) => {
274
+ ctx.timer.setSpeed(ctx.normalSpeed);
275
+ },
276
+ },
277
+ });
278
+ return v(speedMachine);
319
279
  }
320
280
 
321
281
  export { createPlayerService, createSpeedService, discardPriorSnapshots };