@techsee/techsee-media-service 999.20.0-nodejs20 → 999.20.1-alpha

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 (205) hide show
  1. package/README.md +28 -27
  2. package/lib/LocalStreamManager.d.ts +0 -1
  3. package/lib/LocalStreamManager.d.ts.map +1 -1
  4. package/lib/LocalStreamManager.js +84 -82
  5. package/lib/LocalStreamManager.js.map +1 -1
  6. package/lib/MediaConstants.d.ts +3 -21
  7. package/lib/MediaConstants.d.ts.map +1 -1
  8. package/lib/MediaConstants.js +13 -32
  9. package/lib/MediaConstants.js.map +1 -1
  10. package/lib/MediaContracts.d.ts +1 -7
  11. package/lib/MediaContracts.d.ts.map +1 -1
  12. package/lib/MediaContracts.js +4 -1
  13. package/lib/MediaContracts.js.map +1 -1
  14. package/lib/MediaPublisher.d.ts +0 -1
  15. package/lib/MediaPublisher.d.ts.map +1 -1
  16. package/lib/MediaPublisher.js +10 -7
  17. package/lib/MediaPublisher.js.map +1 -1
  18. package/lib/MediaServiceBase.d.ts +0 -1
  19. package/lib/MediaServiceBase.d.ts.map +1 -1
  20. package/lib/MediaServiceBase.js +199 -170
  21. package/lib/MediaServiceBase.js.map +1 -1
  22. package/lib/MediaSession/MediaServer.d.ts +0 -1
  23. package/lib/MediaSession/MediaServer.d.ts.map +1 -1
  24. package/lib/MediaSession/MediaServer.js +74 -62
  25. package/lib/MediaSession/MediaServer.js.map +1 -1
  26. package/lib/MediaSession/MediaSessionBase.d.ts +0 -1
  27. package/lib/MediaSession/MediaSessionBase.d.ts.map +1 -1
  28. package/lib/MediaSession/MediaSessionBase.js +23 -19
  29. package/lib/MediaSession/MediaSessionBase.js.map +1 -1
  30. package/lib/MediaSession/SessionOpentok.d.ts +0 -1
  31. package/lib/MediaSession/SessionOpentok.d.ts.map +1 -1
  32. package/lib/MediaSession/SessionOpentok.js +80 -51
  33. package/lib/MediaSession/SessionOpentok.js.map +1 -1
  34. package/lib/MediaSession/SessionTurn.d.ts +0 -1
  35. package/lib/MediaSession/SessionTurn.d.ts.map +1 -1
  36. package/lib/MediaSession/SessionTurn.js +151 -109
  37. package/lib/MediaSession/SessionTurn.js.map +1 -1
  38. package/lib/MediaSession/TurnConstants.d.ts +0 -1
  39. package/lib/MediaSession/TurnConstants.d.ts.map +1 -1
  40. package/lib/MediaSession/TurnConstants.js +16 -1
  41. package/lib/MediaSession/TurnConstants.js.map +1 -1
  42. package/lib/MediaSubscriber.d.ts +0 -1
  43. package/lib/MediaSubscriber.d.ts.map +1 -1
  44. package/lib/MediaSubscriber.js +43 -37
  45. package/lib/MediaSubscriber.js.map +1 -1
  46. package/lib/MediaUtils/Compatibility.d.ts +0 -3
  47. package/lib/MediaUtils/Compatibility.d.ts.map +1 -1
  48. package/lib/MediaUtils/Compatibility.js +34 -76
  49. package/lib/MediaUtils/Compatibility.js.map +1 -1
  50. package/lib/MediaUtils/MediaDomUtils.d.ts +3 -6
  51. package/lib/MediaUtils/MediaDomUtils.d.ts.map +1 -1
  52. package/lib/MediaUtils/MediaDomUtils.js +65 -70
  53. package/lib/MediaUtils/MediaDomUtils.js.map +1 -1
  54. package/lib/MediaUtils/MediaTracer.d.ts +0 -1
  55. package/lib/MediaUtils/MediaTracer.d.ts.map +1 -1
  56. package/lib/MediaUtils/MediaTracer.js +5 -2
  57. package/lib/MediaUtils/MediaTracer.js.map +1 -1
  58. package/lib/MultiParty/DetectWebRtcService.d.ts +14 -17
  59. package/lib/MultiParty/DetectWebRtcService.d.ts.map +1 -1
  60. package/lib/MultiParty/DetectWebRtcService.js +54 -98
  61. package/lib/MultiParty/DetectWebRtcService.js.map +1 -1
  62. package/lib/MultiParty/MediaCapabilitiesHelper.d.ts +10 -0
  63. package/lib/MultiParty/MediaCapabilitiesHelper.d.ts.map +1 -0
  64. package/lib/MultiParty/MediaCapabilitiesHelper.js +140 -0
  65. package/lib/MultiParty/MediaCapabilitiesHelper.js.map +1 -0
  66. package/lib/MultiParty/MultiParty.d.ts +21 -0
  67. package/lib/MultiParty/MultiParty.d.ts.map +1 -0
  68. package/lib/MultiParty/MultiParty.js +160 -0
  69. package/lib/MultiParty/MultiParty.js.map +1 -0
  70. package/lib/MultiParty/OpentokMultiparty.d.ts +32 -0
  71. package/lib/MultiParty/OpentokMultiparty.d.ts.map +1 -0
  72. package/lib/MultiParty/OpentokMultiparty.js +184 -0
  73. package/lib/MultiParty/OpentokMultiparty.js.map +1 -0
  74. package/lib/TechseeMediaStream.d.ts +0 -1
  75. package/lib/TechseeMediaStream.d.ts.map +1 -1
  76. package/lib/TechseeMediaStream.js +12 -9
  77. package/lib/TechseeMediaStream.js.map +1 -1
  78. package/lib/oldCode/constants.js +20 -0
  79. package/lib/oldCode/constants.js.map +1 -0
  80. package/lib/oldCode/event-emitter.js +39 -0
  81. package/lib/oldCode/event-emitter.js.map +1 -0
  82. package/lib/oldCode/index.js +64 -0
  83. package/lib/oldCode/index.js.map +1 -0
  84. package/lib/oldCode/opentok/session.js +310 -0
  85. package/lib/oldCode/opentok/session.js.map +1 -0
  86. package/lib/oldCode/opentok/stream.js +310 -0
  87. package/lib/oldCode/opentok/stream.js.map +1 -0
  88. package/lib/oldCode/publisher.js +143 -0
  89. package/lib/oldCode/publisher.js.map +1 -0
  90. package/lib/oldCode/service.js +395 -0
  91. package/lib/oldCode/service.js.map +1 -0
  92. package/lib/oldCode/session.js +110 -0
  93. package/lib/oldCode/session.js.map +1 -0
  94. package/lib/oldCode/stream.js +195 -0
  95. package/lib/oldCode/stream.js.map +1 -0
  96. package/lib/oldCode/subscriber.js +90 -0
  97. package/lib/oldCode/subscriber.js.map +1 -0
  98. package/lib/oldCode/tracer.d.ts +36 -0
  99. package/lib/oldCode/tracer.d.ts.map +1 -0
  100. package/lib/oldCode/tracer.js +161 -0
  101. package/lib/oldCode/tracer.js.map +1 -0
  102. package/lib/oldCode/utils/ImageFixer.d.ts +1 -0
  103. package/lib/oldCode/utils/ImageFixer.d.ts.map +1 -0
  104. package/lib/oldCode/utils/ImageFixer.js +59 -0
  105. package/lib/oldCode/utils/ImageFixer.js.map +1 -0
  106. package/lib/oldCode/webrtc/constants.js +114 -0
  107. package/lib/oldCode/webrtc/constants.js.map +1 -0
  108. package/lib/oldCode/webrtc/helper.js +173 -0
  109. package/lib/oldCode/webrtc/helper.js.map +1 -0
  110. package/lib/oldCode/webrtc/session-kms.js +558 -0
  111. package/lib/oldCode/webrtc/session-kms.js.map +1 -0
  112. package/lib/oldCode/webrtc/session-loopback.js +336 -0
  113. package/lib/oldCode/webrtc/session-loopback.js.map +1 -0
  114. package/lib/oldCode/webrtc/session-turn.js +880 -0
  115. package/lib/oldCode/webrtc/session-turn.js.map +1 -0
  116. package/lib/oldCode/webrtc/session-turn.v2.js +583 -0
  117. package/lib/oldCode/webrtc/session-turn.v2.js.map +1 -0
  118. package/lib/oldCode/webrtc/session.js +52 -0
  119. package/lib/oldCode/webrtc/session.js.map +1 -0
  120. package/lib/oldCode/webrtc/stream.js +674 -0
  121. package/lib/oldCode/webrtc/stream.js.map +1 -0
  122. package/lib/oldCode/webrtc/temasys/adapter-loader.js +12 -0
  123. package/lib/oldCode/webrtc/temasys/adapter-loader.js.map +1 -0
  124. package/lib/oldCode/webrtc/temasys/adapter.js +5861 -0
  125. package/lib/oldCode/webrtc/temasys/adapter.js.map +1 -0
  126. package/lib/oldCode/webrtc/webrtc-ie-shim.js +3007 -0
  127. package/lib/oldCode/webrtc/webrtc-ie-shim.js.map +1 -0
  128. package/lib/qos/raw-qos.js +145 -84
  129. package/lib/qos/raw-qos.js.map +1 -1
  130. package/lib/webrtc-ie-shim.js +2950 -1896
  131. package/lib/webrtc-ie-shim.js.map +1 -1
  132. package/package.json +61 -66
  133. package/lib/MediaUtils/index.d.ts +0 -2
  134. package/lib/MediaUtils/index.d.ts.map +0 -1
  135. package/lib/MediaUtils/index.js +0 -6
  136. package/lib/MediaUtils/index.js.map +0 -1
  137. package/lib/MultiParty/MediaCapabilitiesService.d.ts +0 -18
  138. package/lib/MultiParty/MediaCapabilitiesService.d.ts.map +0 -1
  139. package/lib/MultiParty/MediaCapabilitiesService.js +0 -158
  140. package/lib/MultiParty/MediaCapabilitiesService.js.map +0 -1
  141. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts +0 -6
  142. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts.map +0 -1
  143. package/lib/MultiParty/MediaCapabilitiesUtils.js +0 -123
  144. package/lib/MultiParty/MediaCapabilitiesUtils.js.map +0 -1
  145. package/lib/MultiParty/MediaTracer.d.ts +0 -4
  146. package/lib/MultiParty/MediaTracer.d.ts.map +0 -1
  147. package/lib/MultiParty/MediaTracer.js +0 -10
  148. package/lib/MultiParty/MediaTracer.js.map +0 -1
  149. package/lib/MultiParty/MultiPartyService.d.ts +0 -49
  150. package/lib/MultiParty/MultiPartyService.d.ts.map +0 -1
  151. package/lib/MultiParty/MultiPartyService.js +0 -30
  152. package/lib/MultiParty/MultiPartyService.js.map +0 -1
  153. package/lib/MultiParty/MultiPartyServiceFactory.d.ts +0 -4
  154. package/lib/MultiParty/MultiPartyServiceFactory.d.ts.map +0 -1
  155. package/lib/MultiParty/MultiPartyServiceFactory.js +0 -13
  156. package/lib/MultiParty/MultiPartyServiceFactory.js.map +0 -1
  157. package/lib/MultiParty/MultipartyServiceEventTypes.d.ts +0 -89
  158. package/lib/MultiParty/MultipartyServiceEventTypes.d.ts.map +0 -1
  159. package/lib/MultiParty/MultipartyServiceEventTypes.js +0 -16
  160. package/lib/MultiParty/MultipartyServiceEventTypes.js.map +0 -1
  161. package/lib/MultiParty/index.d.ts +0 -7
  162. package/lib/MultiParty/index.d.ts.map +0 -1
  163. package/lib/MultiParty/index.js +0 -25
  164. package/lib/MultiParty/index.js.map +0 -1
  165. package/lib/MultiParty/opentok/OpentokMultiPartyService.d.ts +0 -38
  166. package/lib/MultiParty/opentok/OpentokMultiPartyService.d.ts.map +0 -1
  167. package/lib/MultiParty/opentok/OpentokMultiPartyService.js +0 -492
  168. package/lib/MultiParty/opentok/OpentokMultiPartyService.js.map +0 -1
  169. package/lib/MultiParty/opentok/OpentokPublisher.d.ts +0 -34
  170. package/lib/MultiParty/opentok/OpentokPublisher.d.ts.map +0 -1
  171. package/lib/MultiParty/opentok/OpentokPublisher.js +0 -121
  172. package/lib/MultiParty/opentok/OpentokPublisher.js.map +0 -1
  173. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.d.ts +0 -20
  174. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.d.ts.map +0 -1
  175. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.js +0 -49
  176. package/lib/MultiParty/opentok/OpentokPublisherEventMapper.js.map +0 -1
  177. package/lib/MultiParty/opentok/OpentokScreenPublisher.d.ts +0 -6
  178. package/lib/MultiParty/opentok/OpentokScreenPublisher.d.ts.map +0 -1
  179. package/lib/MultiParty/opentok/OpentokScreenPublisher.js +0 -48
  180. package/lib/MultiParty/opentok/OpentokScreenPublisher.js.map +0 -1
  181. package/lib/MultiParty/opentok/OpentokSubscriber.d.ts +0 -2
  182. package/lib/MultiParty/opentok/OpentokSubscriber.d.ts.map +0 -1
  183. package/lib/MultiParty/opentok/OpentokSubscriber.js +0 -26
  184. package/lib/MultiParty/opentok/OpentokSubscriber.js.map +0 -1
  185. package/lib/MultiParty/opentok/OpentokVideoPublisher.d.ts +0 -19
  186. package/lib/MultiParty/opentok/OpentokVideoPublisher.d.ts.map +0 -1
  187. package/lib/MultiParty/opentok/OpentokVideoPublisher.js +0 -182
  188. package/lib/MultiParty/opentok/OpentokVideoPublisher.js.map +0 -1
  189. package/lib/MultiParty/opentok/trace.d.ts +0 -3
  190. package/lib/MultiParty/opentok/trace.d.ts.map +0 -1
  191. package/lib/MultiParty/opentok/trace.js +0 -18
  192. package/lib/MultiParty/opentok/trace.js.map +0 -1
  193. package/lib/MultiParty/opentok.d.ts +0 -463
  194. package/lib/MultiParty/types.d.ts +0 -33
  195. package/lib/MultiParty/types.d.ts.map +0 -1
  196. package/lib/MultiParty/types.js +0 -3
  197. package/lib/MultiParty/types.js.map +0 -1
  198. package/lib/MultiParty/utils.d.ts +0 -10
  199. package/lib/MultiParty/utils.d.ts.map +0 -1
  200. package/lib/MultiParty/utils.js +0 -17
  201. package/lib/MultiParty/utils.js.map +0 -1
  202. package/lib/qos/raw-qos.d.ts +0 -29
  203. package/lib/qos/raw-qos.d.ts.map +0 -1
  204. package/lib/webrtc-ie-shim.d.ts +0 -4
  205. package/lib/webrtc-ie-shim.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["oldCode/opentok/stream.js"],"names":["EVENTS","TsOpenTokStream","session","otstream","id","_otstream","_session","_videoChannelExists","channel","filter","type","length","_audioChannelExists","publishAudio","publish","publisher","_otpublisher","publishVideo","subscribe","target","params","createSubscriber","then","subscriber","stream","_otsubscriber","on","e","emit","SUBSCRIBER_EVENTS","DESTROYED","DISCONNECTED","video","getVideoElement","element","_environment","isIE11","setAttribute","play","setupDimensionsListener","container","$","find","destroySubscriber","getSnapshot","tsMediaElement","timeout","format","quality","x","y","w","h","Promise","resolve","otElement","TsMediaPublisher","crop","_","isUndefined","resize","toLowerCase","getImgData","videoElement","videoElem","canvas","document","createElement","ctx","getContext","width","height","drawImage","videoHeight","videoWidth","toDataURL","currentWidth","currentHeight","currentPosition","position","videoDimensions","ratio","Math","max","css","left","top","setTimeout","pngDataURL","img","Image","onload","widthRatio","heightRatio","src","imgData","reject","getStats","err","stats","streamId","name","hasVideo","hasAudio","TsMediaStream"],"mappings":"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","file":"stream.js","sourcesContent":["import {\n EVENTS,\n TsMediaStream,\n} from '../stream';\n\nimport {\n EVENTS as SUBSCRIBER_EVENTS,\n} from '../subscriber';\n\nimport { TsMediaPublisher } from '../publisher';\n\nexport { EVENTS };\n\nexport class TsOpenTokStream extends TsMediaStream {\n constructor(session, otstream) {\n super(otstream.id, session);\n\n this._otstream = otstream;\n this._session = session;\n\n this._videoChannelExists = this._otstream.channel && (this._otstream.channel.filter((channel) => channel.type === 'video').length > 0);\n this._audioChannelExists = this._otstream.channel && (this._otstream.channel.filter((channel) => channel.type === 'audio').length > 0);\n }\n\n get id() {\n return this._otstream.streamId;\n }\n\n get name() {\n return this._otstream.name;\n }\n\n /**\n * Whether the stream has video. This property can change if the publisher turns on or off video\n * (by calling Publisher.publishVideo()). When this occurs, the Session object dispatches a streamPropertyChanged\n * event (see StreamPropertyChangedEvent).\n */\n get hasVideo() {\n return this._otstream.hasVideo;\n }\n\n /**\n * Whether the stream has audio. This property can change if the publisher turns on or off audio\n * (by calling Publisher.publishAudio()). When this occurs, the Session object dispatches a streamPropertyChanged\n * event (see StreamPropertyChangedEvent).\n */\n get hasAudio() {\n return this._otstream.hasAudio;\n }\n\n /**\n * Indicates if video channel exists in the stream.\n */\n get videoChannelExists() {\n return this._videoChannelExists;\n }\n\n /**\n * Indicates if audio channel exists in the stream.\n */\n get audioChannelExists() {\n return this._audioChannelExists;\n }\n\n publishAudio(publish) {\n if (this.publisher) {\n this.publisher._otpublisher.publishAudio(publish);\n }\n }\n\n publishVideo(publish) {\n if (this.publisher) {\n this.publisher._otpublisher.publishVideo(publish);\n }\n }\n\n subscribe(target, params) {\n if (!params) {\n params = target;\n target = null;\n }\n\n return this._session.createSubscriber(this, target, params)\n .then((subscriber) => {\n subscriber.stream = this;\n this.subscriber = subscriber;\n\n subscriber._otsubscriber.on('destroyed', (e) => {\n subscriber.emit(SUBSCRIBER_EVENTS.DESTROYED, e);\n });\n\n subscriber._otsubscriber.on('disconnected', (e) => {\n subscriber.emit(SUBSCRIBER_EVENTS.DISCONNECTED, e);\n });\n\n const video = this.getVideoElement(subscriber._otsubscriber.element)[0];\n\n if (!this._environment.isIE11()) {\n // Hack to override behavior introduced by Chrome v71 that unmuted video elements can't auto play\n video.setAttribute('muted', '');\n video.play();\n }\n\n this.setupDimensionsListener(video, subscriber);\n\n subscriber.id = subscriber._otsubscriber.id;\n\n return subscriber;\n });\n }\n\n getVideoElement(container) {\n const element = $(container).find('.OT_video-element');\n\n return (element.length > 0) ? element : $(container).find('.OT_video-container > video');\n }\n\n destroySubscriber(subscriber) {\n return this._session.destroySubscriber(subscriber);\n }\n\n getSnapshot(tsMediaElement, timeout = 0, {format = 'image/png', quality = 0.92, x, y, w, h} = {}) {\n return new Promise((resolve) => {\n const otElement = tsMediaElement[tsMediaElement instanceof TsMediaPublisher ? '_otpublisher' : '_otsubscriber'];\n const crop = !_.isUndefined(x) && !_.isUndefined(y) && !_.isUndefined(w) && !_.isUndefined(h);\n const resize = !crop && (!_.isUndefined(w) || !_.isUndefined(h));\n\n if (!this._environment.isIE11() && format.toLowerCase() === 'image/png' && !crop && !resize) {\n return resolve(`data:image/png;base64,${otElement.getImgData()}`);\n }\n\n const videoElement = this.getVideoElement(otElement.element);\n\n if (!this._environment.isIE11()) {\n const videoElem = videoElement[0];\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (crop) {\n canvas.width = w;\n canvas.height = h;\n\n ctx.drawImage(videoElem, x, y, w, h, 0, 0, w, h);\n } else if (resize) {\n if (!h) {\n h = w * (videoElem.videoHeight / videoElem.videoWidth);\n } else if (!w) {\n w = h * (videoElem.videoWidth / videoElem.videoHeight);\n }\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.drawImage(videoElem, 0, 0, w, h);\n } else {\n canvas.width = videoElem.videoWidth;\n canvas.height = videoElem.videoHeight;\n\n ctx.drawImage(videoElem, 0, 0);\n }\n\n return resolve(canvas.toDataURL(format, quality));\n }\n\n const currentWidth = videoElement.width();\n const currentHeight = videoElement.height();\n const currentPosition = videoElement.position();\n const {width: videoWidth, height: videoHeight} = this.videoDimensions;\n const ratio = Math.max(\n videoWidth / currentWidth,\n videoHeight / currentHeight\n );\n\n videoElement.width(videoWidth / ratio);\n videoElement.height(videoHeight / ratio);\n\n videoElement.css({\n left: currentPosition.left + Math.max(0,\n (currentWidth - videoWidth / ratio) / 2) + 'px',\n\n top: currentPosition.top + Math.max(0,\n (currentHeight - videoHeight / ratio) / 2) + 'px'\n });\n\n setTimeout(() => {\n const pngDataURL = `data:image/png;base64,${otElement.getImgData()}`;\n\n if (format.toLowerCase() === 'image/png' && !crop && !resize) {\n resolve(pngDataURL);\n } else {\n const img = new Image(),\n canvas = document.createElement('canvas'),\n ctx = canvas.getContext('2d');\n\n img.onload = () => {\n if (crop) {\n const widthRatio = img.width / videoWidth;\n const heightRatio = img.height / videoHeight;\n\n x = x && x * widthRatio;\n y = y && y * heightRatio;\n w = w && w * widthRatio;\n h = h && h * heightRatio;\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.drawImage(img, x, y, w, h, 0, 0, w, h);\n } else if (resize) {\n if (!h) {\n h = w * (videoHeight / videoWidth);\n } else if (!w) {\n w = h * (videoWidth / videoHeight);\n }\n\n canvas.width = w;\n canvas.height = h;\n\n ctx.drawImage(img, 0, 0, w, h);\n } else {\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img);\n }\n\n return resolve(canvas.toDataURL(format, quality));\n };\n\n img.src = pngDataURL;\n }\n\n videoElement.width(currentWidth);\n videoElement.height(currentHeight);\n\n videoElement.css({\n left: currentPosition.left + 'px',\n top: currentPosition.top + 'px'\n });\n }, timeout * 1000);\n })\n .then((imgData) => {\n if (!imgData || imgData.length < 10) {\n return Promise.reject('Failed to get a snapshot');\n }\n\n return imgData;\n });\n }\n\n getStats(subscriber) {\n return new Promise((resolve, reject) => {\n subscriber._otsubscriber.getStats((err, stats) => {\n if (err) {\n return reject(err);\n }\n\n return resolve(stats);\n });\n });\n }\n}\n"]}
