@techsee/techsee-media-service 0.5.9 → 0.6.0-alpha.1

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.
package/lib/service.js CHANGED
@@ -29,7 +29,9 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen
29
29
 
30
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
31
 
32
- var tracer = (0, _tracer.getTracer)();
32
+ var trace = (0, _tracer.getTracer)('TurnWebRTCSession', function () {
33
+ return window.TurnSessionDebug === true || true;
34
+ });
33
35
 
34
36
  var environmentDetect = new _tsEnvironmentDetect.TsEnvironmentDetect();
35
37
  var isIE11 = environmentDetect.isIE11();
@@ -114,7 +116,7 @@ var TsMediaServiceFacade = function (_EventEmitter) {
114
116
 
115
117
 
116
118
  TsMediaServiceFacade.prototype.createLocalMediaStream = function createLocalMediaStream(constraints) {
117
- tracer.trace('createLocalMediaStream');
119
+ trace('createLocalMediaStream');
118
120
  if (userMediaPromise) {
119
121
  return userMediaPromise;
120
122
  }
@@ -130,7 +132,7 @@ var TsMediaServiceFacade = function (_EventEmitter) {
130
132
 
131
133
  userMediaPromise = new Promise(function (resolve, reject) {
132
134
  try {
133
- tracer.trace('createLocalMediaStream inside promise');
135
+ trace('createLocalMediaStream inside promise');
134
136
 
135
137
  navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
136
138
  latestLocalStream = stream;
@@ -150,7 +152,7 @@ var TsMediaServiceFacade = function (_EventEmitter) {
150
152
  };
151
153
 
152
154
  TsMediaServiceFacade.prototype.destroyLocalMediaStream = function destroyLocalMediaStream() {
153
- tracer.trace('Destroy local streams');
155
+ trace('Destroy local streams');
154
156
  if (latestLocalStream) {
155
157
  latestLocalStream.getTracks().forEach(function (track) {
156
158
  track.stop();
@@ -1 +1 @@
1
- {"version":3,"sources":["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"]}
1
+ {"version":3,"sources":["service.js"],"names":["trace","window","TurnSessionDebug","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","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","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 trace = getTracer('TurnWebRTCSession', () => window.TurnSessionDebug === true || true);\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 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 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 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"]}
package/lib/tracer.js CHANGED
@@ -1,151 +1,22 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- var TsTracerType;
5
- (function (TsTracerType) {
6
- TsTracerType["WebRtcSessionTrace"] = "WebRtcSessionTrace";
7
- TsTracerType["TSMediaServiceHelper"] = "TSMediaServiceHelper";
8
- })(TsTracerType = exports.TsTracerType || (exports.TsTracerType = {}));
9
- var TsTracerEvent = /** @class */function () {
10
- function TsTracerEvent(type, message, extra) {
11
- this._type = TsTracerType.WebRtcSessionTrace;
12
- this._message = '';
13
- this._type = type;
14
- this._message = message;
15
- this._extra = extra;
16
- }
17
- Object.defineProperty(TsTracerEvent.prototype, "Type", {
18
- get: function get() {
19
- return this._type;
20
- },
21
- enumerable: true,
22
- configurable: true
23
- });
24
- Object.defineProperty(TsTracerEvent.prototype, "Message", {
25
- get: function get() {
26
- return this._message;
27
- },
28
- enumerable: true,
29
- configurable: true
30
- });
31
- Object.defineProperty(TsTracerEvent.prototype, "Extra", {
32
- get: function get() {
33
- return this._extra;
34
- },
35
- enumerable: true,
36
- configurable: true
37
- });
38
- return TsTracerEvent;
39
- }();
40
- var TsTracer = /** @class */function () {
41
- function TsTracer(tracerType, enabled, callback) {
42
- this._enabled = false;
43
- this._type = TsTracerType.WebRtcSessionTrace;
44
- this.consoleOutputEnabled = false;
45
- this._type = tracerType;
46
- this._enabled = enabled;
47
- this._callback = callback;
48
- }
49
- Object.defineProperty(TsTracer.prototype, "Enabled", {
50
- get: function get() {
51
- return this._enabled;
52
- },
53
- set: function set(enabled) {
54
- this._enabled = enabled;
55
- },
56
- enumerable: true,
57
- configurable: true
58
- });
59
- Object.defineProperty(TsTracer.prototype, "TracerType", {
60
- get: function get() {
61
- return this._type;
62
- },
63
- enumerable: true,
64
- configurable: true
65
- });
66
- TsTracer.prototype.trace = function (message) {
67
- var rest = [];
68
- for (var _i = 1; _i < arguments.length; _i++) {
69
- rest[_i - 1] = arguments[_i];
70
- }
71
- if (this.consoleOutputEnabled) {
72
- console.log.apply(console, [this._type + ":" + message].concat(rest));
73
- }
74
- if (!this.Enabled) {
3
+ exports.__esModule = true;
4
+ exports.getTracer = getTracer;
5
+ function getTracer(prefix, isEnabledFn) {
6
+ var trace = function trace(message) {
7
+ var _console;
8
+
9
+ if (typeof isEnabledFn !== 'function' || !isEnabledFn()) {
75
10
  return;
76
11
  }
77
- if (this._callback) {
78
- this._callback(new TsTracerEvent(this._type, message, rest));
79
- }
80
- };
81
- return TsTracer;
82
- }();
83
- exports.TsTracer = TsTracer;
84
- var TsTracers = /** @class */function () {
85
- function TsTracers() {
86
- var _this = this;
87
- this._tracers = [];
88
- this._callbacks = [];
89
- // @ts-ignore
90
- _.keys(TsTracerType).forEach(function (tracerType) {
91
- // @ts-ignore
92
- _this._add(TsTracerType[tracerType]);
93
- });
94
- }
95
- TsTracers.prototype.register = function (callback) {
96
- if (this._callbacks.indexOf(callback) < 0) {
97
- this._callbacks.push(callback);
98
- }
99
- };
100
- TsTracers.prototype.unregister = function (callback) {
101
- var index = this._callbacks.indexOf(callback);
102
- if (index >= 0) {
103
- this._callbacks.splice(index, 1);
12
+
13
+ for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
14
+ rest[_key - 1] = arguments[_key];
104
15
  }
16
+
17
+ (_console = console).log.apply(_console, [prefix + ':' + message].concat(rest));
105
18
  };
106
- TsTracers.prototype._add = function (tracerType) {
107
- var _this = this;
108
- var tracer = new TsTracer(tracerType, false, function (event) {
109
- // @ts-ignore
110
- _.forEach(_this._callbacks, function (callback) {
111
- return callback(event);
112
- });
113
- });
114
- this._tracers.push(tracer);
115
- };
116
- TsTracers.prototype.enableTracers = function (value) {
117
- // @ts-ignore
118
- _.forEach(this._tracers, function (tracer) {
119
- tracer.Enabled = value;
120
- });
121
- };
122
- TsTracers.prototype.enableConsoleOutput = function () {
123
- // @ts-ignore
124
- _.forEach(this._tracers, function (tracer) {
125
- tracer.consoleOutputEnabled = true;
126
- });
127
- };
128
- TsTracers.prototype.getTracer = function (tracerType) {
129
- // @ts-ignore
130
- return _.find(this._tracers, function (tracer) {
131
- return tracer.TracerType === tracerType;
132
- });
133
- };
134
- return TsTracers;
135
- }();
136
- exports.TsTracers = TsTracers;
137
- var tracers = new TsTracers();
138
- function getTracers() {
139
- return tracers;
140
- }
141
- exports.getTracers = getTracers;
142
- function getTracer(tracerType) {
143
- if (tracerType === void 0) {
144
- tracerType = TsTracerType.WebRtcSessionTrace;
145
- }
146
- return getTracers().getTracer(tracerType);
147
- }
148
- exports.getTracer = getTracer;
149
19
 
150
- //# sourceMappingURL=tracer.js.map
20
+ return trace;
21
+ }
151
22
  //# sourceMappingURL=tracer.js.map
package/lib/tracer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["tracer.js","../src/tracer.ts"],"names":["Object","defineProperty","exports","value","TsTracerType","TsTracerEvent","type","message","extra","_type","WebRtcSessionTrace","_message","_extra","prototype","get","enumerable","configurable","TsTracer","tracerType","enabled","callback","_enabled","consoleOutputEnabled","_callback","set","trace","rest","_i","arguments","length","console","log","apply","concat","Enabled","TsTracers","_this","_tracers","_callbacks","_","keys","forEach","_add","register","indexOf","push","unregister","index","splice","tracer","event","enableTracers","enableConsoleOutput","getTracer","find","TracerType","tracers","getTracers"],"mappings":"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","file":"tracer.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar TsTracerType;\n(function (TsTracerType) {\n TsTracerType[\"WebRtcSessionTrace\"] = \"WebRtcSessionTrace\";\n TsTracerType[\"TSMediaServiceHelper\"] = \"TSMediaServiceHelper\";\n})(TsTracerType = exports.TsTracerType || (exports.TsTracerType = {}));\nvar TsTracerEvent = /** @class */ (function () {\n function TsTracerEvent(type, message, extra) {\n this._type = TsTracerType.WebRtcSessionTrace;\n this._message = '';\n this._type = type;\n this._message = message;\n this._extra = extra;\n }\n Object.defineProperty(TsTracerEvent.prototype, \"Type\", {\n get: function () {\n return this._type;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TsTracerEvent.prototype, \"Message\", {\n get: function () {\n return this._message;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TsTracerEvent.prototype, \"Extra\", {\n get: function () {\n return this._extra;\n },\n enumerable: true,\n configurable: true\n });\n return TsTracerEvent;\n}());\nvar TsTracer = /** @class */ (function () {\n function TsTracer(tracerType, enabled, callback) {\n this._enabled = false;\n this._type = TsTracerType.WebRtcSessionTrace;\n this.consoleOutputEnabled = false;\n this._type = tracerType;\n this._enabled = enabled;\n this._callback = callback;\n }\n Object.defineProperty(TsTracer.prototype, \"Enabled\", {\n get: function () {\n return this._enabled;\n },\n set: function (enabled) {\n this._enabled = enabled;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TsTracer.prototype, \"TracerType\", {\n get: function () {\n return this._type;\n },\n enumerable: true,\n configurable: true\n });\n TsTracer.prototype.trace = function (message) {\n var rest = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n rest[_i - 1] = arguments[_i];\n }\n if (this.consoleOutputEnabled) {\n console.log.apply(console, [this._type + \":\" + message].concat(rest));\n }\n if (!this.Enabled) {\n return;\n }\n if (this._callback) {\n this._callback(new TsTracerEvent(this._type, message, rest));\n }\n };\n return TsTracer;\n}());\nexports.TsTracer = TsTracer;\nvar TsTracers = /** @class */ (function () {\n function TsTracers() {\n var _this = this;\n this._tracers = [];\n this._callbacks = [];\n // @ts-ignore\n _.keys(TsTracerType).forEach(function (tracerType) {\n // @ts-ignore\n _this._add(TsTracerType[tracerType]);\n });\n }\n TsTracers.prototype.register = function (callback) {\n if (this._callbacks.indexOf(callback) < 0) {\n this._callbacks.push(callback);\n }\n };\n TsTracers.prototype.unregister = function (callback) {\n var index = this._callbacks.indexOf(callback);\n if (index >= 0) {\n this._callbacks.splice(index, 1);\n }\n };\n TsTracers.prototype._add = function (tracerType) {\n var _this = this;\n var tracer = new TsTracer(tracerType, false, function (event) {\n // @ts-ignore\n _.forEach(_this._callbacks, function (callback) { return callback(event); });\n });\n this._tracers.push(tracer);\n };\n TsTracers.prototype.enableTracers = function (value) {\n // @ts-ignore\n _.forEach(this._tracers, function (tracer) {\n tracer.Enabled = value;\n });\n };\n TsTracers.prototype.enableConsoleOutput = function () {\n // @ts-ignore\n _.forEach(this._tracers, function (tracer) {\n tracer.consoleOutputEnabled = true;\n });\n };\n TsTracers.prototype.getTracer = function (tracerType) {\n // @ts-ignore\n return _.find(this._tracers, function (tracer) { return tracer.TracerType === tracerType; });\n };\n return TsTracers;\n}());\nexports.TsTracers = TsTracers;\nvar tracers = new TsTracers();\nfunction getTracers() {\n return tracers;\n}\nexports.getTracers = getTracers;\nfunction getTracer(tracerType) {\n if (tracerType === void 0) { tracerType = TsTracerType.WebRtcSessionTrace; }\n return getTracers().getTracer(tracerType);\n}\nexports.getTracer = getTracer;\n\n//# sourceMappingURL=tracer.js.map\n","export enum TsTracerType {\n WebRtcSessionTrace = 'WebRtcSessionTrace',\n TSMediaServiceHelper = 'TSMediaServiceHelper'\n}\n\nexport interface ITsTracerEvent {\n readonly Type: TsTracerType;\n readonly Message: string;\n readonly Extra: any[];\n}\n\nexport interface ITsTraceEvent {\n (event: ITsTracerEvent): any\n}\n\nclass TsTracerEvent implements ITsTracerEvent {\n private _type: TsTracerType = TsTracerType.WebRtcSessionTrace;\n private _message: string = '';\n private _extra: any[];\n\n constructor(type: TsTracerType, message: string, extra: any[]) {\n this._type = type;\n this._message = message;\n this._extra = extra;\n }\n\n get Type(): TsTracerType {\n return this._type;\n }\n\n get Message(): string {\n return this._message;\n }\n\n get Extra(): any[] {\n return this._extra;\n }\n}\n\nexport class TsTracer {\n private _enabled: boolean = false;\n private readonly _type: TsTracerType = TsTracerType.WebRtcSessionTrace;\n private readonly _callback: ITsTraceEvent;\n public consoleOutputEnabled: boolean = false;\n\n constructor(tracerType: TsTracerType, enabled: boolean, callback: ITsTraceEvent) {\n this._type = tracerType;\n this._enabled = enabled;\n this._callback = callback;\n }\n\n get Enabled() {\n return this._enabled;\n }\n\n set Enabled(enabled: boolean) {\n this._enabled = enabled;\n }\n\n get TracerType() {\n return this._type;\n }\n\n trace(message: string, ...rest: any[]) {\n if (this.consoleOutputEnabled) {\n console.log(`${this._type}:${message}`, ...rest);\n }\n\n if (!this.Enabled) {\n return;\n }\n\n if (this._callback) {\n this._callback(new TsTracerEvent(this._type, message, rest));\n }\n }\n}\n\nexport class TsTracers {\n private _tracers: Array<TsTracer> = [];\n private _callbacks: Array<ITsTraceEvent> = [];\n\n constructor() {\n\n // @ts-ignore\n _.keys(TsTracerType).forEach((tracerType: string) => {\n\n // @ts-ignore\n this._add(TsTracerType[tracerType]);\n });\n }\n\n register(callback: ITsTraceEvent) {\n if (this._callbacks.indexOf(callback) < 0) {\n this._callbacks.push(callback);\n }\n }\n\n unregister(callback: ITsTraceEvent) {\n let index = this._callbacks.indexOf(callback);\n\n if (index >= 0) {\n this._callbacks.splice(index, 1);\n }\n }\n\n private _add(tracerType: TsTracerType) {\n const tracer = new TsTracer(tracerType, false, (event: ITsTracerEvent) => {\n // @ts-ignore\n _.forEach(this._callbacks, (callback) => callback(event));\n });\n\n this._tracers.push(tracer);\n }\n\n enableTracers(value: boolean) {\n // @ts-ignore\n _.forEach(this._tracers, (tracer) => {\n tracer.Enabled = value;\n\n });\n }\n\n enableConsoleOutput() {\n // @ts-ignore\n _.forEach(this._tracers, (tracer) => {\n tracer.consoleOutputEnabled = true;\n\n });\n }\n\n getTracer(tracerType: TsTracerType) {\n // @ts-ignore\n return _.find(this._tracers, (tracer) => tracer.TracerType === tracerType);\n }\n}\n\nconst tracers = new TsTracers();\n\nexport function getTracers(): TsTracers {\n return tracers;\n}\n\nexport function getTracer(tracerType: TsTracerType = TsTracerType.WebRtcSessionTrace) {\n\n return getTracers().getTracer(tracerType);\n}\n"]}
1
+ {"version":3,"sources":["tracer.js"],"names":["getTracer","prefix","isEnabledFn","trace","message","rest","log"],"mappings":";;;QAAgBA,S,GAAAA,S;AAAT,SAASA,SAAT,CAAmBC,MAAnB,EAA2BC,WAA3B,EAAwC;AAC3C,QAAMC,QAAQ,SAARA,KAAQ,CAAUC,OAAV,EAA4B;AAAA;;AACtC,YAAI,OAAOF,WAAP,KAAuB,UAAvB,IAAqC,CAACA,aAA1C,EAAyD;AACrD;AACH;;AAHqC,0CAANG,IAAM;AAANA,gBAAM;AAAA;;AAKtC,6BAAQC,GAAR,kBAAYL,SAAS,GAAT,GAAeG,OAA3B,SAAuCC,IAAvC;AACH,KAND;;AAQA,WAAOF,KAAP;AACH","file":"tracer.js","sourcesContent":["export function getTracer(prefix, isEnabledFn) {\n const trace = function (message, ...rest) {\n if (typeof isEnabledFn !== 'function' || !isEnabledFn()) {\n return;\n }\n\n console.log(prefix + ':' + message, ...rest);\n };\n\n return trace;\n}\n"]}
@@ -7,7 +7,9 @@ var _service = require('../service');
7
7
 
8
8
  var _tracer = require('../tracer');
9
9
 
10
- var tracer = (0, _tracer.getTracer)('TSMediaServiceHelper');
10
+ var trace = (0, _tracer.getTracer)('TSMediaServiceHelper', function () {
11
+ return window.TSMediaServiceHelper === true;
12
+ });
11
13
 
12
14
  function _resolutionToConstraints(resolution) {
13
15
  var _resolution$split = resolution.split('x'),
@@ -58,7 +60,7 @@ var getMediaConstraints = exports.getMediaConstraints = function getMediaConstra
58
60
  var audioDevice = deviceOpts.audio && _.last(groupedDevices.audio);
59
61
 
60
62
  var mediaConstraints = {};
61
- tracer.trace('getMediaConstraints', videoDevice);
63
+ trace('getMediaConstraints', videoDevice);
62
64
  if (videoDevice) {
63
65
  var videoResolution = _resolutionToConstraints(resolution);
64
66
 
@@ -1 +1 @@
1
- {"version":3,"sources":["webrtc/helper.js"],"names":["tracer","_resolutionToConstraints","resolution","split","width","height","CONSTRAINTS_TYPES","MIN","IDEAL","POSSIBLE_RESOLUTIONS","FALLBACK_RESOLUTION","_constraintByType","value","type","min","ideal","getMediaConstraints","deviceOpts","constraintType","TsMediaService","getDevices","then","devices","groupedDevices","video","_","filter","device","kind","toLowerCase","audio","videoDevice","last","audioDevice","mediaConstraints","trace","videoResolution","assign","deviceId","facingMode","frameRate","max","getVideoTrackSettings","stream","videoTracks","getTracks","track","isEmpty","videoTrack","getSettings","_constraintsByResolution","_handleGetUserMediaError","error","errorName","get","code","name","getHighestResolutionStream","constraints","createLocalMediaStream","successfulConstraintsFound","Promise","resolve","reject","reduce","total","potentialConstraints","catch","err"],"mappings":"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","file":"helper.js","sourcesContent":["import {TsMediaService} from '../service';\n\nimport {getTracer} from '../tracer';\n\nconst tracer = getTracer('TSMediaServiceHelper');\n\nfunction _resolutionToConstraints(resolution) {\n const [width, height] = resolution.split('x');\n\n return {width, height};\n}\n\nexport const CONSTRAINTS_TYPES = {\n MIN: 'min',\n IDEAL: 'ideal'\n};\n\nexport const POSSIBLE_RESOLUTIONS = [\n //'3840x2160', // 4k - disabled since it's an overkill\n '1920x1080', // FHD\n '1280x720' // HD\n];\n\n// In case all possible resolution fails, we'll attempt to set the highest resolution as ideal\nexport const FALLBACK_RESOLUTION = POSSIBLE_RESOLUTIONS[0];\n\nfunction _constraintByType(value, type) {\n switch (type) {\n case CONSTRAINTS_TYPES.MIN:\n return {min: value};\n default:\n return {ideal: value};\n }\n}\n\nexport const getMediaConstraints = ({resolution, deviceOpts, constraintType}) =>\n TsMediaService.getDevices()\n .then((devices) => {\n const groupedDevices = {\n video: _.filter(devices, (device) =>\n device.kind.toLowerCase() === 'videoinput'),\n audio: _.filter(devices, (device) =>\n device.kind.toLowerCase() === 'audioinput')\n };\n\n const videoDevice = deviceOpts.video && _.last(groupedDevices.video);\n const audioDevice = deviceOpts.audio && _.last(groupedDevices.audio);\n\n const mediaConstraints = {};\n tracer.trace('getMediaConstraints', videoDevice);\n if (videoDevice) {\n const videoResolution = _resolutionToConstraints(resolution);\n\n _.assign(mediaConstraints, {\n video: {\n deviceId: videoDevice.deviceId,\n width: _constraintByType(videoResolution.width, constraintType),\n height: _constraintByType(videoResolution.height, constraintType),\n facingMode: 'environment',\n frameRate: {ideal: 15, max: 30}\n }\n });\n }\n\n if (audioDevice) {\n _.assign(mediaConstraints, {\n audio: {deviceId: audioDevice.deviceId}\n });\n }\n\n return mediaConstraints;\n });\n\nexport const getVideoTrackSettings = (stream) => {\n const videoTracks = stream.getTracks()\n .filter((track) => (track.kind === 'video'));\n\n if (_.isEmpty(videoTracks)) {\n return;\n }\n\n const videoTrack = videoTracks[0];\n\n return videoTrack.getSettings && videoTrack.getSettings();\n};\n\nfunction _constraintsByResolution(resolution, deviceOpts, constraintType) {\n return getMediaConstraints({\n resolution: resolution,\n deviceOpts: deviceOpts,\n constraintType: constraintType\n });\n}\n\nfunction _handleGetUserMediaError(error) {\n const errorName = _.get(error, 'name');\n\n if (errorName === 'NotAllowedError') {\n return {code: 1500, name: 'NotAllowedError'};\n }\n\n if (errorName === 'PermissionDismissedError') {\n return {code: 8, name: 'PermissionDismissedError'};\n }\n\n return {code: 999, name: errorName || 'UnknownError'};\n}\n\n/**\n * Scan possible resolutions from high to low, trying to set each as minimal.\n * Eventually, use a fallback as ideal so the browser may decide which to use.\n *\n * @method\n * @param {Object} [deviceOpts] Devices to limit to in the constraints\n * @param {Object} [constraints] Media constraints\n *\n * @returns { Promise }\n *\n */\nexport const getHighestResolutionStream = (deviceOpts, constraints) => {\n // In case we had a constraints scan before, return the best\n if (constraints) {\n return TsMediaService.createLocalMediaStream(constraints)\n .then((stream) => ({stream, constraints}));\n }\n\n let successfulConstraintsFound = false;\n\n return new Promise((resolve, reject) => {\n Promise.reduce(POSSIBLE_RESOLUTIONS, (total, resolution) => {\n if (successfulConstraintsFound) {\n return;\n }\n\n return _constraintsByResolution(resolution, deviceOpts, CONSTRAINTS_TYPES.MIN)\n .then((potentialConstraints) => TsMediaService.createLocalMediaStream(potentialConstraints)\n .then((stream) => {\n successfulConstraintsFound = true;\n\n return resolve({stream, constraints: potentialConstraints});\n }))\n .catch(() => null);\n }, 0)\n .then(() => {\n if (successfulConstraintsFound) {\n return;\n }\n\n _constraintsByResolution(FALLBACK_RESOLUTION, deviceOpts, CONSTRAINTS_TYPES.IDEAL)\n .then((potentialConstraints) => TsMediaService.createLocalMediaStream(potentialConstraints)\n .then((stream) => resolve({stream, constraints: potentialConstraints})))\n .catch((err) => reject(_handleGetUserMediaError(err)));\n });\n });\n};\n"]}
1
+ {"version":3,"sources":["webrtc/helper.js"],"names":["trace","window","TSMediaServiceHelper","_resolutionToConstraints","resolution","split","width","height","CONSTRAINTS_TYPES","MIN","IDEAL","POSSIBLE_RESOLUTIONS","FALLBACK_RESOLUTION","_constraintByType","value","type","min","ideal","getMediaConstraints","deviceOpts","constraintType","TsMediaService","getDevices","then","devices","groupedDevices","video","_","filter","device","kind","toLowerCase","audio","videoDevice","last","audioDevice","mediaConstraints","videoResolution","assign","deviceId","facingMode","frameRate","max","getVideoTrackSettings","stream","videoTracks","getTracks","track","isEmpty","videoTrack","getSettings","_constraintsByResolution","_handleGetUserMediaError","error","errorName","get","code","name","getHighestResolutionStream","constraints","createLocalMediaStream","successfulConstraintsFound","Promise","resolve","reject","reduce","total","potentialConstraints","catch","err"],"mappings":"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","file":"helper.js","sourcesContent":["import {TsMediaService} from '../service';\n\nimport {getTracer} from '../tracer';\n\nconst trace = getTracer('TSMediaServiceHelper', () => window.TSMediaServiceHelper === true);\n\nfunction _resolutionToConstraints(resolution) {\n const [width, height] = resolution.split('x');\n\n return {width, height};\n}\n\nexport const CONSTRAINTS_TYPES = {\n MIN: 'min',\n IDEAL: 'ideal'\n};\n\nexport const POSSIBLE_RESOLUTIONS = [\n //'3840x2160', // 4k - disabled since it's an overkill\n '1920x1080', // FHD\n '1280x720' // HD\n];\n\n// In case all possible resolution fails, we'll attempt to set the highest resolution as ideal\nexport const FALLBACK_RESOLUTION = POSSIBLE_RESOLUTIONS[0];\n\nfunction _constraintByType(value, type) {\n switch (type) {\n case CONSTRAINTS_TYPES.MIN:\n return {min: value};\n default:\n return {ideal: value};\n }\n}\n\nexport const getMediaConstraints = ({resolution, deviceOpts, constraintType}) =>\n TsMediaService.getDevices()\n .then((devices) => {\n const groupedDevices = {\n video: _.filter(devices, (device) =>\n device.kind.toLowerCase() === 'videoinput'),\n audio: _.filter(devices, (device) =>\n device.kind.toLowerCase() === 'audioinput')\n };\n\n const videoDevice = deviceOpts.video && _.last(groupedDevices.video);\n const audioDevice = deviceOpts.audio && _.last(groupedDevices.audio);\n\n const mediaConstraints = {};\n trace('getMediaConstraints', videoDevice);\n if (videoDevice) {\n const videoResolution = _resolutionToConstraints(resolution);\n\n _.assign(mediaConstraints, {\n video: {\n deviceId: videoDevice.deviceId,\n width: _constraintByType(videoResolution.width, constraintType),\n height: _constraintByType(videoResolution.height, constraintType),\n facingMode: 'environment',\n frameRate: {ideal: 15, max: 30}\n }\n });\n }\n\n if (audioDevice) {\n _.assign(mediaConstraints, {\n audio: {deviceId: audioDevice.deviceId}\n });\n }\n\n return mediaConstraints;\n });\n\nexport const getVideoTrackSettings = (stream) => {\n const videoTracks = stream.getTracks()\n .filter((track) => (track.kind === 'video'));\n\n if (_.isEmpty(videoTracks)) {\n return;\n }\n\n const videoTrack = videoTracks[0];\n\n return videoTrack.getSettings && videoTrack.getSettings();\n};\n\nfunction _constraintsByResolution(resolution, deviceOpts, constraintType) {\n return getMediaConstraints({\n resolution: resolution,\n deviceOpts: deviceOpts,\n constraintType: constraintType\n });\n}\n\nfunction _handleGetUserMediaError(error) {\n const errorName = _.get(error, 'name');\n\n if (errorName === 'NotAllowedError') {\n return {code: 1500, name: 'NotAllowedError'};\n }\n\n if (errorName === 'PermissionDismissedError') {\n return {code: 8, name: 'PermissionDismissedError'};\n }\n\n return {code: 999, name: errorName || 'UnknownError'};\n}\n\n/**\n * Scan possible resolutions from high to low, trying to set each as minimal.\n * Eventually, use a fallback as ideal so the browser may decide which to use.\n *\n * @method\n * @param {Object} [deviceOpts] Devices to limit to in the constraints\n * @param {Object} [constraints] Media constraints\n *\n * @returns { Promise }\n *\n */\nexport const getHighestResolutionStream = (deviceOpts, constraints) => {\n // In case we had a constraints scan before, return the best\n if (constraints) {\n return TsMediaService.createLocalMediaStream(constraints)\n .then((stream) => ({stream, constraints}));\n }\n\n let successfulConstraintsFound = false;\n\n return new Promise((resolve, reject) => {\n Promise.reduce(POSSIBLE_RESOLUTIONS, (total, resolution) => {\n if (successfulConstraintsFound) {\n return;\n }\n\n return _constraintsByResolution(resolution, deviceOpts, CONSTRAINTS_TYPES.MIN)\n .then((potentialConstraints) => TsMediaService.createLocalMediaStream(potentialConstraints)\n .then((stream) => {\n successfulConstraintsFound = true;\n\n return resolve({stream, constraints: potentialConstraints});\n }))\n .catch(() => null);\n }, 0)\n .then(() => {\n if (successfulConstraintsFound) {\n return;\n }\n\n _constraintsByResolution(FALLBACK_RESOLUTION, deviceOpts, CONSTRAINTS_TYPES.IDEAL)\n .then((potentialConstraints) => TsMediaService.createLocalMediaStream(potentialConstraints)\n .then((stream) => resolve({stream, constraints: potentialConstraints})))\n .catch((err) => reject(_handleGetUserMediaError(err)));\n });\n });\n};\n"]}