Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

desktopsharing.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /* global APP, JitsiMeetJS, config */
  2. var EventEmitter = require("events");
  3. import DSEvents from '../../service/desktopsharing/DesktopSharingEventTypes';
  4. const TrackEvents = JitsiMeetJS.events.track;
  5. /**
  6. * Indicates that desktop stream is currently in use (for toggle purpose).
  7. * @type {boolean}
  8. */
  9. var isUsingScreenStream = false;
  10. /**
  11. * Indicates that switch stream operation is in progress and prevent from
  12. * triggering new events.
  13. * @type {boolean}
  14. */
  15. var switchInProgress = false;
  16. /**
  17. * true if desktop sharing is enabled and false otherwise.
  18. */
  19. var isEnabled = false;
  20. var eventEmitter = new EventEmitter();
  21. function streamSwitchDone() {
  22. switchInProgress = false;
  23. eventEmitter.emit(DSEvents.SWITCHING_DONE, isUsingScreenStream);
  24. }
  25. function newStreamCreated(track) {
  26. eventEmitter.emit(DSEvents.NEW_STREAM_CREATED, track, streamSwitchDone);
  27. }
  28. function getVideoStreamFailed(error) {
  29. console.error("Failed to obtain the stream to switch to", error);
  30. switchInProgress = false;
  31. isUsingScreenStream = false;
  32. newStreamCreated(null);
  33. }
  34. function getDesktopStreamFailed(error) {
  35. console.error("Failed to obtain the stream to switch to", error);
  36. switchInProgress = false;
  37. }
  38. function onEndedHandler() {
  39. if (!switchInProgress && isUsingScreenStream) {
  40. APP.desktopsharing.toggleScreenSharing();
  41. }
  42. }
  43. module.exports = {
  44. isUsingScreenStream: function () {
  45. return isUsingScreenStream;
  46. },
  47. /**
  48. * Initializes the desktop sharing module.
  49. * @param {boolean} <tt>true</tt> if desktop sharing feature is available
  50. * and enabled.
  51. */
  52. init: function (enabled) {
  53. isEnabled = enabled;
  54. },
  55. /**
  56. * @returns {boolean} <tt>true</tt> if desktop sharing feature is available
  57. * and enabled.
  58. */
  59. isDesktopSharingEnabled: function () {
  60. return isEnabled;
  61. },
  62. addListener: function (type, listener) {
  63. eventEmitter.on(type, listener);
  64. },
  65. removeListener: function (type, listener) {
  66. eventEmitter.removeListener(type, listener);
  67. },
  68. /*
  69. * Toggles screen sharing.
  70. */
  71. toggleScreenSharing: function () {
  72. if (switchInProgress) {
  73. console.warn("Switch in progress.");
  74. return;
  75. } else if (!this.isDesktopSharingEnabled()) {
  76. console.warn("Cannot toggle screen sharing: not supported.");
  77. return;
  78. }
  79. switchInProgress = true;
  80. let type;
  81. if (!isUsingScreenStream) {
  82. // Switch to desktop stream
  83. type = "desktop";
  84. } else {
  85. type = "video";
  86. }
  87. var fail = (error) => {
  88. if (type === 'desktop') {
  89. getDesktopStreamFailed(error);
  90. } else {
  91. getVideoStreamFailed(error);
  92. }
  93. };
  94. APP.conference.createLocalTracks(type).then((tracks) => {
  95. // FIXME does it mean that 'not track.length' == GUM failed ?
  96. // And will this ever happen if promise is supposed to fail in GUM
  97. // failed case ?
  98. if (!tracks.length) {
  99. fail();
  100. return;
  101. }
  102. let stream = tracks[0];
  103. // We now use screen stream
  104. isUsingScreenStream = type === "desktop";
  105. if (isUsingScreenStream) {
  106. stream.on(TrackEvents.TRACK_STOPPED, onEndedHandler);
  107. }
  108. newStreamCreated(stream);
  109. }).catch((error) => {
  110. if(error === JitsiMeetJS.errors.track.FIREFOX_EXTENSION_NEEDED)
  111. {
  112. eventEmitter.emit(
  113. DSEvents.FIREFOX_EXTENSION_NEEDED,
  114. config.desktopSharingFirefoxExtensionURL);
  115. return;
  116. }
  117. fail(error);
  118. });
  119. }
  120. };