@webex/internal-media-core 0.0.1-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 (215) hide show
  1. package/README.md +80 -0
  2. package/dist/esm/index.js +12660 -0
  3. package/dist/transpiled/Logger/index.js +41 -0
  4. package/dist/transpiled/Logger/index.js.map +1 -0
  5. package/dist/transpiled/Media/Device/Device.js +21 -0
  6. package/dist/transpiled/Media/Device/Device.js.map +1 -0
  7. package/dist/transpiled/Media/Device/DeviceMocks.js +65 -0
  8. package/dist/transpiled/Media/Device/DeviceMocks.js.map +1 -0
  9. package/dist/transpiled/Media/Device/index.js +2 -0
  10. package/dist/transpiled/Media/Device/index.js.map +1 -0
  11. package/dist/transpiled/Media/Effects/BNR/Bnr.integration-test.js +47 -0
  12. package/dist/transpiled/Media/Effects/BNR/Bnr.integration-test.js.map +1 -0
  13. package/dist/transpiled/Media/Effects/BNR/Bnr.js +187 -0
  14. package/dist/transpiled/Media/Effects/BNR/Bnr.js.map +1 -0
  15. package/dist/transpiled/Media/Effects/BNR/Bnr.test.js +37 -0
  16. package/dist/transpiled/Media/Effects/BNR/Bnr.test.js.map +1 -0
  17. package/dist/transpiled/Media/Effects/BNR/BnrMock.js +92 -0
  18. package/dist/transpiled/Media/Effects/BNR/BnrMock.js.map +1 -0
  19. package/dist/transpiled/Media/Effects/BNR/index.js +2 -0
  20. package/dist/transpiled/Media/Effects/BNR/index.js.map +1 -0
  21. package/dist/transpiled/Media/Media.integration-test.js +40 -0
  22. package/dist/transpiled/Media/Media.integration-test.js.map +1 -0
  23. package/dist/transpiled/Media/Media.test.js +291 -0
  24. package/dist/transpiled/Media/Media.test.js.map +1 -0
  25. package/dist/transpiled/Media/Track/BufferSourceAudioTrack.js +4 -0
  26. package/dist/transpiled/Media/Track/BufferSourceAudioTrack.js.map +1 -0
  27. package/dist/transpiled/Media/Track/CameraVideoTrack.js +4 -0
  28. package/dist/transpiled/Media/Track/CameraVideoTrack.js.map +1 -0
  29. package/dist/transpiled/Media/Track/LocalAudioTrack.js +4 -0
  30. package/dist/transpiled/Media/Track/LocalAudioTrack.js.map +1 -0
  31. package/dist/transpiled/Media/Track/LocalTrack.js +4 -0
  32. package/dist/transpiled/Media/Track/LocalTrack.js.map +1 -0
  33. package/dist/transpiled/Media/Track/LocalVideoTrack.js +4 -0
  34. package/dist/transpiled/Media/Track/LocalVideoTrack.js.map +1 -0
  35. package/dist/transpiled/Media/Track/MicrophoneAudioTrack.js +4 -0
  36. package/dist/transpiled/Media/Track/MicrophoneAudioTrack.js.map +1 -0
  37. package/dist/transpiled/Media/Track/RemoteAudioTrack.js +4 -0
  38. package/dist/transpiled/Media/Track/RemoteAudioTrack.js.map +1 -0
  39. package/dist/transpiled/Media/Track/RemoteTrack.js +4 -0
  40. package/dist/transpiled/Media/Track/RemoteTrack.js.map +1 -0
  41. package/dist/transpiled/Media/Track/RemoteVideoTrack.js +4 -0
  42. package/dist/transpiled/Media/Track/RemoteVideoTrack.js.map +1 -0
  43. package/dist/transpiled/Media/Track/Track.integration-test.js +118 -0
  44. package/dist/transpiled/Media/Track/Track.integration-test.js.map +1 -0
  45. package/dist/transpiled/Media/Track/Track.js +120 -0
  46. package/dist/transpiled/Media/Track/Track.js.map +1 -0
  47. package/dist/transpiled/Media/Track/Track.test.js +26 -0
  48. package/dist/transpiled/Media/Track/Track.test.js.map +1 -0
  49. package/dist/transpiled/Media/Track/TrackMock.js +109 -0
  50. package/dist/transpiled/Media/Track/TrackMock.js.map +1 -0
  51. package/dist/transpiled/Media/Track/Utils.js +31 -0
  52. package/dist/transpiled/Media/Track/Utils.js.map +1 -0
  53. package/dist/transpiled/Media/Track/index.js +2 -0
  54. package/dist/transpiled/Media/Track/index.js.map +1 -0
  55. package/dist/transpiled/Media/index.js +401 -0
  56. package/dist/transpiled/Media/index.js.map +1 -0
  57. package/dist/transpiled/MediaConnection/EventEmitter.js +4 -0
  58. package/dist/transpiled/MediaConnection/EventEmitter.js.map +1 -0
  59. package/dist/transpiled/MediaConnection/MediaConnection.integration-test.js +218 -0
  60. package/dist/transpiled/MediaConnection/MediaConnection.integration-test.js.map +1 -0
  61. package/dist/transpiled/MediaConnection/MediaConnection.js +357 -0
  62. package/dist/transpiled/MediaConnection/MediaConnection.js.map +1 -0
  63. package/dist/transpiled/MediaConnection/MediaConnection.test.js +427 -0
  64. package/dist/transpiled/MediaConnection/MediaConnection.test.js.map +1 -0
  65. package/dist/transpiled/MediaConnection/RoapMediaConnection.integration-test.js +368 -0
  66. package/dist/transpiled/MediaConnection/RoapMediaConnection.integration-test.js.map +1 -0
  67. package/dist/transpiled/MediaConnection/RoapMediaConnection.js +148 -0
  68. package/dist/transpiled/MediaConnection/RoapMediaConnection.js.map +1 -0
  69. package/dist/transpiled/MediaConnection/RoapMediaConnection.test.js +320 -0
  70. package/dist/transpiled/MediaConnection/RoapMediaConnection.test.js.map +1 -0
  71. package/dist/transpiled/MediaConnection/config.js +2 -0
  72. package/dist/transpiled/MediaConnection/config.js.map +1 -0
  73. package/dist/transpiled/MediaConnection/eventTypes.js +36 -0
  74. package/dist/transpiled/MediaConnection/eventTypes.js.map +1 -0
  75. package/dist/transpiled/MediaConnection/index.js +4 -0
  76. package/dist/transpiled/MediaConnection/index.js.map +1 -0
  77. package/dist/transpiled/MediaConnection/logger.js +22 -0
  78. package/dist/transpiled/MediaConnection/logger.js.map +1 -0
  79. package/dist/transpiled/MediaConnection/roap.js +399 -0
  80. package/dist/transpiled/MediaConnection/roap.js.map +1 -0
  81. package/dist/transpiled/MediaConnection/roap.test.js +873 -0
  82. package/dist/transpiled/MediaConnection/roap.test.js.map +1 -0
  83. package/dist/transpiled/MediaConnection/roap.typegen.js +2 -0
  84. package/dist/transpiled/MediaConnection/roap.typegen.js.map +1 -0
  85. package/dist/transpiled/MediaConnection/testUtils/EventListener.js +102 -0
  86. package/dist/transpiled/MediaConnection/testUtils/EventListener.js.map +1 -0
  87. package/dist/transpiled/MediaConnection/testUtils/RoapListener.js +15 -0
  88. package/dist/transpiled/MediaConnection/testUtils/RoapListener.js.map +1 -0
  89. package/dist/transpiled/MediaConnection/testUtils/index.js +17 -0
  90. package/dist/transpiled/MediaConnection/testUtils/index.js.map +1 -0
  91. package/dist/transpiled/MediaConnection/testUtils/logger.js +31 -0
  92. package/dist/transpiled/MediaConnection/testUtils/logger.js.map +1 -0
  93. package/dist/transpiled/MediaConnection/testUtils.js +14 -0
  94. package/dist/transpiled/MediaConnection/testUtils.js.map +1 -0
  95. package/dist/transpiled/MediaConnection/utils.js +71 -0
  96. package/dist/transpiled/MediaConnection/utils.js.map +1 -0
  97. package/dist/transpiled/MediaConnection/utils.test-fixtures.js +287 -0
  98. package/dist/transpiled/MediaConnection/utils.test-fixtures.js.map +1 -0
  99. package/dist/transpiled/MediaConnection/utils.test.js +20 -0
  100. package/dist/transpiled/MediaConnection/utils.test.js.map +1 -0
  101. package/dist/transpiled/common/peerConnectionMock.js +52 -0
  102. package/dist/transpiled/common/peerConnectionMock.js.map +1 -0
  103. package/dist/transpiled/constants.js +9 -0
  104. package/dist/transpiled/constants.js.map +1 -0
  105. package/dist/transpiled/index.intergation-test.js +14 -0
  106. package/dist/transpiled/index.intergation-test.js.map +1 -0
  107. package/dist/transpiled/index.js +41 -0
  108. package/dist/transpiled/index.js.map +1 -0
  109. package/dist/types/Logger/index.d.ts +16 -0
  110. package/dist/types/Logger/index.d.ts.map +1 -0
  111. package/dist/types/Media/Device/Device.d.ts +20 -0
  112. package/dist/types/Media/Device/Device.d.ts.map +1 -0
  113. package/dist/types/Media/Device/DeviceMocks.d.ts +18 -0
  114. package/dist/types/Media/Device/DeviceMocks.d.ts.map +1 -0
  115. package/dist/types/Media/Device/index.d.ts +2 -0
  116. package/dist/types/Media/Device/index.d.ts.map +1 -0
  117. package/dist/types/Media/Effects/BNR/Bnr.d.ts +5 -0
  118. package/dist/types/Media/Effects/BNR/Bnr.d.ts.map +1 -0
  119. package/dist/types/Media/Effects/BNR/Bnr.integration-test.d.ts +2 -0
  120. package/dist/types/Media/Effects/BNR/Bnr.integration-test.d.ts.map +1 -0
  121. package/dist/types/Media/Effects/BNR/Bnr.test.d.ts +2 -0
  122. package/dist/types/Media/Effects/BNR/Bnr.test.d.ts.map +1 -0
  123. package/dist/types/Media/Effects/BNR/BnrMock.d.ts +3 -0
  124. package/dist/types/Media/Effects/BNR/BnrMock.d.ts.map +1 -0
  125. package/dist/types/Media/Effects/BNR/index.d.ts +2 -0
  126. package/dist/types/Media/Effects/BNR/index.d.ts.map +1 -0
  127. package/dist/types/Media/Media.integration-test.d.ts +2 -0
  128. package/dist/types/Media/Media.integration-test.d.ts.map +1 -0
  129. package/dist/types/Media/Media.test.d.ts +2 -0
  130. package/dist/types/Media/Media.test.d.ts.map +1 -0
  131. package/dist/types/Media/Track/BufferSourceAudioTrack.d.ts +4 -0
  132. package/dist/types/Media/Track/BufferSourceAudioTrack.d.ts.map +1 -0
  133. package/dist/types/Media/Track/CameraVideoTrack.d.ts +4 -0
  134. package/dist/types/Media/Track/CameraVideoTrack.d.ts.map +1 -0
  135. package/dist/types/Media/Track/LocalAudioTrack.d.ts +4 -0
  136. package/dist/types/Media/Track/LocalAudioTrack.d.ts.map +1 -0
  137. package/dist/types/Media/Track/LocalTrack.d.ts +4 -0
  138. package/dist/types/Media/Track/LocalTrack.d.ts.map +1 -0
  139. package/dist/types/Media/Track/LocalVideoTrack.d.ts +4 -0
  140. package/dist/types/Media/Track/LocalVideoTrack.d.ts.map +1 -0
  141. package/dist/types/Media/Track/MicrophoneAudioTrack.d.ts +4 -0
  142. package/dist/types/Media/Track/MicrophoneAudioTrack.d.ts.map +1 -0
  143. package/dist/types/Media/Track/RemoteAudioTrack.d.ts +4 -0
  144. package/dist/types/Media/Track/RemoteAudioTrack.d.ts.map +1 -0
  145. package/dist/types/Media/Track/RemoteTrack.d.ts +4 -0
  146. package/dist/types/Media/Track/RemoteTrack.d.ts.map +1 -0
  147. package/dist/types/Media/Track/RemoteVideoTrack.d.ts +4 -0
  148. package/dist/types/Media/Track/RemoteVideoTrack.d.ts.map +1 -0
  149. package/dist/types/Media/Track/Track.d.ts +34 -0
  150. package/dist/types/Media/Track/Track.d.ts.map +1 -0
  151. package/dist/types/Media/Track/Track.integration-test.d.ts +2 -0
  152. package/dist/types/Media/Track/Track.integration-test.d.ts.map +1 -0
  153. package/dist/types/Media/Track/Track.test.d.ts +2 -0
  154. package/dist/types/Media/Track/Track.test.d.ts.map +1 -0
  155. package/dist/types/Media/Track/TrackMock.d.ts +64 -0
  156. package/dist/types/Media/Track/TrackMock.d.ts.map +1 -0
  157. package/dist/types/Media/Track/Utils.d.ts +3 -0
  158. package/dist/types/Media/Track/Utils.d.ts.map +1 -0
  159. package/dist/types/Media/Track/index.d.ts +2 -0
  160. package/dist/types/Media/Track/index.d.ts.map +1 -0
  161. package/dist/types/Media/index.d.ts +16 -0
  162. package/dist/types/Media/index.d.ts.map +1 -0
  163. package/dist/types/MediaConnection/EventEmitter.d.ts +6 -0
  164. package/dist/types/MediaConnection/EventEmitter.d.ts.map +1 -0
  165. package/dist/types/MediaConnection/MediaConnection.d.ts +64 -0
  166. package/dist/types/MediaConnection/MediaConnection.d.ts.map +1 -0
  167. package/dist/types/MediaConnection/MediaConnection.integration-test.d.ts +2 -0
  168. package/dist/types/MediaConnection/MediaConnection.integration-test.d.ts.map +1 -0
  169. package/dist/types/MediaConnection/MediaConnection.test.d.ts +2 -0
  170. package/dist/types/MediaConnection/MediaConnection.test.d.ts.map +1 -0
  171. package/dist/types/MediaConnection/RoapMediaConnection.d.ts +43 -0
  172. package/dist/types/MediaConnection/RoapMediaConnection.d.ts.map +1 -0
  173. package/dist/types/MediaConnection/RoapMediaConnection.integration-test.d.ts +2 -0
  174. package/dist/types/MediaConnection/RoapMediaConnection.integration-test.d.ts.map +1 -0
  175. package/dist/types/MediaConnection/RoapMediaConnection.test.d.ts +2 -0
  176. package/dist/types/MediaConnection/RoapMediaConnection.test.d.ts.map +1 -0
  177. package/dist/types/MediaConnection/config.d.ts +10 -0
  178. package/dist/types/MediaConnection/config.d.ts.map +1 -0
  179. package/dist/types/MediaConnection/eventTypes.d.ts +65 -0
  180. package/dist/types/MediaConnection/eventTypes.d.ts.map +1 -0
  181. package/dist/types/MediaConnection/index.d.ts +5 -0
  182. package/dist/types/MediaConnection/index.d.ts.map +1 -0
  183. package/dist/types/MediaConnection/logger.d.ts +12 -0
  184. package/dist/types/MediaConnection/logger.d.ts.map +1 -0
  185. package/dist/types/MediaConnection/roap.d.ts +37 -0
  186. package/dist/types/MediaConnection/roap.d.ts.map +1 -0
  187. package/dist/types/MediaConnection/roap.test.d.ts +2 -0
  188. package/dist/types/MediaConnection/roap.test.d.ts.map +1 -0
  189. package/dist/types/MediaConnection/roap.typegen.d.ts +86 -0
  190. package/dist/types/MediaConnection/roap.typegen.d.ts.map +1 -0
  191. package/dist/types/MediaConnection/testUtils/EventListener.d.ts +22 -0
  192. package/dist/types/MediaConnection/testUtils/EventListener.d.ts.map +1 -0
  193. package/dist/types/MediaConnection/testUtils/RoapListener.d.ts +9 -0
  194. package/dist/types/MediaConnection/testUtils/RoapListener.d.ts.map +1 -0
  195. package/dist/types/MediaConnection/testUtils/index.d.ts +10 -0
  196. package/dist/types/MediaConnection/testUtils/index.d.ts.map +1 -0
  197. package/dist/types/MediaConnection/testUtils/logger.d.ts +3 -0
  198. package/dist/types/MediaConnection/testUtils/logger.d.ts.map +1 -0
  199. package/dist/types/MediaConnection/testUtils.d.ts +7 -0
  200. package/dist/types/MediaConnection/testUtils.d.ts.map +1 -0
  201. package/dist/types/MediaConnection/utils.d.ts +11 -0
  202. package/dist/types/MediaConnection/utils.d.ts.map +1 -0
  203. package/dist/types/MediaConnection/utils.test-fixtures.d.ts +6 -0
  204. package/dist/types/MediaConnection/utils.test-fixtures.d.ts.map +1 -0
  205. package/dist/types/MediaConnection/utils.test.d.ts +2 -0
  206. package/dist/types/MediaConnection/utils.test.d.ts.map +1 -0
  207. package/dist/types/common/peerConnectionMock.d.ts +5 -0
  208. package/dist/types/common/peerConnectionMock.d.ts.map +1 -0
  209. package/dist/types/constants.d.ts +9 -0
  210. package/dist/types/constants.d.ts.map +1 -0
  211. package/dist/types/index.d.ts +23 -0
  212. package/dist/types/index.d.ts.map +1 -0
  213. package/dist/types/index.intergation-test.d.ts +2 -0
  214. package/dist/types/index.intergation-test.d.ts.map +1 -0
  215. package/package.json +153 -0
