@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.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.
Files changed (111) hide show
  1. package/dist/common/errors/webex-errors.js +5 -29
  2. package/dist/common/errors/webex-errors.js.map +1 -1
  3. package/dist/constants.js +15 -74
  4. package/dist/constants.js.map +1 -1
  5. package/dist/media/index.js +68 -213
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/media/internal-media-core-wrapper.js +22 -0
  8. package/dist/media/internal-media-core-wrapper.js.map +1 -0
  9. package/dist/media/properties.js +20 -25
  10. package/dist/media/properties.js.map +1 -1
  11. package/dist/media/util.js +0 -27
  12. package/dist/media/util.js.map +1 -1
  13. package/dist/meeting/index.js +694 -432
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/request.js +1 -0
  16. package/dist/meeting/request.js.map +1 -1
  17. package/dist/meeting/util.js +3 -44
  18. package/dist/meeting/util.js.map +1 -1
  19. package/dist/meetings/index.js +64 -5
  20. package/dist/meetings/index.js.map +1 -1
  21. package/dist/meetings/util.js +24 -1
  22. package/dist/meetings/util.js.map +1 -1
  23. package/dist/members/index.js +68 -0
  24. package/dist/members/index.js.map +1 -1
  25. package/dist/multistream/mediaRequestManager.js +132 -0
  26. package/dist/multistream/mediaRequestManager.js.map +1 -0
  27. package/dist/multistream/multistreamMedia.js +116 -0
  28. package/dist/multistream/multistreamMedia.js.map +1 -0
  29. package/dist/multistream/receiveSlot.js +209 -0
  30. package/dist/multistream/receiveSlot.js.map +1 -0
  31. package/dist/multistream/receiveSlotManager.js +195 -0
  32. package/dist/multistream/receiveSlotManager.js.map +1 -0
  33. package/dist/multistream/remoteMedia.js +284 -0
  34. package/dist/multistream/remoteMedia.js.map +1 -0
  35. package/dist/multistream/remoteMediaGroup.js +243 -0
  36. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  37. package/dist/multistream/remoteMediaManager.js +1113 -0
  38. package/dist/multistream/remoteMediaManager.js.map +1 -0
  39. package/dist/reconnection-manager/index.js +109 -130
  40. package/dist/reconnection-manager/index.js.map +1 -1
  41. package/dist/roap/index.js +57 -240
  42. package/dist/roap/index.js.map +1 -1
  43. package/dist/roap/request.js +2 -114
  44. package/dist/roap/request.js.map +1 -1
  45. package/dist/roap/turnDiscovery.js +11 -5
  46. package/dist/roap/turnDiscovery.js.map +1 -1
  47. package/dist/statsAnalyzer/global.js +2 -0
  48. package/dist/statsAnalyzer/global.js.map +1 -1
  49. package/dist/statsAnalyzer/index.js +39 -36
  50. package/dist/statsAnalyzer/index.js.map +1 -1
  51. package/package.json +20 -19
  52. package/src/common/errors/webex-errors.js +0 -18
  53. package/src/constants.ts +139 -180
  54. package/src/media/index.js +60 -194
  55. package/src/media/internal-media-core-wrapper.ts +9 -0
  56. package/src/media/properties.js +19 -25
  57. package/src/media/util.js +0 -22
  58. package/src/meeting/index.js +565 -320
  59. package/src/meeting/request.js +1 -0
  60. package/src/meeting/util.js +3 -46
  61. package/src/meetings/index.js +30 -1
  62. package/src/meetings/util.js +23 -2
  63. package/src/members/index.js +48 -0
  64. package/src/multistream/mediaRequestManager.ts +164 -0
  65. package/src/multistream/multistreamMedia.ts +92 -0
  66. package/src/multistream/receiveSlot.ts +141 -0
  67. package/src/multistream/receiveSlotManager.ts +142 -0
  68. package/src/multistream/remoteMedia.ts +219 -0
  69. package/src/multistream/remoteMediaGroup.ts +224 -0
  70. package/src/multistream/remoteMediaManager.ts +911 -0
  71. package/src/reconnection-manager/index.js +40 -53
  72. package/src/roap/index.js +47 -207
  73. package/src/roap/request.js +1 -72
  74. package/src/roap/turnDiscovery.ts +12 -6
  75. package/src/statsAnalyzer/global.js +2 -0
  76. package/src/statsAnalyzer/index.js +32 -46
  77. package/test/integration/spec/journey.js +1 -1
  78. package/test/unit/spec/media/index.ts +223 -0
  79. package/test/unit/spec/media/properties.ts +73 -82
  80. package/test/unit/spec/meeting/effectsState.js +1 -3
  81. package/test/unit/spec/meeting/index.js +420 -228
  82. package/test/unit/spec/meeting/muteState.js +7 -0
  83. package/test/unit/spec/meeting/utils.js +61 -2
  84. package/test/unit/spec/meetings/index.js +0 -4
  85. package/test/unit/spec/members/index.js +164 -2
  86. package/test/unit/spec/multistream/mediaRequestManager.ts +511 -0
  87. package/test/unit/spec/multistream/receiveSlot.ts +104 -0
  88. package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
  89. package/test/unit/spec/multistream/remoteMedia.ts +217 -0
  90. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  91. package/test/unit/spec/multistream/remoteMediaManager.ts +1251 -0
  92. package/test/unit/spec/roap/index.ts +63 -35
  93. package/test/unit/spec/stats-analyzer/index.js +19 -22
  94. package/dist/peer-connection-manager/index.js +0 -794
  95. package/dist/peer-connection-manager/index.js.map +0 -1
  96. package/dist/roap/collection.js +0 -73
  97. package/dist/roap/collection.js.map +0 -1
  98. package/dist/roap/handler.js +0 -337
  99. package/dist/roap/handler.js.map +0 -1
  100. package/dist/roap/state.js +0 -164
  101. package/dist/roap/state.js.map +0 -1
  102. package/dist/roap/util.js +0 -102
  103. package/dist/roap/util.js.map +0 -1
  104. package/src/peer-connection-manager/index.js +0 -723
  105. package/src/roap/collection.js +0 -63
  106. package/src/roap/handler.js +0 -252
  107. package/src/roap/state.js +0 -149
  108. package/src/roap/util.js +0 -93
  109. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  110. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  111. package/test/unit/spec/roap/util.js +0 -30
