@webex/internal-media-core 0.0.1-beta → 0.0.4-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 (108) hide show
  1. package/README.md +2 -78
  2. package/package.json +3 -2
  3. package/dist/transpiled/Logger/index.js +0 -41
  4. package/dist/transpiled/Logger/index.js.map +0 -1
  5. package/dist/transpiled/Media/Device/Device.js +0 -21
  6. package/dist/transpiled/Media/Device/Device.js.map +0 -1
  7. package/dist/transpiled/Media/Device/DeviceMocks.js +0 -65
  8. package/dist/transpiled/Media/Device/DeviceMocks.js.map +0 -1
  9. package/dist/transpiled/Media/Device/index.js +0 -2
  10. package/dist/transpiled/Media/Device/index.js.map +0 -1
  11. package/dist/transpiled/Media/Effects/BNR/Bnr.integration-test.js +0 -47
  12. package/dist/transpiled/Media/Effects/BNR/Bnr.integration-test.js.map +0 -1
  13. package/dist/transpiled/Media/Effects/BNR/Bnr.js +0 -187
  14. package/dist/transpiled/Media/Effects/BNR/Bnr.js.map +0 -1
  15. package/dist/transpiled/Media/Effects/BNR/Bnr.test.js +0 -37
  16. package/dist/transpiled/Media/Effects/BNR/Bnr.test.js.map +0 -1
  17. package/dist/transpiled/Media/Effects/BNR/BnrMock.js +0 -92
  18. package/dist/transpiled/Media/Effects/BNR/BnrMock.js.map +0 -1
  19. package/dist/transpiled/Media/Effects/BNR/index.js +0 -2
  20. package/dist/transpiled/Media/Effects/BNR/index.js.map +0 -1
  21. package/dist/transpiled/Media/Media.integration-test.js +0 -40
  22. package/dist/transpiled/Media/Media.integration-test.js.map +0 -1
  23. package/dist/transpiled/Media/Media.test.js +0 -291
  24. package/dist/transpiled/Media/Media.test.js.map +0 -1
  25. package/dist/transpiled/Media/Track/BufferSourceAudioTrack.js +0 -4
  26. package/dist/transpiled/Media/Track/BufferSourceAudioTrack.js.map +0 -1
  27. package/dist/transpiled/Media/Track/CameraVideoTrack.js +0 -4
  28. package/dist/transpiled/Media/Track/CameraVideoTrack.js.map +0 -1
  29. package/dist/transpiled/Media/Track/LocalAudioTrack.js +0 -4
  30. package/dist/transpiled/Media/Track/LocalAudioTrack.js.map +0 -1
  31. package/dist/transpiled/Media/Track/LocalTrack.js +0 -4
  32. package/dist/transpiled/Media/Track/LocalTrack.js.map +0 -1
  33. package/dist/transpiled/Media/Track/LocalVideoTrack.js +0 -4
  34. package/dist/transpiled/Media/Track/LocalVideoTrack.js.map +0 -1
  35. package/dist/transpiled/Media/Track/MicrophoneAudioTrack.js +0 -4
  36. package/dist/transpiled/Media/Track/MicrophoneAudioTrack.js.map +0 -1
  37. package/dist/transpiled/Media/Track/RemoteAudioTrack.js +0 -4
  38. package/dist/transpiled/Media/Track/RemoteAudioTrack.js.map +0 -1
  39. package/dist/transpiled/Media/Track/RemoteTrack.js +0 -4
  40. package/dist/transpiled/Media/Track/RemoteTrack.js.map +0 -1
  41. package/dist/transpiled/Media/Track/RemoteVideoTrack.js +0 -4
  42. package/dist/transpiled/Media/Track/RemoteVideoTrack.js.map +0 -1
  43. package/dist/transpiled/Media/Track/Track.integration-test.js +0 -118
  44. package/dist/transpiled/Media/Track/Track.integration-test.js.map +0 -1
  45. package/dist/transpiled/Media/Track/Track.js +0 -120
  46. package/dist/transpiled/Media/Track/Track.js.map +0 -1
  47. package/dist/transpiled/Media/Track/Track.test.js +0 -26
  48. package/dist/transpiled/Media/Track/Track.test.js.map +0 -1
  49. package/dist/transpiled/Media/Track/TrackMock.js +0 -109
  50. package/dist/transpiled/Media/Track/TrackMock.js.map +0 -1
  51. package/dist/transpiled/Media/Track/Utils.js +0 -31
  52. package/dist/transpiled/Media/Track/Utils.js.map +0 -1
  53. package/dist/transpiled/Media/Track/index.js +0 -2
  54. package/dist/transpiled/Media/Track/index.js.map +0 -1
  55. package/dist/transpiled/Media/index.js +0 -401
  56. package/dist/transpiled/Media/index.js.map +0 -1
  57. package/dist/transpiled/MediaConnection/EventEmitter.js +0 -4
  58. package/dist/transpiled/MediaConnection/EventEmitter.js.map +0 -1
  59. package/dist/transpiled/MediaConnection/MediaConnection.integration-test.js +0 -218
  60. package/dist/transpiled/MediaConnection/MediaConnection.integration-test.js.map +0 -1
  61. package/dist/transpiled/MediaConnection/MediaConnection.js +0 -357
  62. package/dist/transpiled/MediaConnection/MediaConnection.js.map +0 -1
  63. package/dist/transpiled/MediaConnection/MediaConnection.test.js +0 -427
  64. package/dist/transpiled/MediaConnection/MediaConnection.test.js.map +0 -1
  65. package/dist/transpiled/MediaConnection/RoapMediaConnection.integration-test.js +0 -368
  66. package/dist/transpiled/MediaConnection/RoapMediaConnection.integration-test.js.map +0 -1
  67. package/dist/transpiled/MediaConnection/RoapMediaConnection.js +0 -148
  68. package/dist/transpiled/MediaConnection/RoapMediaConnection.js.map +0 -1
  69. package/dist/transpiled/MediaConnection/RoapMediaConnection.test.js +0 -320
  70. package/dist/transpiled/MediaConnection/RoapMediaConnection.test.js.map +0 -1
  71. package/dist/transpiled/MediaConnection/config.js +0 -2
  72. package/dist/transpiled/MediaConnection/config.js.map +0 -1
  73. package/dist/transpiled/MediaConnection/eventTypes.js +0 -36
  74. package/dist/transpiled/MediaConnection/eventTypes.js.map +0 -1
  75. package/dist/transpiled/MediaConnection/index.js +0 -4
  76. package/dist/transpiled/MediaConnection/index.js.map +0 -1
  77. package/dist/transpiled/MediaConnection/logger.js +0 -22
  78. package/dist/transpiled/MediaConnection/logger.js.map +0 -1
  79. package/dist/transpiled/MediaConnection/roap.js +0 -399
  80. package/dist/transpiled/MediaConnection/roap.js.map +0 -1
  81. package/dist/transpiled/MediaConnection/roap.test.js +0 -873
  82. package/dist/transpiled/MediaConnection/roap.test.js.map +0 -1
  83. package/dist/transpiled/MediaConnection/roap.typegen.js +0 -2
  84. package/dist/transpiled/MediaConnection/roap.typegen.js.map +0 -1
  85. package/dist/transpiled/MediaConnection/testUtils/EventListener.js +0 -102
  86. package/dist/transpiled/MediaConnection/testUtils/EventListener.js.map +0 -1
  87. package/dist/transpiled/MediaConnection/testUtils/RoapListener.js +0 -15
  88. package/dist/transpiled/MediaConnection/testUtils/RoapListener.js.map +0 -1
  89. package/dist/transpiled/MediaConnection/testUtils/index.js +0 -17
  90. package/dist/transpiled/MediaConnection/testUtils/index.js.map +0 -1
  91. package/dist/transpiled/MediaConnection/testUtils/logger.js +0 -31
  92. package/dist/transpiled/MediaConnection/testUtils/logger.js.map +0 -1
  93. package/dist/transpiled/MediaConnection/testUtils.js +0 -14
  94. package/dist/transpiled/MediaConnection/testUtils.js.map +0 -1
  95. package/dist/transpiled/MediaConnection/utils.js +0 -71
  96. package/dist/transpiled/MediaConnection/utils.js.map +0 -1
  97. package/dist/transpiled/MediaConnection/utils.test-fixtures.js +0 -287
  98. package/dist/transpiled/MediaConnection/utils.test-fixtures.js.map +0 -1
  99. package/dist/transpiled/MediaConnection/utils.test.js +0 -20
  100. package/dist/transpiled/MediaConnection/utils.test.js.map +0 -1
  101. package/dist/transpiled/common/peerConnectionMock.js +0 -52
  102. package/dist/transpiled/common/peerConnectionMock.js.map +0 -1
  103. package/dist/transpiled/constants.js +0 -9
  104. package/dist/transpiled/constants.js.map +0 -1
  105. package/dist/transpiled/index.intergation-test.js +0 -14
  106. package/dist/transpiled/index.intergation-test.js.map +0 -1
  107. package/dist/transpiled/index.js +0 -41
  108. package/dist/transpiled/index.js.map +0 -1
