@techsee/techsee-media-service 999.7.8 → 999.7.9
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/LocalStreamManager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAEH,qBAAqB,EACrB,2BAA2B,EAE3B,yBAAyB,EACzB,iBAAiB,EACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,qBAAqB,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QAC3D,wBAAwB,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;KACjE;CACJ;AAcD,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,WAAW,CAAoB;gBAE3B,WAAW,EAAE,iBAAiB;IAO1C,kBAAkB,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAyC1F,qBAAqB,CAAC,WAAW,EAAE,2BAA2B,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA0CnG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAevC,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAe1C,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,OAAO,CAAC,0BAA0B;IAqDlC,OAAO,CAAC,mCAAmC;IAsB3C,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,wBAAwB;CAoCnC","file":"LocalStreamManager.d.ts","sourcesContent":["import assign from 'lodash/assign';\nimport get from 'lodash/get';\nimport {Promise} from 'bluebird';\n\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n VideoStreamResolution,\n LocalMediaConstraints,\n LocalVideoStreamConstraints,\n MediaRequestFailResult,\n MediaRequestSuccessResult,\n IMediaEnvironment\n} from './MediaContracts';\n\nimport {\n ConstraintType,\n DEFAULT_VIDEO_CONSTRAINT_TYPE,\n DEFAULT_VIDEO_RESOLUTION,\n MediaRequestErrorCode\n} from './MediaConstants';\n\ndeclare global {\n interface Window {\n latestUserMediaStream: Nullable<MediaRequestSuccessResult>;\n latestDesktopMediaStream: Nullable<MediaRequestSuccessResult>;\n }\n}\n\ndeclare const window: Window;\n\nwindow.latestUserMediaStream = null;\nlet userMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nwindow.latestDesktopMediaStream = null;\nlet desktopMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nimport {getMediaTracer} from './MediaUtils/MediaTracer';\n\nconst trace = getMediaTracer('LocalStreamManager');\n\nexport class LocalStreamManager {\n private environment: IMediaEnvironment;\n\n constructor(environment: IMediaEnvironment) {\n this.environment = environment;\n\n this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);\n this.clearAllStreams = this.clearAllStreams.bind(this);\n }\n\n getUserMediaStream(constraints: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n trace.info('getUserMediaStream', constraints);\n if (userMediaPromise) {\n return userMediaPromise;\n }\n\n if (window.latestUserMediaStream) {\n const videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();\n\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return Promise.resolve({...window.latestUserMediaStream, isNew: false});\n }\n this.destroyUserMediaStream();\n\n }\n\n\n userMediaPromise = new Promise((resolve, reject) => {\n const catchHandler = (err: any): void => {\n userMediaPromise = null;\n window.latestUserMediaStream = null;\n trace.error('getUserMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(false, constraints)\n .then((streamResult: MediaRequestSuccessResult) => {\n userMediaPromise = null;\n window.latestUserMediaStream = streamResult;\n resolve({...window.latestUserMediaStream, isNew: true});\n })\n .catch(catchHandler);\n } catch (err) {\n catchHandler(err);\n }\n });\n\n return userMediaPromise;\n }\n\n getDesktopMediaStream(constraints: LocalVideoStreamConstraints): Promise<MediaRequestSuccessResult> {\n if (desktopMediaPromise) {\n return desktopMediaPromise;\n }\n\n if (window.latestDesktopMediaStream) {\n const track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();\n\n if (track.length > 0 && track[0].readyState === 'live') {\n //return Promise.resolve();\n return Promise.resolve({...window.latestDesktopMediaStream, isNew: false});\n }\n this.destroyDesktopMediaStream().catch((error: any) => {\n trace.error('Error destroying desktop media stream', error);\n });\n\n }\n\n desktopMediaPromise = new Promise((resolve, reject) => {\n const mediaCatchHandler = (err: any): void => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = null;\n trace.error('getDisplayMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(true, {video: constraints, audio: false})\n .then((streamResult: MediaRequestSuccessResult) => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = streamResult;\n\n resolve({...window.latestDesktopMediaStream, isNew: true});\n }).catch(mediaCatchHandler);\n } catch (err) {\n mediaCatchHandler(err);\n }\n });\n\n return desktopMediaPromise;\n }\n\n destroyUserMediaStream(): Promise<void> {\n const streamResult = window.latestUserMediaStream;\n\n window.latestUserMediaStream = null;\n userMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n destroyDesktopMediaStream(): Promise<void> {\n const streamResult = window.latestDesktopMediaStream;\n\n window.latestDesktopMediaStream = null;\n desktopMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n clearAllStreams(): Promise<void> {\n trace.info('LocalStreamManager Clearing all streams');\n\n return Promise.all([\n this.destroyDesktopMediaStream(),\n this.destroyUserMediaStream()\n ]).then(() => undefined);\n }\n\n private getHighestResolutionStream(isDesktopMedia: boolean, constraints?: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n const constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);\n\n if (constraintsCandidates.length === 0) {\n return Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n\n return new Promise((resolve, reject) => {\n let lastSuccessfulResult: Nullable<MediaRequestSuccessResult> = null;\n let lastFailedResult: Nullable<MediaRequestFailResult> = null;\n let isStreamRequestFulfilled = false;\n\n (Promise as any).reduce(constraintsCandidates, (total: any, candidate: MediaStreamConstraints) => {\n if (isStreamRequestFulfilled) {\n return;\n }\n const constraintType = get(constraints, 'video.videoResolution.constraintType') || get(constraints, 'video.videoResolution[0].constraintType');\n\n return this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia)\n .then((stream: MediaStream) => {\n lastSuccessfulResult = {\n mediaStream: stream,\n constraint: candidate,\n constraintType,\n isNew: true\n };\n trace.info('getHighestResolutionStream Success', lastSuccessfulResult);\n isStreamRequestFulfilled = true;\n resolve(lastSuccessfulResult);\n })\n .catch((failResult: MediaRequestFailResult) => {\n lastFailedResult = failResult;\n if (lastFailedResult.errorCode === MediaRequestErrorCode.PermissionDenied) {\n isStreamRequestFulfilled = true;\n reject(lastFailedResult);\n }\n });\n }, 0)\n .then(() => {\n if (!isStreamRequestFulfilled) {\n if (!lastFailedResult) {\n lastFailedResult = {\n errorCode: MediaRequestErrorCode.GeneralError,\n message: 'Suitable stream cannot be created'\n };\n }\n reject(lastFailedResult);\n }\n });\n });\n }\n\n //@ts-ignore\n private getStreamPromiseByParsedConstraints(constraints: MediaStreamConstraints, isDesktopMedia: boolean): Promise<MediaStream> {\n let streamPromise = null;\n\n trace.info('getStreamPromiseByParsedConstraints', constraints);\n\n try {\n if (!isDesktopMedia) {\n streamPromise = navigator.mediaDevices.getUserMedia(constraints);\n } else {\n //@ts-ignore\n streamPromise = navigator.mediaDevices.getDisplayMedia\n //@ts-ignore\n ? navigator.mediaDevices.getDisplayMedia(constraints)\n : navigator.getDisplayMedia(constraints);\n }\n\n return streamPromise.catch(this.parseMediaErrorThenThrow);\n } catch (e) {\n this.parseMediaErrorThenThrow(e);\n }\n }\n\n private getParsedConstraints(isDesktopMedia: boolean, streamConstraints?: LocalMediaConstraints): MediaStreamConstraints[] {\n const constraintCandidates: MediaStreamConstraints[] = [];\n\n //TODO - Alex: need to understand which constraints not compatible with screen share\n if (isDesktopMedia) {\n return [{video: true}];\n }\n\n if (!streamConstraints) {\n return constraintCandidates;\n }\n\n const baseConstraints: MediaStreamConstraints = {};\n\n baseConstraints.audio = typeof streamConstraints.audio === 'boolean' ? streamConstraints.audio : undefined;\n\n if (!streamConstraints.video) {\n return [baseConstraints];\n }\n\n baseConstraints.video = {\n facingMode: 'environment',\n frameRate: {ideal: 15, max: 30}\n };\n\n const assignConstraint = (videoResolution: VideoStreamResolution): void => {\n const [width, height] = videoResolution.resolution.split('x');\n const constraintCandidate = assign({}, baseConstraints);\n\n constraintCandidate.video = assign({}, baseConstraints.video, {\n width: _constraintByType(width, videoResolution.constraintType),\n height: _constraintByType(height, videoResolution.constraintType)\n });\n constraintCandidates.push(constraintCandidate);\n };\n\n if ((baseConstraints.video && typeof streamConstraints.video === 'boolean') ||\n !((streamConstraints.video as LocalVideoStreamConstraints).videoResolution instanceof Array)) {\n\n const defaultResolution: VideoStreamResolution = {\n resolution: DEFAULT_VIDEO_RESOLUTION,\n constraintType: DEFAULT_VIDEO_CONSTRAINT_TYPE\n };\n\n assignConstraint(defaultResolution);\n\n return constraintCandidates;\n }\n\n (streamConstraints.video as any).videoResolution.forEach(assignConstraint);\n\n return constraintCandidates;\n }\n\n private parseMediaErrorThenThrow(error: any): MediaRequestFailResult {\n trace.error('Get media stream error.', error);\n const errorName = error && error.name ? error.name : '';\n\n const permissionErrorNames = [\n 'NotAllowedError',\n 'PermissionDismissedError',\n 'PermissionDeniedError'\n\n ];\n\n // const generalError = [\n // 'NotFoundError',\n // 'DevicesNotFoundError',\n // 'NotReadableError',\n // 'TrackStartError'\n // ];\n\n const constraintsErrors = [\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError'\n\n ];\n\n const isErrorOfType = (errorsArr: string[]) => errorsArr.filter((err: string) => err === errorName).length > 0;\n\n if (isErrorOfType(permissionErrorNames)) {\n throw {errorCode: MediaRequestErrorCode.PermissionDenied, message: errorName};\n }\n\n if (isErrorOfType(constraintsErrors)) {\n throw {errorCode: MediaRequestErrorCode.Overconstrained, message: errorName};\n }\n\n throw {errorCode: MediaRequestErrorCode.GeneralError, message: errorName};\n }\n}\n\nfunction _constraintByType(value: any, type: ConstraintType): any {\n switch (type) {\n case ConstraintType.MIN:\n return {min: value};\n default:\n return {ideal: value};\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/LocalStreamManager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAEH,qBAAqB,EACrB,2BAA2B,EAE3B,yBAAyB,EACzB,iBAAiB,EACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,qBAAqB,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QAC3D,wBAAwB,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;KACjE;CACJ;AAcD,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,WAAW,CAAoB;gBAE3B,WAAW,EAAE,iBAAiB;IAO1C,kBAAkB,CAAC,WAAW,EAAE,qBAAqB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAyC1F,qBAAqB,CAAC,WAAW,EAAE,2BAA2B,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA0CnG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAevC,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAe1C,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,OAAO,CAAC,0BAA0B;IAqDlC,OAAO,CAAC,mCAAmC;IAsB3C,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,wBAAwB;CAoCnC","file":"LocalStreamManager.d.ts","sourcesContent":["import assign from 'lodash/assign';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport {Promise} from 'bluebird';\n\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n VideoStreamResolution,\n LocalMediaConstraints,\n LocalVideoStreamConstraints,\n MediaRequestFailResult,\n MediaRequestSuccessResult,\n IMediaEnvironment\n} from './MediaContracts';\n\nimport {\n ConstraintType,\n DEFAULT_VIDEO_CONSTRAINT_TYPE,\n DEFAULT_VIDEO_RESOLUTION,\n MediaRequestErrorCode\n} from './MediaConstants';\n\ndeclare global {\n interface Window {\n latestUserMediaStream: Nullable<MediaRequestSuccessResult>;\n latestDesktopMediaStream: Nullable<MediaRequestSuccessResult>;\n }\n}\n\ndeclare const window: Window;\n\nwindow.latestUserMediaStream = null;\nlet userMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nwindow.latestDesktopMediaStream = null;\nlet desktopMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nimport {getMediaTracer} from './MediaUtils/MediaTracer';\n\nconst trace = getMediaTracer('LocalStreamManager');\n\nexport class LocalStreamManager {\n private environment: IMediaEnvironment;\n\n constructor(environment: IMediaEnvironment) {\n this.environment = environment;\n\n this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);\n this.clearAllStreams = this.clearAllStreams.bind(this);\n }\n\n getUserMediaStream(constraints: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n trace.info('getUserMediaStream', constraints);\n if (userMediaPromise) {\n return userMediaPromise;\n }\n\n if (window.latestUserMediaStream) {\n const videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();\n\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return Promise.resolve({...window.latestUserMediaStream, isNew: false});\n }\n this.destroyUserMediaStream();\n\n }\n\n\n userMediaPromise = new Promise((resolve, reject) => {\n const catchHandler = (err: any): void => {\n userMediaPromise = null;\n window.latestUserMediaStream = null;\n trace.error('getUserMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(false, constraints)\n .then((streamResult: MediaRequestSuccessResult) => {\n userMediaPromise = null;\n window.latestUserMediaStream = streamResult;\n resolve({...window.latestUserMediaStream, isNew: true});\n })\n .catch(catchHandler);\n } catch (err) {\n catchHandler(err);\n }\n });\n\n return userMediaPromise;\n }\n\n getDesktopMediaStream(constraints: LocalVideoStreamConstraints): Promise<MediaRequestSuccessResult> {\n if (desktopMediaPromise) {\n return desktopMediaPromise;\n }\n\n if (window.latestDesktopMediaStream) {\n const track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();\n\n if (track.length > 0 && track[0].readyState === 'live') {\n //return Promise.resolve();\n return Promise.resolve({...window.latestDesktopMediaStream, isNew: false});\n }\n this.destroyDesktopMediaStream().catch((error: any) => {\n trace.error('Error destroying desktop media stream', error);\n });\n\n }\n\n desktopMediaPromise = new Promise((resolve, reject) => {\n const mediaCatchHandler = (err: any): void => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = null;\n trace.error('getDisplayMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(true, {video: constraints, audio: false})\n .then((streamResult: MediaRequestSuccessResult) => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = streamResult;\n\n resolve({...window.latestDesktopMediaStream, isNew: true});\n }).catch(mediaCatchHandler);\n } catch (err) {\n mediaCatchHandler(err);\n }\n });\n\n return desktopMediaPromise;\n }\n\n destroyUserMediaStream(): Promise<void> {\n const streamResult = window.latestUserMediaStream;\n\n window.latestUserMediaStream = null;\n userMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n destroyDesktopMediaStream(): Promise<void> {\n const streamResult = window.latestDesktopMediaStream;\n\n window.latestDesktopMediaStream = null;\n desktopMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n clearAllStreams(): Promise<void> {\n trace.info('LocalStreamManager Clearing all streams');\n\n return Promise.all([\n this.destroyDesktopMediaStream(),\n this.destroyUserMediaStream()\n ]).then(() => undefined);\n }\n\n private getHighestResolutionStream(isDesktopMedia: boolean, constraints?: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n const constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);\n\n if (constraintsCandidates.length === 0) {\n return Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n\n return new Promise((resolve, reject) => {\n let lastSuccessfulResult: Nullable<MediaRequestSuccessResult> = null;\n let lastFailedResult: Nullable<MediaRequestFailResult> = null;\n let isStreamRequestFulfilled = false;\n\n (Promise as any).reduce(constraintsCandidates, (total: any, candidate: MediaStreamConstraints) => {\n if (isStreamRequestFulfilled) {\n return;\n }\n const constraintType = get(constraints, 'video.videoResolution.constraintType') || get(constraints, 'video.videoResolution[0].constraintType');\n\n return this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia)\n .then((stream: MediaStream) => {\n lastSuccessfulResult = {\n mediaStream: stream,\n constraint: candidate,\n constraintType,\n isNew: true\n };\n trace.info('getHighestResolutionStream Success', lastSuccessfulResult);\n isStreamRequestFulfilled = true;\n resolve(lastSuccessfulResult);\n })\n .catch((failResult: MediaRequestFailResult) => {\n lastFailedResult = failResult;\n if (lastFailedResult.errorCode === MediaRequestErrorCode.PermissionDenied) {\n isStreamRequestFulfilled = true;\n reject(lastFailedResult);\n }\n });\n }, 0)\n .then(() => {\n if (!isStreamRequestFulfilled) {\n if (!lastFailedResult) {\n lastFailedResult = {\n errorCode: MediaRequestErrorCode.GeneralError,\n message: 'Suitable stream cannot be created'\n };\n }\n reject(lastFailedResult);\n }\n });\n });\n }\n\n //@ts-ignore\n private getStreamPromiseByParsedConstraints(constraints: MediaStreamConstraints, isDesktopMedia: boolean): Promise<MediaStream> {\n let streamPromise = null;\n\n trace.info('getStreamPromiseByParsedConstraints', constraints);\n\n try {\n if (!isDesktopMedia) {\n streamPromise = navigator.mediaDevices.getUserMedia(constraints);\n } else {\n //@ts-ignore\n streamPromise = navigator.mediaDevices.getDisplayMedia\n //@ts-ignore\n ? navigator.mediaDevices.getDisplayMedia(constraints)\n : navigator.getDisplayMedia(constraints);\n }\n\n return streamPromise.catch(this.parseMediaErrorThenThrow);\n } catch (e) {\n this.parseMediaErrorThenThrow(e);\n }\n }\n\n private getParsedConstraints(isDesktopMedia: boolean, streamConstraints?: LocalMediaConstraints): MediaStreamConstraints[] {\n const constraintCandidates: MediaStreamConstraints[] = [];\n\n //TODO - Alex: need to understand which constraints not compatible with screen share\n if (isDesktopMedia) {\n return [{video: true}];\n }\n\n if (!streamConstraints) {\n return constraintCandidates;\n }\n\n const baseConstraints: MediaStreamConstraints = {};\n\n baseConstraints.audio = !isEmpty(streamConstraints.audio) ? streamConstraints.audio : undefined;\n\n if (!streamConstraints.video) {\n return [baseConstraints];\n }\n\n baseConstraints.video = {\n facingMode: 'environment',\n frameRate: {ideal: 15, max: 30}\n };\n\n const assignConstraint = (videoResolution: VideoStreamResolution): void => {\n const [width, height] = videoResolution.resolution.split('x');\n const constraintCandidate = assign({}, baseConstraints);\n\n constraintCandidate.video = assign({}, baseConstraints.video, {\n width: _constraintByType(width, videoResolution.constraintType),\n height: _constraintByType(height, videoResolution.constraintType)\n });\n constraintCandidates.push(constraintCandidate);\n };\n\n if ((baseConstraints.video && typeof streamConstraints.video === 'boolean') ||\n !((streamConstraints.video as LocalVideoStreamConstraints).videoResolution instanceof Array)) {\n\n const defaultResolution: VideoStreamResolution = {\n resolution: DEFAULT_VIDEO_RESOLUTION,\n constraintType: DEFAULT_VIDEO_CONSTRAINT_TYPE\n };\n\n assignConstraint(defaultResolution);\n\n return constraintCandidates;\n }\n\n (streamConstraints.video as any).videoResolution.forEach(assignConstraint);\n\n return constraintCandidates;\n }\n\n private parseMediaErrorThenThrow(error: any): MediaRequestFailResult {\n trace.error('Get media stream error.', error);\n const errorName = error && error.name ? error.name : '';\n\n const permissionErrorNames = [\n 'NotAllowedError',\n 'PermissionDismissedError',\n 'PermissionDeniedError'\n\n ];\n\n // const generalError = [\n // 'NotFoundError',\n // 'DevicesNotFoundError',\n // 'NotReadableError',\n // 'TrackStartError'\n // ];\n\n const constraintsErrors = [\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError'\n\n ];\n\n const isErrorOfType = (errorsArr: string[]) => errorsArr.filter((err: string) => err === errorName).length > 0;\n\n if (isErrorOfType(permissionErrorNames)) {\n throw {errorCode: MediaRequestErrorCode.PermissionDenied, message: errorName};\n }\n\n if (isErrorOfType(constraintsErrors)) {\n throw {errorCode: MediaRequestErrorCode.Overconstrained, message: errorName};\n }\n\n throw {errorCode: MediaRequestErrorCode.GeneralError, message: errorName};\n }\n}\n\nfunction _constraintByType(value: any, type: ConstraintType): any {\n switch (type) {\n case ConstraintType.MIN:\n return {min: value};\n default:\n return {ideal: value};\n }\n}\n"]}
|
|
@@ -18,6 +18,7 @@ var __importDefault = undefined && undefined.__importDefault || function (mod) {
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
var assign_1 = __importDefault(require("lodash/assign"));
|
|
20
20
|
var get_1 = __importDefault(require("lodash/get"));
|
|
21
|
+
var isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
21
22
|
var bluebird_1 = require("bluebird");
|
|
22
23
|
var MediaConstants_1 = require("./MediaConstants");
|
|
23
24
|
window.latestUserMediaStream = null;
|
|
@@ -199,7 +200,7 @@ var LocalStreamManager = /** @class */function () {
|
|
|
199
200
|
return constraintCandidates;
|
|
200
201
|
}
|
|
201
202
|
var baseConstraints = {};
|
|
202
|
-
baseConstraints.audio =
|
|
203
|
+
baseConstraints.audio = !isEmpty_1.default(streamConstraints.audio) ? streamConstraints.audio : undefined;
|
|
203
204
|
if (!streamConstraints.video) {
|
|
204
205
|
return [baseConstraints];
|
|
205
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["LocalStreamManager.js","../src/LocalStreamManager.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","__importDefault","mod","__esModule","defineProperty","exports","value","assign_1","require","get_1","bluebird_1","MediaConstants_1","window","latestUserMediaStream","userMediaPromise","latestDesktopMediaStream","desktopMediaPromise","MediaTracer_1","trace","getMediaTracer","LocalStreamManager","environment","parseMediaErrorThenThrow","bind","clearAllStreams","getUserMediaStream","constraints","_this","info","videoTrack","mediaStream","getVideoTracks","readyState","Promise","resolve","isNew","destroyUserMediaStream","reject","catchHandler","err","error","getHighestResolutionStream","then","streamResult","catch","getDesktopMediaStream","track","destroyDesktopMediaStream","mediaCatchHandler","video","audio","getTracks","forEach","stop","all","undefined","isDesktopMedia","constraintsCandidates","getParsedConstraints","Error","lastSuccessfulResult","lastFailedResult","isStreamRequestFulfilled","reduce","total","candidate","constraintType","default","getStreamPromiseByParsedConstraints","stream","constraint","failResult","errorCode","MediaRequestErrorCode","PermissionDenied","GeneralError","message","streamPromise","navigator","mediaDevices","getUserMedia","getDisplayMedia","e","streamConstraints","constraintCandidates","baseConstraints","facingMode","frameRate","ideal","max","assignConstraint","videoResolution","_a","resolution","split","width","height","constraintCandidate","_constraintByType","push","Array","defaultResolution","DEFAULT_VIDEO_RESOLUTION","DEFAULT_VIDEO_CONSTRAINT_TYPE","errorName","name","permissionErrorNames","constraintsErrors","isErrorOfType","errorsArr","filter","Overconstrained","type","ConstraintType","MIN","min"],"mappings":"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","file":"LocalStreamManager.js","sourcesContent":["\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar get_1 = __importDefault(require(\"lodash/get\"));\nvar bluebird_1 = require(\"bluebird\");\nvar MediaConstants_1 = require(\"./MediaConstants\");\nwindow.latestUserMediaStream = null;\nvar userMediaPromise = null;\nwindow.latestDesktopMediaStream = null;\nvar desktopMediaPromise = null;\nvar MediaTracer_1 = require(\"./MediaUtils/MediaTracer\");\nvar trace = MediaTracer_1.getMediaTracer('LocalStreamManager');\nvar LocalStreamManager = /** @class */ (function () {\n function LocalStreamManager(environment) {\n this.environment = environment;\n this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);\n this.clearAllStreams = this.clearAllStreams.bind(this);\n }\n LocalStreamManager.prototype.getUserMediaStream = function (constraints) {\n var _this = this;\n trace.info('getUserMediaStream', constraints);\n if (userMediaPromise) {\n return userMediaPromise;\n }\n if (window.latestUserMediaStream) {\n var videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return bluebird_1.Promise.resolve(__assign({}, window.latestUserMediaStream, { isNew: false }));\n }\n this.destroyUserMediaStream();\n }\n userMediaPromise = new bluebird_1.Promise(function (resolve, reject) {\n var catchHandler = function (err) {\n userMediaPromise = null;\n window.latestUserMediaStream = null;\n trace.error('getUserMedia error', err);\n reject(err);\n };\n try {\n _this.getHighestResolutionStream(false, constraints)\n .then(function (streamResult) {\n userMediaPromise = null;\n window.latestUserMediaStream = streamResult;\n resolve(__assign({}, window.latestUserMediaStream, { isNew: true }));\n })\n .catch(catchHandler);\n }\n catch (err) {\n catchHandler(err);\n }\n });\n return userMediaPromise;\n };\n LocalStreamManager.prototype.getDesktopMediaStream = function (constraints) {\n var _this = this;\n if (desktopMediaPromise) {\n return desktopMediaPromise;\n }\n if (window.latestDesktopMediaStream) {\n var track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();\n if (track.length > 0 && track[0].readyState === 'live') {\n //return Promise.resolve();\n return bluebird_1.Promise.resolve(__assign({}, window.latestDesktopMediaStream, { isNew: false }));\n }\n this.destroyDesktopMediaStream().catch(function (error) {\n trace.error('Error destroying desktop media stream', error);\n });\n }\n desktopMediaPromise = new bluebird_1.Promise(function (resolve, reject) {\n var mediaCatchHandler = function (err) {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = null;\n trace.error('getDisplayMedia error', err);\n reject(err);\n };\n try {\n _this.getHighestResolutionStream(true, { video: constraints, audio: false })\n .then(function (streamResult) {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = streamResult;\n resolve(__assign({}, window.latestDesktopMediaStream, { isNew: true }));\n }).catch(mediaCatchHandler);\n }\n catch (err) {\n mediaCatchHandler(err);\n }\n });\n return desktopMediaPromise;\n };\n LocalStreamManager.prototype.destroyUserMediaStream = function () {\n var streamResult = window.latestUserMediaStream;\n window.latestUserMediaStream = null;\n userMediaPromise = null;\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach(function (track) {\n track.stop();\n });\n }\n return bluebird_1.Promise.resolve();\n };\n LocalStreamManager.prototype.destroyDesktopMediaStream = function () {\n var streamResult = window.latestDesktopMediaStream;\n window.latestDesktopMediaStream = null;\n desktopMediaPromise = null;\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach(function (track) {\n track.stop();\n });\n }\n return bluebird_1.Promise.resolve();\n };\n LocalStreamManager.prototype.clearAllStreams = function () {\n trace.info('LocalStreamManager Clearing all streams');\n return bluebird_1.Promise.all([\n this.destroyDesktopMediaStream(),\n this.destroyUserMediaStream()\n ]).then(function () { return undefined; });\n };\n LocalStreamManager.prototype.getHighestResolutionStream = function (isDesktopMedia, constraints) {\n var _this = this;\n var constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);\n if (constraintsCandidates.length === 0) {\n return bluebird_1.Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n return new bluebird_1.Promise(function (resolve, reject) {\n var lastSuccessfulResult = null;\n var lastFailedResult = null;\n var isStreamRequestFulfilled = false;\n bluebird_1.Promise.reduce(constraintsCandidates, function (total, candidate) {\n if (isStreamRequestFulfilled) {\n return;\n }\n var constraintType = get_1.default(constraints, 'video.videoResolution.constraintType') || get_1.default(constraints, 'video.videoResolution[0].constraintType');\n return _this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia)\n .then(function (stream) {\n lastSuccessfulResult = {\n mediaStream: stream,\n constraint: candidate,\n constraintType: constraintType,\n isNew: true\n };\n trace.info('getHighestResolutionStream Success', lastSuccessfulResult);\n isStreamRequestFulfilled = true;\n resolve(lastSuccessfulResult);\n })\n .catch(function (failResult) {\n lastFailedResult = failResult;\n if (lastFailedResult.errorCode === MediaConstants_1.MediaRequestErrorCode.PermissionDenied) {\n isStreamRequestFulfilled = true;\n reject(lastFailedResult);\n }\n });\n }, 0)\n .then(function () {\n if (!isStreamRequestFulfilled) {\n if (!lastFailedResult) {\n lastFailedResult = {\n errorCode: MediaConstants_1.MediaRequestErrorCode.GeneralError,\n message: 'Suitable stream cannot be created'\n };\n }\n reject(lastFailedResult);\n }\n });\n });\n };\n //@ts-ignore\n LocalStreamManager.prototype.getStreamPromiseByParsedConstraints = function (constraints, isDesktopMedia) {\n var streamPromise = null;\n trace.info('getStreamPromiseByParsedConstraints', constraints);\n try {\n if (!isDesktopMedia) {\n streamPromise = navigator.mediaDevices.getUserMedia(constraints);\n }\n else {\n //@ts-ignore\n streamPromise = navigator.mediaDevices.getDisplayMedia\n //@ts-ignore\n ? navigator.mediaDevices.getDisplayMedia(constraints)\n : navigator.getDisplayMedia(constraints);\n }\n return streamPromise.catch(this.parseMediaErrorThenThrow);\n }\n catch (e) {\n this.parseMediaErrorThenThrow(e);\n }\n };\n LocalStreamManager.prototype.getParsedConstraints = function (isDesktopMedia, streamConstraints) {\n var constraintCandidates = [];\n //TODO - Alex: need to understand which constraints not compatible with screen share\n if (isDesktopMedia) {\n return [{ video: true }];\n }\n if (!streamConstraints) {\n return constraintCandidates;\n }\n var baseConstraints = {};\n baseConstraints.audio = typeof streamConstraints.audio === 'boolean' ? streamConstraints.audio : undefined;\n if (!streamConstraints.video) {\n return [baseConstraints];\n }\n baseConstraints.video = {\n facingMode: 'environment',\n frameRate: { ideal: 15, max: 30 }\n };\n var assignConstraint = function (videoResolution) {\n var _a = videoResolution.resolution.split('x'), width = _a[0], height = _a[1];\n var constraintCandidate = assign_1.default({}, baseConstraints);\n constraintCandidate.video = assign_1.default({}, baseConstraints.video, {\n width: _constraintByType(width, videoResolution.constraintType),\n height: _constraintByType(height, videoResolution.constraintType)\n });\n constraintCandidates.push(constraintCandidate);\n };\n if ((baseConstraints.video && typeof streamConstraints.video === 'boolean') ||\n !(streamConstraints.video.videoResolution instanceof Array)) {\n var defaultResolution = {\n resolution: MediaConstants_1.DEFAULT_VIDEO_RESOLUTION,\n constraintType: MediaConstants_1.DEFAULT_VIDEO_CONSTRAINT_TYPE\n };\n assignConstraint(defaultResolution);\n return constraintCandidates;\n }\n streamConstraints.video.videoResolution.forEach(assignConstraint);\n return constraintCandidates;\n };\n LocalStreamManager.prototype.parseMediaErrorThenThrow = function (error) {\n trace.error('Get media stream error.', error);\n var errorName = error && error.name ? error.name : '';\n var permissionErrorNames = [\n 'NotAllowedError',\n 'PermissionDismissedError',\n 'PermissionDeniedError'\n ];\n // const generalError = [\n // 'NotFoundError',\n // 'DevicesNotFoundError',\n // 'NotReadableError',\n // 'TrackStartError'\n // ];\n var constraintsErrors = [\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError'\n ];\n var isErrorOfType = function (errorsArr) { return errorsArr.filter(function (err) { return err === errorName; }).length > 0; };\n if (isErrorOfType(permissionErrorNames)) {\n throw { errorCode: MediaConstants_1.MediaRequestErrorCode.PermissionDenied, message: errorName };\n }\n if (isErrorOfType(constraintsErrors)) {\n throw { errorCode: MediaConstants_1.MediaRequestErrorCode.Overconstrained, message: errorName };\n }\n throw { errorCode: MediaConstants_1.MediaRequestErrorCode.GeneralError, message: errorName };\n };\n return LocalStreamManager;\n}());\nexports.LocalStreamManager = LocalStreamManager;\nfunction _constraintByType(value, type) {\n switch (type) {\n case MediaConstants_1.ConstraintType.MIN:\n return { min: value };\n default:\n return { ideal: value };\n }\n}\n\n//# sourceMappingURL=LocalStreamManager.js.map\n","import assign from 'lodash/assign';\nimport get from 'lodash/get';\nimport {Promise} from 'bluebird';\n\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n VideoStreamResolution,\n LocalMediaConstraints,\n LocalVideoStreamConstraints,\n MediaRequestFailResult,\n MediaRequestSuccessResult,\n IMediaEnvironment\n} from './MediaContracts';\n\nimport {\n ConstraintType,\n DEFAULT_VIDEO_CONSTRAINT_TYPE,\n DEFAULT_VIDEO_RESOLUTION,\n MediaRequestErrorCode\n} from './MediaConstants';\n\ndeclare global {\n interface Window {\n latestUserMediaStream: Nullable<MediaRequestSuccessResult>;\n latestDesktopMediaStream: Nullable<MediaRequestSuccessResult>;\n }\n}\n\ndeclare const window: Window;\n\nwindow.latestUserMediaStream = null;\nlet userMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nwindow.latestDesktopMediaStream = null;\nlet desktopMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nimport {getMediaTracer} from './MediaUtils/MediaTracer';\n\nconst trace = getMediaTracer('LocalStreamManager');\n\nexport class LocalStreamManager {\n private environment: IMediaEnvironment;\n\n constructor(environment: IMediaEnvironment) {\n this.environment = environment;\n\n this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);\n this.clearAllStreams = this.clearAllStreams.bind(this);\n }\n\n getUserMediaStream(constraints: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n trace.info('getUserMediaStream', constraints);\n if (userMediaPromise) {\n return userMediaPromise;\n }\n\n if (window.latestUserMediaStream) {\n const videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();\n\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return Promise.resolve({...window.latestUserMediaStream, isNew: false});\n }\n this.destroyUserMediaStream();\n\n }\n\n\n userMediaPromise = new Promise((resolve, reject) => {\n const catchHandler = (err: any): void => {\n userMediaPromise = null;\n window.latestUserMediaStream = null;\n trace.error('getUserMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(false, constraints)\n .then((streamResult: MediaRequestSuccessResult) => {\n userMediaPromise = null;\n window.latestUserMediaStream = streamResult;\n resolve({...window.latestUserMediaStream, isNew: true});\n })\n .catch(catchHandler);\n } catch (err) {\n catchHandler(err);\n }\n });\n\n return userMediaPromise;\n }\n\n getDesktopMediaStream(constraints: LocalVideoStreamConstraints): Promise<MediaRequestSuccessResult> {\n if (desktopMediaPromise) {\n return desktopMediaPromise;\n }\n\n if (window.latestDesktopMediaStream) {\n const track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();\n\n if (track.length > 0 && track[0].readyState === 'live') {\n //return Promise.resolve();\n return Promise.resolve({...window.latestDesktopMediaStream, isNew: false});\n }\n this.destroyDesktopMediaStream().catch((error: any) => {\n trace.error('Error destroying desktop media stream', error);\n });\n\n }\n\n desktopMediaPromise = new Promise((resolve, reject) => {\n const mediaCatchHandler = (err: any): void => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = null;\n trace.error('getDisplayMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(true, {video: constraints, audio: false})\n .then((streamResult: MediaRequestSuccessResult) => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = streamResult;\n\n resolve({...window.latestDesktopMediaStream, isNew: true});\n }).catch(mediaCatchHandler);\n } catch (err) {\n mediaCatchHandler(err);\n }\n });\n\n return desktopMediaPromise;\n }\n\n destroyUserMediaStream(): Promise<void> {\n const streamResult = window.latestUserMediaStream;\n\n window.latestUserMediaStream = null;\n userMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n destroyDesktopMediaStream(): Promise<void> {\n const streamResult = window.latestDesktopMediaStream;\n\n window.latestDesktopMediaStream = null;\n desktopMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n clearAllStreams(): Promise<void> {\n trace.info('LocalStreamManager Clearing all streams');\n\n return Promise.all([\n this.destroyDesktopMediaStream(),\n this.destroyUserMediaStream()\n ]).then(() => undefined);\n }\n\n private getHighestResolutionStream(isDesktopMedia: boolean, constraints?: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n const constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);\n\n if (constraintsCandidates.length === 0) {\n return Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n\n return new Promise((resolve, reject) => {\n let lastSuccessfulResult: Nullable<MediaRequestSuccessResult> = null;\n let lastFailedResult: Nullable<MediaRequestFailResult> = null;\n let isStreamRequestFulfilled = false;\n\n (Promise as any).reduce(constraintsCandidates, (total: any, candidate: MediaStreamConstraints) => {\n if (isStreamRequestFulfilled) {\n return;\n }\n const constraintType = get(constraints, 'video.videoResolution.constraintType') || get(constraints, 'video.videoResolution[0].constraintType');\n\n return this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia)\n .then((stream: MediaStream) => {\n lastSuccessfulResult = {\n mediaStream: stream,\n constraint: candidate,\n constraintType,\n isNew: true\n };\n trace.info('getHighestResolutionStream Success', lastSuccessfulResult);\n isStreamRequestFulfilled = true;\n resolve(lastSuccessfulResult);\n })\n .catch((failResult: MediaRequestFailResult) => {\n lastFailedResult = failResult;\n if (lastFailedResult.errorCode === MediaRequestErrorCode.PermissionDenied) {\n isStreamRequestFulfilled = true;\n reject(lastFailedResult);\n }\n });\n }, 0)\n .then(() => {\n if (!isStreamRequestFulfilled) {\n if (!lastFailedResult) {\n lastFailedResult = {\n errorCode: MediaRequestErrorCode.GeneralError,\n message: 'Suitable stream cannot be created'\n };\n }\n reject(lastFailedResult);\n }\n });\n });\n }\n\n //@ts-ignore\n private getStreamPromiseByParsedConstraints(constraints: MediaStreamConstraints, isDesktopMedia: boolean): Promise<MediaStream> {\n let streamPromise = null;\n\n trace.info('getStreamPromiseByParsedConstraints', constraints);\n\n try {\n if (!isDesktopMedia) {\n streamPromise = navigator.mediaDevices.getUserMedia(constraints);\n } else {\n //@ts-ignore\n streamPromise = navigator.mediaDevices.getDisplayMedia\n //@ts-ignore\n ? navigator.mediaDevices.getDisplayMedia(constraints)\n : navigator.getDisplayMedia(constraints);\n }\n\n return streamPromise.catch(this.parseMediaErrorThenThrow);\n } catch (e) {\n this.parseMediaErrorThenThrow(e);\n }\n }\n\n private getParsedConstraints(isDesktopMedia: boolean, streamConstraints?: LocalMediaConstraints): MediaStreamConstraints[] {\n const constraintCandidates: MediaStreamConstraints[] = [];\n\n //TODO - Alex: need to understand which constraints not compatible with screen share\n if (isDesktopMedia) {\n return [{video: true}];\n }\n\n if (!streamConstraints) {\n return constraintCandidates;\n }\n\n const baseConstraints: MediaStreamConstraints = {};\n\n baseConstraints.audio = typeof streamConstraints.audio === 'boolean' ? streamConstraints.audio : undefined;\n\n if (!streamConstraints.video) {\n return [baseConstraints];\n }\n\n baseConstraints.video = {\n facingMode: 'environment',\n frameRate: {ideal: 15, max: 30}\n };\n\n const assignConstraint = (videoResolution: VideoStreamResolution): void => {\n const [width, height] = videoResolution.resolution.split('x');\n const constraintCandidate = assign({}, baseConstraints);\n\n constraintCandidate.video = assign({}, baseConstraints.video, {\n width: _constraintByType(width, videoResolution.constraintType),\n height: _constraintByType(height, videoResolution.constraintType)\n });\n constraintCandidates.push(constraintCandidate);\n };\n\n if ((baseConstraints.video && typeof streamConstraints.video === 'boolean') ||\n !((streamConstraints.video as LocalVideoStreamConstraints).videoResolution instanceof Array)) {\n\n const defaultResolution: VideoStreamResolution = {\n resolution: DEFAULT_VIDEO_RESOLUTION,\n constraintType: DEFAULT_VIDEO_CONSTRAINT_TYPE\n };\n\n assignConstraint(defaultResolution);\n\n return constraintCandidates;\n }\n\n (streamConstraints.video as any).videoResolution.forEach(assignConstraint);\n\n return constraintCandidates;\n }\n\n private parseMediaErrorThenThrow(error: any): MediaRequestFailResult {\n trace.error('Get media stream error.', error);\n const errorName = error && error.name ? error.name : '';\n\n const permissionErrorNames = [\n 'NotAllowedError',\n 'PermissionDismissedError',\n 'PermissionDeniedError'\n\n ];\n\n // const generalError = [\n // 'NotFoundError',\n // 'DevicesNotFoundError',\n // 'NotReadableError',\n // 'TrackStartError'\n // ];\n\n const constraintsErrors = [\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError'\n\n ];\n\n const isErrorOfType = (errorsArr: string[]) => errorsArr.filter((err: string) => err === errorName).length > 0;\n\n if (isErrorOfType(permissionErrorNames)) {\n throw {errorCode: MediaRequestErrorCode.PermissionDenied, message: errorName};\n }\n\n if (isErrorOfType(constraintsErrors)) {\n throw {errorCode: MediaRequestErrorCode.Overconstrained, message: errorName};\n }\n\n throw {errorCode: MediaRequestErrorCode.GeneralError, message: errorName};\n }\n}\n\nfunction _constraintByType(value: any, type: ConstraintType): any {\n switch (type) {\n case ConstraintType.MIN:\n return {min: value};\n default:\n return {ideal: value};\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["LocalStreamManager.js","../src/LocalStreamManager.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","__importDefault","mod","__esModule","defineProperty","exports","value","assign_1","require","get_1","isEmpty_1","bluebird_1","MediaConstants_1","window","latestUserMediaStream","userMediaPromise","latestDesktopMediaStream","desktopMediaPromise","MediaTracer_1","trace","getMediaTracer","LocalStreamManager","environment","parseMediaErrorThenThrow","bind","clearAllStreams","getUserMediaStream","constraints","_this","info","videoTrack","mediaStream","getVideoTracks","readyState","Promise","resolve","isNew","destroyUserMediaStream","reject","catchHandler","err","error","getHighestResolutionStream","then","streamResult","catch","getDesktopMediaStream","track","destroyDesktopMediaStream","mediaCatchHandler","video","audio","getTracks","forEach","stop","all","undefined","isDesktopMedia","constraintsCandidates","getParsedConstraints","Error","lastSuccessfulResult","lastFailedResult","isStreamRequestFulfilled","reduce","total","candidate","constraintType","default","getStreamPromiseByParsedConstraints","stream","constraint","failResult","errorCode","MediaRequestErrorCode","PermissionDenied","GeneralError","message","streamPromise","navigator","mediaDevices","getUserMedia","getDisplayMedia","e","streamConstraints","constraintCandidates","baseConstraints","facingMode","frameRate","ideal","max","assignConstraint","videoResolution","_a","resolution","split","width","height","constraintCandidate","_constraintByType","push","Array","defaultResolution","DEFAULT_VIDEO_RESOLUTION","DEFAULT_VIDEO_CONSTRAINT_TYPE","errorName","name","permissionErrorNames","constraintsErrors","isErrorOfType","errorsArr","filter","Overconstrained","type","ConstraintType","MIN","min"],"mappings":"AAAA;;AACA,IAAIA,WAAY,aAAQ,UAAKA,QAAd,IAA2B,YAAY;AAClDA,eAAWC,OAAOC,MAAP,IAAiB,UAASC,CAAT,EAAY;AACpC,aAAK,IAAIC,CAAJ,EAAOC,IAAI,CAAX,EAAcC,IAAIC,UAAUC,MAAjC,EAAyCH,IAAIC,CAA7C,EAAgDD,GAAhD,EAAqD;AACjDD,gBAAIG,UAAUF,CAAV,CAAJ;AACA,iBAAK,IAAII,CAAT,IAAcL,CAAd;AAAiB,oBAAIH,OAAOS,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCR,CAArC,EAAwCK,CAAxC,CAAJ,EACbN,EAAEM,CAAF,IAAOL,EAAEK,CAAF,CAAP;AADJ;AAEH;AACD,eAAON,CAAP;AACH,KAPD;AAQA,WAAOH,SAASa,KAAT,CAAe,IAAf,EAAqBN,SAArB,CAAP;AACH,CAVD;AAWA,IAAIO,kBAAmB,aAAQ,UAAKA,eAAd,IAAkC,UAAUC,GAAV,EAAe;AACnE,WAAQA,OAAOA,IAAIC,UAAZ,GAA0BD,GAA1B,GAAgC,EAAE,WAAWA,GAAb,EAAvC;AACH,CAFD;AAGAd,OAAOgB,cAAP,CAAsBC,OAAtB,EAA+B,YAA/B,EAA6C,EAAEC,OAAO,IAAT,EAA7C;ACfA,IAAAC,WAAAN,gBAAAO,QAAA,eAAA,CAAA,CAAA;AACA,IAAAC,QAAAR,gBAAAO,QAAA,YAAA,CAAA,CAAA;AACA,IAAAE,YAAAT,gBAAAO,QAAA,gBAAA,CAAA,CAAA;AACA,IAAAG,aAAAH,QAAA,UAAA,CAAA;AAaA,IAAAI,mBAAAJ,QAAA,kBAAA,CAAA;AAgBAK,OAAOC,qBAAP,GAA+B,IAA/B;AACA,IAAIC,mBAAiE,IAArE;AAEAF,OAAOG,wBAAP,GAAkC,IAAlC;AACA,IAAIC,sBAAoE,IAAxE;AAEA,IAAAC,gBAAAV,QAAA,0BAAA,CAAA;AAEA,IAAMW,QAAQD,cAAAE,cAAA,CAAe,oBAAf,CAAd;AAEA,IAAAC,qBAAA,aAAA,YAAA;AAGI,aAAAA,kBAAA,CAAYC,WAAZ,EAA0C;AACtC,aAAKA,WAAL,GAAmBA,WAAnB;AAEA,aAAKC,wBAAL,GAAgC,KAAKA,wBAAL,CAA8BC,IAA9B,CAAmC,IAAnC,CAAhC;AACA,aAAKC,eAAL,GAAuB,KAAKA,eAAL,CAAqBD,IAArB,CAA0B,IAA1B,CAAvB;AACH;AAEDH,uBAAAxB,SAAA,CAAA6B,kBAAA,GAAA,UAAmBC,WAAnB,EAAqD;AAArD,YAAAC,QAAA,IAAA;AACIT,cAAMU,IAAN,CAAW,oBAAX,EAAiCF,WAAjC;AACA,YAAIZ,gBAAJ,EAAsB;AAClB,mBAAOA,gBAAP;AACH;AAED,YAAIF,OAAOC,qBAAX,EAAkC;AAC9B,gBAAMgB,aAAajB,OAAOC,qBAAP,CAA6BiB,WAA7B,CAAyCC,cAAzC,EAAnB;AAEA,gBAAIF,WAAWnC,MAAX,GAAoB,CAApB,IAAyBmC,WAAW,CAAX,EAAcG,UAAd,KAA6B,MAA1D,EAAkE;AAC9D,uBAAOtB,WAAAuB,OAAA,CAAQC,OAAR,CAAehD,SAAA,EAAA,EAAK0B,OAAOC,qBAAZ,EAAiC,EAAEsB,OAAO,KAAT,EAAjC,CAAf,CAAP;AACH;AACD,iBAAKC,sBAAL;AAEH;AAGDtB,2BAAmB,IAAIJ,WAAAuB,OAAJ,CAAY,UAACC,OAAD,EAAUG,MAAV,EAAgB;AAC3C,gBAAMC,eAAe,SAAfA,YAAe,CAACC,GAAD,EAAS;AAC1BzB,mCAAmB,IAAnB;AACAF,uBAAOC,qBAAP,GAA+B,IAA/B;AACAK,sBAAMsB,KAAN,CAAY,oBAAZ,EAAkCD,GAAlC;AACAF,uBAAOE,GAAP;AACH,aALD;AAOA,gBAAI;AACAZ,sBAAKc,0BAAL,CAAgC,KAAhC,EAAuCf,WAAvC,EACKgB,IADL,CACU,UAACC,YAAD,EAAwC;AAC1C7B,uCAAmB,IAAnB;AACAF,2BAAOC,qBAAP,GAA+B8B,YAA/B;AACAT,4BAAOhD,SAAA,EAAA,EAAK0B,OAAOC,qBAAZ,EAAiC,EAAEsB,OAAO,IAAT,EAAjC,CAAP;AACH,iBALL,EAMKS,KANL,CAMWN,YANX;AAOH,aARD,CAQE,OAAOC,GAAP,EAAY;AACVD,6BAAaC,GAAb;AACH;AACJ,SAnBkB,CAAnB;AAqBA,eAAOzB,gBAAP;AACH,KAvCD;AAyCAM,uBAAAxB,SAAA,CAAAiD,qBAAA,GAAA,UAAsBnB,WAAtB,EAA8D;AAA9D,YAAAC,QAAA,IAAA;AACI,YAAIX,mBAAJ,EAAyB;AACrB,mBAAOA,mBAAP;AACH;AAED,YAAIJ,OAAOG,wBAAX,EAAqC;AACjC,gBAAM+B,QAAQlC,OAAOG,wBAAP,CAAgCe,WAAhC,CAA4CC,cAA5C,EAAd;AAEA,gBAAIe,MAAMpD,MAAN,GAAe,CAAf,IAAoBoD,MAAM,CAAN,EAASd,UAAT,KAAwB,MAAhD,EAAwD;AACpD;AACA,uBAAOtB,WAAAuB,OAAA,CAAQC,OAAR,CAAehD,SAAA,EAAA,EAAK0B,OAAOG,wBAAZ,EAAoC,EAAEoB,OAAO,KAAT,EAApC,CAAf,CAAP;AACH;AACD,iBAAKY,yBAAL,GAAiCH,KAAjC,CAAuC,UAACJ,KAAD,EAAW;AAC9CtB,sBAAMsB,KAAN,CAAY,uCAAZ,EAAqDA,KAArD;AACH,aAFD;AAIH;AAEDxB,8BAAsB,IAAIN,WAAAuB,OAAJ,CAAY,UAACC,OAAD,EAAUG,MAAV,EAAgB;AAC9C,gBAAMW,oBAAoB,SAApBA,iBAAoB,CAACT,GAAD,EAAS;AAC/BvB,sCAAsB,IAAtB;AACAJ,uBAAOG,wBAAP,GAAkC,IAAlC;AACAG,sBAAMsB,KAAN,CAAY,uBAAZ,EAAqCD,GAArC;AACAF,uBAAOE,GAAP;AACH,aALD;AAOA,gBAAI;AACAZ,sBAAKc,0BAAL,CAAgC,IAAhC,EAAsC,EAACQ,OAAOvB,WAAR,EAAqBwB,OAAO,KAA5B,EAAtC,EACKR,IADL,CACU,UAACC,YAAD,EAAwC;AAC1C3B,0CAAsB,IAAtB;AACAJ,2BAAOG,wBAAP,GAAkC4B,YAAlC;AAEAT,4BAAOhD,SAAA,EAAA,EAAK0B,OAAOG,wBAAZ,EAAoC,EAAEoB,OAAO,IAAT,EAApC,CAAP;AACH,iBANL,EAMOS,KANP,CAMaI,iBANb;AAOH,aARD,CAQE,OAAOT,GAAP,EAAY;AACVS,kCAAkBT,GAAlB;AACH;AACJ,SAnBqB,CAAtB;AAqBA,eAAOvB,mBAAP;AACH,KAxCD;AA0CAI,uBAAAxB,SAAA,CAAAwC,sBAAA,GAAA,YAAA;AACI,YAAMO,eAAe/B,OAAOC,qBAA5B;AAEAD,eAAOC,qBAAP,GAA+B,IAA/B;AACAC,2BAAmB,IAAnB;AAEA,YAAI6B,YAAJ,EAAkB;AACdA,yBAAab,WAAb,CAAyBqB,SAAzB,GAAqCC,OAArC,CAA6C,UAACN,KAAD,EAAwB;AACjEA,sBAAMO,IAAN;AACH,aAFD;AAGH;AAED,eAAO3C,WAAAuB,OAAA,CAAQC,OAAR,EAAP;AACH,KAbD;AAeAd,uBAAAxB,SAAA,CAAAmD,yBAAA,GAAA,YAAA;AACI,YAAMJ,eAAe/B,OAAOG,wBAA5B;AAEAH,eAAOG,wBAAP,GAAkC,IAAlC;AACAC,8BAAsB,IAAtB;AAEA,YAAI2B,YAAJ,EAAkB;AACdA,yBAAab,WAAb,CAAyBqB,SAAzB,GAAqCC,OAArC,CAA6C,UAACN,KAAD,EAAwB;AACjEA,sBAAMO,IAAN;AACH,aAFD;AAGH;AAED,eAAO3C,WAAAuB,OAAA,CAAQC,OAAR,EAAP;AACH,KAbD;AAeAd,uBAAAxB,SAAA,CAAA4B,eAAA,GAAA,YAAA;AACIN,cAAMU,IAAN,CAAW,yCAAX;AAEA,eAAOlB,WAAAuB,OAAA,CAAQqB,GAAR,CAAY,CACf,KAAKP,yBAAL,EADe,EAEf,KAAKX,sBAAL,EAFe,CAAZ,EAGJM,IAHI,CAGC,YAAA;AAAM,mBAAAa,SAAA;AAAS,SAHhB,CAAP;AAIH,KAPD;AASQnC,uBAAAxB,SAAA,CAAA6C,0BAAA,GAAR,UAAmCe,cAAnC,EAA4D9B,WAA5D,EAA+F;AAA/F,YAAAC,QAAA,IAAA;AACI,YAAM8B,wBAAwB,KAAKC,oBAAL,CAA0BF,cAA1B,EAA0C9B,WAA1C,CAA9B;AAEA,YAAI+B,sBAAsB/D,MAAtB,KAAiC,CAArC,EAAwC;AACpC,mBAAOgB,WAAAuB,OAAA,CAAQI,MAAR,CAAe,IAAIsB,KAAJ,CAAU,uCAAV,CAAf,CAAP;AACH;AAED,eAAO,IAAIjD,WAAAuB,OAAJ,CAAY,UAACC,OAAD,EAAUG,MAAV,EAAgB;AAC/B,gBAAIuB,uBAA4D,IAAhE;AACA,gBAAIC,mBAAqD,IAAzD;AACA,gBAAIC,2BAA2B,KAA/B;AAECpD,uBAAAuB,OAAA,CAAgB8B,MAAhB,CAAuBN,qBAAvB,EAA8C,UAACO,KAAD,EAAaC,SAAb,EAA8C;AACzF,oBAAIH,wBAAJ,EAA8B;AAC1B;AACH;AACD,oBAAMI,iBAAiB1D,MAAA2D,OAAA,CAAIzC,WAAJ,EAAiB,sCAAjB,KAA4DlB,MAAA2D,OAAA,CAAIzC,WAAJ,EAAiB,yCAAjB,CAAnF;AAEA,uBAAOC,MAAKyC,mCAAL,CAAyCH,SAAzC,EAAoDT,cAApD,EACFd,IADE,CACG,UAAC2B,MAAD,EAAoB;AACtBT,2CAAuB;AACnB9B,qCAAauC,MADM;AAEnBC,oCAAYL,SAFO;AAGnBC,wCAAcA,cAHK;AAInB/B,+BAAO;AAJY,qBAAvB;AAMAjB,0BAAMU,IAAN,CAAW,oCAAX,EAAiDgC,oBAAjD;AACAE,+CAA2B,IAA3B;AACA5B,4BAAQ0B,oBAAR;AACH,iBAXE,EAYFhB,KAZE,CAYI,UAAC2B,UAAD,EAAmC;AACtCV,uCAAmBU,UAAnB;AACA,wBAAIV,iBAAiBW,SAAjB,KAA+B7D,iBAAA8D,qBAAA,CAAsBC,gBAAzD,EAA2E;AACvEZ,mDAA2B,IAA3B;AACAzB,+BAAOwB,gBAAP;AACH;AACJ,iBAlBE,CAAP;AAmBH,aAzBA,EAyBE,CAzBF,EA0BInB,IA1BJ,CA0BS,YAAA;AACF,oBAAI,CAACoB,wBAAL,EAA+B;AAC3B,wBAAI,CAACD,gBAAL,EAAuB;AACnBA,2CAAmB;AACfW,uCAAW7D,iBAAA8D,qBAAA,CAAsBE,YADlB;AAEfC,qCAAS;AAFM,yBAAnB;AAIH;AACDvC,2BAAOwB,gBAAP;AACH;AACJ,aApCJ;AAqCJ,SA1CM,CAAP;AA2CH,KAlDO;AAoDR;AACQzC,uBAAAxB,SAAA,CAAAwE,mCAAA,GAAR,UAA4C1C,WAA5C,EAAiF8B,cAAjF,EAAwG;AACpG,YAAIqB,gBAAgB,IAApB;AAEA3D,cAAMU,IAAN,CAAW,qCAAX,EAAkDF,WAAlD;AAEA,YAAI;AACA,gBAAI,CAAC8B,cAAL,EAAqB;AACjBqB,gCAAgBC,UAAUC,YAAV,CAAuBC,YAAvB,CAAoCtD,WAApC,CAAhB;AACH,aAFD,MAEO;AACH;AACAmD,gCAAgBC,UAAUC,YAAV,CAAuBE;AACnC;AADY,kBAEVH,UAAUC,YAAV,CAAuBE,eAAvB,CAAuCvD,WAAvC,CAFU,GAGVoD,UAAUG,eAAV,CAA0BvD,WAA1B,CAHN;AAIH;AAED,mBAAOmD,cAAcjC,KAAd,CAAoB,KAAKtB,wBAAzB,CAAP;AACH,SAZD,CAYE,OAAO4D,CAAP,EAAU;AACR,iBAAK5D,wBAAL,CAA8B4D,CAA9B;AACH;AACJ,KApBO;AAsBA9D,uBAAAxB,SAAA,CAAA8D,oBAAA,GAAR,UAA6BF,cAA7B,EAAsD2B,iBAAtD,EAA+F;AAC3F,YAAMC,uBAAiD,EAAvD;AAEA;AACA,YAAI5B,cAAJ,EAAoB;AAChB,mBAAO,CAAC,EAACP,OAAO,IAAR,EAAD,CAAP;AACH;AAED,YAAI,CAACkC,iBAAL,EAAwB;AACpB,mBAAOC,oBAAP;AACH;AAED,YAAMC,kBAA0C,EAAhD;AAEAA,wBAAgBnC,KAAhB,GAAwB,CAACzC,UAAA0D,OAAA,CAAQgB,kBAAkBjC,KAA1B,CAAD,GAAoCiC,kBAAkBjC,KAAtD,GAA8DK,SAAtF;AAEA,YAAI,CAAC4B,kBAAkBlC,KAAvB,EAA8B;AAC1B,mBAAO,CAACoC,eAAD,CAAP;AACH;AAEDA,wBAAgBpC,KAAhB,GAAwB;AACpBqC,wBAAY,aADQ;AAEpBC,uBAAW,EAACC,OAAO,EAAR,EAAYC,KAAK,EAAjB;AAFS,SAAxB;AAKA,YAAMC,mBAAmB,SAAnBA,gBAAmB,CAACC,eAAD,EAAuC;AACtD,gBAAAC,KAAAD,gBAAAE,UAAA,CAAAC,KAAA,CAAA,GAAA,CAAA;AAAA,gBAACC,QAAAH,GAAA,CAAA,CAAD;AAAA,gBAAQI,SAAAJ,GAAA,CAAA,CAAR;AACN,gBAAMK,sBAAsB3F,SAAA6D,OAAA,CAAO,EAAP,EAAWkB,eAAX,CAA5B;AAEAY,gCAAoBhD,KAApB,GAA4B3C,SAAA6D,OAAA,CAAO,EAAP,EAAWkB,gBAAgBpC,KAA3B,EAAkC;AAC1D8C,uBAAOG,kBAAkBH,KAAlB,EAAyBJ,gBAAgBzB,cAAzC,CADmD;AAE1D8B,wBAAQE,kBAAkBF,MAAlB,EAA0BL,gBAAgBzB,cAA1C;AAFkD,aAAlC,CAA5B;AAIAkB,iCAAqBe,IAArB,CAA0BF,mBAA1B;AACH,SATD;AAWA,YAAKZ,gBAAgBpC,KAAhB,IAAyB,OAAOkC,kBAAkBlC,KAAzB,KAAmC,SAA7D,IACA,EAAGkC,kBAAkBlC,KAAlB,CAAwD0C,eAAxD,YAAmFS,KAAtF,CADJ,EACkG;AAE9F,gBAAMC,oBAA2C;AAC7CR,4BAAYlF,iBAAA2F,wBADiC;AAE7CpC,gCAAgBvD,iBAAA4F;AAF6B,aAAjD;AAKAb,6BAAiBW,iBAAjB;AAEA,mBAAOjB,oBAAP;AACH;AAEAD,0BAAkBlC,KAAlB,CAAgC0C,eAAhC,CAAgDvC,OAAhD,CAAwDsC,gBAAxD;AAED,eAAON,oBAAP;AACH,KApDO;AAsDAhE,uBAAAxB,SAAA,CAAA0B,wBAAA,GAAR,UAAiCkB,KAAjC,EAA2C;AACvCtB,cAAMsB,KAAN,CAAY,yBAAZ,EAAuCA,KAAvC;AACA,YAAMgE,YAAYhE,SAASA,MAAMiE,IAAf,GAAsBjE,MAAMiE,IAA5B,GAAmC,EAArD;AAEA,YAAMC,uBAAuB,CACzB,iBADyB,EAEzB,0BAFyB,EAGzB,uBAHyB,CAA7B;AAOA;AACA;AACA;AACA;AACA;AACA;AAEA,YAAMC,oBAAoB,CACtB,sBADsB,EAEtB,6BAFsB,CAA1B;AAMA,YAAMC,gBAAgB,SAAhBA,aAAgB,CAACC,SAAD,EAAoB;AAAK,mBAAAA,UAAUC,MAAV,CAAiB,UAACvE,GAAD,EAAY;AAAK,uBAAAA,QAAQiE,SAAR;AAAiB,aAAnD,EAAqD9G,MAArD,GAA8D,CAA9D;AAA+D,SAA9G;AAEA,YAAIkH,cAAcF,oBAAd,CAAJ,EAAyC;AACrC,kBAAM,EAAClC,WAAW7D,iBAAA8D,qBAAA,CAAsBC,gBAAlC,EAAoDE,SAAS4B,SAA7D,EAAN;AACH;AAED,YAAII,cAAcD,iBAAd,CAAJ,EAAsC;AAClC,kBAAM,EAACnC,WAAW7D,iBAAA8D,qBAAA,CAAsBsC,eAAlC,EAAmDnC,SAAS4B,SAA5D,EAAN;AACH;AAED,cAAM,EAAChC,WAAW7D,iBAAA8D,qBAAA,CAAsBE,YAAlC,EAAgDC,SAAS4B,SAAzD,EAAN;AACH,KAnCO;AAoCZ,WAAApF,kBAAA;AAzSA,CAAA,EAAA;AAAahB,QAAAgB,kBAAA,GAAAA,kBAAA;AA2Sb,SAAS8E,iBAAT,CAA2B7F,KAA3B,EAAuC2G,IAAvC,EAA2D;AACvD,YAAQA,IAAR;AACI,aAAKrG,iBAAAsG,cAAA,CAAeC,GAApB;AACI,mBAAO,EAACC,KAAK9G,KAAN,EAAP;AACJ;AACI,mBAAO,EAACmF,OAAOnF,KAAR,EAAP;AAJR;AAMH;;ADpED","file":"LocalStreamManager.js","sourcesContent":["\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar assign_1 = __importDefault(require(\"lodash/assign\"));\nvar get_1 = __importDefault(require(\"lodash/get\"));\nvar isEmpty_1 = __importDefault(require(\"lodash/isEmpty\"));\nvar bluebird_1 = require(\"bluebird\");\nvar MediaConstants_1 = require(\"./MediaConstants\");\nwindow.latestUserMediaStream = null;\nvar userMediaPromise = null;\nwindow.latestDesktopMediaStream = null;\nvar desktopMediaPromise = null;\nvar MediaTracer_1 = require(\"./MediaUtils/MediaTracer\");\nvar trace = MediaTracer_1.getMediaTracer('LocalStreamManager');\nvar LocalStreamManager = /** @class */ (function () {\n function LocalStreamManager(environment) {\n this.environment = environment;\n this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);\n this.clearAllStreams = this.clearAllStreams.bind(this);\n }\n LocalStreamManager.prototype.getUserMediaStream = function (constraints) {\n var _this = this;\n trace.info('getUserMediaStream', constraints);\n if (userMediaPromise) {\n return userMediaPromise;\n }\n if (window.latestUserMediaStream) {\n var videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return bluebird_1.Promise.resolve(__assign({}, window.latestUserMediaStream, { isNew: false }));\n }\n this.destroyUserMediaStream();\n }\n userMediaPromise = new bluebird_1.Promise(function (resolve, reject) {\n var catchHandler = function (err) {\n userMediaPromise = null;\n window.latestUserMediaStream = null;\n trace.error('getUserMedia error', err);\n reject(err);\n };\n try {\n _this.getHighestResolutionStream(false, constraints)\n .then(function (streamResult) {\n userMediaPromise = null;\n window.latestUserMediaStream = streamResult;\n resolve(__assign({}, window.latestUserMediaStream, { isNew: true }));\n })\n .catch(catchHandler);\n }\n catch (err) {\n catchHandler(err);\n }\n });\n return userMediaPromise;\n };\n LocalStreamManager.prototype.getDesktopMediaStream = function (constraints) {\n var _this = this;\n if (desktopMediaPromise) {\n return desktopMediaPromise;\n }\n if (window.latestDesktopMediaStream) {\n var track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();\n if (track.length > 0 && track[0].readyState === 'live') {\n //return Promise.resolve();\n return bluebird_1.Promise.resolve(__assign({}, window.latestDesktopMediaStream, { isNew: false }));\n }\n this.destroyDesktopMediaStream().catch(function (error) {\n trace.error('Error destroying desktop media stream', error);\n });\n }\n desktopMediaPromise = new bluebird_1.Promise(function (resolve, reject) {\n var mediaCatchHandler = function (err) {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = null;\n trace.error('getDisplayMedia error', err);\n reject(err);\n };\n try {\n _this.getHighestResolutionStream(true, { video: constraints, audio: false })\n .then(function (streamResult) {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = streamResult;\n resolve(__assign({}, window.latestDesktopMediaStream, { isNew: true }));\n }).catch(mediaCatchHandler);\n }\n catch (err) {\n mediaCatchHandler(err);\n }\n });\n return desktopMediaPromise;\n };\n LocalStreamManager.prototype.destroyUserMediaStream = function () {\n var streamResult = window.latestUserMediaStream;\n window.latestUserMediaStream = null;\n userMediaPromise = null;\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach(function (track) {\n track.stop();\n });\n }\n return bluebird_1.Promise.resolve();\n };\n LocalStreamManager.prototype.destroyDesktopMediaStream = function () {\n var streamResult = window.latestDesktopMediaStream;\n window.latestDesktopMediaStream = null;\n desktopMediaPromise = null;\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach(function (track) {\n track.stop();\n });\n }\n return bluebird_1.Promise.resolve();\n };\n LocalStreamManager.prototype.clearAllStreams = function () {\n trace.info('LocalStreamManager Clearing all streams');\n return bluebird_1.Promise.all([\n this.destroyDesktopMediaStream(),\n this.destroyUserMediaStream()\n ]).then(function () { return undefined; });\n };\n LocalStreamManager.prototype.getHighestResolutionStream = function (isDesktopMedia, constraints) {\n var _this = this;\n var constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);\n if (constraintsCandidates.length === 0) {\n return bluebird_1.Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n return new bluebird_1.Promise(function (resolve, reject) {\n var lastSuccessfulResult = null;\n var lastFailedResult = null;\n var isStreamRequestFulfilled = false;\n bluebird_1.Promise.reduce(constraintsCandidates, function (total, candidate) {\n if (isStreamRequestFulfilled) {\n return;\n }\n var constraintType = get_1.default(constraints, 'video.videoResolution.constraintType') || get_1.default(constraints, 'video.videoResolution[0].constraintType');\n return _this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia)\n .then(function (stream) {\n lastSuccessfulResult = {\n mediaStream: stream,\n constraint: candidate,\n constraintType: constraintType,\n isNew: true\n };\n trace.info('getHighestResolutionStream Success', lastSuccessfulResult);\n isStreamRequestFulfilled = true;\n resolve(lastSuccessfulResult);\n })\n .catch(function (failResult) {\n lastFailedResult = failResult;\n if (lastFailedResult.errorCode === MediaConstants_1.MediaRequestErrorCode.PermissionDenied) {\n isStreamRequestFulfilled = true;\n reject(lastFailedResult);\n }\n });\n }, 0)\n .then(function () {\n if (!isStreamRequestFulfilled) {\n if (!lastFailedResult) {\n lastFailedResult = {\n errorCode: MediaConstants_1.MediaRequestErrorCode.GeneralError,\n message: 'Suitable stream cannot be created'\n };\n }\n reject(lastFailedResult);\n }\n });\n });\n };\n //@ts-ignore\n LocalStreamManager.prototype.getStreamPromiseByParsedConstraints = function (constraints, isDesktopMedia) {\n var streamPromise = null;\n trace.info('getStreamPromiseByParsedConstraints', constraints);\n try {\n if (!isDesktopMedia) {\n streamPromise = navigator.mediaDevices.getUserMedia(constraints);\n }\n else {\n //@ts-ignore\n streamPromise = navigator.mediaDevices.getDisplayMedia\n //@ts-ignore\n ? navigator.mediaDevices.getDisplayMedia(constraints)\n : navigator.getDisplayMedia(constraints);\n }\n return streamPromise.catch(this.parseMediaErrorThenThrow);\n }\n catch (e) {\n this.parseMediaErrorThenThrow(e);\n }\n };\n LocalStreamManager.prototype.getParsedConstraints = function (isDesktopMedia, streamConstraints) {\n var constraintCandidates = [];\n //TODO - Alex: need to understand which constraints not compatible with screen share\n if (isDesktopMedia) {\n return [{ video: true }];\n }\n if (!streamConstraints) {\n return constraintCandidates;\n }\n var baseConstraints = {};\n baseConstraints.audio = !isEmpty_1.default(streamConstraints.audio) ? streamConstraints.audio : undefined;\n if (!streamConstraints.video) {\n return [baseConstraints];\n }\n baseConstraints.video = {\n facingMode: 'environment',\n frameRate: { ideal: 15, max: 30 }\n };\n var assignConstraint = function (videoResolution) {\n var _a = videoResolution.resolution.split('x'), width = _a[0], height = _a[1];\n var constraintCandidate = assign_1.default({}, baseConstraints);\n constraintCandidate.video = assign_1.default({}, baseConstraints.video, {\n width: _constraintByType(width, videoResolution.constraintType),\n height: _constraintByType(height, videoResolution.constraintType)\n });\n constraintCandidates.push(constraintCandidate);\n };\n if ((baseConstraints.video && typeof streamConstraints.video === 'boolean') ||\n !(streamConstraints.video.videoResolution instanceof Array)) {\n var defaultResolution = {\n resolution: MediaConstants_1.DEFAULT_VIDEO_RESOLUTION,\n constraintType: MediaConstants_1.DEFAULT_VIDEO_CONSTRAINT_TYPE\n };\n assignConstraint(defaultResolution);\n return constraintCandidates;\n }\n streamConstraints.video.videoResolution.forEach(assignConstraint);\n return constraintCandidates;\n };\n LocalStreamManager.prototype.parseMediaErrorThenThrow = function (error) {\n trace.error('Get media stream error.', error);\n var errorName = error && error.name ? error.name : '';\n var permissionErrorNames = [\n 'NotAllowedError',\n 'PermissionDismissedError',\n 'PermissionDeniedError'\n ];\n // const generalError = [\n // 'NotFoundError',\n // 'DevicesNotFoundError',\n // 'NotReadableError',\n // 'TrackStartError'\n // ];\n var constraintsErrors = [\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError'\n ];\n var isErrorOfType = function (errorsArr) { return errorsArr.filter(function (err) { return err === errorName; }).length > 0; };\n if (isErrorOfType(permissionErrorNames)) {\n throw { errorCode: MediaConstants_1.MediaRequestErrorCode.PermissionDenied, message: errorName };\n }\n if (isErrorOfType(constraintsErrors)) {\n throw { errorCode: MediaConstants_1.MediaRequestErrorCode.Overconstrained, message: errorName };\n }\n throw { errorCode: MediaConstants_1.MediaRequestErrorCode.GeneralError, message: errorName };\n };\n return LocalStreamManager;\n}());\nexports.LocalStreamManager = LocalStreamManager;\nfunction _constraintByType(value, type) {\n switch (type) {\n case MediaConstants_1.ConstraintType.MIN:\n return { min: value };\n default:\n return { ideal: value };\n }\n}\n\n//# sourceMappingURL=LocalStreamManager.js.map\n","import assign from 'lodash/assign';\nimport get from 'lodash/get';\nimport isEmpty from 'lodash/isEmpty';\nimport {Promise} from 'bluebird';\n\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n VideoStreamResolution,\n LocalMediaConstraints,\n LocalVideoStreamConstraints,\n MediaRequestFailResult,\n MediaRequestSuccessResult,\n IMediaEnvironment\n} from './MediaContracts';\n\nimport {\n ConstraintType,\n DEFAULT_VIDEO_CONSTRAINT_TYPE,\n DEFAULT_VIDEO_RESOLUTION,\n MediaRequestErrorCode\n} from './MediaConstants';\n\ndeclare global {\n interface Window {\n latestUserMediaStream: Nullable<MediaRequestSuccessResult>;\n latestDesktopMediaStream: Nullable<MediaRequestSuccessResult>;\n }\n}\n\ndeclare const window: Window;\n\nwindow.latestUserMediaStream = null;\nlet userMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nwindow.latestDesktopMediaStream = null;\nlet desktopMediaPromise: Nullable<Promise<MediaRequestSuccessResult>> = null;\n\nimport {getMediaTracer} from './MediaUtils/MediaTracer';\n\nconst trace = getMediaTracer('LocalStreamManager');\n\nexport class LocalStreamManager {\n private environment: IMediaEnvironment;\n\n constructor(environment: IMediaEnvironment) {\n this.environment = environment;\n\n this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);\n this.clearAllStreams = this.clearAllStreams.bind(this);\n }\n\n getUserMediaStream(constraints: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n trace.info('getUserMediaStream', constraints);\n if (userMediaPromise) {\n return userMediaPromise;\n }\n\n if (window.latestUserMediaStream) {\n const videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();\n\n if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {\n return Promise.resolve({...window.latestUserMediaStream, isNew: false});\n }\n this.destroyUserMediaStream();\n\n }\n\n\n userMediaPromise = new Promise((resolve, reject) => {\n const catchHandler = (err: any): void => {\n userMediaPromise = null;\n window.latestUserMediaStream = null;\n trace.error('getUserMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(false, constraints)\n .then((streamResult: MediaRequestSuccessResult) => {\n userMediaPromise = null;\n window.latestUserMediaStream = streamResult;\n resolve({...window.latestUserMediaStream, isNew: true});\n })\n .catch(catchHandler);\n } catch (err) {\n catchHandler(err);\n }\n });\n\n return userMediaPromise;\n }\n\n getDesktopMediaStream(constraints: LocalVideoStreamConstraints): Promise<MediaRequestSuccessResult> {\n if (desktopMediaPromise) {\n return desktopMediaPromise;\n }\n\n if (window.latestDesktopMediaStream) {\n const track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();\n\n if (track.length > 0 && track[0].readyState === 'live') {\n //return Promise.resolve();\n return Promise.resolve({...window.latestDesktopMediaStream, isNew: false});\n }\n this.destroyDesktopMediaStream().catch((error: any) => {\n trace.error('Error destroying desktop media stream', error);\n });\n\n }\n\n desktopMediaPromise = new Promise((resolve, reject) => {\n const mediaCatchHandler = (err: any): void => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = null;\n trace.error('getDisplayMedia error', err);\n reject(err);\n };\n\n try {\n this.getHighestResolutionStream(true, {video: constraints, audio: false})\n .then((streamResult: MediaRequestSuccessResult) => {\n desktopMediaPromise = null;\n window.latestDesktopMediaStream = streamResult;\n\n resolve({...window.latestDesktopMediaStream, isNew: true});\n }).catch(mediaCatchHandler);\n } catch (err) {\n mediaCatchHandler(err);\n }\n });\n\n return desktopMediaPromise;\n }\n\n destroyUserMediaStream(): Promise<void> {\n const streamResult = window.latestUserMediaStream;\n\n window.latestUserMediaStream = null;\n userMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n destroyDesktopMediaStream(): Promise<void> {\n const streamResult = window.latestDesktopMediaStream;\n\n window.latestDesktopMediaStream = null;\n desktopMediaPromise = null;\n\n if (streamResult) {\n streamResult.mediaStream.getTracks().forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n\n return Promise.resolve();\n }\n\n clearAllStreams(): Promise<void> {\n trace.info('LocalStreamManager Clearing all streams');\n\n return Promise.all([\n this.destroyDesktopMediaStream(),\n this.destroyUserMediaStream()\n ]).then(() => undefined);\n }\n\n private getHighestResolutionStream(isDesktopMedia: boolean, constraints?: LocalMediaConstraints): Promise<MediaRequestSuccessResult> {\n const constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);\n\n if (constraintsCandidates.length === 0) {\n return Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n\n return new Promise((resolve, reject) => {\n let lastSuccessfulResult: Nullable<MediaRequestSuccessResult> = null;\n let lastFailedResult: Nullable<MediaRequestFailResult> = null;\n let isStreamRequestFulfilled = false;\n\n (Promise as any).reduce(constraintsCandidates, (total: any, candidate: MediaStreamConstraints) => {\n if (isStreamRequestFulfilled) {\n return;\n }\n const constraintType = get(constraints, 'video.videoResolution.constraintType') || get(constraints, 'video.videoResolution[0].constraintType');\n\n return this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia)\n .then((stream: MediaStream) => {\n lastSuccessfulResult = {\n mediaStream: stream,\n constraint: candidate,\n constraintType,\n isNew: true\n };\n trace.info('getHighestResolutionStream Success', lastSuccessfulResult);\n isStreamRequestFulfilled = true;\n resolve(lastSuccessfulResult);\n })\n .catch((failResult: MediaRequestFailResult) => {\n lastFailedResult = failResult;\n if (lastFailedResult.errorCode === MediaRequestErrorCode.PermissionDenied) {\n isStreamRequestFulfilled = true;\n reject(lastFailedResult);\n }\n });\n }, 0)\n .then(() => {\n if (!isStreamRequestFulfilled) {\n if (!lastFailedResult) {\n lastFailedResult = {\n errorCode: MediaRequestErrorCode.GeneralError,\n message: 'Suitable stream cannot be created'\n };\n }\n reject(lastFailedResult);\n }\n });\n });\n }\n\n //@ts-ignore\n private getStreamPromiseByParsedConstraints(constraints: MediaStreamConstraints, isDesktopMedia: boolean): Promise<MediaStream> {\n let streamPromise = null;\n\n trace.info('getStreamPromiseByParsedConstraints', constraints);\n\n try {\n if (!isDesktopMedia) {\n streamPromise = navigator.mediaDevices.getUserMedia(constraints);\n } else {\n //@ts-ignore\n streamPromise = navigator.mediaDevices.getDisplayMedia\n //@ts-ignore\n ? navigator.mediaDevices.getDisplayMedia(constraints)\n : navigator.getDisplayMedia(constraints);\n }\n\n return streamPromise.catch(this.parseMediaErrorThenThrow);\n } catch (e) {\n this.parseMediaErrorThenThrow(e);\n }\n }\n\n private getParsedConstraints(isDesktopMedia: boolean, streamConstraints?: LocalMediaConstraints): MediaStreamConstraints[] {\n const constraintCandidates: MediaStreamConstraints[] = [];\n\n //TODO - Alex: need to understand which constraints not compatible with screen share\n if (isDesktopMedia) {\n return [{video: true}];\n }\n\n if (!streamConstraints) {\n return constraintCandidates;\n }\n\n const baseConstraints: MediaStreamConstraints = {};\n\n baseConstraints.audio = !isEmpty(streamConstraints.audio) ? streamConstraints.audio : undefined;\n\n if (!streamConstraints.video) {\n return [baseConstraints];\n }\n\n baseConstraints.video = {\n facingMode: 'environment',\n frameRate: {ideal: 15, max: 30}\n };\n\n const assignConstraint = (videoResolution: VideoStreamResolution): void => {\n const [width, height] = videoResolution.resolution.split('x');\n const constraintCandidate = assign({}, baseConstraints);\n\n constraintCandidate.video = assign({}, baseConstraints.video, {\n width: _constraintByType(width, videoResolution.constraintType),\n height: _constraintByType(height, videoResolution.constraintType)\n });\n constraintCandidates.push(constraintCandidate);\n };\n\n if ((baseConstraints.video && typeof streamConstraints.video === 'boolean') ||\n !((streamConstraints.video as LocalVideoStreamConstraints).videoResolution instanceof Array)) {\n\n const defaultResolution: VideoStreamResolution = {\n resolution: DEFAULT_VIDEO_RESOLUTION,\n constraintType: DEFAULT_VIDEO_CONSTRAINT_TYPE\n };\n\n assignConstraint(defaultResolution);\n\n return constraintCandidates;\n }\n\n (streamConstraints.video as any).videoResolution.forEach(assignConstraint);\n\n return constraintCandidates;\n }\n\n private parseMediaErrorThenThrow(error: any): MediaRequestFailResult {\n trace.error('Get media stream error.', error);\n const errorName = error && error.name ? error.name : '';\n\n const permissionErrorNames = [\n 'NotAllowedError',\n 'PermissionDismissedError',\n 'PermissionDeniedError'\n\n ];\n\n // const generalError = [\n // 'NotFoundError',\n // 'DevicesNotFoundError',\n // 'NotReadableError',\n // 'TrackStartError'\n // ];\n\n const constraintsErrors = [\n 'OverconstrainedError',\n 'ConstraintNotSatisfiedError'\n\n ];\n\n const isErrorOfType = (errorsArr: string[]) => errorsArr.filter((err: string) => err === errorName).length > 0;\n\n if (isErrorOfType(permissionErrorNames)) {\n throw {errorCode: MediaRequestErrorCode.PermissionDenied, message: errorName};\n }\n\n if (isErrorOfType(constraintsErrors)) {\n throw {errorCode: MediaRequestErrorCode.Overconstrained, message: errorName};\n }\n\n throw {errorCode: MediaRequestErrorCode.GeneralError, message: errorName};\n }\n}\n\nfunction _constraintByType(value: any, type: ConstraintType): any {\n switch (type) {\n case ConstraintType.MIN:\n return {min: value};\n default:\n return {ideal: value};\n }\n}\n"]}
|