@webex/internal-media-core 0.0.2-beta → 0.0.5-beta

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 (124) hide show
  1. package/dist/cjs/index.js +13246 -0
  2. package/dist/esm/index.js +1342 -762
  3. package/dist/types/Media/Effects/BNR/Bnr.d.ts.map +1 -1
  4. package/dist/types/Media/Effects/BNR/BnrMock.d.ts.map +1 -1
  5. package/dist/types/MediaConnection/MediaConnection.d.ts.map +1 -1
  6. package/dist/types/MediaConnection/config.d.ts +11 -0
  7. package/dist/types/MediaConnection/config.d.ts.map +1 -1
  8. package/dist/types/MediaConnection/logger.d.ts +1 -1
  9. package/dist/types/MediaConnection/logger.d.ts.map +1 -1
  10. package/dist/types/MediaConnection/utils.d.ts +3 -0
  11. package/dist/types/MediaConnection/utils.d.ts.map +1 -1
  12. package/dist/types/MediaConnection/utils.test-fixtures.d.ts +10 -0
  13. package/dist/types/MediaConnection/utils.test-fixtures.d.ts.map +1 -1
  14. package/package.json +13 -8
  15. package/dist/transpiled/Logger/index.js +0 -41
  16. package/dist/transpiled/Logger/index.js.map +0 -1
  17. package/dist/transpiled/Media/Device/Device.js +0 -21
  18. package/dist/transpiled/Media/Device/Device.js.map +0 -1
  19. package/dist/transpiled/Media/Device/DeviceMocks.js +0 -65
  20. package/dist/transpiled/Media/Device/DeviceMocks.js.map +0 -1
  21. package/dist/transpiled/Media/Device/index.js +0 -2
  22. package/dist/transpiled/Media/Device/index.js.map +0 -1
  23. package/dist/transpiled/Media/Effects/BNR/Bnr.integration-test.js +0 -47
  24. package/dist/transpiled/Media/Effects/BNR/Bnr.integration-test.js.map +0 -1
  25. package/dist/transpiled/Media/Effects/BNR/Bnr.js +0 -187
  26. package/dist/transpiled/Media/Effects/BNR/Bnr.js.map +0 -1
  27. package/dist/transpiled/Media/Effects/BNR/Bnr.test.js +0 -37
  28. package/dist/transpiled/Media/Effects/BNR/Bnr.test.js.map +0 -1
  29. package/dist/transpiled/Media/Effects/BNR/BnrMock.js +0 -92
  30. package/dist/transpiled/Media/Effects/BNR/BnrMock.js.map +0 -1
  31. package/dist/transpiled/Media/Effects/BNR/index.js +0 -2
  32. package/dist/transpiled/Media/Effects/BNR/index.js.map +0 -1
  33. package/dist/transpiled/Media/Media.integration-test.js +0 -40
  34. package/dist/transpiled/Media/Media.integration-test.js.map +0 -1
  35. package/dist/transpiled/Media/Media.test.js +0 -291
  36. package/dist/transpiled/Media/Media.test.js.map +0 -1
  37. package/dist/transpiled/Media/Track/BufferSourceAudioTrack.js +0 -4
  38. package/dist/transpiled/Media/Track/BufferSourceAudioTrack.js.map +0 -1
  39. package/dist/transpiled/Media/Track/CameraVideoTrack.js +0 -4
  40. package/dist/transpiled/Media/Track/CameraVideoTrack.js.map +0 -1
  41. package/dist/transpiled/Media/Track/LocalAudioTrack.js +0 -4
  42. package/dist/transpiled/Media/Track/LocalAudioTrack.js.map +0 -1
  43. package/dist/transpiled/Media/Track/LocalTrack.js +0 -4
  44. package/dist/transpiled/Media/Track/LocalTrack.js.map +0 -1
  45. package/dist/transpiled/Media/Track/LocalVideoTrack.js +0 -4
  46. package/dist/transpiled/Media/Track/LocalVideoTrack.js.map +0 -1
  47. package/dist/transpiled/Media/Track/MicrophoneAudioTrack.js +0 -4
  48. package/dist/transpiled/Media/Track/MicrophoneAudioTrack.js.map +0 -1
  49. package/dist/transpiled/Media/Track/RemoteAudioTrack.js +0 -4
  50. package/dist/transpiled/Media/Track/RemoteAudioTrack.js.map +0 -1
  51. package/dist/transpiled/Media/Track/RemoteTrack.js +0 -4
  52. package/dist/transpiled/Media/Track/RemoteTrack.js.map +0 -1
  53. package/dist/transpiled/Media/Track/RemoteVideoTrack.js +0 -4
  54. package/dist/transpiled/Media/Track/RemoteVideoTrack.js.map +0 -1
  55. package/dist/transpiled/Media/Track/Track.integration-test.js +0 -118
  56. package/dist/transpiled/Media/Track/Track.integration-test.js.map +0 -1
  57. package/dist/transpiled/Media/Track/Track.js +0 -120
  58. package/dist/transpiled/Media/Track/Track.js.map +0 -1
  59. package/dist/transpiled/Media/Track/Track.test.js +0 -26
  60. package/dist/transpiled/Media/Track/Track.test.js.map +0 -1
  61. package/dist/transpiled/Media/Track/TrackMock.js +0 -109
  62. package/dist/transpiled/Media/Track/TrackMock.js.map +0 -1
  63. package/dist/transpiled/Media/Track/Utils.js +0 -31
  64. package/dist/transpiled/Media/Track/Utils.js.map +0 -1
  65. package/dist/transpiled/Media/Track/index.js +0 -2
  66. package/dist/transpiled/Media/Track/index.js.map +0 -1
  67. package/dist/transpiled/Media/index.js +0 -401
  68. package/dist/transpiled/Media/index.js.map +0 -1
  69. package/dist/transpiled/MediaConnection/EventEmitter.js +0 -4
  70. package/dist/transpiled/MediaConnection/EventEmitter.js.map +0 -1
  71. package/dist/transpiled/MediaConnection/MediaConnection.integration-test.js +0 -218
  72. package/dist/transpiled/MediaConnection/MediaConnection.integration-test.js.map +0 -1
  73. package/dist/transpiled/MediaConnection/MediaConnection.js +0 -357
  74. package/dist/transpiled/MediaConnection/MediaConnection.js.map +0 -1
  75. package/dist/transpiled/MediaConnection/MediaConnection.test.js +0 -427
  76. package/dist/transpiled/MediaConnection/MediaConnection.test.js.map +0 -1
  77. package/dist/transpiled/MediaConnection/RoapMediaConnection.integration-test.js +0 -368
  78. package/dist/transpiled/MediaConnection/RoapMediaConnection.integration-test.js.map +0 -1
  79. package/dist/transpiled/MediaConnection/RoapMediaConnection.js +0 -148
  80. package/dist/transpiled/MediaConnection/RoapMediaConnection.js.map +0 -1
  81. package/dist/transpiled/MediaConnection/RoapMediaConnection.test.js +0 -320
  82. package/dist/transpiled/MediaConnection/RoapMediaConnection.test.js.map +0 -1
  83. package/dist/transpiled/MediaConnection/config.js +0 -2
  84. package/dist/transpiled/MediaConnection/config.js.map +0 -1
  85. package/dist/transpiled/MediaConnection/eventTypes.js +0 -36
  86. package/dist/transpiled/MediaConnection/eventTypes.js.map +0 -1
  87. package/dist/transpiled/MediaConnection/index.js +0 -4
  88. package/dist/transpiled/MediaConnection/index.js.map +0 -1
  89. package/dist/transpiled/MediaConnection/logger.js +0 -22
  90. package/dist/transpiled/MediaConnection/logger.js.map +0 -1
  91. package/dist/transpiled/MediaConnection/roap.js +0 -399
  92. package/dist/transpiled/MediaConnection/roap.js.map +0 -1
  93. package/dist/transpiled/MediaConnection/roap.test.js +0 -873
  94. package/dist/transpiled/MediaConnection/roap.test.js.map +0 -1
  95. package/dist/transpiled/MediaConnection/roap.typegen.js +0 -2
  96. package/dist/transpiled/MediaConnection/roap.typegen.js.map +0 -1
  97. package/dist/transpiled/MediaConnection/testUtils/EventListener.js +0 -102
  98. package/dist/transpiled/MediaConnection/testUtils/EventListener.js.map +0 -1
  99. package/dist/transpiled/MediaConnection/testUtils/RoapListener.js +0 -15
  100. package/dist/transpiled/MediaConnection/testUtils/RoapListener.js.map +0 -1
  101. package/dist/transpiled/MediaConnection/testUtils/index.js +0 -17
  102. package/dist/transpiled/MediaConnection/testUtils/index.js.map +0 -1
  103. package/dist/transpiled/MediaConnection/testUtils/logger.js +0 -31
  104. package/dist/transpiled/MediaConnection/testUtils/logger.js.map +0 -1
  105. package/dist/transpiled/MediaConnection/testUtils.js +0 -14
  106. package/dist/transpiled/MediaConnection/testUtils.js.map +0 -1
  107. package/dist/transpiled/MediaConnection/utils.js +0 -71
  108. package/dist/transpiled/MediaConnection/utils.js.map +0 -1
  109. package/dist/transpiled/MediaConnection/utils.test-fixtures.js +0 -287
  110. package/dist/transpiled/MediaConnection/utils.test-fixtures.js.map +0 -1
  111. package/dist/transpiled/MediaConnection/utils.test.js +0 -20
  112. package/dist/transpiled/MediaConnection/utils.test.js.map +0 -1
  113. package/dist/transpiled/common/peerConnectionMock.js +0 -52
  114. package/dist/transpiled/common/peerConnectionMock.js.map +0 -1
  115. package/dist/transpiled/constants.js +0 -9
  116. package/dist/transpiled/constants.js.map +0 -1
  117. package/dist/transpiled/index.intergation-test.js +0 -14
  118. package/dist/transpiled/index.intergation-test.js.map +0 -1
  119. package/dist/transpiled/index.js +0 -41
  120. package/dist/transpiled/index.js.map +0 -1
  121. package/dist/types/MediaConnection/MediaConnection.integration-test.d.ts +0 -2
  122. package/dist/types/MediaConnection/MediaConnection.integration-test.d.ts.map +0 -1
  123. package/dist/types/MediaConnection/testUtils.d.ts +0 -7
  124. package/dist/types/MediaConnection/testUtils.d.ts.map +0 -1
