You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SignalingLayerImpl.js 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* global __filename */
  2. import { getLogger } from 'jitsi-meet-logger';
  3. import * as MediaType from '../../service/RTC/MediaType';
  4. import * as SignalingEvents from '../../service/RTC/SignalingEvents';
  5. import SignalingLayer from '../../service/RTC/SignalingLayer';
  6. const logger = getLogger(__filename);
  7. /**
  8. * Default XMPP implementation of the {@link SignalingLayer} interface. Obtains
  9. * the data from the MUC presence.
  10. */
  11. export default class SignalingLayerImpl extends SignalingLayer {
  12. /**
  13. * Creates new instance.
  14. */
  15. constructor() {
  16. super();
  17. /**
  18. * A map that stores SSRCs of remote streams. And is used only locally
  19. * We store the mapping when jingle is received, and later is used
  20. * onaddstream webrtc event where we have only the ssrc
  21. * FIXME: This map got filled and never cleaned and can grow during long
  22. * conference
  23. * @type {Map<number, string>} maps SSRC number to jid
  24. */
  25. this.ssrcOwners = new Map();
  26. /**
  27. *
  28. * @type {ChatRoom|null}
  29. */
  30. this.chatRoom = null;
  31. }
  32. /**
  33. * Sets the <tt>ChatRoom</tt> instance used and binds presence listeners.
  34. * @param {ChatRoom} room
  35. */
  36. setChatRoom(room) {
  37. const oldChatRoom = this.chatRoom;
  38. this.chatRoom = room;
  39. if (oldChatRoom) {
  40. oldChatRoom.removePresenceListener(
  41. 'audiomuted', this._audioMuteHandler);
  42. oldChatRoom.removePresenceListener(
  43. 'videomuted', this._videoMuteHandler);
  44. oldChatRoom.removePresenceListener(
  45. 'videoType', this._videoTypeHandler);
  46. }
  47. if (room) {
  48. // SignalingEvents
  49. this._audioMuteHandler = (node, from) => {
  50. this.eventEmitter.emit(
  51. SignalingEvents.PEER_MUTED_CHANGED,
  52. from, MediaType.AUDIO, node.value === 'true');
  53. };
  54. room.addPresenceListener('audiomuted', this._audioMuteHandler);
  55. this._videoMuteHandler = (node, from) => {
  56. this.eventEmitter.emit(
  57. SignalingEvents.PEER_MUTED_CHANGED,
  58. from, MediaType.VIDEO, node.value === 'true');
  59. };
  60. room.addPresenceListener('videomuted', this._videoMuteHandler);
  61. this._videoTypeHandler = (node, from) => {
  62. this.eventEmitter.emit(
  63. SignalingEvents.PEER_VIDEO_TYPE_CHANGED,
  64. from, node.value);
  65. };
  66. room.addPresenceListener('videoType', this._videoTypeHandler);
  67. }
  68. }
  69. /**
  70. * @inheritDoc
  71. */
  72. getPeerMediaInfo(owner, mediaType) {
  73. if (this.chatRoom) {
  74. return this.chatRoom.getMediaPresenceInfo(owner, mediaType);
  75. }
  76. logger.error('Requested peer media info, before room was set');
  77. }
  78. /**
  79. * @inheritDoc
  80. */
  81. getSSRCOwner(ssrc) {
  82. return this.ssrcOwners.get(ssrc);
  83. }
  84. /**
  85. * Set an SSRC owner.
  86. * @param {number} ssrc an SSRC to be owned
  87. * @param {string} endpointId owner's ID (MUC nickname)
  88. * @throws TypeError if <tt>ssrc</tt> is not a number
  89. */
  90. setSSRCOwner(ssrc, endpointId) {
  91. if (typeof ssrc !== 'number') {
  92. throw new TypeError(`SSRC(${ssrc}) must be a number`);
  93. }
  94. this.ssrcOwners.set(ssrc, endpointId);
  95. }
  96. }