@reactoo/watchtogether-sdk-js 2.7.80 → 2.7.82

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.
@@ -1,11 +1,11 @@
1
- import {setExactTimeout} from "../wt-utils";
1
+ import {setExactTimeout} from "../../models/utils";
2
2
  import localEmitter from "../wt-emitter";
3
3
 
4
4
  const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
5
-
5
+
6
6
  //SYNC VARS
7
7
  let _emitter = localEmitter();
8
-
8
+
9
9
  let _playerInterface = null;
10
10
  let _playerInterfaceOptions = {
11
11
  isLive: true,
@@ -24,39 +24,39 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
24
24
  let syncNextWaitTime = null;
25
25
  let stopFlag = false;
26
26
  let isSyncing = false;
27
-
27
+
28
28
  let playbackRate = 2;
29
29
  let isPlaying = false;
30
30
  let isPreloading = true;
31
31
  let isProgrammaticallySeeked = false;
32
32
  let shouldPropagateMaster = false;
33
-
33
+
34
34
  const startSyncLoop = () => {
35
-
35
+
36
36
  if(!isConnected()) {
37
37
  room._log('--- Sync loop will not start due to user not connected yet ---');
38
38
  return
39
39
  }
40
-
40
+
41
41
  if(syncWaitId) {
42
42
  room._log('--- Sync loop already running ---');
43
43
  return
44
44
  }
45
-
45
+
46
46
  room._log('--- Sync enabled ---');
47
-
47
+
48
48
  stopFlag = false;
49
-
49
+
50
50
  const loop = () => {
51
-
51
+
52
52
  isSyncing = true;
53
53
  emitter.emit('playerSyncing', true);
54
-
54
+
55
55
  sync().finally(() => {
56
-
56
+
57
57
  isSyncing = false;
58
58
  emitter.emit('playerSyncing', false);
59
-
59
+
60
60
  if(isConnected() && !stopFlag) {
61
61
  syncWaitId = setTimeout(loop, syncNextWaitTime);
62
62
  }
@@ -64,14 +64,14 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
64
64
  room._log('--- Automatic stop due to user not connected or stop flag enabled ---');
65
65
  stopSyncLoop();
66
66
  }
67
-
67
+
68
68
  })
69
69
  };
70
-
70
+
71
71
  loop();
72
-
72
+
73
73
  };
74
-
74
+
75
75
  const stopSyncLoop = () => {
76
76
  room._log('--- Sync disabled ---');
77
77
  clearTimeout(syncWaitId);
@@ -79,17 +79,17 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
79
79
  currentSyncRetry = 0
80
80
  stopFlag = true;
81
81
  };
82
-
82
+
83
83
  const restartSyncLoop = () => {
84
-
84
+
85
85
  room._log('--- Sync restarting ---');
86
86
  stopSyncLoop();
87
87
  startSyncLoop();
88
-
88
+
89
89
  };
90
-
90
+
91
91
  const setNextWaitTime = (didSyncFail = false) => {
92
-
92
+
93
93
  if(!didSyncFail) {
94
94
  syncNextWaitTime = syncDefaultWaitTime;
95
95
  currentSyncRetry = 0
@@ -102,40 +102,40 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
102
102
  syncNextWaitTime = syncShortWaitTime;
103
103
  }
104
104
  }
105
-
105
+
106
106
  room._log('--- Next sync will occur in ' + syncNextWaitTime / 1000 + ' seconds ---');
107
-
107
+
108
108
  }
