Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

MockClasses.js 10.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. import transform from 'sdp-transform';
  2. /* eslint-disable no-empty-function */
  3. /* eslint-disable max-len */
  4. /**
  5. * MockRTCPeerConnection that return the local description sdp.
  6. */
  7. class MockRTCPeerConnection {
  8. /**
  9. * local description SDP.
  10. */
  11. get localDescription() {
  12. return { sdp: [
  13. 'v=0\r\n',
  14. 'o=- 2074571967553371465 5 IN IP4 127.0.0.1\r\n',
  15. 's=-\r\n',
  16. 't=0 0\r\n',
  17. 'a=msid-semantic: WMS 2a9e4328-59f4-4af5-883f-4b265ac854d6\r\n',
  18. 'a=group:BUNDLE 0 1\r\n',
  19. 'a=extmap-allow-mixed\r\n',
  20. 'm=audio 9 UDP/TLS/RTP/SAVPF 111 126\r\n',
  21. 'c=IN IP4 0.0.0.0\r\n',
  22. 'a=rtpmap:111 opus/48000/2\r\n',
  23. 'a=rtpmap:126 telephone-event/8000\r\n',
  24. 'a=fmtp:126 0-15\r\n',
  25. 'a=fmtp:111 minptime=10;useinbandfec=1\r\n',
  26. 'a=rtcp:9 IN IP4 0.0.0.0\r\n',
  27. 'a=setup:active\r\n',
  28. 'a=mid:0\r\n',
  29. 'a=msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
  30. 'a=sendrecv\r\n',
  31. 'a=ice-ufrag:tOQd\r\n',
  32. 'a=ice-pwd:3sAozs7hw6+2O6DBp2pt9fvY\r\n',
  33. 'a=fingerprint:sha-256 A9:00:CC:F9:81:33:EA:E9:E3:B4:01:E9:9E:18:B3:9B:F8:49:25:A0:5D:12:20:70:D5:6F:34:5A:2A:39:19:0A\r\n',
  34. 'a=ssrc:2002 msid:26D16D51-503A-420B-8274-3DD1174E498F 8205D1FC-50B4-407C-87D5-9C45F1B779F0\r\n',
  35. 'a=ssrc:2002 cname:juejgy8a01\r\n',
  36. 'a=ssrc:2002 name:a8f7g30-a0\r\n',
  37. 'a=rtcp-mux\r\n',
  38. 'a=extmap-allow-mixed\r\n',
  39. 'm=video 9 UDP/TLS/RTP/SAVPF 100 98 96 45\r\n',
  40. 'c=IN IP4 0.0.0.0\r\n',
  41. 'a=rtpmap:100 VP9/90000\r\n',
  42. 'a=rtpmap:98 VP9/90000\r\n',
  43. 'a=rtpmap:96 VP8/90000\r\n',
  44. 'a=rtpmap:45 AV1/90000\r\n',
  45. 'a=fmtp:100 profile-id=2\r\n',
  46. 'a=fmtp:98 profile-id=0\r\n',
  47. 'a=rtcp:9 IN IP4 0.0.0.0\r\n',
  48. 'a=rtcp-fb:100 goog-remb\r\n',
  49. 'a=rtcp-fb:100 transport-cc\r\n',
  50. 'a=rtcp-fb:100 ccm fir\r\n',
  51. 'a=rtcp-fb:100 nack\r\n',
  52. 'a=rtcp-fb:100 nack pli\r\n',
  53. 'a=rtcp-fb:98 goog-remb\r\n',
  54. 'a=rtcp-fb:98 transport-cc\r\n',
  55. 'a=rtcp-fb:98 ccm fir\r\n',
  56. 'a=rtcp-fb:98 nack\r\n',
  57. 'a=rtcp-fb:98 nack pli\r\n',
  58. 'a=rtcp-fb:96 goog-remb\r\n',
  59. 'a=rtcp-fb:96 transport-cc\r\n',
  60. 'a=rtcp-fb:96 ccm fir\r\n',
  61. 'a=rtcp-fb:96 nack\r\n',
  62. 'a=rtcp-fb:96 nack pli\r\n',
  63. 'a=rtcp-fb:45 goog-remb\r\n',
  64. 'a=rtcp-fb:45 transport-cc\r\n',
  65. 'a=rtcp-fb:45 ccm fir\r\n',
  66. 'a=rtcp-fb:45 nack\r\n',
  67. 'a=rtcp-fb:45 nack pli\r\n',
  68. 'a=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\n',
  69. 'a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n',
  70. 'a=extmap:13 urn:3gpp:video-orientation\r\n',
  71. 'a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n',
  72. 'a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\n',
  73. 'a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\n',
  74. 'a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\n',
  75. 'a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\n',
  76. 'a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\n',
  77. 'a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\n',
  78. 'a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\n',
  79. 'a=setup:actpass\r\n',
  80. 'a=mid:1\r\n',
  81. 'a=msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
  82. 'a=sendrecv\r\n',
  83. 'a=ice-ufrag:tOQd\r\n',
  84. 'a=ice-pwd:3sAozs7hw6+2O6DBp2pt9fvY\r\n',
  85. 'a=fingerprint:sha-256 A9:00:CC:F9:81:33:EA:E9:E3:B4:01:E9:9E:18:B3:9B:F8:49:25:A0:5D:12:20:70:D5:6F:34:5A:2A:39:19:0A\r\n',
  86. 'a=ssrc:4004 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
  87. 'a=ssrc:4005 msid:7C0035E5-2DA1-4AEA-804A-9E75BF9B3768 225E9CDA-0384-4C92-92DD-E74C1153EC68\r\n',
  88. 'a=ssrc:4004 cname:juejgy8a01\r\n',
  89. 'a=ssrc:4005 cname:juejgy8a01\r\n',
  90. 'a=ssrc:4004 name:a8f7g30-v0\r\n',
  91. 'a=ssrc:4005 name:a8f7g30-v0\r\n',
  92. 'a=ssrc-group:FID 4004 4005\r\n',
  93. 'a=rtcp-mux\r\n'
  94. ].join('') };
  95. }
  96. }
  97. /**
  98. * Mock {@link TraceablePeerConnection} - add things as needed, but only things useful for all tests.
  99. */
  100. export class MockPeerConnection {
  101. /**
  102. * Constructor.
  103. *
  104. * @param {string} id RTC id
  105. * @param {boolean} usesUnifiedPlan
  106. * @param {boolean} simulcast
  107. */
  108. constructor(id, usesUnifiedPlan, simulcast) {
  109. this.id = id;
  110. this._usesUnifiedPlan = usesUnifiedPlan;
  111. this.peerconnection = new MockRTCPeerConnection();
  112. this._simulcast = simulcast;
  113. }
  114. /**
  115. * {@link TraceablePeerConnection.localDescription}.
  116. *
  117. * @returns {Object}
  118. */
  119. get localDescription() {
  120. return {
  121. sdp: ''
  122. };
  123. }
  124. /**
  125. * {@link TraceablePeerConnection.remoteDescription}.
  126. *
  127. * @returns {Object}
  128. */
  129. get remoteDescription() {
  130. return {
  131. sdp: ''
  132. };
  133. }
  134. /**
  135. * {@link TraceablePeerConnection.createAnswer}.
  136. *
  137. * @returns {Promise<Object>}
  138. */
  139. createAnswer() {
  140. return Promise.resolve(/* answer */{});
  141. }
  142. /**
  143. * Returns the list of the codecs negotiated.
  144. * @returns {Array<string>}
  145. */
  146. getConfiguredVideoCodecs() {
  147. const sdp = this.peerconnection.localDescription?.sdp;
  148. if (!sdp) {
  149. return [];
  150. }
  151. const parsedSdp = transform.parse(sdp);
  152. const mLine = parsedSdp.media.find(m => m.type === 'video');
  153. const codecs = new Set(mLine.rtp.map(pt => pt.codec.toLowerCase()));
  154. return Array.from(codecs);
  155. }
  156. /**
  157. * {@link TraceablePeerConnection.isSpatialScalabilityOn}.
  158. *
  159. * @returns {boolean}
  160. */
  161. isSpatialScalabilityOn() {
  162. return this._simulcast;
  163. }
  164. /**
  165. * {@link TraceablePeerConnection.processLocalSdpForTransceiverInfo}.
  166. *
  167. * @returns {void}
  168. */
  169. processLocalSdpForTransceiverInfo() {
  170. }
  171. /**
  172. * {@link TraceablePeerConnection.setLocalDescription}.
  173. *
  174. * @returns {Promise<void>}
  175. */
  176. setLocalDescription() {
  177. return Promise.resolve();
  178. }
  179. /**
  180. * {@link TraceablePeerConnection.setRemoteDescription}.
  181. *
  182. * @returns {Promise<void>}
  183. */
  184. setRemoteDescription() {
  185. return Promise.resolve();
  186. }
  187. /**
  188. * {@link TraceablePeerConnection.setSenderVideoConstraints}.
  189. */
  190. setSenderVideoConstraints() {
  191. }
  192. /**
  193. * {@link TraceablePeerConnection.setVideoTransferActive}.
  194. */
  195. setVideoTransferActive() {
  196. return false;
  197. }
  198. /**
  199. * {@link TraceablePeerConnection.usesUnifiedPlan}.
  200. */
  201. usesUnifiedPlan() {
  202. return this._usesUnifiedPlan;
  203. }
  204. /**
  205. * {@link TraceablePeerConnection.getLocalVideoTracks}.
  206. */
  207. getLocalVideoTracks() {
  208. return [];
  209. }
  210. }
  211. /**
  212. * Mock {@link RTC} - add things as needed, but only things useful for all tests.
  213. */
  214. export class MockRTC {
  215. /**
  216. * {@link RTC.createPeerConnection}.
  217. *
  218. * @returns {MockPeerConnection}
  219. */
  220. createPeerConnection() {
  221. this.pc = new MockPeerConnection();
  222. return this.pc;
  223. }
  224. }
  225. /**
  226. * MockSignalingLayerImpl
  227. */
  228. export class MockSignalingLayerImpl {
  229. /**
  230. * A constructor
  231. */
  232. constructor() {
  233. this._remoteSourceState = {};
  234. }
  235. /**
  236. * Returns the muted state, videoType and codec info received in presence.
  237. * @param {string} endpointId
  238. * @returns Object
  239. */
  240. getPeerMediaInfo(endpointId) {
  241. return this._remoteSourceState[endpointId];
  242. }
  243. /**
  244. * Updates the media info for peer on join/leave.
  245. * @param {boolean} isJoin - whether endpoint is joining or leaving the call
  246. * @param {string} endpointId - endpoint id
  247. * @param {Array<string>} codecList - new codec list published in presence
  248. * @param {string} codecType - legacy codec setting published in presence
  249. */
  250. setPeerMediaInfo(isJoin, endpointId, codecList, codecType) {
  251. if (isJoin) {
  252. this._remoteSourceState[endpointId] = {
  253. muted: true, // muted by default
  254. videoType: 'camera',
  255. codecList,
  256. codecType
  257. };
  258. } else {
  259. this._remoteSourceState[endpointId] = undefined;
  260. }
  261. }
  262. }
  263. /**
  264. * MockTrack
  265. */
  266. export class MockTrack {
  267. /**
  268. * A constructor
  269. */
  270. constructor(height) {
  271. this.height = height;
  272. }
  273. /**
  274. * Returns height.
  275. * @returns {number}
  276. */
  277. getSettings() {
  278. return {
  279. height: this.height
  280. };
  281. }
  282. }
  283. /**
  284. * MockJitsiLocalTrack
  285. */
  286. export class MockJitsiLocalTrack {
  287. /**
  288. * A constructor
  289. */
  290. constructor(height, mediaType, videoType) {
  291. this.resolution = height;
  292. this.track = new MockTrack(height);
  293. this.type = mediaType;
  294. this.videoType = videoType;
  295. }
  296. /**
  297. * Returns the height.
  298. * @returns {number}
  299. */
  300. getHeight() {
  301. return this.track.height;
  302. }
  303. /**
  304. * Returns the capture resolution.
  305. * @returns {number}
  306. */
  307. getCaptureResolution() {
  308. return this.getHeight();
  309. }
  310. /**
  311. * Returns track.
  312. * @returns {MockTrack}
  313. */
  314. getTrack() {
  315. return this.track;
  316. }
  317. /**
  318. * Returns media type.
  319. * @returns {MediaType}
  320. */
  321. getType() {
  322. return this.type;
  323. }
  324. /**
  325. * Returns video type.
  326. * @returns {VideoType}
  327. */
  328. getVideoType() {
  329. return this.videoType;
  330. }
  331. }