@@ -0,0 +1,427 @@
1
+ import { setupTestLogger, teardownTestLogger } from './testUtils';
2
+ import { ConnectionState } from './index';
3
+ import { MediaConnection } from './MediaConnection';
4
+ import { Event } from './eventTypes';
5
+ describe('MediaConnection', () => {
6
+ let previousRTCPeerConnection;
7
+ const DEFAULT_CONFIG = {
8
+ iceServers: [],
9
+ skipInactiveTransceivers: false,
10
+ sdpMunging: {},
11
+ };
12
+ const FAKE_AUDIO_TRACK = {
13
+ kind: 'audio',
14
+ };
15
+ const FAKE_VIDEO_TRACK = {
16
+ kind: 'video',
17
+ };
18
+ const FAKE_SCREENSHARE_TRACK = {
19
+ kind: 'video',
20
+ };
21
+ const FAKE_PC = {
22
+ addTrack: jest.fn(),
23
+ getTransceivers: jest.fn().mockReturnValue([]),
24
+ addTransceiver: jest.fn(),
25
+ createOffer: jest.fn().mockResolvedValue({ sdp: '', type: 'offer' }),
26
+ setLocalDescription: jest.fn().mockResolvedValue({}),
27
+ iceGatheringState: 'complete',
28
+ localDescription: { sdp: 'fake' },
29
+ getStats: jest.fn(),
30
+ close: jest.fn(),
31
+ ontrack: null,
32
+ };
33
+ beforeAll(() => {
34
+ setupTestLogger();
35
+ });
36
+ afterAll(() => {
37
+ teardownTestLogger();
38
+ });
39
+ beforeEach(() => {
40
+ previousRTCPeerConnection = window.RTCPeerConnection;
41
+ Object.defineProperty(window, 'RTCPeerConnection', {
42
+ writable: true,
43
+ value: jest.fn().mockImplementation(() => FAKE_PC),
44
+ });
45
+ });
46
+ afterEach(() => {
47
+ Object.defineProperty(window, 'RTCPeerConnection', {
48
+ writable: true,
49
+ value: previousRTCPeerConnection,
50
+ });
51
+ });
52
+ it('initial media connection state is NEW', () => {
53
+ const mediaConnection = new MediaConnection(DEFAULT_CONFIG, {
54
+ send: {},
55
+ receive: {
56
+ audio: true,
57
+ video: true,
58
+ screenShareVideo: true,
59
+ },
60
+ });
61
+ expect(mediaConnection.getConnectionState()).toEqual(ConnectionState.NEW);
62
+ });
63
+ it('getStats() calls getStats() on the RTCPeerConnection', async () => {
64
+ const FAKE_STATS = { anyKey: 'any value' };
65
+ FAKE_PC.getStats.mockResolvedValue(FAKE_STATS);
66
+ const mediaConnection = new MediaConnection(DEFAULT_CONFIG, {
67
+ send: {},
68
+ receive: {
69
+ audio: true,
70
+ video: true,
71
+ screenShareVideo: true,
72
+ },
73
+ });
74
+ const stats = await mediaConnection.getStats();
75
+ expect(FAKE_PC.getStats).toBeCalledOnceWith();
76
+ expect(stats).toEqual(FAKE_STATS);
77
+ FAKE_PC.getStats.mockReset();
78
+ });
79
+ describe('outgoing call/joining a meeting', () => {
80
+ let mc;
81
+ beforeEach(() => {
82
+ mc = new MediaConnection(DEFAULT_CONFIG, {
83
+ send: {
84
+ audio: FAKE_AUDIO_TRACK,
85
+ video: FAKE_VIDEO_TRACK,
86
+ screenShareVideo: FAKE_SCREENSHARE_TRACK,
87
+ },
88
+ receive: {
89
+ audio: true,
90
+ video: true,
91
+ screenShareVideo: true,
92
+ },
93
+ });
94
+ });
95
+ it('creates transceivers and does not call addTrack() when initializeTransceivers() is called', async () => {
96
+ await mc.initializeTransceivers(false);
97
+ expect(FAKE_PC.addTrack).not.toBeCalled();
98
+ expect(FAKE_PC.addTransceiver).toBeCalledTimes(3);
99
+ expect(FAKE_PC.addTransceiver).nthCalledWith(1, FAKE_AUDIO_TRACK, { direction: 'sendrecv' });
100
+ expect(FAKE_PC.addTransceiver).nthCalledWith(2, FAKE_VIDEO_TRACK, { direction: 'sendrecv' });
101
+ expect(FAKE_PC.addTransceiver).nthCalledWith(3, FAKE_SCREENSHARE_TRACK, {
102
+ direction: 'sendrecv',
103
+ });
104
+ });
105
+ it('fails if any transceiver already exists when initializeTransceivers() is called', () => {
106
+ const originalMock = FAKE_PC.getTransceivers;
107
+ FAKE_PC.getTransceivers = jest.fn().mockReturnValue([{ id: 'fake_transceiver' }]);
108
+ expect(() => mc.initializeTransceivers(false)).toThrow(new Error('SDP negotiation already started'));
109
+ expect(() => mc.initializeTransceivers(true)).toThrow(new Error('SDP negotiation already started'));
110
+ FAKE_PC.getTransceivers = originalMock;
111
+ });
112
+ describe('creates transceivers correctly', () => {
113
+ [
114
+ { localTrack: true, receive: true, expectedDirection: 'sendrecv' },
115
+ { localTrack: true, receive: false, expectedDirection: 'sendonly' },
116
+ { localTrack: false, receive: false, expectedDirection: 'inactive' },
117
+ { localTrack: false, receive: true, expectedDirection: 'recvonly' },
118
+ ].forEach(({ localTrack, receive, expectedDirection }) => {
119
+ it(`creates AUDIO transceiver with the right direction (${expectedDirection})`, async () => {
120
+ const track = localTrack ? FAKE_AUDIO_TRACK : undefined;
121
+ mc = new MediaConnection(DEFAULT_CONFIG, {
122
+ send: {
123
+ audio: track,
124
+ },
125
+ receive: {
126
+ audio: receive,
127
+ video: false,
128
+ screenShareVideo: false,
129
+ },
130
+ });
131
+ await mc.initializeTransceivers(false);
132
+ expect(FAKE_PC.addTransceiver).toBeCalledTimes(3);
133
+ expect(FAKE_PC.addTransceiver).nthCalledWith(1, track || 'audio', {
134
+ direction: expectedDirection,
135
+ });
136
+ expect(FAKE_PC.addTransceiver).nthCalledWith(2, 'video', { direction: 'inactive' });
137
+ expect(FAKE_PC.addTransceiver).nthCalledWith(3, 'video', { direction: 'inactive' });
138
+ });
139
+ it(`creates 1st VIDEO transceiver with the right direction (${expectedDirection})`, async () => {
140
+ const track = localTrack ? FAKE_VIDEO_TRACK : undefined;
141
+ mc = new MediaConnection(DEFAULT_CONFIG, {
142
+ send: {
143
+ video: track,
144
+ },
145
+ receive: {
146
+ audio: false,
147
+ video: receive,
148
+ screenShareVideo: false,
149
+ },
150
+ });
151
+ await mc.initializeTransceivers(false);
152
+ expect(FAKE_PC.addTransceiver).toBeCalledTimes(3);
153
+ expect(FAKE_PC.addTransceiver).nthCalledWith(1, 'audio', { direction: 'inactive' });
154
+ expect(FAKE_PC.addTransceiver).nthCalledWith(2, track || 'video', {
155
+ direction: expectedDirection,
156
+ });
157
+ expect(FAKE_PC.addTransceiver).nthCalledWith(3, 'video', { direction: 'inactive' });
158
+ });
159
+ it(`creates 2nd VIDEO transceiver with the right direction (${expectedDirection})`, async () => {
160
+ const track = localTrack ? FAKE_VIDEO_TRACK : undefined;
161
+ mc = new MediaConnection(DEFAULT_CONFIG, {
162
+ send: {
163
+ screenShareVideo: track,
164
+ },
165
+ receive: {
166
+ audio: false,
167
+ video: false,
168
+ screenShareVideo: receive,
169
+ },
170
+ });
171
+ await mc.initializeTransceivers(false);
172
+ expect(FAKE_PC.addTransceiver).toBeCalledTimes(3);
173
+ expect(FAKE_PC.addTransceiver).nthCalledWith(1, 'audio', { direction: 'inactive' });
174
+ expect(FAKE_PC.addTransceiver).nthCalledWith(2, 'video', { direction: 'inactive' });
175
+ expect(FAKE_PC.addTransceiver).nthCalledWith(3, track || 'video', {
176
+ direction: expectedDirection,
177
+ });
178
+ });
179
+ });
180
+ });
181
+ });
182
+ describe('incoming call', () => {
183
+ it('calls addTrack() for each sent track when initializeTransceivers(true) is called', () => {
184
+ const mc = new MediaConnection(DEFAULT_CONFIG, {
185
+ send: {
186
+ audio: FAKE_AUDIO_TRACK,
187
+ video: FAKE_VIDEO_TRACK,
188
+ screenShareVideo: FAKE_SCREENSHARE_TRACK,
189
+ },
190
+ receive: {
191
+ audio: false,
192
+ video: false,
193
+ screenShareVideo: false,
194
+ },
195
+ });
196
+ mc.initializeTransceivers(true);
197
+ expect(FAKE_PC.addTrack).toBeCalledTimes(3);
198
+ expect(FAKE_PC.addTrack).toBeCalledWith(FAKE_AUDIO_TRACK);
199
+ expect(FAKE_PC.addTrack).toBeCalledWith(FAKE_VIDEO_TRACK);
200
+ expect(FAKE_PC.addTrack).toBeCalledWith(FAKE_SCREENSHARE_TRACK);
201
+ });
202
+ });
203
+ describe('skipInactiveTransceivers config entry', () => {
204
+ const createMediaConnectionWithOnlyAudio = (receiveAudio, sendAudio, config) => {
205
+ return new MediaConnection(config, {
206
+ send: {
207
+ audio: sendAudio ? FAKE_AUDIO_TRACK : undefined,
208
+ },
209
+ receive: {
210
+ audio: receiveAudio,
211
+ video: false,
212
+ screenShareVideo: false,
213
+ },
214
+ });
215
+ };
216
+ [
217
+ { direction: 'sendrecv', receiveAudio: true, sendAudio: true },
218
+ { direction: 'sendonly', receiveAudio: false, sendAudio: true },
219
+ { direction: 'recvonly', receiveAudio: true, sendAudio: false },
220
+ ].forEach(({ direction, receiveAudio, sendAudio }) => {
221
+ it(`creates only a single transceiver if only audio is used (${direction}) and skipInactiveTransceivers=true`, async () => {
222
+ const mediaConnection = createMediaConnectionWithOnlyAudio(receiveAudio, sendAudio, {
223
+ iceServers: [],
224
+ skipInactiveTransceivers: true,
225
+ sdpMunging: {},
226
+ });
227
+ await mediaConnection.initializeTransceivers(false);
228
+ expect(FAKE_PC.addTransceiver).toBeCalledOnceWith(sendAudio ? FAKE_AUDIO_TRACK : 'audio', {
229
+ direction,
230
+ });
231
+ });
232
+ });
233
+ it('creates 3 transceivers if only audio is used and skipInactiveTransceivers=false', async () => {
234
+ const mediaConnection = createMediaConnectionWithOnlyAudio(true, true, {
235
+ iceServers: [],
236
+ skipInactiveTransceivers: false,
237
+ sdpMunging: {},
238
+ });
239
+ await mediaConnection.initializeTransceivers(false);
240
+ expect(FAKE_PC.addTransceiver).toBeCalledTimes(3);
241
+ expect(FAKE_PC.addTransceiver).nthCalledWith(1, FAKE_AUDIO_TRACK, {
242
+ direction: 'sendrecv',
243
+ });
244
+ expect(FAKE_PC.addTransceiver).nthCalledWith(2, 'video', {
245
+ direction: 'inactive',
246
+ });
247
+ expect(FAKE_PC.addTransceiver).nthCalledWith(3, 'video', {
248
+ direction: 'inactive',
249
+ });
250
+ });
251
+ });
252
+ it('close() closes the RTCPeerConnection', () => {
253
+ const mediaConnection = new MediaConnection(DEFAULT_CONFIG, {
254
+ send: {},
255
+ receive: {
256
+ audio: true,
257
+ video: true,
258
+ screenShareVideo: true,
259
+ },
260
+ });
261
+ mediaConnection.close();
262
+ expect(FAKE_PC.close).toBeCalledOnceWith();
263
+ });
264
+ describe('insertDTMF', () => {
265
+ beforeEach(() => {
266
+ FAKE_PC.addTransceiver.mockReturnValue({});
267
+ });
268
+ afterEach(() => {
269
+ FAKE_PC.addTransceiver.mockReset();
270
+ });
271
+ it('fails if audio transceivers are not initialised', async () => {
272
+ const mc = new MediaConnection(DEFAULT_CONFIG, {
273
+ send: { audio: FAKE_AUDIO_TRACK },
274
+ receive: {
275
+ audio: true,
276
+ video: true,
277
+ screenShareVideo: true,
278
+ },
279
+ });
280
+ expect(() => mc.insertDTMF('000')).toThrow(new Error('audio transceiver missing'));
281
+ });
282
+ it('fails if audio transceiver is missing', async () => {
283
+ const mc = new MediaConnection({ ...DEFAULT_CONFIG, skipInactiveTransceivers: true }, {
284
+ send: {},
285
+ receive: {
286
+ audio: false,
287
+ video: true,
288
+ screenShareVideo: true,
289
+ },
290
+ });
291
+ mc.initializeTransceivers(false);
292
+ expect(() => mc.insertDTMF('000')).toThrow(new Error('audio transceiver missing'));
293
+ });
294
+ const setupMediaConnWithFakeAudioTransceiver = (fakeTransceiver) => {
295
+ FAKE_PC.addTransceiver.mockImplementation((trackOrKind) => {
296
+ if (trackOrKind === 'audio') {
297
+ return fakeTransceiver;
298
+ }
299
+ return { sender: { dtmf: { insertDTMF: jest.fn() } } };
300
+ });
301
+ const mc = new MediaConnection(DEFAULT_CONFIG, {
302
+ send: {},
303
+ receive: {
304
+ audio: true,
305
+ video: true,
306
+ screenShareVideo: true,
307
+ },
308
+ });
309
+ return mc;
310
+ };
311
+ it('fails if audio transceiver is missing sender', async () => {
312
+ const mc = setupMediaConnWithFakeAudioTransceiver({ sender: null });
313
+ mc.initializeTransceivers(false);
314
+ expect(() => mc.insertDTMF('000')).toThrow(new Error('this.transceivers.audio.sender is null'));
315
+ });
316
+ it('fails if audio transceiver is missing sender.dtmf', async () => {
317
+ const mc = setupMediaConnWithFakeAudioTransceiver({ sender: { dtmf: null } });
318
+ mc.initializeTransceivers(false);
319
+ expect(() => mc.insertDTMF('000')).toThrow(new Error('this.transceivers.audio.sender.dtmf is null'));
320
+ });
321
+ describe('calls insertDTMF() with the right arguments', () => {
322
+ let mc;
323
+ const insertDtmfSpy = jest.fn();
324
+ beforeEach(() => {
325
+ FAKE_PC.addTransceiver.mockImplementation((trackOrKind, { direction }) => {
326
+ if (trackOrKind === FAKE_AUDIO_TRACK && direction === 'sendrecv') {
327
+ return {
328
+ sender: {
329
+ dtmf: {
330
+ insertDTMF: insertDtmfSpy,
331
+ },
332
+ },
333
+ };
334
+ }
335
+ return {};
336
+ });
337
+ mc = new MediaConnection(DEFAULT_CONFIG, {
338
+ send: { audio: FAKE_AUDIO_TRACK },
339
+ receive: {
340
+ audio: true,
341
+ video: false,
342
+ screenShareVideo: false,
343
+ },
344
+ });
345
+ mc.initializeTransceivers(false);
346
+ });
347
+ it('without optional parameters', () => {
348
+ mc.insertDTMF('123');
349
+ expect(insertDtmfSpy).toBeCalledOnceWith('123', undefined, undefined);
350
+ });
351
+ it('with only the 1st optional parameter', () => {
352
+ mc.insertDTMF('ABC', 100);
353
+ expect(insertDtmfSpy).toBeCalledOnceWith('ABC', 100, undefined);
354
+ });
355
+ it('with all parameters', () => {
356
+ mc.insertDTMF('#0A*', 200, 500);
357
+ expect(insertDtmfSpy).toBeCalledOnceWith('#0A*', 200, 500);
358
+ });
359
+ it('converts tone to upper case', () => {
360
+ mc.insertDTMF('01abcd*,#', 200, 500);
361
+ expect(insertDtmfSpy).toBeCalledOnceWith('01ABCD*,#', 200, 500);
362
+ });
363
+ });
364
+ });
365
+ describe('DTMF tone change event', () => {
366
+ let fakeDtmfSender;
367
+ let mc;
368
+ beforeEach(() => {
369
+ fakeDtmfSender = {
370
+ dtmf: {},
371
+ };
372
+ FAKE_PC.addTransceiver.mockImplementation((trackOrKind) => {
373
+ if (trackOrKind === FAKE_AUDIO_TRACK) {
374
+ return { sender: fakeDtmfSender };
375
+ }
376
+ return {};
377
+ });
378
+ mc = new MediaConnection(DEFAULT_CONFIG, {
379
+ send: { audio: FAKE_AUDIO_TRACK },
380
+ receive: {
381
+ audio: false,
382
+ video: false,
383
+ screenShareVideo: false,
384
+ },
385
+ });
386
+ });
387
+ afterEach(() => {
388
+ FAKE_PC.addTransceiver.mockReset();
389
+ });
390
+ it('listens for it (outgoing call)', () => {
391
+ mc.initializeTransceivers(false);
392
+ expect(fakeDtmfSender.dtmf.ontonechange).toBeTruthy();
393
+ });
394
+ it('listens for it (incoming call)', () => {
395
+ mc.initializeTransceivers(true);
396
+ const oldMock = FAKE_PC.getTransceivers;
397
+ FAKE_PC.getTransceivers = jest.fn().mockReturnValue([
398
+ {
399
+ sender: fakeDtmfSender,
400
+ },
401
+ ]);
402
+ expect(FAKE_PC.ontrack).toBeTruthy();
403
+ if (FAKE_PC.ontrack) {
404
+ FAKE_PC.ontrack({
405
+ track: { id: 'fake' },
406
+ });
407
+ }
408
+ expect(fakeDtmfSender.dtmf.ontonechange).toBeTruthy();
409
+ FAKE_PC.getTransceivers = oldMock;
410
+ });
411
+ it('is forwarded from RTCPeerConnnections dtmf sender', () => {
412
+ const FAKE_TONE_EVENT = { tone: '2468#' };
413
+ let toneChangeEventFired = false;
414
+ mc.on(Event.DTMF_TONE_CHANGED, (data) => {
415
+ expect(data).toEqual(FAKE_TONE_EVENT);
416
+ toneChangeEventFired = true;
417
+ });
418
+ mc.initializeTransceivers(false);
419
+ expect(fakeDtmfSender.dtmf.ontonechange).toBeTruthy();
420
+ if (fakeDtmfSender.dtmf.ontonechange) {
421
+ fakeDtmfSender.dtmf.ontonechange(FAKE_TONE_EVENT);
422
+ }
423
+ expect(toneChangeEventFired).toEqual(true);
424
+ });
425
+ });
426
+ });
427
+ //# sourceMappingURL=MediaConnection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaConnection.test.js","sourceRoot":"","sources":["../../../src/MediaConnection/MediaConnection.test.ts"],"names":[],"mappings":"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"}