109
-
109
+
110
110
  const sync = () => {
111
-
111
+
112
112
  return getSyncData()
113
113
  .then(syncData => {
114
-
114
+
115
115
  if(syncData.isMaster) {
116
116
  if(_playerInterface.isPaused) _playerInterface.play();
117
117
  setNextWaitTime(false);
118
118
  return Promise.resolve();
119
119
  }
120
-
120
+
121
121
  else if(shouldPropagateMaster) {
122
122
  setNextWaitTime(false);
123
123
  return propagateMasterFunc();
124
124
  }
125
-
125
+
126
126
  else {
127
-
127
+
128
128
  const syncStartTime = Date.now();
129
129
  const {position, realPosition, isBufferSufficient} = calculateSyncDifferenceTime(syncData.masterFragmentSn, syncData.masterFragmentPos, syncData.ping);
130
130
  const currentPosition = getCurrentSegmentPosition() / 1000;
131
-
132
-
131
+
132
+
133
133
  if(position && Math.abs(position - currentPosition) <= maxSyncThreshold) {
134
134
  room._log(`We're within max sync threshold, no need to resync now`);
135
135
  setNextWaitTime(false);
136
136
  return Promise.resolve();
137
137
  }
138
-
138
+
139
139
  if(position !== null) {
140
140
  return seekTo(position)
141
141
  .then(() => {
@@ -145,7 +145,7 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
145
145
  room._log(`Insufficient buffer: `, !isBufferSufficient)
146
146
  room._log(`Seek duration is ${seekDuration} seconds`);
147
147
  room._log(`Sync precision should be ${syncPrecision}`);
148
-
148
+
149
149
  const didSyncFail = syncPrecision > maxSyncThreshold;
150
150
  setNextWaitTime(didSyncFail);
151
151
  return Promise.resolve();
@@ -164,7 +164,7 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
164
164
  return Promise.reject();
165
165
  })
166
166
  }
167
-
167
+
168
168
  const handleAddLocalParticipant = () => {
169
169
  if(shouldPropagateMaster) {
170
170
  propagateMasterFunc();
@@ -173,17 +173,17 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
173
173
  _emitter.once('timeupdate', restartSyncLoop);
174
174
  }
175
175
  };
176
-
176
+
177
177
  const handleAddRemoteParticipant = () => {
178
178
  if(shouldPropagateMaster) {
179
179
  propagateMasterFunc();
180
180
  }
181
181
  };
182
-
182
+
183
183
  const isConnected = () => {
184
184
  return room._isDataChannelOpen && room.isConnected;
185
185
  };
186
-
186
+
187
187
  const parseDataEvents = (msg = {}) => {
188
188
  if(msg.videoroom === 'sync_source_set' && msg.wt_channel_id != "") {
189
189
  emitter.emit('changePlayerSource', msg.wt_channel_id);
@@ -192,17 +192,17 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
192
192
  roomSyncSend(msg.sync_slave_id).catch(()=>{});
193
193
  }
194
194
  };
195
-
195
+
196
196
  const getCurrentSegmentPosition = () => {
197
197
  let position = _playerInterface.currentTime;
198
198
  return isNaN(position) ? 0 : position * 1000
199
199
  };
200
-
200
+
201
201
  const calculateSyncDifferenceTime = (fragmentSn, fragmentPos, ping) => {
202
-
202
+
203
203
  let seekRanges = _playerInterface.buffered;
204
204
  let position = (fragmentPos + (ping / 2)) / 1000;
205
-
205
+
206
206
  if(seekRanges && !_playerInterfaceOptions.ignoreBufferedTimeRanges) {
207
207
  let seekRange = {};
208
208
  for (let i = 0; i < seekRanges.length; i++) {
@@ -229,7 +229,7 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
229
229
  return { position, realPosition: position, isBufferSufficient: true };
230
230
  }
231
231
  };
232
-
232
+
233
233
  const seekTo = (time) => {
234
234
  return new Promise((resolve, reject) => {
235
235
  if(_playerInterface.currentTime !== time) {
@@ -258,9 +258,9 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
258
258
  }, (diff * 1000) / (playbackRate - 1), 20);
259
259
  _playerInterface.setPlaybackRate(playbackRate);
260
260
  };
261
-
261
+
262
262
  _emitter.once('stalled', _handleFailed);
263
-
263
+
264
264
  if(_playerInterface.isPaused) {
265
265
  wasPaused = true;
266
266
  _playerInterface.play()
@@ -291,7 +291,7 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
291
291
  } else resolve()
292
292
  });
293
293
  };
294
-
294
+
295
295
  const handlePlaying = () => {
296
296
  if(!isProgrammaticallySeeked) {
297
297
  room._log('Handle playing');
@@ -301,13 +301,13 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
301
301
  isPreloading = _playerInterface.isPaused;
302
302
  isPlaying = !_playerInterface.isPaused;
303
303
  };
304
-
304
+
305
305
  const handlePause = () => {
306
306
  stopSyncLoop()
307
307
  clientPaused().catch(() => {});
308
308
  isPlaying = !_playerInterface.isPaused;
309
309
  };
310
-
310
+
311
311
  const handleBuffering = () => {
312
312
  room._log('handleBuffering');
313
313
  if(!isProgrammaticallySeeked) {
@@ -316,9 +316,9 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
316
316
  isPreloading = _playerInterface.isPaused;
317
317
  }
318
318
  };
319
-
319
+
320
320
  const roomSyncSend = (slaveId) => {
321
-
321
+
322
322
  if(!_playerInterface) {
323
323
  room._log(
324
324
  `I've been asked for position even if we don't have player attached.
@@ -326,12 +326,12 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
326
326
  );
327
327
  return Promise.resolve();
328
328
  }
329
-
329
+
330
330
  let fragmentPosition = parseInt(getCurrentSegmentPosition());
331
-
331
+
332
332
  room._log(`Sending my position to ${slaveId}`);
333
333
  room._log(`Current time: ${fragmentPosition}`);
334
-
334
+
335
335
  return room.sendMessage(room.handleId, {
336
336
  body : {
337
337
  request: "sync_response",
@@ -342,23 +342,23 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
342
342
  slave_id: room.webrtcVersion > 1000 ? String(slaveId) : Number(slaveId)
343
343
  }});
344
344
  };
345
-
345
+
346
346
  const getSyncData = () => {
347
-
347
+
348
348
  room._log('Sending roomSync request');
349
349
  let roomId = room.roomId;
350
350
  let fragmentPosition = parseInt(getCurrentSegmentPosition());
351
-
351
+
352
352
  return new Promise((resolve, reject) => {
353
-
353
+
354
354
  let now = new Date().getTime();
355
355
  let ping = null;
356
-
356
+
357
357
  let sid = setTimeout(() => {
358
358
  room.off('data', fn, this);
359
359
  reject('Timeout');
360
360
  }, 3000);
361
-
361
+
362
362
  let body = {
363
363
  request: "sync",
364
364
  room: roomId,
@@ -366,32 +366,32 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
366
366
  fragment: String("0"),
367
367
  fragment_pos: Number(fragmentPosition)
368
368
  };
369
-
369
+
370
370
  let fn = (msg) => {
371
-
371
+
372
372
  if(msg.videoroom && ['sync', 'sync_response'].includes(msg.videoroom)) {
373
-
373
+
374
374
  if(msg.sync_master_await) {
375
375
  room._log('Waiting for master position');
376
376
  if(!ping) {
377
377
  ping = (new Date().getTime() - now);
378
378
  }
379
379
  }
380
-
380
+
381
381
  else if(msg.sync_master_fragment || msg.sync_master_fragment_pos) {
382
382
  room._log('Got master position data');
383
383
  if(!ping) {
384
384
  ping = (new Date().getTime() - now);
385
385
  }
386
-
386
+
387
387
  room._log(`I'm master: ${!!msg.sync_master_self}`);
388
388
  room._log(`Ping: ${ping}`);
389
389
  room._log(`Master fragment: ${msg.sync_master_fragment}`);
390
390
  room._log(`Master fragment position: ${msg.sync_master_fragment_pos}`);
391
-
391
+
392
392
  room.off('data', fn, this);
393
393
  clearTimeout(sid);
394
-
394
+
395
395
  resolve({
396
396
  isMaster: !!msg.sync_master_self,
397
397
  ping: ping,
@@ -399,7 +399,7 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
399
399
  masterFragmentSn: parseInt(msg.sync_master_fragment),
400
400
  });
401
401
  }
402
-
402
+
403
403
  else {
404
404
  clearTimeout(sid);
405
405
  reject('Master lost connection')
@@ -414,14 +414,14 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
414
414
  });
415
415
  });
416
416
  };
417
-
417
+
418
418
  const clientPaused = () => {
419
419
  room._log('Sending client paused');
420
-
420
+
421
421
  if(!isConnected()) {
422
422
  return Promise.resolve();
423
423
  }
424
-
424
+
425
425
  return room.sendMessage(room.handleId, {
426
426
  body:{
427
427
  request: "sync_paused",
@@ -431,7 +431,7 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
431
431
  fragment_pos:0
432
432
  }});
433
433
  };
434
-
434
+
435
435
  const propagateMasterFunc = () => {
436
436
  room._log('Propagating master');
437
437
  if(!isConnected()) {
@@ -447,11 +447,11 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
447
447
  fragment_pos:0
448
448
  }});
449
449
  };
