@stream-io/video-client 1.18.7 → 1.18.8

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 (51) hide show
  1. package/CHANGELOG.md +97 -169
  2. package/dist/index.browser.es.js +89 -52
  3. package/dist/index.browser.es.js.map +1 -1
  4. package/dist/index.cjs.js +89 -52
  5. package/dist/index.cjs.js.map +1 -1
  6. package/dist/index.es.js +89 -52
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/src/Call.d.ts +10 -1
  9. package/dist/src/devices/ScreenShareManager.d.ts +1 -3
  10. package/dist/src/gen/video/sfu/event/events.d.ts +1 -19
  11. package/dist/src/gen/video/sfu/signal_rpc/signal.client.d.ts +2 -21
  12. package/dist/src/gen/video/sfu/signal_rpc/signal.d.ts +1 -9
  13. package/dist/src/helpers/promise.d.ts +2 -2
  14. package/package.json +10 -11
  15. package/src/Call.ts +61 -10
  16. package/src/StreamSfuClient.ts +9 -3
  17. package/src/StreamVideoClient.ts +4 -5
  18. package/src/__tests__/Call.test.ts +1 -1
  19. package/src/coordinator/connection/client.ts +2 -3
  20. package/src/coordinator/connection/connection.ts +14 -14
  21. package/src/coordinator/connection/signing.ts +1 -1
  22. package/src/devices/BrowserPermission.ts +3 -2
  23. package/src/devices/ScreenShareManager.ts +1 -3
  24. package/src/devices/__tests__/InputMediaDeviceManager.test.ts +1 -1
  25. package/src/devices/__tests__/MicrophoneManager.test.ts +4 -4
  26. package/src/devices/__tests__/MicrophoneManagerRN.test.ts +4 -4
  27. package/src/devices/devices.ts +3 -1
  28. package/src/events/__tests__/call.test.ts +42 -57
  29. package/src/events/__tests__/internal.test.ts +8 -13
  30. package/src/events/__tests__/mutes.test.ts +7 -3
  31. package/src/events/__tests__/participant.test.ts +16 -20
  32. package/src/events/__tests__/speaker.test.ts +6 -6
  33. package/src/gen/coordinator/index.ts +1 -1
  34. package/src/gen/video/sfu/event/events.ts +22 -20
  35. package/src/gen/video/sfu/models/models.ts +0 -1
  36. package/src/gen/video/sfu/signal_rpc/signal.client.ts +27 -23
  37. package/src/gen/video/sfu/signal_rpc/signal.ts +13 -11
  38. package/src/helpers/RNSpeechDetector.ts +3 -4
  39. package/src/helpers/__tests__/DynascaleManager.test.ts +27 -26
  40. package/src/helpers/__tests__/clientUtils.test.ts +0 -1
  41. package/src/helpers/client-details.ts +1 -1
  42. package/src/helpers/promise.ts +4 -4
  43. package/src/rtc/Dispatcher.ts +1 -1
  44. package/src/rtc/Publisher.ts +2 -2
  45. package/src/rtc/__tests__/Publisher.test.ts +8 -8
  46. package/src/rtc/__tests__/Subscriber.test.ts +9 -9
  47. package/src/rtc/__tests__/mocks/webrtc.mocks.ts +2 -2
  48. package/src/rtc/helpers/__tests__/sdp.test.ts +3 -3
  49. package/src/stats/CallStateStatsReporter.ts +2 -3
  50. package/src/store/__tests__/CallState.test.ts +59 -115
  51. package/src/timers/worker.ts +0 -4