@@ -1,401 +0,0 @@
1
- import EventEmitter from 'events';
2
- import { DEVICE, MEDIA } from '../constants';
3
- import logger from '../Logger';
4
- import { Device, DeviceKinds } from './Device';
5
- import { Track } from './Track';
6
- const eventEmitter = new EventEmitter();
7
- const deviceList = [];
8
- const getDevices = async () => {
9
- logger.debug({
10
- mediaType: DEVICE,
11
- action: 'getDevices()',
12
- description: 'Called',
13
- });
14
- if (!navigator.mediaDevices?.enumerateDevices) {
15
- console.warn('navigator.mediaDevices.enumerateDevices() is not supported.');
16
- return [];
17
- }
18
- logger.info({
19
- mediaType: DEVICE,
20
- action: 'getDevices()',
21
- description: 'Requesting list of available media input and output devices',
22
- });
23
- return navigator.mediaDevices.enumerateDevices();
24
- };
25
- const getCameras = async () => {
26
- logger.debug({
27
- mediaType: DEVICE,
28
- action: 'getCameras()',
29
- description: 'Called',
30
- });
31
- const devices = await getDevices();
32
- logger.info({
33
- mediaType: DEVICE,
34
- action: 'getCameras()',
35
- description: 'Filtering camera devices from all available media devices',
36
- });
37
- return devices
38
- .filter(({ kind }) => kind === DeviceKinds.VIDEO_INPUT)
39
- .map((device) => {
40
- logger.debug({
41
- ID: device.deviceId,
42
- mediaType: DEVICE,
43
- action: 'getCameras()',
44
- description: `Received camera device ${JSON.stringify(device)}`,
45
- });
46
- return new Device(device);
47
- });
48
- };
49
- const getMicrophones = async () => {
50
- logger.debug({
51
- mediaType: DEVICE,
52
- action: 'getMicrophones()',
53
- description: 'Called',
54
- });
55
- const devices = await getDevices();
56
- logger.info({
57
- mediaType: DEVICE,
58
- action: 'getMicrophones()',
59
- description: 'Filtering microphones devices from all available media devices',
60
- });
61
- return devices
62
- .filter(({ kind }) => kind === DeviceKinds.AUDIO_INPUT)
63
- .map((device) => {
64
- logger.debug({
65
- ID: device.deviceId,
66
- mediaType: DEVICE,
67
- action: 'getMicrophones()',
68
- description: `Received microphone device ${JSON.stringify(device)}`,
69
- });
70
- return new Device(device);
71
- });
72
- };
73
- const getSpeakers = async () => {
74
- logger.debug({
75
- mediaType: DEVICE,
76
- action: 'getSpeakers()',
77
- description: 'Called',
78
- });
79
- const devices = await getDevices();
80
- logger.info({
81
- mediaType: DEVICE,
82
- action: 'getSpeakers()',
83
- description: 'Filtering speaker devices from all available media devices',
84
- });
85
- return devices
86
- .filter(({ kind }) => kind === DeviceKinds.AUDIO_OUTPUT)
87
- .map((device) => {
88
- logger.debug({
89
- ID: device.deviceId,
90
- mediaType: DEVICE,
91
- action: 'getSpeakers()',
92
- description: `Received speaker device ${JSON.stringify(device)}`,
93
- });
94
- return new Device(device);
95
- });
96
- };
97
- function getUnsupportedConstraints(mediaConstraints) {
98
- logger.debug({
99
- mediaType: MEDIA,
100
- action: 'getUnsupportedConstraints()',
101
- description: `Called with ${JSON.stringify(mediaConstraints)}`,
102
- });
103
- logger.info({
104
- mediaType: MEDIA,
105
- action: 'getUnsupportedConstraints()',
106
- description: 'Filtering list of media track unsupported constraints',
107
- });
108
- const supportedConstraints = navigator.mediaDevices.getSupportedConstraints();
109
- const unsupportedConstraints = [];
110
- Object.keys(mediaConstraints).forEach((constraint) => {
111
- if (!(Object.prototype.hasOwnProperty.call(supportedConstraints, constraint) &&
112
- supportedConstraints[constraint])) {
113
- unsupportedConstraints.push(constraint);
114
- }
115
- });
116
- logger.debug({
117
- mediaType: MEDIA,
118
- action: 'getUnsupportedConstraints()',
119
- description: `Received unsupported constraints ${unsupportedConstraints}`,
120
- });
121
- return unsupportedConstraints;
122
- }
123
- async function createAudioTrack(device) {
124
- logger.debug({
125
- ID: device?.ID,
126
- mediaType: DEVICE,
127
- action: 'createAudioTrack()',
128
- description: `Called ${device ? `with ${JSON.stringify(device)}` : ''} `,
129
- });
130
- if (device && device.kind !== DeviceKinds.AUDIO_INPUT) {
131
- const error = new Error(`Device ${device.ID} is not of kind AUDIO_INPUT`);
132
- logger.error({
133
- ID: device.ID,
134
- mediaType: 'DEVICE',
135
- action: 'createAudioTrack()',
136
- description: error.message,
137
- error,
138
- });
139
- throw error;
140
- }
141
- logger.info({
142
- ID: device?.ID,
143
- mediaType: DEVICE,
144
- action: 'createAudioTrack()',
145
- description: 'Creating audio track',
146
- });
147
- const deviceConfig = device
148
- ? {
149
- audio: {
150
- deviceId: {
151
- exact: device.ID,
152
- },
153
- },
154
- }
155
- : {
156
- audio: true,
157
- video: false,
158
- };
159
- const stream = await navigator.mediaDevices.getUserMedia(deviceConfig);
160
- const track = stream.getAudioTracks()[0];
161
- if (track) {
162
- logger.debug({
163
- ID: device?.ID,
164
- mediaType: DEVICE,
165
- action: 'createAudioTrack()',
166
- description: `Received audio track ${JSON.stringify(track)}`,
167
- });
168
- return new Track(track);
169
- }
170
- const error = new Error(`Device could not obtain an audio track of kind ${device?.kind}`);
171
- logger.error({
172
- ID: device?.ID,
173
- mediaType: 'DEVICE',
174
- action: 'createAudioTrack()',
175
- description: error.message,
176
- error,
177
- });
178
- throw error;
179
- }
180
- async function createVideoTrack(device) {
181
- logger.debug({
182
- ID: device?.ID,
183
- mediaType: DEVICE,
184
- action: 'createVideoTrack()',
185
- description: `Called ${device ? `with ${JSON.stringify(device)}` : ''} `,
186
- });
187
- if (device && device.kind !== DeviceKinds.VIDEO_INPUT) {
188
- const error = new Error(`Device ${device.ID} is not of kind VIDEO_INPUT`);
189
- logger.error({
190
- ID: device.ID,
191
- mediaType: 'DEVICE',
192
- action: 'createVideoTrack()',
193
- description: error.message,
194
- error,
195
- });
196
- throw error;
197
- }
198
- logger.info({
199
- ID: device?.ID,
200
- mediaType: DEVICE,
201
- action: 'createVideoTrack()',
202
- description: 'Creating video track',
203
- });
204
- const deviceConfig = device
205
- ? {
206
- video: {
207
- deviceId: {
208
- exact: device.ID,
209
- },
210
- },
211
- }
212
- : {
213
- audio: false,
214
- video: true,
215
- };
216
- const stream = await navigator.mediaDevices.getUserMedia(deviceConfig);
217
- const track = stream.getVideoTracks()[0];
218
- if (track) {
219
- logger.debug({
220
- ID: device?.ID,
221
- mediaType: DEVICE,
222
- action: 'createVideoTrack()',
223
- description: `Received video track ${JSON.stringify(track)}`,
224
- });
225
- return new Track(track);
226
- }
227
- const error = new Error(`Device could not obtain a video track of kind ${device?.kind}`);
228
- logger.error({
229
- ID: device?.ID,
230
- mediaType: 'DEVICE',
231
- action: 'createVideoTrack()',
232
- description: error.message,
233
- error,
234
- });
235
- throw error;
236
- }
237
- async function createContentTrack(mediaConstraints) {
238
- logger.debug({
239
- ID: mediaConstraints?.deviceId?.toString(),
240
- mediaType: DEVICE,
241
- action: 'createContentTrack()',
242
- description: `Called ${mediaConstraints ? `with ${JSON.stringify(mediaConstraints)}` : ''} `,
243
- });
244
- logger.info({
245
- ID: mediaConstraints?.deviceId?.toString(),
246
- mediaType: MEDIA,
247
- action: 'createContentTrack()',
248
- description: 'Creating content track',
249
- });
250
- const deviceConfig = {
251
- audio: false,
252
- video: true,
253
- };
254
- let track;
255
- let stream;
256
- try {
257
- stream = await navigator.mediaDevices.getDisplayMedia(deviceConfig);
258
- [track] = stream.getVideoTracks();
259
- }
260
- catch (error) {
261
- if (error instanceof Error) {
262
- logger.error({
263
- ID: mediaConstraints?.deviceId?.toString(),
264
- mediaType: 'DEVICE',
265
- action: 'createContentTrack()',
266
- description: error.message,
267
- error,
268
- });
269
- }
270
- throw error;
271
- }
272
- if (mediaConstraints) {
273
- const unsupportedConstraints = getUnsupportedConstraints(mediaConstraints);
274
- if (unsupportedConstraints.length <= 0) {
275
- track.applyConstraints(mediaConstraints);
276
- logger.debug({
277
- ID: mediaConstraints?.deviceId?.toString(),
278
- mediaType: DEVICE,
279
- action: 'createContentTrack()',
280
- description: 'Applied media constraints to fetched content track',
281
- });
282
- }
283
- else {
284
- const error = new Error(`${unsupportedConstraints.join(', ')} constraint is not supported by browser`);
285
- logger.error({
286
- ID: mediaConstraints?.deviceId?.toString(),
287
- mediaType: 'DEVICE',
288
- action: 'createContentTrack()',
289
- description: error.message,
290
- error,
291
- });
292
- throw error;
293
- }
294
- }
295
- if (track) {
296
- logger.debug({
297
- ID: mediaConstraints?.deviceId?.toString(),
298
- mediaType: DEVICE,
299
- action: 'createContentTrack()',
300
- description: `Received content track ${JSON.stringify(track)}`,
301
- });
302
- return new Track(track);
303
- }
304
- const error = new Error('Could not obtain a content track');
305
- logger.error({
306
- ID: mediaConstraints?.deviceId?.toString(),
307
- mediaType: 'DEVICE',
308
- action: 'createContentTrack()',
309
- description: error.message,
310
- error,
311
- });
312
- throw error;
313
- }
314
- async function deviceChangePublisher() {
315
- logger.debug({
316
- mediaType: DEVICE,
317
- action: 'deviceChangePublisher()',
318
- description: 'Called',
319
- });
320
- if (!navigator.mediaDevices?.enumerateDevices) {
321
- console.warn('navigator.mediaDevices.enumerateDevices() is not supported.');
322
- return;
323
- }
324
- logger.info({
325
- mediaType: DEVICE,
326
- action: 'deviceChangePublisher()',
327
- description: 'Calling individual subscription listener obtained by device change event',
328
- });
329
- const newDeviceList = await navigator.mediaDevices.enumerateDevices();
330
- let filtered = [];
331
- let getGroupIdsFrom = [];
332
- let filterDevicesFrom = [];
333
- let action = 'changed';
334
- const deviceListGroups = new Set();
335
- if (newDeviceList.length !== deviceList.length) {
336
- [getGroupIdsFrom, filterDevicesFrom, action] =
337
- newDeviceList.length < deviceList.length
338
- ? [newDeviceList, deviceList, 'removed']
339
- : [deviceList, newDeviceList, 'added'];
340
- getGroupIdsFrom.forEach((device) => {
341
- deviceListGroups.add(device.groupId);
342
- });
343
- filtered = filterDevicesFrom.filter((device) => !deviceListGroups.has(device.groupId));
344
- deviceList.splice(0, deviceList.length);
345
- deviceList.push(...newDeviceList);
346
- eventEmitter.emit('device:changed', {
347
- action,
348
- devices: filtered,
349
- });
350
- }
351
- }
352
- async function on(eventName, listener) {
353
- logger.debug({
354
- mediaType: MEDIA,
355
- action: 'on()',
356
- description: `Subscribing to an ${eventName},${listener}`,
357
- });
358
- eventEmitter.on(eventName, listener);
359
- if (eventName === 'device:changed') {
360
- const thisDeviceList = await getDevices();
361
- deviceList.push(...thisDeviceList);
362
- navigator.mediaDevices.addEventListener('devicechange', deviceChangePublisher);
363
- }
364
- }
365
- const off = (eventName, listener) => {
366
- logger.debug({
367
- mediaType: MEDIA,
368
- action: 'off()',
369
- description: `Called ${eventName} with ${listener} listener`,
370
- });
371
- eventEmitter.off(eventName, listener);
372
- };
373
- const hasH264Codec = async () => {
374
- let hasCodec = false;
375
- try {
376
- const peerConnection = new window.RTCPeerConnection();
377
- const offer = await peerConnection.createOffer({
378
- offerToReceiveVideo: true,
379
- });
380
- if (offer?.sdp?.match(/^a=rtpmap:\d+\s+H264\/\d+/m)) {
381
- hasCodec = true;
382
- }
383
- peerConnection.close();
384
- }
385
- catch (error) {
386
- logger.debug({
387
- mediaType: MEDIA,
388
- action: 'hasH264Codec()',
389
- description: `Meetings:util#hasH264Codec----> Error creating peerConnection for H.264 test`,
390
- });
391
- }
392
- return hasCodec;
393
- };
394
- const isCodecAvailable = async () => {
395
- const isCodec = await hasH264Codec();
396
- return isCodec;
397
- };
398
- export * from './Device';
399
- export * from './Track';
400
- export { getDevices, getCameras, getMicrophones, getSpeakers, createAudioTrack, createVideoTrack, createContentTrack, on, off, isCodecAvailable, };
401
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Media/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { EventEmitter as EE } from 'events';
2
- export default class EventEmitter extends EE {
3
- }
4
- //# sourceMappingURL=EventEmitter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../../src/MediaConnection/EventEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,IAAI,EAAE,EAAC,MAAM,QAAQ,CAAC;AAM1C,MAAM,CAAC,OAAO,OAAO,YAAiC,SAAS,EAE1D;CAAG"}
@@ -1,218 +0,0 @@
1
- import { expect } from 'chai';
2
- import { RemoteTrackType } from './eventTypes';
3
- import { ConnectionState, Event, MediaConnection, } from './index';
4
- import { createControlledPromise } from './testUtils';
5
- describe('2 MediaConnections connected to each other', () => {
6
- let localStream;
7
- let testConnections;
8
- const setupConnectionEventHandlers = () => {
9
- const getOtherConnection = (connection) => {
10
- return connection === testConnections[0].mc ? testConnections[1].mc : testConnections[0].mc;
11
- };
12
- testConnections.forEach(({ mc, debug, connectionEstablished, audioRemoteTrackAdded, videoRemoteTrackAdded }) => {
13
- if (mc) {
14
- mc.on(Event.CONNECTION_STATE_CHANGED, (e) => {
15
- console.log(`TEST: got CONNECTION_STATE_CHANGED from ${debug}:`, e);
16
- if (e.state === ConnectionState.CONNECTED) {
17
- connectionEstablished.resolve(undefined);
18
- }
19
- });
20
- mc.on(Event.REMOTE_TRACK_ADDED, (e) => {
21
- console.log(`TEST: got REMOTE_TRACK_ADDED from ${debug}:`, JSON.stringify(e));
22
- if (e.type === RemoteTrackType.AUDIO) {
23
- audioRemoteTrackAdded.resolve(undefined);
24
- }
25
- if (e.type === RemoteTrackType.VIDEO) {
26
- videoRemoteTrackAdded.resolve(undefined);
27
- }
28
- });
29
- mc.on(Event.ROAP_MESSAGE_TO_SEND, (e) => {
30
- console.log(`TEST: got ROAP_MESSAGE_TO_SEND from ${debug}: ${e.roapMessage.sdp}`);
31
- if (e.roapMessage.messageType === 'OFFER') {
32
- const message = e.roapMessage;
33
- message.sdp = message.sdp?.replace(/\r\na=group:BUNDLE 0 1 2/gi, '');
34
- getOtherConnection(mc).roapMessageReceived(message);
35
- }
36
- else {
37
- getOtherConnection(mc).roapMessageReceived(e.roapMessage);
38
- }
39
- });
40
- }
41
- });
42
- };
43
- const createTestConnections = (options) => {
44
- const { send, receive } = options;
45
- testConnections = [
46
- {
47
- mc: new MediaConnection({ iceServers: [], sdpMunging: { convertPort9to0: false } }, { send, receive }, 'mc1'),
48
- debug: 'mc1',
49
- connectionEstablished: createControlledPromise(),
50
- audioRemoteTrackAdded: createControlledPromise(),
51
- videoRemoteTrackAdded: createControlledPromise(),
52
- },
53
- {
54
- mc: new MediaConnection({ iceServers: [], sdpMunging: { convertPort9to0: false } }, { send, receive }, 'mc2'),
55
- debug: 'mc2',
56
- connectionEstablished: createControlledPromise(),
57
- audioRemoteTrackAdded: createControlledPromise(),
58
- videoRemoteTrackAdded: createControlledPromise(),
59
- },
60
- ];
61
- setupConnectionEventHandlers();
62
- };
63
- beforeEach(async () => {
64
- localStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
65
- expect(localStream.getAudioTracks().length).to.equal(1);
66
- expect(localStream.getVideoTracks().length).to.equal(1);
67
- });
68
- afterEach(() => {
69
- testConnections?.forEach((testConnection) => {
70
- testConnection.mc.close();
71
- });
72
- localStream?.getTracks().forEach((track) => track.stop());
73
- });
74
- it('audio only (both ways)', async () => {
75
- const audioTrack = localStream.getAudioTracks()[0];
76
- createTestConnections({
77
- send: {
78
- audio: audioTrack,
79
- },
80
- receive: { audio: true, video: false, screenShareVideo: false },
81
- });
82
- await testConnections[0].mc.initiateOffer();
83
- await Promise.all(testConnections
84
- .map(({ connectionEstablished, audioRemoteTrackAdded }) => [
85
- connectionEstablished,
86
- audioRemoteTrackAdded,
87
- ])
88
- .flat());
89
- });
90
- it('audio and video both ways', async () => {
91
- const audioTrack = localStream.getAudioTracks()[0];
92
- const videoTrack = localStream.getVideoTracks()[0];
93
- createTestConnections({
94
- send: {
95
- audio: audioTrack,
96
- video: videoTrack,
97
- },
98
- receive: { audio: true, video: true, screenShareVideo: false },
99
- });
100
- await testConnections[0].mc.initiateOffer();
101
- await Promise.all(testConnections
102
- .map(({ connectionEstablished, audioRemoteTrackAdded, videoRemoteTrackAdded }) => [
103
- connectionEstablished,
104
- audioRemoteTrackAdded,
105
- videoRemoteTrackAdded,
106
- ])
107
- .flat());
108
- });
109
- it('updateLocalTracks() should add an audio track (outgoing call)', async () => {
110
- createTestConnections({
111
- send: {},
112
- receive: { audio: true, video: true, screenShareVideo: true },
113
- });
114
- await testConnections[0].mc.initiateOffer();
115
- await Promise.all(testConnections.map(({ connectionEstablished }) => [connectionEstablished]).flat());
116
- testConnections[0].mc.updateSendOptions({ audio: localStream.getAudioTracks()[0] });
117
- await testConnections[1].audioRemoteTrackAdded;
118
- });
119
- it('updateLocalTracks() should add an audio track (incoming call)', async () => {
120
- createTestConnections({
121
- send: {},
122
- receive: { audio: true, video: true, screenShareVideo: true },
123
- });
124
- await testConnections[0].mc.initiateOffer();
125
- await Promise.all(testConnections.map(({ connectionEstablished }) => [connectionEstablished]).flat());
126
- testConnections[1].mc.updateSendOptions({ audio: localStream.getAudioTracks()[0] });
127
- await testConnections[0].audioRemoteTrackAdded;
128
- });
129
- });
130
- describe('1 MediaConnection connected to a raw RTCPeerConnection', () => {
131
- let localStream;
132
- beforeEach(async () => {
133
- localStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
134
- expect(localStream.getAudioTracks().length).to.equal(1);
135
- expect(localStream.getVideoTracks().length).to.equal(1);
136
- });
137
- afterEach(() => {
138
- localStream?.getTracks().forEach((track) => track.stop());
139
- });
140
- it('incoming audio call (with a single m-line)', async () => {
141
- let failMessage;
142
- const audioTrack = localStream.getAudioTracks()[0];
143
- const pc = new RTCPeerConnection();
144
- const mc = new MediaConnection({ iceServers: [], sdpMunging: { convertPort9to0: false } }, {
145
- send: {
146
- audio: audioTrack,
147
- },
148
- receive: {
149
- audio: true,
150
- video: false,
151
- screenShareVideo: false,
152
- },
153
- }, 'mc');
154
- const expectingRoapFromMc = {
155
- OFFER: false,
156
- OFFER_REQUEST: false,
157
- OFFER_RESPONSE: false,
158
- ANSWER: false,
159
- OK: false,
160
- ERROR: false,
161
- };
162
- const connectionEstablished = createControlledPromise();
163
- const audioRemoteTrackAdded = createControlledPromise();
164
- const roapOkSent = createControlledPromise();
165
- mc.on(Event.CONNECTION_STATE_CHANGED, (e) => {
166
- console.log('TEST: got CONNECTION_STATE_CHANGED:', e);
167
- if (e.state === ConnectionState.CONNECTED) {
168
- connectionEstablished.resolve({});
169
- }
170
- });
171
- mc.on(Event.REMOTE_TRACK_ADDED, (e) => {
172
- console.log('TEST: got REMOTE_TRACK_ADDED:', JSON.stringify(e));
173
- if (e.type === RemoteTrackType.AUDIO) {
174
- audioRemoteTrackAdded.resolve({});
175
- }
176
- });
177
- mc.on(Event.ROAP_MESSAGE_TO_SEND, async (e) => {
178
- console.log(`TEST: got ROAP_MESSAGE_TO_SEND: ${e.roapMessage.messageType}, ${e.roapMessage.sdp}`);
179
- if (expectingRoapFromMc[e.roapMessage.messageType]) {
180
- if (e.roapMessage.messageType === 'ANSWER') {
181
- await pc.setRemoteDescription({ type: 'answer', sdp: e.roapMessage.sdp });
182
- mc.roapMessageReceived({ messageType: 'OK', seq: e.roapMessage.seq });
183
- }
184
- else if (e.roapMessage.messageType === 'OFFER') {
185
- await pc.setRemoteDescription({ type: 'offer', sdp: e.roapMessage.sdp });
186
- const answer = await pc.createAnswer();
187
- await pc.setLocalDescription(answer);
188
- mc.roapMessageReceived({ messageType: 'ANSWER', seq: e.roapMessage.seq, sdp: answer.sdp });
189
- }
190
- else if (e.roapMessage.messageType === 'OK') {
191
- roapOkSent.resolve({});
192
- }
193
- }
194
- else {
195
- failMessage = `unexpected roap message received: ${JSON.stringify(e.roapMessage)}`;
196
- }
197
- });
198
- pc.addTransceiver(audioTrack);
199
- await pc.setLocalDescription();
200
- const sdp = pc.localDescription?.sdp.replaceAll(/\r\n(a=mid:.*|a=group:BUNDLE.*)/g, '');
201
- console.log(`TEST: sending SDP offer to MediaConnection: ${sdp}`);
202
- expectingRoapFromMc.ANSWER = true;
203
- mc.roapMessageReceived({
204
- messageType: 'OFFER',
205
- seq: 1,
206
- sdp,
207
- });
208
- await Promise.all([connectionEstablished, audioRemoteTrackAdded]);
209
- expect(failMessage).to.equal(undefined);
210
- expectingRoapFromMc.OFFER = true;
211
- expectingRoapFromMc.ANSWER = false;
212
- expectingRoapFromMc.OK = true;
213
- mc.updateReceiveOptions({ audio: false, video: false, screenShareVideo: false });
214
- await roapOkSent;
215
- expect(failMessage).to.equal(undefined);
216
- });
217
- });
218
- //# sourceMappingURL=MediaConnection.integration-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaConnection.integration-test.js","sourceRoot":"","sources":["../../../src/MediaConnection/MediaConnection.integration-test.ts"],"names":[],"mappings":"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"}