450
-
450
+
451
451
  return {
452
-
452
+
453
453
  __events: ['playerSyncing'],
454
-
454
+
455
455
  getHandlers: () => ({
456
456
  handlePause: (event) => {
457
457
  room._log('handlePause');
@@ -476,40 +476,40 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
476
476
  _emitter.emit('timeupdate', event);
477
477
  }
478
478
  }),
479
-
479
+
480
480
  initialize: ({playerInterface} = {}) => {
481
-
481
+
482
482
  _playerInterface = playerInterface;
483
483
  _playerInterfaceOptions = {..._playerInterfaceOptions, ...(_playerInterface.options || {})}
484
-
484
+
485
485
  room._log('Interface options passed: ', (_playerInterface.options || {}));
486
486
  room._log('All interface options: ', _playerInterfaceOptions );
487
-
487
+
488
488
  shouldPropagateMaster = false;
489
-
489
+
490
490
  isPlaying = _playerInterface.isPaused === false;
491
-
491
+
492
492
  room.on('disconnect', stopSyncLoop);
493
493
  room.on('removeLocalParticipant', stopSyncLoop);
494
494
  room.on('addLocalParticipant', handleAddLocalParticipant);
495
495
  room.on('addRemoteParticipant', handleAddRemoteParticipant);
496
496
  room.on('data', parseDataEvents);
497
-
497
+
498
498
  if(shouldPropagateMaster) {
499
499
  propagateMasterFunc().catch(() => {});
500
500
  }
501
-
501
+
502
502
  if(_playerInterface.isPaused === false) {
503
503
  _emitter.once('timeupdate', restartSyncLoop);
504
504
  }
505
-
505
+
506
506
  _emitter.on('buffering', handleBuffering);
507
507
  _emitter.on('playing', handlePlaying);
508
508
  _emitter.on('pause', handlePause);
509
-
510
-
509
+
510
+
511
511
  },
512
-
512
+
513
513
  destroy: () => {
514
514
  stopSyncLoop();
515
515
  room.off('disconnect', stopSyncLoop);
@@ -517,17 +517,17 @@ const syncDazn = function ({room, wt, roomSession, emitter} = {}) {
517
517
  room.off('addLocalParticipant', handleAddLocalParticipant);
518
518
  room.off('addRemoteParticipant', handleAddRemoteParticipant);
519
519
  room.off('data', parseDataEvents);
520
-
520
+
521
521
  if(typeof _playerInterface?.destroy === 'function') {
522
522
  _playerInterface?.destroy()
523
523
  }
524
-
524
+
525
525
  _playerInterface = null;
526
-
526
+
527
527
  _emitter.clear();
528
528
  }
529
529
  };
530
-
530
+
531
531
  };
532
532
 
533
533
  export default syncDazn;