@@ -33,7 +33,7 @@ describe('CallState', () => {
33
33
  Object.getOwnPropertyDescriptors(state),
34
34
  ).filter((key) => key.endsWith('$'));
35
35
 
36
- // @ts-ignore - __proto__
36
+ // @ts-expect-error - __proto__
37
37
  const getters = Object.getOwnPropertyDescriptors(state.__proto__);
38
38
 
39
39
  for (const observable of observables) {
@@ -318,7 +318,7 @@ describe('CallState', () => {
318
318
  it('should update the pinned state of participants in the call', () => {
319
319
  const state = new CallState();
320
320
  state.setSortParticipantsBy(noopComparator());
321
- // @ts-ignore
321
+ // @ts-expect-error - incomplete data
322
322
  state.setParticipants([{ sessionId: '123' }, { sessionId: '456' }]);
323
323
 
324
324
  state.setServerSidePins([{ sessionId: '123', userId: 'user-id' }]);
@@ -333,9 +333,9 @@ describe('CallState', () => {
333
333
  const state = new CallState();
334
334
  state.setSortParticipantsBy(noopComparator());
335
335
  state.setParticipants([
336
- // @ts-ignore
336
+ // @ts-expect-error - incomplete data
337
337
  { sessionId: '123', pin: { isLocalPin: false, pinnedAt: 1000 } },
338
- // @ts-ignore
338
+ // @ts-expect-error - incomplete data
339
339
  { sessionId: '456' },
340
340
  ]);
341
341
 
@@ -351,9 +351,9 @@ describe('CallState', () => {
351
351
  const state = new CallState();
352
352
  state.setSortParticipantsBy(noopComparator());
353
353
  state.setParticipants([
354
- // @ts-ignore
354
+ // @ts-expect-error - incomplete data
355
355
  { sessionId: '123', pin: { isLocalPin: true, pinnedAt: 1000 } },
356
- // @ts-ignore
356
+ // @ts-expect-error - incomplete data
357
357
  { sessionId: '456' },
358
358
  ]);
359
359
 
@@ -370,10 +370,9 @@ describe('CallState', () => {
370
370
  describe('call.live and backstage events', () => {
371
371
  it('handles call.live_started events', () => {
372
372
  const state = new CallState();
373
- // @ts-ignore
374
373
  state.updateFromEvent({
375
374
  type: 'call.live_started',
376
- // @ts-ignore
375
+ // @ts-expect-error - incomplete data
377
376
  call: {
378
377
  backstage: false,
379
378
  },
@@ -389,7 +388,7 @@ describe('CallState', () => {
389
388
  const event: CallUpdatedEvent = {
390
389
  type: 'call.updated',
391
390
  call_cid: 'development:12345',
392
- // @ts-expect-error
391
+ // @ts-expect-error incomplete data
393
392
  call: {
394
393
  cid: 'development:12345',
395
394
  custom: {
@@ -398,7 +397,7 @@ describe('CallState', () => {
398
397
  },
399
398
  };
400
399
 
401
- // @ts-ignore
400
+ // @ts-expect-error incomplete data
402
401
  state.updateFromEvent(event);
403
402
  expect(state.custom).toEqual(event.call.custom);
404
403
  });
@@ -409,14 +408,14 @@ describe('CallState', () => {
409
408
  const state = new CallState();
410
409
  const event: CallAcceptedEvent = {
411
410
  type: 'call.accepted',
412
- // @ts-expect-error
411
+ // @ts-expect-error incomplete data
413
412
  call: {
414
413
  custom: {
415
414
  test: 'value',
416
415
  },
417
416
  },
418
417
  };
419
- // @ts-ignore
418
+ // @ts-expect-error incomplete data
420
419
  state.updateFromEvent(event);
421
420
 
422
421
  expect(state.custom).toEqual(event.call.custom);
@@ -428,14 +427,14 @@ describe('CallState', () => {
428
427
  const state = new CallState();
429
428
  const event: CallEndedEvent = {
430
429
  type: 'call.rejected',
431
- // @ts-expect-error
430
+ // @ts-expect-error incomplete data
432
431
  call: {
433
432
  custom: {
434
433
  test: 'value',
435
434
  },
436
435
  },
437
436
  };
438
- // @ts-ignore
437
+ // @ts-expect-error incomplete data
439
438
  state.updateFromEvent(event);
440
439
 
441
440
  expect(state.custom).toEqual(event.call.custom);
@@ -447,14 +446,14 @@ describe('CallState', () => {
447
446
  const state = new CallState();
448
447
  const event: CallEndedEvent = {
449
448
  type: 'call.ended',
450
- // @ts-expect-error
449
+ // @ts-expect-error incomplete data
451
450
  call: {
452
451
  custom: {
453
452
  test: 'value',
454
453
  },
455
454
  },
456
455
  };
457
- // @ts-ignore
456
+ // @ts-expect-error incomplete data
458
457
  state.updateFromEvent(event);
459
458
 
460
459
  expect(state.custom).toEqual(event.call.custom);
@@ -521,16 +520,16 @@ describe('CallState', () => {
521
520
  it('handles call.member_removed events', () => {
522
521
  const state = new CallState();
523
522
  const initialMembers: MemberResponse[] = [
524
- // @ts-ignore
523
+ // @ts-expect-error incomplete data
525
524
  { user_id: 'user0' },
526
- // @ts-ignore
525
+ // @ts-expect-error incomplete data
527
526
  { user_id: 'user1' },
528
- // @ts-ignore
527
+ // @ts-expect-error incomplete data
529
528
  { user_id: 'user2' },
530
529
  ];
531
530
  state.setMembers(initialMembers);
532
531
  const removedMembers = ['user1'];
533
- // @ts-ignore
532
+
534
533
  state.updateFromEvent({
535
534
  type: 'call.member_removed',
536
535
  members: removedMembers,
@@ -548,39 +547,33 @@ describe('CallState', () => {
548
547
 
549
548
  it('handles call.member_updated_permission events', () => {
550
549
  const state = new CallState();
551
- const user0 = {
550
+ const user0: MemberResponse = {
552
551
  user_id: 'user0',
553
- user: {
554
- role: 'viewer',
555
- },
552
+ user: { role: 'viewer' },
556
553
  } as MemberResponse;
557
554
  const user1 = {
558
555
  user_id: 'user1',
559
- user: {
560
- role: 'host',
561
- },
556
+ user: { role: 'host' },
562
557
  } as MemberResponse;
563
558
  const user2 = {
564
559
  user_id: 'user2',
565
- user: {
566
- role: 'viewer',
567
- },
560
+ user: { role: 'viewer' },
568
561
  } as MemberResponse;
569
562
  const initialMembers: MemberResponse[] = [user0, user1, user2];
570
563
  state.setMembers(initialMembers);
571
- // @ts-ignore
564
+
572
565
  state.updateFromEvent({
573
566
  type: 'call.member_updated_permission',
574
567
  members: [
575
568
  {
576
569
  user_id: user1.user_id,
577
- // @ts-ignore
570
+ // @ts-expect-error incomplete data
578
571
  user: { ...user1, role: 'viewer' },
579
572
  role: 'viewer',
580
573
  },
581
574
  {
582
575
  user_id: user0.user_id,
583
- // @ts-ignore
576
+ // @ts-expect-error incomplete data
584
577
  user: { ...user0, role: 'host' },
585
578
  role: 'host',
586
579
  },
@@ -599,27 +592,21 @@ describe('CallState', () => {
599
592
  const state = new CallState();
600
593
  const user0 = {
601
594
  user_id: 'user0',
602
- user: {
603
- name: 'Jane',
604
- },
595
+ user: { name: 'Jane' },
605
596
  } as MemberResponse;
606
597
  const user1 = {
607
598
  user_id: 'user1',
608
- user: {
609
- name: 'Jack',
610
- },
599
+ user: { name: 'Jack' },
611
600
  } as MemberResponse;
612
601
  const user2 = {
613
602
  user_id: 'user2',
614
- user: {
615
- name: 'Adam',
616
- },
603
+ user: { name: 'Adam' },
617
604
  } as MemberResponse;
618
605
  const initialMembers: MemberResponse[] = [user0, user1, user2];
619
606
  state.setMembers(initialMembers);
620
607
  state.updateFromEvent({
621
608
  type: 'call.member_updated',
622
- // @ts-ignore
609
+ // @ts-expect-error incomplete data
623
610
  members: [{ ...user1, user: { name: 'John' } }],
624
611
  // @ts-expect-error incomplete data
625
612
  call: {},
@@ -635,19 +622,15 @@ describe('CallState', () => {
635
622
  describe('recording and broadcasting events', () => {
636
623
  it('handles call.recording_started events', () => {
637
624
  const state = new CallState();
638
- // @ts-ignore
639
- state.updateFromEvent({
640
- type: 'call.recording_started',
641
- });
625
+ // @ts-expect-error incomplete data
626
+ state.updateFromEvent({ type: 'call.recording_started' });
642
627
  expect(state.recording).toBe(true);
643
628
  });
644
629
 
645
630
  it('handles call.recording_stopped events', () => {
646
631
  const state = new CallState();
647
- // @ts-ignore
648
- state.updateFromEvent({
649
- type: 'call.recording_stopped',
650
- });
632
+ // @ts-expect-error incomplete data
633
+ state.updateFromEvent({ type: 'call.recording_stopped' });
651
634
  expect(state.recording).toBe(false);
652
635
  });
653
636
 
@@ -664,16 +647,13 @@ describe('CallState', () => {
664
647
  it('handles call.hls_broadcasting_started events', () => {
665
648
  const state = new CallState();
666
649
  state.updateFromCallResponse({
667
- // @ts-ignore
650
+ // @ts-expect-error incomplete data
668
651
  egress: {
669
652
  broadcasting: false,
670
- hls: {
671
- playlist_url: '',
672
- status: 'starting',
673
- },
653
+ hls: { playlist_url: '', status: 'starting' },
674
654
  },
675
655
  });
676
- // @ts-ignore
656
+
677
657
  state.updateFromEvent({
678
658
  type: 'call.hls_broadcasting_started',
679
659
  // @ts-expect-error incomplete data
@@ -697,9 +677,9 @@ describe('CallState', () => {
697
677
 
698
678
  it('handles call.hls_broadcasting_stopped events', () => {
699
679
  const state = new CallState();
700
- // @ts-ignore
680
+ // @ts-expect-error incomplete data
701
681
  state.updateFromCallResponse({});
702
- // @ts-ignore
682
+ // @ts-expect-error incomplete data
703
683
  state.updateFromEvent({
704
684
  type: 'call.hls_broadcasting_stopped',
705
685
  });
@@ -722,7 +702,7 @@ describe('CallState', () => {
722
702
  state.updateFromEvent({
723
703
  type: 'call.session_started',
724
704
  call: {
725
- // @ts-ignore
705
+ // @ts-expect-error incomplete data
726
706
  session: {
727
707
  id: 'session-id',
728
708
  participants: [],
@@ -743,7 +723,7 @@ describe('CallState', () => {
743
723
  state.updateFromEvent({
744
724
  type: 'call.session_ended',
745
725
  call: {
746
- // @ts-ignore
726
+ // @ts-expect-error incomplete data
747
727
  session: {
748
728
  id: 'session-id',
749
729
  participants: [],
@@ -761,7 +741,7 @@ describe('CallState', () => {
761
741
  it('should update the call metadata when a participant joins', () => {
762
742
  const state = new CallState();
763
743
  state.updateFromCallResponse({
764
- // @ts-ignore
744
+ // @ts-expect-error incomplete data
765
745
  session: {
766
746
  participants: [],
767
747
  participants_count_by_role: {},
@@ -770,117 +750,81 @@ describe('CallState', () => {
770
750
  state.updateFromEvent({
771
751
  type: 'call.session_participant_joined',
772
752
  participant: {
773
- // @ts-ignore
774
- user: {
775
- id: 'user-id',
776
- role: 'user',
777
- },
753
+ // @ts-expect-error incomplete data
754
+ user: { id: 'user-id', role: 'user' },
778
755
  user_session_id: '123',
779
756
  },
780
757
  });
781
758
  expect(state.session).toEqual({
782
759
  participants: [
783
760
  {
784
- user: {
785
- id: 'user-id',
786
- role: 'user',
787
- },
761
+ user: { id: 'user-id', role: 'user' },
788
762
  user_session_id: '123',
789
763
  },
790
764
  ],
791
- participants_count_by_role: {
792
- user: 1,
793
- },
765
+ participants_count_by_role: { user: 1 },
794
766
  });
795
767
  });
796
768
 
797
769
  it('should update the call metadata when a participant leaves', () => {
798
770
  const state = new CallState();
799
771
  state.updateFromCallResponse({
800
- // @ts-ignore
801
772
  session: {
802
773
  participants: [
803
774
  {
804
775
  joined_at: '2021-01-01T00:00:00.000Z',
805
- // @ts-ignore
806
- user: {
807
- id: 'user-id',
808
- role: 'user',
809
- },
776
+ // @ts-expect-error incomplete data
777
+ user: { id: 'user-id', role: 'user' },
810
778
  user_session_id: '123',
811
779
  },
812
780
  ],
813
- participants_count_by_role: {
814
- user: 1,
815
- },
781
+ participants_count_by_role: { user: 1 },
816
782
  },
817
783
  });
818
784
  state.updateFromEvent({
819
785
  type: 'call.session_participant_left',
820
786
  participant: {
821
- // @ts-ignore
822
- user: {
823
- id: 'user-id',
824
- role: 'user',
825
- },
787
+ // @ts-expect-error incomplete data
788
+ user: { id: 'user-id', role: 'user' },
826
789
  user_session_id: '123',
827
790
  },
828
791
  });
829
792
  expect(state.session).toEqual({
830
793
  participants: [],
831
- participants_count_by_role: {
832
- user: 0,
833
- },
794
+ participants_count_by_role: { user: 0 },
834
795
  });
835
796
  });
836
797
 
837
798
  it('should update existing participant', () => {
838
799
  const state = new CallState();
839
800
  state.updateFromCallResponse({
840
- // @ts-ignore
841
801
  session: {
842
802
  participants: [
843
803
  {
844
- // @ts-ignore
845
- user: {
846
- id: 'user-id',
847
- role: 'user',
848
- },
804
+ // @ts-expect-error incomplete data
805
+ user: { id: 'user-id', role: 'user' },
849
806
  user_session_id: '123',
850
807
  },
851
808
  ],
852
- participants_count_by_role: {
853
- user: 1,
854
- },
809
+ participants_count_by_role: { user: 1 },
855
810
  },
856
811
  });
857
812
  state.updateFromEvent({
858
813
  type: 'call.session_participant_joined',
859
814
  participant: {
860
- // @ts-ignore
861
- user: {
862
- id: 'user-id',
863
- role: 'user',
864
- name: 'Updated user',
865
- },
815
+ // @ts-expect-error incomplete data
816
+ user: { id: 'user-id', role: 'user', name: 'Updated user' },
866
817
  user_session_id: '123',
867
818
  },
868
819
  });
869
820
  expect(state.session).toEqual({
870
821
  participants: [
871
822
  {
872
- // @ts-ignore
873
- user: {
874
- id: 'user-id',
875
- role: 'user',
876
- name: 'Updated user',
877
- },
823
+ user: { id: 'user-id', role: 'user', name: 'Updated user' },
878
824
  user_session_id: '123',
879
825
  },
880
826
  ],
881
- participants_count_by_role: {
882
- user: 1,
883
- },
827
+ participants_count_by_role: { user: 1 },
884
828
  });
885
829
  });
886
830
 
@@ -1,5 +1,3 @@
1
- /* eslint-disable */
2
-
3
1
  import type { TimerWorkerEvent, TimerWorkerRequest } from './types';
4
2
 
5
3
  const timerIdMapping = new Map<number, NodeJS.Timeout>();
@@ -36,5 +34,3 @@ function tick(id: number) {
36
34
  const message: TimerWorkerEvent = { type: 'tick', id };
37
35
  self.postMessage(message);
38
36
  }
39
-
40
- /* eslint-enable */