@@ -1,873 +0,0 @@
1
- import { Roap } from './roap';
2
- import { Event, ErrorType } from './eventTypes';
3
- import { createControlledPromise, flushPromises, setupTestLogger, teardownTestLogger, RoapListener, } from './testUtils';
4
- import { getLogger } from './logger';
5
- describe('Roap', () => {
6
- let roap;
7
- const MUNGED_LOCAL_SDP = 'munged local SDP';
8
- const FAKE_REMOTE_SDP = 'some remote SDP';
9
- let createLocalOffer;
10
- let handleRemoteOffer;
11
- let handleRemoteAnswer;
12
- const log = (action, description) => getLogger().info(`Test: ${action} ${description}`);
13
- const resetCallbackMocks = () => {
14
- createLocalOffer.mockClear();
15
- handleRemoteOffer.mockClear();
16
- handleRemoteAnswer.mockClear();
17
- };
18
- let roapListener;
19
- let roapStateMachineState;
20
- let waitingForState;
21
- beforeAll(() => {
22
- setupTestLogger();
23
- });
24
- afterAll(() => {
25
- teardownTestLogger();
26
- });
27
- beforeEach(() => {
28
- roapStateMachineState = '';
29
- waitingForState = {};
30
- createLocalOffer = jest.fn().mockResolvedValue({ sdp: MUNGED_LOCAL_SDP });
31
- handleRemoteOffer = jest.fn().mockResolvedValue({ sdp: MUNGED_LOCAL_SDP });
32
- handleRemoteAnswer = jest.fn().mockResolvedValue({});
33
- roap = new Roap(() => createLocalOffer(), (sdp) => handleRemoteOffer(sdp), (sdp) => handleRemoteAnswer(sdp));
34
- roapListener = new RoapListener(roap, log);
35
- roap.getStateMachine().onTransition((state) => {
36
- roapStateMachineState = state.value;
37
- if (waitingForState.resolve && state.value === waitingForState.state) {
38
- waitingForState.resolve();
39
- waitingForState.resolve = undefined;
40
- waitingForState.state = undefined;
41
- }
42
- });
43
- console.log(`======================== TEST: ${expect.getState().currentTestName}`);
44
- });
45
- const waitForState = (expectedState) => {
46
- if (roapStateMachineState === expectedState) {
47
- log('waitForState()', `state already matching expectedState ${expectedState}`);
48
- return Promise.resolve();
49
- }
50
- return new Promise((resolve) => {
51
- log('waitForState()', `waiting for roap state machine to reach ${expectedState}`);
52
- waitingForState.state = expectedState;
53
- waitingForState.resolve = resolve;
54
- });
55
- };
56
- const checkRemoteAnswerOkFlow = async (seq) => {
57
- roap.roapMessageReceived({
58
- messageType: 'ANSWER',
59
- seq,
60
- sdp: FAKE_REMOTE_SDP,
61
- });
62
- await roapListener.waitForMessage({
63
- messageType: 'OK',
64
- seq,
65
- });
66
- await waitForState('idle');
67
- };
68
- const checkLocalOfferAnswerOkFlow = async (seq) => {
69
- await roapListener.waitForMessage({
70
- messageType: 'OFFER',
71
- seq,
72
- sdp: MUNGED_LOCAL_SDP,
73
- tieBreaker: 0xfffffffe,
74
- });
75
- await checkRemoteAnswerOkFlow(seq);
76
- };
77
- const expectLocalOfferToBeCreated = () => {
78
- expect(createLocalOffer).toBeCalledOnceWith();
79
- };
80
- const expectLocalAnswerToBeCreated = (remoteOffer) => {
81
- expect(handleRemoteOffer).toBeCalledOnceWith(remoteOffer);
82
- };
83
- const expectRemoteAnswerToBeHandled = (remoteAnswer) => {
84
- expect(handleRemoteAnswer).toBeCalledOnceWith(remoteAnswer);
85
- };
86
- it('handles OFFER_REQUEST correctly', async () => {
87
- const FAKE_SEQ = 10;
88
- roap.roapMessageReceived({
89
- messageType: 'OFFER_REQUEST',
90
- seq: FAKE_SEQ,
91
- });
92
- await roapListener.waitForMessage({
93
- messageType: 'OFFER_RESPONSE',
94
- seq: FAKE_SEQ,
95
- sdp: MUNGED_LOCAL_SDP,
96
- });
97
- expectLocalOfferToBeCreated();
98
- roap.roapMessageReceived({
99
- messageType: 'ANSWER',
100
- seq: FAKE_SEQ,
101
- sdp: FAKE_REMOTE_SDP,
102
- });
103
- await roapListener.waitForMessage({
104
- messageType: 'OK',
105
- seq: FAKE_SEQ,
106
- });
107
- expectRemoteAnswerToBeHandled(FAKE_REMOTE_SDP);
108
- await waitForState('idle');
109
- });
110
- it('works correctly when client initiates the offer', async () => {
111
- roap.initiateOffer();
112
- await roapListener.waitForMessage({
113
- messageType: 'OFFER',
114
- seq: 1,
115
- sdp: MUNGED_LOCAL_SDP,
116
- tieBreaker: 0xfffffffe,
117
- });
118
- expectLocalOfferToBeCreated();
119
- roap.roapMessageReceived({
120
- messageType: 'ANSWER',
121
- seq: 1,
122
- sdp: FAKE_REMOTE_SDP,
123
- });
124
- await roapListener.waitForMessage({
125
- messageType: 'OK',
126
- seq: 1,
127
- });
128
- await waitForState('idle');
129
- });
130
- it('works correctly when backend initiates the offer', async () => {
131
- roap.roapMessageReceived({
132
- messageType: 'OFFER',
133
- seq: 1,
134
- sdp: FAKE_REMOTE_SDP,
135
- tieBreaker: 0x100,
136
- });
137
- await roapListener.waitForMessage({
138
- messageType: 'ANSWER',
139
- seq: 1,
140
- sdp: MUNGED_LOCAL_SDP,
141
- });
142
- expectLocalAnswerToBeCreated(FAKE_REMOTE_SDP);
143
- roap.roapMessageReceived({
144
- messageType: 'OK',
145
- seq: 1,
146
- });
147
- await waitForState('idle');
148
- });
149
- describe('glare handling', () => {
150
- const runTest = async (remoteOfferMessageType, remoteOfferBeforeOurs = false) => {
151
- const createLocalOfferPromise = createControlledPromise();
152
- if (remoteOfferBeforeOurs) {
153
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
154
- }
155
- roap.initiateOffer();
156
- if (remoteOfferBeforeOurs) {
157
- roap.roapMessageReceived({
158
- messageType: remoteOfferMessageType,
159
- seq: 1,
160
- sdp: remoteOfferMessageType === 'OFFER' ? FAKE_REMOTE_SDP : undefined,
161
- tieBreaker: 0x100,
162
- });
163
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
164
- await roapListener.waitForMessage({
165
- messageType: 'ERROR',
166
- errorType: ErrorType.CONFLICT,
167
- seq: 1,
168
- });
169
- await roapListener.waitForMessage({
170
- messageType: 'OFFER',
171
- seq: 1,
172
- sdp: MUNGED_LOCAL_SDP,
173
- tieBreaker: 0xfffffffe,
174
- });
175
- }
176
- else {
177
- await roapListener.waitForMessage({
178
- messageType: 'OFFER',
179
- seq: 1,
180
- sdp: MUNGED_LOCAL_SDP,
181
- tieBreaker: 0xfffffffe,
182
- });
183
- roap.roapMessageReceived({
184
- messageType: remoteOfferMessageType,
185
- seq: 1,
186
- sdp: remoteOfferMessageType === 'OFFER' ? FAKE_REMOTE_SDP : undefined,
187
- tieBreaker: 0x100,
188
- });
189
- await roapListener.waitForMessage({
190
- messageType: 'ERROR',
191
- errorType: ErrorType.CONFLICT,
192
- seq: 1,
193
- });
194
- }
195
- await checkRemoteAnswerOkFlow(1);
196
- };
197
- it('works correctly when remote OFFER arrives AFTER our offer got created', async () => runTest('OFFER'));
198
- it('works correctly when remote OFFER_REQUEST arrives AFTER our offer got created', async () => runTest('OFFER_REQUEST'));
199
- it('works correctly when remote OFFER arrives BEFORE our offer got created', async () => runTest('OFFER', true));
200
- it('works correctly when remote OFFER_REQUEST arrives BEFORE our offer got created', async () => runTest('OFFER_REQUEST', true));
201
- describe('queueing when initiateOffer() is called', () => {
202
- const testInitiateOffer = async (whenToCallInitiateOffer) => {
203
- let initiateOfferResolved = false;
204
- const remoteOfferMessageType = 'OFFER';
205
- const handleRemoteOfferPromise = createControlledPromise();
206
- handleRemoteOffer = jest.fn().mockReturnValue(handleRemoteOfferPromise);
207
- roap.roapMessageReceived({
208
- messageType: remoteOfferMessageType,
209
- seq: 1,
210
- sdp: remoteOfferMessageType === 'OFFER' ? FAKE_REMOTE_SDP : undefined,
211
- tieBreaker: 0x100,
212
- });
213
- if (whenToCallInitiateOffer === 'WHILE_PROCESSING_REMOTE_OFFER') {
214
- roap.initiateOffer().then(() => {
215
- initiateOfferResolved = true;
216
- });
217
- }
218
- handleRemoteOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
219
- await roapListener.waitForMessage({
220
- messageType: 'ANSWER',
221
- seq: 1,
222
- sdp: MUNGED_LOCAL_SDP,
223
- });
224
- expectLocalAnswerToBeCreated(FAKE_REMOTE_SDP);
225
- if (whenToCallInitiateOffer === 'WHILE_WAITING_FOR_OK') {
226
- roap.initiateOffer().then(() => {
227
- initiateOfferResolved = true;
228
- });
229
- }
230
- await flushPromises();
231
- expect(initiateOfferResolved).toEqual(false);
232
- roap.roapMessageReceived({
233
- messageType: 'OK',
234
- seq: 1,
235
- });
236
- await roapListener.waitForMessage({
237
- messageType: 'OFFER',
238
- seq: 2,
239
- sdp: MUNGED_LOCAL_SDP,
240
- tieBreaker: 0xfffffffe,
241
- });
242
- await flushPromises();
243
- expect(initiateOfferResolved).toEqual(true);
244
- await checkRemoteAnswerOkFlow(2);
245
- };
246
- it('queues another SDP exchange if initiateOffer() is called after receiving remote offer', async () => {
247
- await testInitiateOffer('WHILE_PROCESSING_REMOTE_OFFER');
248
- });
249
- it('queues another SDP exchange if initiateOffer() is when waiting for OK message', async () => {
250
- await testInitiateOffer('WHILE_WAITING_FOR_OK');
251
- });
252
- it('restarts SDP exchange if initiateOffer() is called while creating a local offer', async () => {
253
- const createLocalOfferPromise = createControlledPromise();
254
- const initiateOfferResolved = [false, false];
255
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
256
- roap.initiateOffer().then(() => {
257
- initiateOfferResolved[0] = true;
258
- });
259
- await flushPromises();
260
- roap.initiateOffer().then(() => {
261
- initiateOfferResolved[1] = true;
262
- });
263
- await flushPromises();
264
- expect(initiateOfferResolved).toEqual([false, false]);
265
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
266
- await roapListener.waitForMessage({
267
- messageType: 'OFFER',
268
- seq: 1,
269
- sdp: MUNGED_LOCAL_SDP,
270
- tieBreaker: 0xfffffffe,
271
- });
272
- await flushPromises();
273
- expect(initiateOfferResolved).toEqual([true, true]);
274
- expect(createLocalOffer).toBeCalledTimes(2);
275
- await checkRemoteAnswerOkFlow(1);
276
- });
277
- it('restarts SDP exchange if initiateOffer() is called while handling OFFER_REQUEST message', async () => {
278
- const createLocalOfferPromise = createControlledPromise();
279
- let initiateOfferResolved = false;
280
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
281
- roap.roapMessageReceived({
282
- messageType: 'OFFER_REQUEST',
283
- seq: 1,
284
- });
285
- await flushPromises();
286
- roap.initiateOffer().then(() => {
287
- initiateOfferResolved = true;
288
- });
289
- await flushPromises();
290
- expect(initiateOfferResolved).toEqual(false);
291
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
292
- await roapListener.waitForMessage({
293
- messageType: 'OFFER_RESPONSE',
294
- seq: 1,
295
- sdp: MUNGED_LOCAL_SDP,
296
- });
297
- await flushPromises();
298
- expect(initiateOfferResolved).toEqual(true);
299
- expect(createLocalOffer).toBeCalledTimes(2);
300
- await checkRemoteAnswerOkFlow(1);
301
- });
302
- it('queues another SDP exchange if initiateOffer() is called while waiting for answer', async () => {
303
- const initiateOfferResolved = [false, false];
304
- roap.initiateOffer().then(() => {
305
- initiateOfferResolved[0] = true;
306
- });
307
- await roapListener.waitForMessage({
308
- messageType: 'OFFER',
309
- seq: 1,
310
- sdp: MUNGED_LOCAL_SDP,
311
- tieBreaker: 0xfffffffe,
312
- });
313
- roap.initiateOffer().then(() => {
314
- initiateOfferResolved[1] = true;
315
- });
316
- await flushPromises();
317
- expect(initiateOfferResolved).toEqual([true, false]);
318
- roap.roapMessageReceived({
319
- messageType: 'ANSWER',
320
- seq: 1,
321
- sdp: FAKE_REMOTE_SDP,
322
- });
323
- await roapListener.waitForMessage({
324
- messageType: 'OK',
325
- seq: 1,
326
- });
327
- await roapListener.waitForMessage({
328
- messageType: 'OFFER',
329
- seq: 2,
330
- sdp: MUNGED_LOCAL_SDP,
331
- tieBreaker: 0xfffffffe,
332
- });
333
- await flushPromises();
334
- expect(initiateOfferResolved).toEqual([true, true]);
335
- await checkRemoteAnswerOkFlow(2);
336
- });
337
- it('queues another SDP exchange if initiateOffer() is called while processing an answer', async () => {
338
- const initiateOfferResolved = [false, false];
339
- const handleRemoteAnswerPromise = createControlledPromise();
340
- handleRemoteAnswer = jest.fn().mockReturnValue(handleRemoteAnswerPromise);
341
- roap.initiateOffer().then(() => {
342
- initiateOfferResolved[0] = true;
343
- });
344
- await roapListener.waitForMessage({
345
- messageType: 'OFFER',
346
- seq: 1,
347
- sdp: MUNGED_LOCAL_SDP,
348
- tieBreaker: 0xfffffffe,
349
- });
350
- await flushPromises();
351
- expect(initiateOfferResolved).toEqual([true, false]);
352
- roap.roapMessageReceived({
353
- messageType: 'ANSWER',
354
- seq: 1,
355
- sdp: FAKE_REMOTE_SDP,
356
- });
357
- roap.initiateOffer().then(() => {
358
- initiateOfferResolved[1] = true;
359
- });
360
- await flushPromises();
361
- expect(initiateOfferResolved).toEqual([true, false]);
362
- handleRemoteAnswerPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
363
- await roapListener.waitForMessage({
364
- messageType: 'OK',
365
- seq: 1,
366
- });
367
- await roapListener.waitForMessage({
368
- messageType: 'OFFER',
369
- seq: 2,
370
- sdp: MUNGED_LOCAL_SDP,
371
- tieBreaker: 0xfffffffe,
372
- });
373
- await flushPromises();
374
- expect(initiateOfferResolved).toEqual([true, true]);
375
- await checkRemoteAnswerOkFlow(2);
376
- });
377
- });
378
- });
379
- describe('Error messages', () => {
380
- let roapFailurePromise;
381
- beforeEach(() => {
382
- roapFailurePromise = createControlledPromise();
383
- roap.on(Event.ROAP_FAILURE, () => {
384
- log('Event.ROAP_FAILURE', 'got ROAP_FAILURE event');
385
- roapFailurePromise.resolve({});
386
- });
387
- });
388
- it('DOUBLECONFLICT handled correctly when received after initiating an offer', async () => {
389
- roap.initiateOffer();
390
- await roapListener.waitForMessage({
391
- messageType: 'OFFER',
392
- seq: 1,
393
- sdp: MUNGED_LOCAL_SDP,
394
- tieBreaker: 0xfffffffe,
395
- });
396
- expectLocalOfferToBeCreated();
397
- resetCallbackMocks();
398
- roap.roapMessageReceived({
399
- messageType: 'ERROR',
400
- errorType: ErrorType.DOUBLECONFLICT,
401
- seq: 1,
402
- });
403
- await roapListener.waitForMessage({
404
- messageType: 'OFFER',
405
- seq: 2,
406
- sdp: MUNGED_LOCAL_SDP,
407
- tieBreaker: 0xfffffffe,
408
- });
409
- expectLocalOfferToBeCreated();
410
- await checkRemoteAnswerOkFlow(2);
411
- });
412
- const retryableErrors = [
413
- ErrorType.DOUBLECONFLICT,
414
- ErrorType.INVALID_STATE,
415
- ErrorType.OUT_OF_ORDER,
416
- ErrorType.RETRY,
417
- ];
418
- retryableErrors.map((errorType) => it(`${errorType} triggers no more than 2 offer retries`, async () => {
419
- roap.initiateOffer();
420
- await roapListener.waitForMessage({
421
- messageType: 'OFFER',
422
- seq: 1,
423
- sdp: MUNGED_LOCAL_SDP,
424
- tieBreaker: 0xfffffffe,
425
- });
426
- expectLocalOfferToBeCreated();
427
- resetCallbackMocks();
428
- roap.roapMessageReceived({
429
- messageType: 'ERROR',
430
- errorType,
431
- seq: 1,
432
- });
433
- await roapListener.waitForMessage({
434
- messageType: 'OFFER',
435
- seq: 2,
436
- sdp: MUNGED_LOCAL_SDP,
437
- tieBreaker: 0xfffffffe,
438
- });
439
- expectLocalOfferToBeCreated();
440
- resetCallbackMocks();
441
- roap.roapMessageReceived({
442
- messageType: 'ERROR',
443
- errorType,
444
- seq: 2,
445
- });
446
- await roapListener.waitForMessage({
447
- messageType: 'OFFER',
448
- seq: 3,
449
- sdp: MUNGED_LOCAL_SDP,
450
- tieBreaker: 0xfffffffe,
451
- });
452
- expectLocalOfferToBeCreated();
453
- resetCallbackMocks();
454
- roap.roapMessageReceived({
455
- messageType: 'ERROR',
456
- errorType,
457
- seq: 3,
458
- });
459
- await waitForState('remoteError');
460
- await roapFailurePromise;
461
- }));
462
- it('fails if unrecoverable error is received while waiting for SDP answer', async () => {
463
- roap.initiateOffer();
464
- await roapListener.waitForMessage({
465
- messageType: 'OFFER',
466
- seq: 1,
467
- sdp: MUNGED_LOCAL_SDP,
468
- tieBreaker: 0xfffffffe,
469
- });
470
- roap.roapMessageReceived({
471
- messageType: 'ERROR',
472
- errorType: ErrorType.CONFLICT,
473
- seq: 1,
474
- });
475
- await waitForState('remoteError');
476
- await roapFailurePromise;
477
- });
478
- it('fails if error is received while waiting for OK message', async () => {
479
- roap.roapMessageReceived({
480
- messageType: 'OFFER',
481
- seq: 1,
482
- sdp: FAKE_REMOTE_SDP,
483
- tieBreaker: 0x100,
484
- });
485
- await roapListener.waitForMessage({
486
- messageType: 'ANSWER',
487
- seq: 1,
488
- sdp: MUNGED_LOCAL_SDP,
489
- });
490
- roap.roapMessageReceived({
491
- messageType: 'ERROR',
492
- seq: 1,
493
- });
494
- await waitForState('remoteError');
495
- await roapFailurePromise;
496
- });
497
- it('sends FAILED error if browser rejects the remote SDP offer', async () => {
498
- handleRemoteOffer = jest.fn().mockRejectedValue(new Error('fake browser failure'));
499
- roap.roapMessageReceived({
500
- messageType: 'OFFER',
501
- seq: 1,
502
- sdp: FAKE_REMOTE_SDP,
503
- });
504
- await roapListener.waitForMessage({
505
- messageType: 'ERROR',
506
- errorType: ErrorType.FAILED,
507
- seq: 1,
508
- });
509
- await waitForState('browserError');
510
- await roapFailurePromise;
511
- });
512
- it('sends FAILED error if browser rejects the remote SDP answer', async () => {
513
- handleRemoteAnswer = jest.fn().mockRejectedValue(new Error('fake browser failure'));
514
- roap.initiateOffer();
515
- await roapListener.waitForMessage({
516
- messageType: 'OFFER',
517
- seq: 1,
518
- sdp: MUNGED_LOCAL_SDP,
519
- tieBreaker: 0xfffffffe,
520
- });
521
- roap.roapMessageReceived({
522
- messageType: 'ANSWER',
523
- seq: 1,
524
- sdp: FAKE_REMOTE_SDP,
525
- });
526
- await roapListener.waitForMessage({
527
- messageType: 'ERROR',
528
- errorType: ErrorType.FAILED,
529
- seq: 1,
530
- });
531
- await waitForState('browserError');
532
- await roapFailurePromise;
533
- });
534
- it('sends FAILED error if browser fails to create a local SDP offer', async () => {
535
- const fakeError = new Error('local SDP rejected');
536
- createLocalOffer.mockRejectedValue(fakeError);
537
- await expect(roap.initiateOffer()).rejects.toEqual(fakeError);
538
- await waitForState('browserError');
539
- await roapFailurePromise;
540
- });
541
- });
542
- describe('Unexpected messages', () => {
543
- const checkInvalidStateError = async (messageType, seq) => {
544
- roap.roapMessageReceived({ messageType, seq, sdp: FAKE_REMOTE_SDP });
545
- await roapListener.waitForMessage({
546
- messageType: 'ERROR',
547
- errorType: ErrorType.INVALID_STATE,
548
- seq,
549
- });
550
- roap.roapMessageReceived({ messageType, seq: seq + 10, sdp: FAKE_REMOTE_SDP });
551
- await roapListener.waitForMessage({
552
- messageType: 'ERROR',
553
- errorType: ErrorType.INVALID_STATE,
554
- seq: seq + 10,
555
- });
556
- };
557
- it('sends INVALID_STATE error when receiving messages in wrong state (client initiates the offer)', async () => {
558
- const createLocalOfferPromise = createControlledPromise();
559
- const handleRemoteAnswerPromise = createControlledPromise();
560
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
561
- handleRemoteAnswer = jest.fn().mockReturnValue(handleRemoteAnswerPromise);
562
- await checkInvalidStateError('ANSWER', 1);
563
- await checkInvalidStateError('OK', 1);
564
- roap.initiateOffer();
565
- await flushPromises();
566
- await checkInvalidStateError('ANSWER', 1);
567
- await checkInvalidStateError('OK', 1);
568
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
569
- await roapListener.waitForMessage({
570
- messageType: 'OFFER',
571
- seq: 1,
572
- sdp: MUNGED_LOCAL_SDP,
573
- tieBreaker: 0xfffffffe,
574
- });
575
- expectLocalOfferToBeCreated();
576
- await checkInvalidStateError('OK', 1);
577
- roap.roapMessageReceived({
578
- messageType: 'ANSWER',
579
- seq: 1,
580
- sdp: FAKE_REMOTE_SDP,
581
- });
582
- await checkInvalidStateError('OFFER', 1);
583
- await checkInvalidStateError('OFFER_REQUEST', 1);
584
- await checkInvalidStateError('OK', 1);
585
- handleRemoteAnswerPromise.resolve({});
586
- await roapListener.waitForMessage({
587
- messageType: 'OK',
588
- seq: 1,
589
- });
590
- await checkInvalidStateError('ANSWER', 2);
591
- await checkInvalidStateError('OK', 2);
592
- await waitForState('idle');
593
- });
594
- it('sends INVALID_STATE error when receiving messages in wrong state (server initiates the offer)', async () => {
595
- const handleRemoteOfferPromise = createControlledPromise();
596
- handleRemoteOffer = jest.fn().mockReturnValue(handleRemoteOfferPromise);
597
- roap.roapMessageReceived({
598
- messageType: 'OFFER',
599
- seq: 1,
600
- sdp: FAKE_REMOTE_SDP,
601
- tieBreaker: 0x100,
602
- });
603
- await checkInvalidStateError('ANSWER', 1);
604
- await checkInvalidStateError('OK', 1);
605
- await checkInvalidStateError('OFFER_REQUEST', 1);
606
- handleRemoteOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
607
- await roapListener.waitForMessage({
608
- messageType: 'ANSWER',
609
- seq: 1,
610
- sdp: MUNGED_LOCAL_SDP,
611
- });
612
- expectLocalAnswerToBeCreated(FAKE_REMOTE_SDP);
613
- await checkInvalidStateError('ANSWER', 1);
614
- await checkInvalidStateError('OFFER_REQUEST', 1);
615
- roap.roapMessageReceived({
616
- messageType: 'OK',
617
- seq: 1,
618
- });
619
- await waitForState('idle');
620
- });
621
- });
622
- describe('Duplicate messages from server', () => {
623
- const checkDuplicateIgnored = async (messageType, seq) => {
624
- const stateBeforeMessageReceived = roapStateMachineState;
625
- roap.roapMessageReceived({ messageType, seq, sdp: FAKE_REMOTE_SDP });
626
- await flushPromises();
627
- expect(roapListener.getReceivedMessages().length).toEqual(0);
628
- expect(stateBeforeMessageReceived).toEqual(roapStateMachineState);
629
- };
630
- it('ignores duplicate ANSWER from the server', async () => {
631
- const handleRemoteAnswerPromise = createControlledPromise();
632
- handleRemoteAnswer = jest.fn().mockReturnValue(handleRemoteAnswerPromise);
633
- roap.initiateOffer();
634
- await roapListener.waitForMessage({
635
- messageType: 'OFFER',
636
- seq: 1,
637
- sdp: MUNGED_LOCAL_SDP,
638
- tieBreaker: 0xfffffffe,
639
- });
640
- expectLocalOfferToBeCreated();
641
- roap.roapMessageReceived({
642
- messageType: 'ANSWER',
643
- seq: 1,
644
- sdp: FAKE_REMOTE_SDP,
645
- });
646
- await checkDuplicateIgnored('ANSWER', 1);
647
- handleRemoteAnswerPromise.resolve({});
648
- await roapListener.waitForMessage({
649
- messageType: 'OK',
650
- seq: 1,
651
- });
652
- await checkDuplicateIgnored('ANSWER', 1);
653
- await waitForState('idle');
654
- await checkDuplicateIgnored('ANSWER', 1);
655
- });
656
- it('ignores duplicate OFFER from the server', async () => {
657
- const handleRemoteOfferPromise = createControlledPromise();
658
- handleRemoteOffer = jest.fn().mockReturnValue(handleRemoteOfferPromise);
659
- roap.roapMessageReceived({
660
- messageType: 'OFFER',
661
- seq: 1,
662
- sdp: FAKE_REMOTE_SDP,
663
- tieBreaker: 0x100,
664
- });
665
- await checkDuplicateIgnored('OFFER', 1);
666
- handleRemoteOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
667
- await roapListener.waitForMessage({
668
- messageType: 'ANSWER',
669
- seq: 1,
670
- sdp: MUNGED_LOCAL_SDP,
671
- });
672
- expectLocalAnswerToBeCreated(FAKE_REMOTE_SDP);
673
- await checkDuplicateIgnored('OFFER', 1);
674
- roap.roapMessageReceived({
675
- messageType: 'OK',
676
- seq: 1,
677
- });
678
- await waitForState('idle');
679
- });
680
- it('ignores duplicate OFFER_REQUEST from the server', async () => {
681
- const createLocalOfferPromise = createControlledPromise();
682
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
683
- roap.roapMessageReceived({
684
- messageType: 'OFFER_REQUEST',
685
- seq: 1,
686
- });
687
- await checkDuplicateIgnored('OFFER_REQUEST', 1);
688
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
689
- await roapListener.waitForMessage({
690
- messageType: 'OFFER_RESPONSE',
691
- seq: 1,
692
- sdp: MUNGED_LOCAL_SDP,
693
- });
694
- expectLocalOfferToBeCreated();
695
- await checkDuplicateIgnored('OFFER_REQUEST', 1);
696
- await checkRemoteAnswerOkFlow(1);
697
- });
698
- });
699
- describe('messages with old seq are rejected with OUT_OF_ORDER error or ignored', () => {
700
- const checkOutOfOrderError = async (messageType, seq) => {
701
- roap.roapMessageReceived({ messageType, seq, sdp: FAKE_REMOTE_SDP });
702
- await roapListener.waitForMessage({
703
- messageType: 'ERROR',
704
- errorType: ErrorType.OUT_OF_ORDER,
705
- seq,
706
- });
707
- };
708
- const checkOldErrorsAreIgnored = async () => {
709
- for (const errorType of Object.values(ErrorType)) {
710
- const stateBeforeMessageReceived = roapStateMachineState;
711
- roap.roapMessageReceived({
712
- messageType: 'ERROR',
713
- errorType,
714
- seq: 0,
715
- });
716
- await flushPromises();
717
- expect(roapListener.getReceivedMessages().length).toEqual(0);
718
- expect(stateBeforeMessageReceived).toEqual(roapStateMachineState);
719
- }
720
- };
721
- it('in idle state', async () => {
722
- roap.initiateOffer();
723
- await checkLocalOfferAnswerOkFlow(1);
724
- await checkOutOfOrderError('OFFER', 0);
725
- await checkOutOfOrderError('OFFER', 1);
726
- await checkOutOfOrderError('OFFER_REQUEST', 0);
727
- await checkOutOfOrderError('OFFER_REQUEST', 1);
728
- await checkOutOfOrderError('ANSWER', 0);
729
- await checkOutOfOrderError('OK', 0);
730
- await checkOldErrorsAreIgnored();
731
- });
732
- it('during the flow where client initiates the offer', async () => {
733
- const createLocalOfferPromise = createControlledPromise();
734
- const handleRemoteAnswerPromise = createControlledPromise();
735
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
736
- handleRemoteAnswer = jest.fn().mockReturnValue(handleRemoteAnswerPromise);
737
- roap.initiateOffer();
738
- await flushPromises();
739
- await checkOutOfOrderError('OFFER', 0);
740
- await checkOutOfOrderError('OFFER_REQUEST', 0);
741
- await checkOutOfOrderError('ANSWER', 0);
742
- await checkOutOfOrderError('OK', 0);
743
- await checkOldErrorsAreIgnored();
744
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
745
- await roapListener.waitForMessage({
746
- messageType: 'OFFER',
747
- seq: 1,
748
- sdp: MUNGED_LOCAL_SDP,
749
- tieBreaker: 0xfffffffe,
750
- });
751
- expectLocalOfferToBeCreated();
752
- await checkOutOfOrderError('OFFER', 0);
753
- await checkOutOfOrderError('OFFER_REQUEST', 0);
754
- await checkOutOfOrderError('ANSWER', 0);
755
- await checkOutOfOrderError('OK', 0);
756
- await checkOldErrorsAreIgnored();
757
- roap.roapMessageReceived({
758
- messageType: 'ANSWER',
759
- seq: 1,
760
- sdp: FAKE_REMOTE_SDP,
761
- });
762
- await checkOutOfOrderError('OFFER', 0);
763
- await checkOutOfOrderError('OFFER_REQUEST', 0);
764
- await checkOutOfOrderError('ANSWER', 0);
765
- await checkOutOfOrderError('OK', 0);
766
- await checkOldErrorsAreIgnored();
767
- handleRemoteAnswerPromise.resolve({});
768
- await roapListener.waitForMessage({
769
- messageType: 'OK',
770
- seq: 1,
771
- });
772
- await waitForState('idle');
773
- });
774
- it('during the flow where server initiates the offer', async () => {
775
- const handleRemoteOfferPromise = createControlledPromise();
776
- handleRemoteOffer = jest.fn().mockReturnValue(handleRemoteOfferPromise);
777
- roap.roapMessageReceived({
778
- messageType: 'OFFER',
779
- seq: 1,
780
- sdp: FAKE_REMOTE_SDP,
781
- tieBreaker: 0x100,
782
- });
783
- await checkOutOfOrderError('OFFER', 0);
784
- await checkOutOfOrderError('OFFER_REQUEST', 0);
785
- await checkOutOfOrderError('ANSWER', 0);
786
- await checkOutOfOrderError('OK', 0);
787
- await checkOldErrorsAreIgnored();
788
- handleRemoteOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
789
- await roapListener.waitForMessage({
790
- messageType: 'ANSWER',
791
- seq: 1,
792
- sdp: MUNGED_LOCAL_SDP,
793
- });
794
- expectLocalAnswerToBeCreated(FAKE_REMOTE_SDP);
795
- await checkOutOfOrderError('OFFER', 0);
796
- await checkOutOfOrderError('OFFER_REQUEST', 0);
797
- await checkOutOfOrderError('ANSWER', 0);
798
- await checkOutOfOrderError('OK', 0);
799
- await checkOldErrorsAreIgnored();
800
- roap.roapMessageReceived({
801
- messageType: 'OK',
802
- seq: 1,
803
- });
804
- await waitForState('idle');
805
- });
806
- it('during the flow where server sends OFFER_REQUEST', async () => {
807
- const createLocalOfferPromise = createControlledPromise();
808
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
809
- roap.roapMessageReceived({
810
- messageType: 'OFFER_REQUEST',
811
- seq: 1,
812
- });
813
- await checkOutOfOrderError('OFFER', 0);
814
- await checkOutOfOrderError('OFFER_REQUEST', 0);
815
- await checkOutOfOrderError('ANSWER', 0);
816
- await checkOutOfOrderError('OK', 0);
817
- await checkOldErrorsAreIgnored();
818
- createLocalOfferPromise.resolve({ sdp: MUNGED_LOCAL_SDP });
819
- await roapListener.waitForMessage({
820
- messageType: 'OFFER_RESPONSE',
821
- seq: 1,
822
- sdp: MUNGED_LOCAL_SDP,
823
- });
824
- expectLocalOfferToBeCreated();
825
- await checkOutOfOrderError('OFFER', 0);
826
- await checkOutOfOrderError('OFFER_REQUEST', 0);
827
- await checkOutOfOrderError('ANSWER', 0);
828
- await checkOutOfOrderError('OK', 0);
829
- await checkOldErrorsAreIgnored();
830
- await checkRemoteAnswerOkFlow(1);
831
- });
832
- });
833
- describe('stop() method', () => {
834
- it('calls stop() on the state machine interpreter', () => {
835
- const stateMachineInterpreter = roap.getStateMachine();
836
- const stopSpy = jest.spyOn(stateMachineInterpreter, 'stop');
837
- roap.stop();
838
- expect(stopSpy).toBeCalledOnceWith();
839
- });
840
- it('stops events that are sent from service onDone handler from firing', async () => {
841
- const createLocalOfferPromise = createControlledPromise();
842
- createLocalOffer = jest.fn().mockReturnValue(createLocalOfferPromise);
843
- roap.initiateOffer();
844
- await flushPromises();
845
- roap.stop();
846
- createLocalOfferPromise.resolve({ sdp: 'fake sdp' });
847
- await flushPromises();
848
- expect(roapListener.getReceivedMessages().length).toEqual(0);
849
- await new Promise((resolve) => {
850
- setTimeout(() => resolve({}), 2000);
851
- });
852
- });
853
- it('stops the state machine from handling any more requests', async () => {
854
- roap.stop();
855
- roap.initiateOffer();
856
- await flushPromises();
857
- expect(roapListener.getReceivedMessages().length).toEqual(0);
858
- });
859
- it('stops handling any more remote messages', async () => {
860
- roap.stop();
861
- roap.roapMessageReceived({
862
- messageType: 'OFFER',
863
- seq: 1,
864
- sdp: FAKE_REMOTE_SDP,
865
- tieBreaker: 0x100,
866
- });
867
- await flushPromises();
868
- expect(handleRemoteOffer).not.toBeCalled();
869
- expect(roapListener.getReceivedMessages().length).toEqual(0);
870
- });
871
- });
872
- });
873
- //# sourceMappingURL=roap.test.js.map