@techsee/techsee-media-service 0.5.4 → 0.5.5

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,9 +29,7 @@ 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 trace = (0, _tracer.getTracer)('WebRtcSessionTrace', function () {
33
- return window.WebRtcSessionTrace === true;
34
- });
32
+ var tracer = (0, _tracer.getTracer)();
35
33
 
36
34
  var environmentDetect = new _tsEnvironmentDetect.TsEnvironmentDetect();
37
35
  var isIE11 = environmentDetect.isIE11();
@@ -116,7 +114,7 @@ var TsMediaServiceFacade = function (_EventEmitter) {
116
114
 
117
115
 
118
116
  TsMediaServiceFacade.prototype.createLocalMediaStream = function createLocalMediaStream(constraints) {
119
- trace('createLocalMediaStream');
117
+ tracer.trace('createLocalMediaStream');
120
118
  if (userMediaPromise) {
121
119
  return userMediaPromise;
122
120
  }
@@ -132,7 +130,7 @@ var TsMediaServiceFacade = function (_EventEmitter) {
132
130
 
133
131
  userMediaPromise = new Promise(function (resolve, reject) {
134
132
  try {
135
- trace('createLocalMediaStream inside promise');
133
+ tracer.trace('createLocalMediaStream inside promise');
136
134
 
137
135
  navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
138
136
  latestLocalStream = stream;
@@ -152,7 +150,7 @@ var TsMediaServiceFacade = function (_EventEmitter) {
152
150
  };
153
151
 
154
152
  TsMediaServiceFacade.prototype.destroyLocalMediaStream = function destroyLocalMediaStream() {
155
- trace('Destroy local streams');
153
+ tracer.trace('Destroy local streams');
156
154
  if (latestLocalStream) {
157
155
  latestLocalStream.getTracks().forEach(function (track) {
158
156
  track.stop();
@@ -1 +1 @@
1
- {"version":3,"sources":["service.js"],"names":["trace","window","WebRtcSessionTrace","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('WebRtcSessionTrace', () => window.WebRtcSessionTrace === 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"]}
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"]}
@@ -0,0 +1,33 @@
1
+ export declare enum TsTracerType {
2
+ WebRtcSessionTrace = "WebRtcSessionTrace",
3
+ TSMediaServiceHelper = "TSMediaServiceHelper"
4
+ }
5
+ export interface ITsTracerEvent {
6
+ readonly Type: TsTracerType;
7
+ readonly Message: string;
8
+ readonly Extra: any[];
9
+ }
10
+ export interface ITsTraceEvent {
11
+ (event: ITsTracerEvent): any;
12
+ }
13
+ export declare class TsTracer {
14
+ private _enabled;
15
+ private readonly _type;
16
+ private readonly _callback;
17
+ constructor(tracerType: TsTracerType, enabled: boolean, callback: ITsTraceEvent);
18
+ Enabled: boolean;
19
+ readonly TracerType: TsTracerType;
20
+ trace(message: string, ...rest: any[]): void;
21
+ }
22
+ export declare class TsTracers {
23
+ private _tracers;
24
+ private _callbacks;
25
+ constructor();
26
+ register(callback: ITsTraceEvent): void;
27
+ unregister(callback: ITsTraceEvent): void;
28
+ private _add;
29
+ enableTracers(value: boolean): void;
30
+ getTracer(tracerType: TsTracerType): TsTracer | undefined;
31
+ }
32
+ export declare function getTracers(): TsTracers;
33
+ export declare function getTracer(tracerType?: TsTracerType): TsTracer | undefined;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tracer.ts"],"names":[],"mappings":"AACA,oBAAY,YAAY;IACpB,kBAAkB,uBAAuB;IACzC,oBAAoB,yBAAyB;CAChD;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,CAAA;CAC/B;AA0BD,qBAAa,QAAQ;IACjB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiD;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAE9B,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa;IAM3E,OAAO,EAIU,OAAO;aAIxB,UAAU;IAId,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAWxC;AAED,qBAAa,SAAS;IAClB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAA4B;;IAY9C,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAMhC,UAAU,CAAC,QAAQ,EAAE,aAAa;IAQlC,OAAO,CAAC,IAAI;IASZ,aAAa,CAAC,KAAK,EAAE,OAAO;IAO5B,SAAS,CAAC,UAAU,EAAE,YAAY;CAIrC;AAID,wBAAgB,UAAU,IAAI,SAAS,CAEtC;AAED,wBAAgB,SAAS,CAAC,UAAU,GAAE,YAA8C,wBAGnF","file":"tracer.d.ts","sourcesContent":["\nexport 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\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.Enabled) {\n return;\n }\n\n console.log(`${this._type}:${message}`, ...rest);\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 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"]}
package/lib/tracer.js CHANGED
@@ -1,22 +1,142 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
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()) {
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._type = tracerType;
45
+ this._enabled = enabled;
46
+ this._callback = callback;
47
+ }
48
+ Object.defineProperty(TsTracer.prototype, "Enabled", {
49
+ get: function get() {
50
+ return this._enabled;
51
+ },
52
+ set: function set(enabled) {
53
+ this._enabled = enabled;
54
+ },
55
+ enumerable: true,
56
+ configurable: true
57
+ });
58
+ Object.defineProperty(TsTracer.prototype, "TracerType", {
59
+ get: function get() {
60
+ return this._type;
61
+ },
62
+ enumerable: true,
63
+ configurable: true
64
+ });
65
+ TsTracer.prototype.trace = function (message) {
66
+ var rest = [];
67
+ for (var _i = 1; _i < arguments.length; _i++) {
68
+ rest[_i - 1] = arguments[_i];
69
+ }
70
+ if (!this.Enabled) {
10
71
  return;
11
72
  }
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];
73
+ console.log.apply(console, [this._type + ":" + message].concat(rest));
74
+ if (this._callback) {
75
+ this._callback(new TsTracerEvent(this._type, message, rest));
15
76
  }
16
-
17
- (_console = console).log.apply(_console, [prefix + ':' + message].concat(rest));
18
77
  };
19
-
20
- return trace;
78
+ return TsTracer;
79
+ }();
80
+ exports.TsTracer = TsTracer;
81
+ var TsTracers = /** @class */function () {
82
+ function TsTracers() {
83
+ var _this = this;
84
+ this._tracers = [];
85
+ this._callbacks = [];
86
+ // @ts-ignore
87
+ _.keys(TsTracerType).forEach(function (tracerType) {
88
+ // @ts-ignore
89
+ _this._add(TsTracerType[tracerType]);
90
+ });
91
+ }
92
+ TsTracers.prototype.register = function (callback) {
93
+ if (this._callbacks.indexOf(callback) < 0) {
94
+ this._callbacks.push(callback);
95
+ }
96
+ };
97
+ TsTracers.prototype.unregister = function (callback) {
98
+ var index = this._callbacks.indexOf(callback);
99
+ if (index >= 0) {
100
+ this._callbacks.splice(index, 1);
101
+ }
102
+ };
103
+ TsTracers.prototype._add = function (tracerType) {
104
+ var _this = this;
105
+ var tracer = new TsTracer(tracerType, false, function (event) {
106
+ // @ts-ignore
107
+ _.forEach(_this._callbacks, function (callback) {
108
+ return callback(event);
109
+ });
110
+ });
111
+ this._tracers.push(tracer);
112
+ };
113
+ TsTracers.prototype.enableTracers = function (value) {
114
+ // @ts-ignore
115
+ _.forEach(this._tracers, function (tracer) {
116
+ tracer.Enabled = value;
117
+ });
118
+ };
119
+ TsTracers.prototype.getTracer = function (tracerType) {
120
+ // @ts-ignore
121
+ return _.find(this._tracers, function (tracer) {
122
+ return tracer.TracerType === tracerType;
123
+ });
124
+ };
125
+ return TsTracers;
126
+ }();
127
+ exports.TsTracers = TsTracers;
128
+ var tracers = new TsTracers();
129
+ function getTracers() {
130
+ return tracers;
21
131
  }
132
+ exports.getTracers = getTracers;
133
+ function getTracer(tracerType) {
134
+ if (tracerType === void 0) {
135
+ tracerType = TsTracerType.WebRtcSessionTrace;
136
+ }
137
+ return getTracers().getTracer(tracerType);
138
+ }
139
+ exports.getTracer = getTracer;
140
+
141
+ //# sourceMappingURL=tracer.js.map
22
142
  //# sourceMappingURL=tracer.js.map
package/lib/tracer.js.map CHANGED
@@ -1 +1 @@
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"]}
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","_callback","set","trace","rest","_i","arguments","length","Enabled","console","log","apply","concat","TsTracers","_this","_tracers","_callbacks","_","keys","forEach","_add","register","indexOf","push","unregister","index","splice","tracer","event","enableTracers","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._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.Enabled) {\n return;\n }\n console.log.apply(console, [this._type + \":\" + message].concat(rest));\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.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","\nexport 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\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.Enabled) {\n return;\n }\n\n console.log(`${this._type}:${message}`, ...rest);\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 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"]}
@@ -7,9 +7,7 @@ var _service = require('../service');
7
7
 
8
8
  var _tracer = require('../tracer');
9
9
 
10
- var trace = (0, _tracer.getTracer)('TSMediaServiceHelper', function () {
11
- return window.TSMediaServiceHelper === true;
12
- });
10
+ var tracer = (0, _tracer.getTracer)('TSMediaServiceHelper');
13
11
 
14
12
  function _resolutionToConstraints(resolution) {
15
13
  var _resolution$split = resolution.split('x'),
@@ -60,7 +58,7 @@ var getMediaConstraints = exports.getMediaConstraints = function getMediaConstra
60
58
  var audioDevice = deviceOpts.audio && _.last(groupedDevices.audio);
61
59
 
62
60
  var mediaConstraints = {};
63
- trace('getMediaConstraints', videoDevice);
61
+ tracer.trace('getMediaConstraints', videoDevice);
64
62
  if (videoDevice) {
65
63
  var videoResolution = _resolutionToConstraints(resolution);
66
64
 
@@ -1 +1 @@
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"]}
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"]}