Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

desktopsharing.js 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /* global APP, config */
  2. var EventEmitter = require("events");
  3. var DesktopSharingEventTypes
  4. = require("../../service/desktopsharing/DesktopSharingEventTypes");
  5. var RTCBrowserType = require("../RTC/RTCBrowserType");
  6. var RTCEvents = require("../../service/RTC/RTCEvents");
  7. var ScreenObtainer = require("./ScreenObtainer");
  8. /**
  9. * Indicates that desktop stream is currently in use (for toggle purpose).
  10. * @type {boolean}
  11. */
  12. var isUsingScreenStream = false;
  13. /**
  14. * Indicates that switch stream operation is in progress and prevent from
  15. * triggering new events.
  16. * @type {boolean}
  17. */
  18. var switchInProgress = false;
  19. /**
  20. * Used to obtain the screen sharing stream from the browser.
  21. */
  22. var screenObtainer = new ScreenObtainer();
  23. var eventEmitter = new EventEmitter();
  24. function streamSwitchDone() {
  25. switchInProgress = false;
  26. eventEmitter.emit(
  27. DesktopSharingEventTypes.SWITCHING_DONE,
  28. isUsingScreenStream);
  29. }
  30. function newStreamCreated(stream) {
  31. eventEmitter.emit(DesktopSharingEventTypes.NEW_STREAM_CREATED,
  32. stream, isUsingScreenStream, streamSwitchDone);
  33. }
  34. function getVideoStreamFailed(error) {
  35. console.error("Failed to obtain the stream to switch to", error);
  36. switchInProgress = false;
  37. isUsingScreenStream = false;
  38. newStreamCreated(null);
  39. }
  40. function getDesktopStreamFailed(error) {
  41. console.error("Failed to obtain the stream to switch to", error);
  42. switchInProgress = false;
  43. }
  44. function onEndedHandler(stream) {
  45. if (!switchInProgress && isUsingScreenStream) {
  46. APP.desktopsharing.toggleScreenSharing();
  47. }
  48. //FIXME: to be verified
  49. if (stream.removeEventListener) {
  50. stream.removeEventListener('ended', onEndedHandler);
  51. } else {
  52. stream.detachEvent('ended', onEndedHandler);
  53. }
  54. }
  55. module.exports = {
  56. isUsingScreenStream: function () {
  57. return isUsingScreenStream;
  58. },
  59. /**
  60. * @returns {boolean} <tt>true</tt> if desktop sharing feature is available
  61. * and enabled.
  62. */
  63. isDesktopSharingEnabled: function () {
  64. return screenObtainer.isSupported();
  65. },
  66. init: function () {
  67. // Called when RTC finishes initialization
  68. APP.RTC.addListener(RTCEvents.RTC_READY,
  69. function() {
  70. screenObtainer.init(eventEmitter);
  71. eventEmitter.emit(DesktopSharingEventTypes.INIT);
  72. });
  73. },
  74. addListener: function (type, listener) {
  75. eventEmitter.on(type, listener);
  76. },
  77. removeListener: function (type, listener) {
  78. eventEmitter.removeListener(type, listener);
  79. },
  80. /*
  81. * Toggles screen sharing.
  82. */
  83. toggleScreenSharing: function () {
  84. if (switchInProgress) {
  85. console.warn("Switch in progress.");
  86. return;
  87. } else if (!screenObtainer.isSupported()) {
  88. console.warn("Cannot toggle screen sharing: not supported.");
  89. return;
  90. }
  91. switchInProgress = true;
  92. if (!isUsingScreenStream) {
  93. // Switch to desktop stream
  94. screenObtainer.obtainStream(
  95. function (stream) {
  96. // We now use screen stream
  97. isUsingScreenStream = true;
  98. // Hook 'ended' event to restore camera
  99. // when screen stream stops
  100. //FIXME: to be verified
  101. if (stream.addEventListener) {
  102. stream.addEventListener('ended', function () {
  103. onEndedHandler(stream);
  104. });
  105. } else {
  106. stream.attachEvent('ended', function () {
  107. onEndedHandler(stream);
  108. });
  109. }
  110. newStreamCreated(stream);
  111. },
  112. getDesktopStreamFailed);
  113. } else {
  114. // Disable screen stream
  115. APP.RTC.getUserMediaWithConstraints(
  116. ['video'],
  117. function (stream) {
  118. // We are now using camera stream
  119. isUsingScreenStream = false;
  120. newStreamCreated(stream);
  121. },
  122. getVideoStreamFailed,
  123. config.resolution || '360'
  124. );
  125. }
  126. },
  127. /*
  128. * Exports the event emitter to allow use by ScreenObtainer. Not for outside
  129. * use.
  130. */
  131. eventEmitter: eventEmitter
  132. };