@@ -0,0 +1,143 @@
1
+ 'use strict';
2
+
3
+ exports.__esModule = true;
4
+ exports.TsMediaPublisher = exports.EVENTS = undefined;
5
+
6
+ var _eventEmitter = require('./event-emitter');
7
+
8
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9
+
10
+ function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
11
+
12
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
13
+
14
+ /**
15
+ * @enum PUBLISHER_EVENTS
16
+ */
17
+ var PUBLISHER_EVENTS = {
18
+ STREAM_CREATED: 'STREAM_CREATED',
19
+ DESTROYED: 'DESTROYED',
20
+ VIDEO_DIMENSIONS_CHANGED: 'VIDEO_DIMENSIONS_CHANGED'
21
+ };
22
+
23
+ exports.EVENTS = PUBLISHER_EVENTS;
24
+
25
+ /**
26
+ * Publisher object represents publishing a media stream.
27
+ *
28
+ * Exposes session and stream wrapper methods specific for media publishing.
29
+ *
30
+ * Instance is returned by TsMediaSession.createPublisher() call
31
+ *
32
+ * @class
33
+ *
34
+ * @see TsMediaSession
35
+ */
36
+
37
+ var TsMediaPublisher = exports.TsMediaPublisher = function (_EventEmitter) {
38
+ _inherits(TsMediaPublisher, _EventEmitter);
39
+
40
+ function TsMediaPublisher(session, data) {
41
+ _classCallCheck(this, TsMediaPublisher);
42
+
43
+ var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));
44
+
45
+ _.assign(_this, data);
46
+
47
+ _this._session = session;
48
+ return _this;
49
+ }
50
+
51
+ /**
52
+ * Publish media stream to a server.
53
+ *
54
+ * @method
55
+ *
56
+ * @returns { Promise }
57
+ *
58
+ * @fires PUBLISHER_EVENTS#STREAM_CREATED
59
+ * @fires SESSION_EVENTS#STREAM_PROPERTY_CHANGED
60
+ * @fires STREAM_EVENTS#PROPERTY_CHANGED
61
+ */
62
+
63
+
64
+ TsMediaPublisher.prototype.publish = function publish() {
65
+ return this._session.publish(this);
66
+ };
67
+
68
+ /**
69
+ * Unpublish the media strem and destroy publisher's view
70
+ *
71
+ * @method
72
+ * @return { Promise }
73
+ */
74
+
75
+
76
+ TsMediaPublisher.prototype.destroy = function destroy() {
77
+ return this._session.destroyPublisher(this);
78
+ };
79
+
80
+ /**
81
+ * Whether or not publish audio
82
+ *
83
+ * @method
84
+ * @param { Boolean } publish
85
+ *
86
+ * @returns { Promise }
87
+ */
88
+
89
+
90
+ TsMediaPublisher.prototype.publishAudio = function publishAudio(publish) {
91
+ if (this.stream) {
92
+ return this.stream.publishAudio(publish);
93
+ }
94
+
95
+ return Promise.reject();
96
+ };
97
+
98
+ /**
99
+ * Whether or not publish video
100
+ *
101
+ * @method
102
+ * @param { Boolean } publish
103
+ *
104
+ * @returns { Promise }
105
+ */
106
+
107
+
108
+ TsMediaPublisher.prototype.publishVideo = function publishVideo(publish) {
109
+ if (this.stream) {
110
+ return this.stream.publishVideo(publish);
111
+ }
112
+
113
+ return Promise.reject();
114
+ };
115
+
116
+ /**
117
+ * Get snapshot of the current frame in the media stream
118
+ *
119
+ * @method
120
+ * @param { Object } options Snapshot options: format, quality and crop positions
121
+ *
122
+ * @returns { Promise<String> } snapshot
123
+ */
124
+
125
+
126
+ TsMediaPublisher.prototype.getSnapshot = function getSnapshot(options) {
127
+ // Since a video publisher (the client) won't be used in IE, we can drop the timeout.
128
+ return this.stream.getSnapshot(this, 0, options);
129
+ };
130
+
131
+ TsMediaPublisher.prototype.turnFlashlight = function turnFlashlight() {
132
+ var isTorchOn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
133
+
134
+ return this.stream.turnFlashlight(isTorchOn);
135
+ };
136
+
137
+ TsMediaPublisher.prototype.setAutoLightOffTimer = function setAutoLightOffTimer(flashlightTimeout) {
138
+ return this.stream.setAutoLightOffTimer(flashlightTimeout);
139
+ };
140
+
141
+ return TsMediaPublisher;
142
+ }(_eventEmitter.EventEmitter);
143
+ //# sourceMappingURL=publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["oldCode/publisher.js"],"names":["PUBLISHER_EVENTS","STREAM_CREATED","DESTROYED","VIDEO_DIMENSIONS_CHANGED","EVENTS","TsMediaPublisher","session","data","_","assign","_session","publish","destroy","destroyPublisher","publishAudio","stream","Promise","reject","publishVideo","getSnapshot","options","turnFlashlight","isTorchOn","setAutoLightOffTimer","flashlightTimeout","EventEmitter"],"mappings":";;;;;AAAA;;;;;;;;AAEA;;;AAGA,IAAMA,mBAAmB;AACrBC,oBAAgB,gBADK;AAErBC,eAAW,WAFU;AAGrBC,8BAA0B;AAHL,CAAzB;;QAM6BC,M,GAApBJ,gB;;AAET;;;;;;;;;;;;IAWaK,gB,WAAAA,gB;;;AACT,8BAAYC,OAAZ,EAAqBC,IAArB,EAA2B;AAAA;;AAAA,qDACvB,wBADuB;;AAGvBC,UAAEC,MAAF,QAAeF,IAAf;;AAEA,cAAKG,QAAL,GAAgBJ,OAAhB;AALuB;AAM1B;;AAED;;;;;;;;;;;;;+BAWAK,O,sBAAU;AACN,eAAO,KAAKD,QAAL,CAAcC,OAAd,CAAsB,IAAtB,CAAP;AACH,K;;AAED;;;;;;;;+BAMAC,O,sBAAU;AACN,eAAO,KAAKF,QAAL,CAAcG,gBAAd,CAA+B,IAA/B,CAAP;AACH,K;;AAED;;;;;;;;;;+BAQAC,Y,yBAAaH,O,EAAS;AAClB,YAAI,KAAKI,MAAT,EAAiB;AACb,mBAAO,KAAKA,MAAL,CAAYD,YAAZ,CAAyBH,OAAzB,CAAP;AACH;;AAED,eAAOK,QAAQC,MAAR,EAAP;AACH,K;;AAED;;;;;;;;;;+BAQAC,Y,yBAAaP,O,EAAS;AAClB,YAAI,KAAKI,MAAT,EAAiB;AACb,mBAAO,KAAKA,MAAL,CAAYG,YAAZ,CAAyBP,OAAzB,CAAP;AACH;;AAED,eAAOK,QAAQC,MAAR,EAAP;AACH,K;;AAED;;;;;;;;;;+BAQAE,W,wBAAYC,O,EAAS;AACjB;AACA,eAAO,KAAKL,MAAL,CAAYI,WAAZ,CAAwB,IAAxB,EAA8B,CAA9B,EAAiCC,OAAjC,CAAP;AACH,K;;+BAEDC,c,6BAAiC;AAAA,YAAlBC,SAAkB,uEAAN,IAAM;;AAC7B,eAAO,KAAKP,MAAL,CAAYM,cAAZ,CAA2BC,SAA3B,CAAP;AACH,K;;+BAEDC,oB,iCAAqBC,iB,EAAmB;AACpC,eAAO,KAAKT,MAAL,CAAYQ,oBAAZ,CAAiCC,iBAAjC,CAAP;AACH,K;;;EArFiCC,0B","file":"publisher.js","sourcesContent":["import { EventEmitter } from './event-emitter';\n\n/**\n * @enum PUBLISHER_EVENTS\n */\nconst PUBLISHER_EVENTS = {\n STREAM_CREATED: 'STREAM_CREATED',\n DESTROYED: 'DESTROYED',\n VIDEO_DIMENSIONS_CHANGED: 'VIDEO_DIMENSIONS_CHANGED',\n};\n\nexport { PUBLISHER_EVENTS as EVENTS };\n\n/**\n * Publisher object represents publishing a media stream.\n *\n * Exposes session and stream wrapper methods specific for media publishing.\n *\n * Instance is returned by TsMediaSession.createPublisher() call\n *\n * @class\n *\n * @see TsMediaSession\n */\nexport class TsMediaPublisher extends EventEmitter {\n constructor(session, data) {\n super();\n\n _.assign(this, data);\n\n this._session = session;\n }\n\n /**\n * Publish media stream to a server.\n *\n * @method\n *\n * @returns { Promise }\n *\n * @fires PUBLISHER_EVENTS#STREAM_CREATED\n * @fires SESSION_EVENTS#STREAM_PROPERTY_CHANGED\n * @fires STREAM_EVENTS#PROPERTY_CHANGED\n */\n publish() {\n return this._session.publish(this);\n }\n\n /**\n * Unpublish the media strem and destroy publisher's view\n *\n * @method\n * @return { Promise }\n */\n destroy() {\n return this._session.destroyPublisher(this);\n }\n\n /**\n * Whether or not publish audio\n *\n * @method\n * @param { Boolean } publish\n *\n * @returns { Promise }\n */\n publishAudio(publish) {\n if (this.stream) {\n return this.stream.publishAudio(publish);\n }\n\n return Promise.reject();\n }\n\n /**\n * Whether or not publish video\n *\n * @method\n * @param { Boolean } publish\n *\n * @returns { Promise }\n */\n publishVideo(publish) {\n if (this.stream) {\n return this.stream.publishVideo(publish);\n }\n\n return Promise.reject();\n }\n\n /**\n * Get snapshot of the current frame in the media stream\n *\n * @method\n * @param { Object } options Snapshot options: format, quality and crop positions\n *\n * @returns { Promise<String> } snapshot\n */\n getSnapshot(options) {\n // Since a video publisher (the client) won't be used in IE, we can drop the timeout.\n return this.stream.getSnapshot(this, 0, options);\n }\n\n turnFlashlight(isTorchOn = true) {\n return this.stream.turnFlashlight(isTorchOn);\n }\n\n setAutoLightOffTimer(flashlightTimeout) {\n return this.stream.setAutoLightOffTimer(flashlightTimeout);\n }\n}\n\n"]}
@@ -0,0 +1,395 @@
1
+ 'use strict';
2
+
3
+ exports.__esModule = true;
4
+ exports.TsMediaService = exports.EVENTS = undefined;
5
+
6
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
7
+
8
+ var _tsEnvironmentDetect = require('@techsee/techsee-common/lib/helpers/ts-environment-detect');
9
+
10
+ var _eventEmitter = require('./event-emitter');
11
+
12
+ var _session = require('./session');
13
+
14
+ var _session2 = require('./opentok/session');
15
+
16
+ var _session3 = require('./webrtc/session');
17
+
18
+ var _helper = require('./webrtc/helper');
19
+
20
+ var _constants = require('./constants');
21
+
22
+ var _constants2 = require('./webrtc/constants');
23
+
24
+ var _tracer = require('./tracer');
25
+
26
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
27
+
28
+ function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
29
+
30
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
31
+
32
+ var tracer = (0, _tracer.getTracer)();
33
+
34
+ var environmentDetect = new _tsEnvironmentDetect.TsEnvironmentDetect();
35
+ var isIE11 = environmentDetect.isIE11();
36
+
37
+ if (isIE11) {
38
+ require('./webrtc/webrtc-ie-shim.js');
39
+ } else if (!(environmentDetect.isChrome() && environmentDetect.majorVersion() < 49)) {
40
+ require('webrtc-adapter/src/js/adapter_core'); // eslint-disable-line global-require
41
+ }
42
+
43
+ function _isOTDefined() {
44
+ try {
45
+ return !!OT;
46
+ } catch (e) {
47
+ return false;
48
+ }
49
+ }
50
+
51
+ function _waitForOT() {
52
+ if (_isOTDefined()) {
53
+ return Promise.resolve();
54
+ }
55
+
56
+ var isDefined = false;
57
+
58
+ return Promise.reduce(new Array(_constants.WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS), function () {
59
+ if (isDefined || _isOTDefined()) {
60
+ isDefined = true;
61
+
62
+ return Promise.resolve();
63
+ }
64
+
65
+ return Promise.delay(_constants.WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL);
66
+ }, 0).then(function () {
67
+ return isDefined || Promise.reject('OT is undefined');
68
+ });
69
+ }
70
+
71
+ /**
72
+ * @enum SERVICE_EVENTS
73
+ */
74
+ var SERVICE_EVENTS = {
75
+ SESSION_CREATED: 'SESSION_CREATED',
76
+ EXCEPTION: 'EXCEPTION'
77
+ };
78
+
79
+ exports.EVENTS = SERVICE_EVENTS;
80
+
81
+
82
+ var sessions = [];
83
+ var latestLocalStream = null;
84
+ var userMediaPromise = null;
85
+
86
+ /**
87
+ * The top of hierarchy and the entry point of the TsMedia Service.
88
+ *
89
+ * @static
90
+ * @class
91
+ * @extends EventEmitter
92
+ */
93
+
94
+ var TsMediaServiceFacade = function (_EventEmitter) {
95
+ _inherits(TsMediaServiceFacade, _EventEmitter);
96
+
97
+ function TsMediaServiceFacade() {
98
+ _classCallCheck(this, TsMediaServiceFacade);
99
+
100
+ var _this = _possibleConstructorReturn(this, _EventEmitter.call(this));
101
+
102
+ _this.createLocalMediaStream = _this.createLocalMediaStream.bind(_this);
103
+ _this.destroyLocalMediaStream = _this.destroyLocalMediaStream.bind(_this);
104
+ return _this;
105
+ }
106
+
107
+ /**
108
+ * All created sessoins
109
+ *
110
+ * @member { Object }
111
+ * @memberof TsMediaService
112
+ * @type { Array<TsMediaSession> }
113
+ */
114
+
115
+
116
+ TsMediaServiceFacade.prototype.createLocalMediaStream = function createLocalMediaStream(constraints) {
117
+ tracer.trace('createLocalMediaStream');
118
+ if (userMediaPromise) {
119
+ return userMediaPromise;
120
+ }
121
+
122
+ if (latestLocalStream) {
123
+ var videoTrack = latestLocalStream.getVideoTracks();
124
+ if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {
125
+ return Promise.resolve(latestLocalStream);
126
+ } else {
127
+ this.destroyLocalMediaStream();
128
+ }
129
+ }
130
+
131
+ userMediaPromise = new Promise(function (resolve, reject) {
132
+ try {
133
+ tracer.trace('createLocalMediaStream inside promise');
134
+
135
+ navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
136
+ latestLocalStream = stream;
137
+ userMediaPromise = null;
138
+ resolve(stream);
139
+ }).catch(function (err) {
140
+ userMediaPromise = null;
141
+ reject(err);
142
+ });
143
+ } catch (e) {
144
+ userMediaPromise = null;
145
+ reject(e);
146
+ }
147
+ });
148
+
149
+ return userMediaPromise;
150
+ };
151
+
152
+ TsMediaServiceFacade.prototype.destroyLocalMediaStream = function destroyLocalMediaStream() {
153
+ tracer.trace('Destroy local streams');
154
+ if (latestLocalStream) {
155
+ latestLocalStream.getTracks().forEach(function (track) {
156
+ track.stop();
157
+ });
158
+ }
159
+
160
+ latestLocalStream = null;
161
+ };
162
+
163
+ TsMediaServiceFacade.prototype.toggleMicrophone = function toggleMicrophone() {
164
+ var enableMic = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
165
+
166
+ if (!latestLocalStream) {
167
+ return Promise.resolve();
168
+ }
169
+
170
+ var audioTracks = latestLocalStream.getAudioTracks();
171
+ if (audioTracks.length > 0) {
172
+ audioTracks[0].enabled = enableMic;
173
+ }
174
+
175
+ return Promise.resolve();
176
+ };
177
+
178
+ /**
179
+ * Enumerate available media devices
180
+ *
181
+ * @method
182
+ * @memberof TsMediaService
183
+ * @returns { Promise<Array<MediaDeviceInfo>> } devices list
184
+ *
185
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo | MediaDeviceInfo documentation}
186
+ */
187
+
188
+
189
+ TsMediaServiceFacade.prototype.getDevices = function getDevices() {
190
+ if (typeof OT !== 'undefined' && OT && OT.getDevices) {
191
+ return new Promise(function (resolve, reject) {
192
+ OT.getDevices(function (error, devices) {
193
+ if (error) {
194
+ return reject(error);
195
+ }
196
+
197
+ return resolve(devices);
198
+ });
199
+ });
200
+ }
201
+
202
+ if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
203
+ return navigator.mediaDevices.enumerateDevices();
204
+ }
205
+
206
+ return Promise.reject('getDevices is not supported');
207
+ };
208
+
209
+ /**
210
+ * Verifies camera access
211
+ *
212
+ * @method
213
+ * @memberof TsMediaService
214
+ * @returns { Promise<Object> } returns {stream,constraints} if successful, or rejected promise if failed
215
+ *
216
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo | MediaDeviceInfo documentation}
217
+ */
218
+
219
+
220
+ TsMediaServiceFacade.prototype.verifyCameraAccess = function verifyCameraAccess(deviceOpts) {
221
+ return (0, _helper.getHighestResolutionStream)(deviceOpts);
222
+ };
223
+
224
+ TsMediaServiceFacade.prototype.isVideoPlaySupportedOnDevice = function isVideoPlaySupportedOnDevice() {
225
+ if (!isIE11) {
226
+ return Promise.resolve(true);
227
+ }
228
+
229
+ if (!!window.WebRTCAdapter) {
230
+ return Promise.resolve(true);
231
+ }
232
+
233
+ if (window.OT && window.OTPlugin && window.OTPlugin.isInstalled && window.OTPlugin.isInstalled()) {
234
+ return Promise.resolve(true);
235
+ }
236
+
237
+ return Promise.resolve(false);
238
+ };
239
+
240
+ /**
241
+ * Init WebRTC or OpenTok session depends on required type.
242
+ *
243
+ * Returns an initialized specific implementation of TsMediaSession interface.
244
+ *
245
+ * Assuming mobile will be a publisher and not mobile will be a subscriber.
246
+ *
247
+ * @method
248
+ * @memberof TsMediaService
249
+ *
250
+ * @param { OPENTOK|MEDIASERVER|TURNSERVER } mediaServiceType required implementation
251
+ * @param { Boolean } isMobile Whether techsee-mobile or not calls this method.
252
+ * @param { Object } resolution constraint to use for video stream
253
+ * @param { opentok|tsMediaServer|turnServer } credentials server/service credentials
254
+ * @param { Object } deviceOpts requested devices (mainly audio/video device ids)
255
+ * @param { Boolean } isLoopback Whether to use loopback webrtc
256
+ *
257
+ * @returns { Promise<TsMediaSession> }
258
+ */
259
+
260
+
261
+ TsMediaServiceFacade.prototype.initSession = function initSession() {
262
+ var _this2 = this;
263
+
264
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
265
+ isMobile: false,
266
+ resolution: '640x480'
267
+ },
268
+ mediaServiceType = _ref.mediaServiceType,
269
+ isMobile = _ref.isMobile,
270
+ resolution = _ref.resolution,
271
+ credentials = _ref.credentials,
272
+ deviceOpts = _ref.deviceOpts,
273
+ isLoopback = _ref.isLoopback;
274
+
275
+ return Promise.resolve().then(function () {
276
+ if (mediaServiceType === _constants.MEDIA_SERVICE_TYPES.MEDIASERVER) {
277
+ //
278
+ // KMS CONNECTION
279
+ //
280
+ return Promise.resolve().then(function () {
281
+ var sessionOptions = {
282
+ isMobile: isMobile,
283
+ resolution: resolution,
284
+
285
+ credentials: credentials.tsMediaServer,
286
+ deviceOpts: deviceOpts || { audio: true, video: true }
287
+ };
288
+
289
+ return new _session3.KMSWebRTCSession(sessionOptions);
290
+ });
291
+ } else if (mediaServiceType === _constants.MEDIA_SERVICE_TYPES.TURNSERVER || isLoopback) {
292
+ //
293
+ // TURN-based connection or loopback (no connection)
294
+ //
295
+ return Promise.resolve().then(function () {
296
+ var creds = null;
297
+
298
+ if (!isLoopback) {
299
+ creds = mediaServiceType === _constants.MEDIA_SERVICE_TYPES.TURNSERVER ? credentials.turnServer : credentials.opentok;
300
+ }
301
+
302
+ var sessionOptions = {
303
+ isMobile: isMobile,
304
+ resolution: resolution,
305
+ credentials: creds,
306
+ deviceOpts: deviceOpts || { audio: true, video: true }
307
+ };
308
+
309
+ if (isLoopback) {
310
+ return new _session3.LoopbackWebRTCSession(sessionOptions);
311
+ } else if (isMobile) {
312
+ return new _session3.TurnWebRTCSession(sessionOptions, _this2.createLocalMediaStream);
313
+ } else {
314
+ return _this2.getTurnMediaSessionV2(sessionOptions).then(function (mediaSession) {
315
+ _this2.subscribeTurnSessionEvents(mediaSession);
316
+
317
+ return mediaSession;
318
+ });
319
+ }
320
+ });
321
+ }
322
+
323
+ //
324
+ // OT CONNECTION (default mediaServiceType)
325
+ //
326
+ return Promise.resolve().then(function () {
327
+ return _waitForOT();
328
+ }).then(function () {
329
+ var sessionOptions = {
330
+ isMobile: isMobile,
331
+ resolution: resolution,
332
+
333
+ credentials: credentials.opentok
334
+ };
335
+
336
+ return new _session2.TsOpenTokSession(sessionOptions);
337
+ });
338
+ }).then(function (session) {
339
+ _this2.emit(SERVICE_EVENTS.SESSION_CREATED, session);
340
+
341
+ sessions.push(session);
342
+
343
+ return session;
344
+ });
345
+ };
346
+
347
+ TsMediaServiceFacade.prototype.getTurnMediaSessionV2 = function getTurnMediaSessionV2(sessionOptions) {
348
+ var _this3 = this;
349
+
350
+ return (0, _helper.getMediaConstraints)({
351
+ resolution: sessionOptions.resolution,
352
+ deviceOpts: sessionOptions.deviceOpts
353
+ }).then(function (constraints) {
354
+ var clientType = sessionOptions.isMobile ? _constants2.CLIENT_TYPES.INITIATOR : _constants2.CLIENT_TYPES.GUEST;
355
+
356
+ // streaming from dashboard is not supported and we
357
+ // don't want to access the camera without a reason
358
+ if (clientType === _constants2.CLIENT_TYPES.GUEST) {
359
+ delete constraints.video;
360
+ }
361
+
362
+ var sessionParams = {
363
+ constraints: constraints,
364
+ clientType: clientType,
365
+ credentials: sessionOptions.credentials,
366
+ streamFactory: _this3.createLocalMediaStream
367
+ };
368
+
369
+ return new _session3.TurnWebRtcSessionV2(sessionParams);
370
+ });
371
+ };
372
+
373
+ TsMediaServiceFacade.prototype.subscribeTurnSessionEvents = function subscribeTurnSessionEvents(mediaSession) {
374
+ var _this4 = this;
375
+
376
+ var disconnectHandler = function disconnectHandler() {
377
+ _this4.destroyLocalMediaStream();
378
+ mediaSession.off(_session.SESSION_EVENTS.DISCONNECTED, disconnectHandler);
379
+ };
380
+
381
+ mediaSession.on(_session.SESSION_EVENTS.DISCONNECTED, disconnectHandler);
382
+ };
383
+
384
+ _createClass(TsMediaServiceFacade, [{
385
+ key: 'sessions',
386
+ get: function get() {
387
+ return sessions;
388
+ }
389
+ }]);
390
+
391
+ return TsMediaServiceFacade;
392
+ }(_eventEmitter.EventEmitter);
393
+
394
+ var TsMediaService = exports.TsMediaService = new TsMediaServiceFacade();
395
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["oldCode/service.js"],"names":["tracer","environmentDetect","TsEnvironmentDetect","isIE11","require","isChrome","majorVersion","_isOTDefined","OT","e","_waitForOT","Promise","resolve","isDefined","reduce","Array","WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS","delay","WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL","then","reject","SERVICE_EVENTS","SESSION_CREATED","EXCEPTION","EVENTS","sessions","latestLocalStream","userMediaPromise","TsMediaServiceFacade","createLocalMediaStream","bind","destroyLocalMediaStream","constraints","trace","videoTrack","getVideoTracks","length","readyState","navigator","mediaDevices","getUserMedia","stream","catch","err","getTracks","forEach","track","stop","toggleMicrophone","enableMic","audioTracks","getAudioTracks","enabled","getDevices","error","devices","enumerateDevices","verifyCameraAccess","deviceOpts","isVideoPlaySupportedOnDevice","window","WebRTCAdapter","OTPlugin","isInstalled","initSession","isMobile","resolution","mediaServiceType","credentials","isLoopback","MEDIA_SERVICE_TYPES","MEDIASERVER","sessionOptions","tsMediaServer","audio","video","KMSWebRTCSession","TURNSERVER","creds","turnServer","opentok","LoopbackWebRTCSession","TurnWebRTCSession","getTurnMediaSessionV2","mediaSession","subscribeTurnSessionEvents","TsOpenTokSession","session","emit","push","clientType","CLIENT_TYPES","INITIATOR","GUEST","sessionParams","streamFactory","TurnWebRtcSessionV2","disconnectHandler","off","SESSION_EVENTS","DISCONNECTED","on","EventEmitter","TsMediaService"],"mappings":"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","file":"service.js","sourcesContent":["import {TsEnvironmentDetect} from '@techsee/techsee-common/lib/helpers/ts-environment-detect';\nimport {EventEmitter} from './event-emitter';\nimport {SESSION_EVENTS} from './session';\nimport {TsOpenTokSession} from './opentok/session';\nimport {KMSWebRTCSession, LoopbackWebRTCSession, TurnWebRTCSession, TurnWebRtcSessionV2} from './webrtc/session';\nimport {getHighestResolutionStream, getMediaConstraints} from './webrtc/helper';\n\nimport {\n MEDIA_SERVICE_TYPES,\n WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL,\n WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS\n} from './constants';\nimport {CLIENT_TYPES} from './webrtc/constants';\nimport {getTracer} from './tracer';\n\nconst tracer = getTracer();\n\n\nconst environmentDetect = new TsEnvironmentDetect();\nconst isIE11 = environmentDetect.isIE11();\n\nif (isIE11) {\n require('./webrtc/webrtc-ie-shim.js');\n} else if (!(environmentDetect.isChrome() && (environmentDetect.majorVersion() < 49))) {\n require('webrtc-adapter/src/js/adapter_core'); // eslint-disable-line global-require\n}\n\nfunction _isOTDefined() {\n try {\n return !!OT;\n } catch (e) {\n return false;\n }\n}\n\nfunction _waitForOT() {\n if (_isOTDefined()) {\n return Promise.resolve();\n }\n\n let isDefined = false;\n\n return Promise.reduce(\n new Array(WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS),\n () => {\n if (isDefined || _isOTDefined()) {\n isDefined = true;\n\n return Promise.resolve();\n }\n\n return Promise.delay(WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL);\n }, 0)\n .then(() => isDefined || Promise.reject('OT is undefined'));\n}\n\n/**\n * @enum SERVICE_EVENTS\n */\nconst SERVICE_EVENTS = {\n SESSION_CREATED: 'SESSION_CREATED',\n EXCEPTION: 'EXCEPTION'\n};\n\nexport {SERVICE_EVENTS as EVENTS};\n\nconst sessions = [];\nlet latestLocalStream = null;\nlet userMediaPromise = null;\n\n/**\n * The top of hierarchy and the entry point of the TsMedia Service.\n *\n * @static\n * @class\n * @extends EventEmitter\n */\nclass TsMediaServiceFacade extends EventEmitter {\n constructor() {\n super();\n\n this.createLocalMediaStream = this.createLocalMediaStream.bind(this);\n this.destroyLocalMediaStream = this.destroyLocalMediaStream.bind(this);\n }\n\n /**\n * All created sessoins\n *\n * @member { Object }\n * @memberof TsMediaService\n * @type { Array<TsMediaSession> }\n */\n get sessions() {\n return sessions;\n }\n\n createLocalMediaStream(constraints) {\n tracer.trace('createLocalMediaStream');\n if (userMediaPromise) {\n return userMediaPromise;\n }\n\n if (latestLocalStream) {\n const videoTrack = latestLocalStream.getVideoTracks();\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return Promise.resolve(latestLocalStream);\n } else {\n this.destroyLocalMediaStream();\n }\n }\n\n userMediaPromise = new Promise((resolve, reject) => {\n try {\n tracer.trace('createLocalMediaStream inside promise');\n\n navigator.mediaDevices.getUserMedia(constraints)\n .then((stream) => {\n latestLocalStream = stream;\n userMediaPromise = null;\n resolve(stream);\n })\n .catch((err) => {\n userMediaPromise = null;\n reject(err);\n });\n } catch (e) {\n userMediaPromise = null;\n reject(e);\n }\n });\n\n return userMediaPromise;\n }\n\n destroyLocalMediaStream() {\n tracer.trace('Destroy local streams');\n if (latestLocalStream) {\n latestLocalStream.getTracks().forEach((track) => {\n track.stop();\n });\n }\n\n latestLocalStream = null;\n }\n\n toggleMicrophone(enableMic = true) {\n if (!latestLocalStream) {\n return Promise.resolve();\n }\n\n const audioTracks = latestLocalStream.getAudioTracks();\n if (audioTracks.length > 0) {\n audioTracks[0].enabled = enableMic;\n }\n\n return Promise.resolve();\n }\n\n /**\n * Enumerate available media devices\n *\n * @method\n * @memberof TsMediaService\n * @returns { Promise<Array<MediaDeviceInfo>> } devices list\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo | MediaDeviceInfo documentation}\n */\n getDevices() {\n if ((typeof OT !== 'undefined') && OT && OT.getDevices) {\n return new Promise((resolve, reject) => {\n OT.getDevices((error, devices) => {\n if (error) {\n return reject(error);\n }\n\n return resolve(devices);\n });\n });\n }\n\n if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {\n return navigator.mediaDevices.enumerateDevices();\n }\n\n return Promise.reject('getDevices is not supported');\n }\n\n /**\n * Verifies camera access\n *\n * @method\n * @memberof TsMediaService\n * @returns { Promise<Object> } returns {stream,constraints} if successful, or rejected promise if failed\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo | MediaDeviceInfo documentation}\n */\n verifyCameraAccess(deviceOpts) {\n return getHighestResolutionStream(deviceOpts);\n }\n\n isVideoPlaySupportedOnDevice() {\n if (!isIE11) {\n return Promise.resolve(true);\n }\n\n if (!!window.WebRTCAdapter) {\n return Promise.resolve(true);\n }\n\n if (window.OT && window.OTPlugin && window.OTPlugin.isInstalled && window.OTPlugin.isInstalled()) {\n return Promise.resolve(true);\n }\n\n return Promise.resolve(false);\n }\n\n /**\n * Init WebRTC or OpenTok session depends on required type.\n *\n * Returns an initialized specific implementation of TsMediaSession interface.\n *\n * Assuming mobile will be a publisher and not mobile will be a subscriber.\n *\n * @method\n * @memberof TsMediaService\n *\n * @param { OPENTOK|MEDIASERVER|TURNSERVER } mediaServiceType required implementation\n * @param { Boolean } isMobile Whether techsee-mobile or not calls this method.\n * @param { Object } resolution constraint to use for video stream\n * @param { opentok|tsMediaServer|turnServer } credentials server/service credentials\n * @param { Object } deviceOpts requested devices (mainly audio/video device ids)\n * @param { Boolean } isLoopback Whether to use loopback webrtc\n *\n * @returns { Promise<TsMediaSession> }\n */\n initSession({\n mediaServiceType,\n isMobile,\n resolution,\n credentials,\n deviceOpts,\n isLoopback\n } = {\n isMobile: false,\n resolution: '640x480'\n }) {\n return Promise.resolve()\n .then(() => {\n if (mediaServiceType === MEDIA_SERVICE_TYPES.MEDIASERVER) {\n //\n // KMS CONNECTION\n //\n return Promise.resolve()\n .then(() => {\n const sessionOptions = {\n isMobile,\n resolution,\n\n credentials: credentials.tsMediaServer,\n deviceOpts: deviceOpts || {audio: true, video: true}\n };\n\n return new KMSWebRTCSession(sessionOptions);\n });\n } else if (mediaServiceType === MEDIA_SERVICE_TYPES.TURNSERVER || isLoopback) {\n //\n // TURN-based connection or loopback (no connection)\n //\n return Promise.resolve()\n .then(() => {\n let creds = null;\n\n if (!isLoopback) {\n creds = (mediaServiceType === MEDIA_SERVICE_TYPES.TURNSERVER) ? credentials.turnServer : credentials.opentok;\n }\n\n const sessionOptions = {\n isMobile,\n resolution,\n credentials: creds,\n deviceOpts: deviceOpts || {audio: true, video: true}\n };\n\n if (isLoopback) {\n return new LoopbackWebRTCSession(sessionOptions);\n } else if (isMobile) {\n return new TurnWebRTCSession(sessionOptions, this.createLocalMediaStream);\n } else {\n return this.getTurnMediaSessionV2(sessionOptions)\n .then((mediaSession) => {\n this.subscribeTurnSessionEvents(mediaSession);\n\n return mediaSession;\n });\n }\n });\n }\n\n //\n // OT CONNECTION (default mediaServiceType)\n //\n return Promise.resolve()\n .then(() => _waitForOT())\n .then(() => {\n const sessionOptions = {\n isMobile,\n resolution,\n\n credentials: credentials.opentok\n };\n\n return new TsOpenTokSession(sessionOptions);\n });\n })\n .then((session) => {\n this.emit(SERVICE_EVENTS.SESSION_CREATED, session);\n\n sessions.push(session);\n\n return session;\n });\n }\n\n getTurnMediaSessionV2(sessionOptions) {\n return getMediaConstraints({\n resolution: sessionOptions.resolution,\n deviceOpts: sessionOptions.deviceOpts\n }).then((constraints) => {\n const clientType = sessionOptions.isMobile ? CLIENT_TYPES.INITIATOR : CLIENT_TYPES.GUEST;\n\n // streaming from dashboard is not supported and we\n // don't want to access the camera without a reason\n if (clientType === CLIENT_TYPES.GUEST) {\n delete constraints.video;\n }\n\n const sessionParams = {\n constraints,\n clientType,\n credentials: sessionOptions.credentials,\n streamFactory: this.createLocalMediaStream\n };\n\n return new TurnWebRtcSessionV2(sessionParams);\n });\n }\n\n subscribeTurnSessionEvents(mediaSession) {\n const disconnectHandler = () => {\n this.destroyLocalMediaStream();\n mediaSession.off(SESSION_EVENTS.DISCONNECTED, disconnectHandler);\n };\n\n mediaSession.on(SESSION_EVENTS.DISCONNECTED, disconnectHandler);\n }\n}\n\nexport const TsMediaService = new TsMediaServiceFacade();\n"]}