@@ -1,10 +1,8 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
2
  import sinon from 'sinon';
3
3
  import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
4
- import {ROAP} from '@webex/plugin-meetings/src/constants';
5
4
 
6
5
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
7
- import RoapHandler from '@webex/plugin-meetings/src/roap/handler';
8
6
  import Roap from '@webex/plugin-meetings/src/roap/';
9
7
 
10
8
  describe('Roap', () => {
@@ -13,7 +11,9 @@ describe('Roap', () => {
13
11
  const RESULT = {something: 'some value'};
14
12
  const meeting = {id: 'some meeting id'};
15
13
 
16
- const doTurnDiscoveryStub = sinon.stub(TurnDiscovery.prototype, 'doTurnDiscovery').resolves(RESULT);
14
+ const doTurnDiscoveryStub = sinon
15
+ .stub(TurnDiscovery.prototype, 'doTurnDiscovery')
16
+ .resolves(RESULT);
17
17
 
18
18
  const roap = new Roap({}, {parent: 'fake'});
19
19
 
@@ -37,22 +37,22 @@ describe('Roap', () => {
37
37
 
38
38
  describe('sendRoapMediaRequest', () => {
39
39
  let sendRoapStub;
40
- let roapHandlerSubmitStub;
41
-
42
- const meeting = {
43
- id: 'some meeting id',
44
- correlationId: 'correlation id',
45
- selfUrl: 'self url',
46
- mediaId: 'media id',
47
- isAudioMuted: () => true,
48
- isVideoMuted: () => false,
49
- setRoapSeq: sinon.stub(),
50
- config: {experimental: {enableTurnDiscovery: false}},
51
- };
40
+ let meeting;
52
41
 
53
42
  beforeEach(() => {
43
+ meeting = {
44
+ id: 'some meeting id',
45
+ correlationId: 'correlation id',
46
+ selfUrl: 'self url',
47
+ mediaId: 'media id',
48
+ isMultistream: false,
49
+ isAudioMuted: () => true,
50
+ isVideoMuted: () => false,
51
+ setRoapSeq: sinon.stub(),
52
+ config: {experimental: {enableTurnDiscovery: false}},
53
+ };
54
+
54
55
  sendRoapStub = sinon.stub(RoapRequest.prototype, 'sendRoap').resolves({});
55
- roapHandlerSubmitStub = sinon.stub(RoapHandler.prototype, 'submit');
56
56
  meeting.setRoapSeq.resetHistory();
57
57
  });
58
58
 
@@ -66,13 +66,21 @@ describe('Roap', () => {
66
66
  {reconnect: false, enableTurnDiscovery: true, expectEmptyMediaId: false},
67
67
  {reconnect: false, enableTurnDiscovery: false, expectEmptyMediaId: false},
68
68
  ].forEach(({reconnect, enableTurnDiscovery, expectEmptyMediaId}) =>
69
- it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${reconnect ? '' : 'not '}reconnecting and TURN discovery is ${enableTurnDiscovery ? 'enabled' : 'disabled'}`, async () => {
69
+ it(`sends roap OFFER with ${expectEmptyMediaId ? 'empty ' : ''}mediaId when ${
70
+ reconnect ? '' : 'not '
71
+ }reconnecting and TURN discovery is ${
72
+ enableTurnDiscovery ? 'enabled' : 'disabled'
73
+ }`, async () => {
70
74
  meeting.config.experimental.enableTurnDiscovery = enableTurnDiscovery;
71
75
 
72
76
  const roap = new Roap({}, {parent: 'fake'});
73
77
 
74
78
  await roap.sendRoapMediaRequest({
75
- meeting, sdp: 'sdp', reconnect, roapSeq: 1
79
+ meeting,
80
+ sdp: 'sdp',
81
+ reconnect,
82
+ seq: 2,
83
+ tieBreaker: 4294967294,
76
84
  });
77
85
 
78
86
  const expectedRoapMessage = {
@@ -80,7 +88,7 @@ describe('Roap', () => {
80
88
  sdps: ['sdp'],
81
89
  version: '2',
82
90
  seq: 2,
83
- tieBreaker: 4294967294
91
+ tieBreaker: 4294967294,
84
92
  };
85
93
 
86
94
  assert.calledOnce(sendRoapStub);
@@ -91,23 +99,43 @@ describe('Roap', () => {
91
99
  mediaId: expectEmptyMediaId ? '' : meeting.mediaId,
92
100
  audioMuted: meeting.isAudioMuted(),
93
101
  videoMuted: meeting.isVideoMuted(),
94
- meetingId: meeting.id
95
- });
96
-
97
- assert.calledTwice(roapHandlerSubmitStub);
98
- assert.calledWith(roapHandlerSubmitStub, {
99
- type: ROAP.SEND_ROAP_MSG,
100
- msg: expectedRoapMessage,
101
- correlationId: meeting.correlationId
102
- });
103
- assert.calledWith(roapHandlerSubmitStub, {
104
- type: ROAP.SEND_ROAP_MSG_SUCCESS,
105
- seq: 2,
106
- correlationId: meeting.correlationId
102
+ meetingId: meeting.id,
103
+ preferTranscoding: true,
107
104
  });
105
+ })
106
+ );
107
+ it('sends roap request with preferTranscoding=false for multistream meetings', async () => {
108
+ const roap = new Roap({}, {parent: 'fake'});
108
109
 
109
- assert.calledOnce(meeting.setRoapSeq);
110
- assert.calledWith(meeting.setRoapSeq, 2);
111
- }));
110
+ meeting.isMultistream = true;
111
+
112
+ await roap.sendRoapMediaRequest({
113
+ meeting,
114
+ sdp: 'sdp',
115
+ reconnect: false,
116
+ seq: 10,
117
+ tieBreaker: 1,
118
+ });
119
+
120
+ const expectedRoapMessage = {
121
+ messageType: 'OFFER',
122
+ sdps: ['sdp'],
123
+ version: '2',
124
+ seq: 10,
125
+ tieBreaker: 1,
126
+ };
127
+
128
+ assert.calledOnce(sendRoapStub);
129
+ assert.calledWith(sendRoapStub, {
130
+ roapMessage: expectedRoapMessage,
131
+ correlationId: meeting.correlationId,
132
+ locusSelfUrl: meeting.selfUrl,
133
+ mediaId: meeting.mediaId,
134
+ audioMuted: meeting.isAudioMuted(),
135
+ videoMuted: meeting.isVideoMuted(),
136
+ meetingId: meeting.id,
137
+ preferTranscoding: false,
138
+ });
139
+ });
112
140
  });
113
141
  });
@@ -2,6 +2,7 @@ import 'jsdom-global/register';
2
2
  import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
+ import {MediaConnection as MC} from '@webex/internal-media-core';
5
6
 
6
7
  import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
7
8
  import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
@@ -130,30 +131,26 @@ describe('plugin-meetings', () => {
130
131
  };
131
132
 
132
133
  pc = {
133
- audioTransceiver: {
134
- sender: {
135
- getStats: sinon.stub().resolves([fakeStats.audio.sender])
136
- },
137
- receiver: {
138
- getStats: sinon.stub().resolves([fakeStats.audio.receiver])
139
- },
140
- },
141
- videoTransceiver: {
142
- sender: {
143
- getStats: sinon.stub().resolves([fakeStats.video.sender])
144
- },
145
- receiver: {
146
- getStats: sinon.stub().resolves([fakeStats.video.receiver])
134
+ getConnectionState: sinon.stub().returns(MC.ConnectionState.Connected),
135
+ getTransceiverStats: sinon.stub().resolves({
136
+ audio: {
137
+ sender: [fakeStats.audio.sender],
138
+ receiver: [fakeStats.audio.receiver],
139
+ currentDirection: 'sendrecv',
140
+ localTrackLabel: 'fake mic',
147
141
  },
148
- },
149
- shareTransceiver: {
150
- sender: {
151
- getStats: sinon.stub().resolves([])
142
+ video: {
143
+ sender: [fakeStats.video.sender],
144
+ receiver: [fakeStats.video.receiver],
145
+ currentDirection: 'sendrecv',
146
+ localTrackLabel: 'fake camera',
152
147
  },
153
- receiver: {
154
- getStats: sinon.stub().resolves([])
155
- },
156
- }
148
+ screenShareVideo: {
149
+ sender: [],
150
+ receiver: [],
151
+ currentDirection: 'sendrecv'
152
+ }
153
+ })
157
154
  };
158
155
 
159
156
  networkQualityMonitor = new NetworkQualityMonitor(initialConfig);