@techsee/techsee-media-service 0.6.0 → 0.6.1-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/lib/LocalStreamManager.d.ts +21 -0
  2. package/lib/LocalStreamManager.d.ts.map +1 -0
  3. package/lib/LocalStreamManager.js +268 -0
  4. package/lib/LocalStreamManager.js.map +1 -0
  5. package/lib/MediaConstants.d.ts +52 -0
  6. package/lib/MediaConstants.d.ts.map +1 -0
  7. package/lib/MediaConstants.js +68 -0
  8. package/lib/MediaConstants.js.map +1 -0
  9. package/lib/MediaContracts.d.ts +122 -0
  10. package/lib/MediaContracts.d.ts.map +1 -0
  11. package/lib/MediaContracts.js +6 -0
  12. package/lib/MediaContracts.js.map +1 -0
  13. package/lib/MediaPublisher.d.ts +14 -0
  14. package/lib/MediaPublisher.d.ts.map +1 -0
  15. package/lib/MediaPublisher.js +43 -0
  16. package/lib/MediaPublisher.js.map +1 -0
  17. package/lib/MediaServiceBase.d.ts +64 -0
  18. package/lib/MediaServiceBase.d.ts.map +1 -0
  19. package/lib/MediaServiceBase.js +591 -0
  20. package/lib/MediaServiceBase.js.map +1 -0
  21. package/lib/MediaSession/SessionOpentok.v3.d.ts +33 -0
  22. package/lib/MediaSession/SessionOpentok.v3.d.ts.map +1 -0
  23. package/lib/MediaSession/SessionOpentok.v3.js +287 -0
  24. package/lib/MediaSession/SessionOpentok.v3.js.map +1 -0
  25. package/lib/MediaSession/SessionTurn.v3.d.ts +42 -0
  26. package/lib/MediaSession/SessionTurn.v3.d.ts.map +1 -0
  27. package/lib/MediaSession/SessionTurn.v3.js +442 -0
  28. package/lib/MediaSession/SessionTurn.v3.js.map +1 -0
  29. package/lib/MediaSession/TurnConstants.d.ts +18 -0
  30. package/lib/MediaSession/TurnConstants.d.ts.map +1 -0
  31. package/lib/MediaSession/TurnConstants.js +36 -0
  32. package/lib/MediaSession/TurnConstants.js.map +1 -0
  33. package/lib/MediaSubscriber.d.ts +35 -0
  34. package/lib/MediaSubscriber.d.ts.map +1 -0
  35. package/lib/MediaSubscriber.js +202 -0
  36. package/lib/MediaSubscriber.js.map +1 -0
  37. package/lib/MediaUtils/Compatibility.d.ts +11 -0
  38. package/lib/MediaUtils/Compatibility.d.ts.map +1 -0
  39. package/lib/MediaUtils/Compatibility.js +71 -0
  40. package/lib/MediaUtils/Compatibility.js.map +1 -0
  41. package/lib/MediaUtils/MediaDomUtils.d.ts +4 -0
  42. package/lib/MediaUtils/MediaDomUtils.d.ts.map +1 -0
  43. package/lib/MediaUtils/MediaDomUtils.js +200 -0
  44. package/lib/MediaUtils/MediaDomUtils.js.map +1 -0
  45. package/lib/MediaUtils/MediaTracer.d.ts +3 -0
  46. package/lib/MediaUtils/MediaTracer.d.ts.map +1 -0
  47. package/lib/MediaUtils/MediaTracer.js +12 -0
  48. package/lib/MediaUtils/MediaTracer.js.map +1 -0
  49. package/lib/TechseeMediaStream.d.ts +14 -0
  50. package/lib/TechseeMediaStream.d.ts.map +1 -0
  51. package/lib/TechseeMediaStream.js +58 -0
  52. package/lib/TechseeMediaStream.js.map +1 -0
  53. package/lib/oldCode/constants.js.map +1 -0
  54. package/lib/oldCode/event-emitter.js.map +1 -0
  55. package/lib/oldCode/index.js.map +1 -0
  56. package/lib/oldCode/opentok/session.js.map +1 -0
  57. package/lib/oldCode/opentok/stream.js.map +1 -0
  58. package/lib/oldCode/publisher.js.map +1 -0
  59. package/lib/oldCode/qos/raw-qos.js.map +1 -0
  60. package/lib/oldCode/service.js.map +1 -0
  61. package/lib/oldCode/session.js.map +1 -0
  62. package/lib/oldCode/stream.js.map +1 -0
  63. package/lib/oldCode/subscriber.js.map +1 -0
  64. package/lib/oldCode/tracer.d.ts.map +1 -0
  65. package/lib/oldCode/tracer.js.map +1 -0
  66. package/lib/oldCode/utils/ImageFixer.d.ts.map +1 -0
  67. package/lib/oldCode/utils/ImageFixer.js.map +1 -0
  68. package/lib/oldCode/webrtc/constants.js.map +1 -0
  69. package/lib/oldCode/webrtc/helper.js.map +1 -0
  70. package/lib/oldCode/webrtc/session-kms.js.map +1 -0
  71. package/lib/oldCode/webrtc/session-loopback.js.map +1 -0
  72. package/lib/oldCode/webrtc/session-turn.js.map +1 -0
  73. package/lib/{webrtc → oldCode/webrtc}/session-turn.v2.js +0 -2
  74. package/lib/oldCode/webrtc/session-turn.v2.js.map +1 -0
  75. package/lib/oldCode/webrtc/session.js.map +1 -0
  76. package/lib/oldCode/webrtc/stream.js.map +1 -0
  77. package/lib/oldCode/webrtc/temasys/adapter-loader.js.map +1 -0
  78. package/lib/oldCode/webrtc/temasys/adapter.js.map +1 -0
  79. package/lib/oldCode/webrtc/webrtc-ie-shim.js.map +1 -0
  80. package/lib/webrtc-ie-shim.js +3218 -0
  81. package/lib/webrtc-ie-shim.js.map +1 -0
  82. package/package.json +4 -4
  83. package/lib/constants.js.map +0 -1
  84. package/lib/event-emitter.js.map +0 -1
  85. package/lib/index.js.map +0 -1
  86. package/lib/opentok/session.js.map +0 -1
  87. package/lib/opentok/stream.js.map +0 -1
  88. package/lib/publisher.js.map +0 -1
  89. package/lib/qos/raw-qos.js.map +0 -1
  90. package/lib/service.js.map +0 -1
  91. package/lib/session.js.map +0 -1
  92. package/lib/stream.js.map +0 -1
  93. package/lib/subscriber.js.map +0 -1
  94. package/lib/tracer.d.ts.map +0 -1
  95. package/lib/tracer.js.map +0 -1
  96. package/lib/utils/ImageFixer.d.ts.map +0 -1
  97. package/lib/utils/ImageFixer.js.map +0 -1
  98. package/lib/webrtc/constants.js.map +0 -1
  99. package/lib/webrtc/helper.js.map +0 -1
  100. package/lib/webrtc/session-kms.js.map +0 -1
  101. package/lib/webrtc/session-loopback.js.map +0 -1
  102. package/lib/webrtc/session-turn.js.map +0 -1
  103. package/lib/webrtc/session-turn.v2.js.map +0 -1
  104. package/lib/webrtc/session.js.map +0 -1
  105. package/lib/webrtc/stream.js.map +0 -1
  106. package/lib/webrtc/temasys/adapter-loader.js.map +0 -1
  107. package/lib/webrtc/temasys/adapter.js.map +0 -1
  108. package/lib/webrtc/webrtc-ie-shim.js.map +0 -1
  109. /package/lib/{constants.js → oldCode/constants.js} +0 -0
  110. /package/lib/{event-emitter.js → oldCode/event-emitter.js} +0 -0
  111. /package/lib/{index.js → oldCode/index.js} +0 -0
  112. /package/lib/{opentok → oldCode/opentok}/session.js +0 -0
  113. /package/lib/{opentok → oldCode/opentok}/stream.js +0 -0
  114. /package/lib/{publisher.js → oldCode/publisher.js} +0 -0
  115. /package/lib/{qos → oldCode/qos}/raw-qos.js +0 -0
  116. /package/lib/{service.js → oldCode/service.js} +0 -0
  117. /package/lib/{session.js → oldCode/session.js} +0 -0
  118. /package/lib/{stream.js → oldCode/stream.js} +0 -0
  119. /package/lib/{subscriber.js → oldCode/subscriber.js} +0 -0
  120. /package/lib/{tracer.d.ts → oldCode/tracer.d.ts} +0 -0
  121. /package/lib/{tracer.js → oldCode/tracer.js} +0 -0
  122. /package/lib/{utils → oldCode/utils}/ImageFixer.d.ts +0 -0
  123. /package/lib/{utils → oldCode/utils}/ImageFixer.js +0 -0
  124. /package/lib/{webrtc → oldCode/webrtc}/constants.js +0 -0
  125. /package/lib/{webrtc → oldCode/webrtc}/helper.js +0 -0
  126. /package/lib/{webrtc → oldCode/webrtc}/session-kms.js +0 -0
  127. /package/lib/{webrtc → oldCode/webrtc}/session-loopback.js +0 -0
  128. /package/lib/{webrtc → oldCode/webrtc}/session-turn.js +0 -0
  129. /package/lib/{webrtc → oldCode/webrtc}/session.js +0 -0
  130. /package/lib/{webrtc → oldCode/webrtc}/stream.js +0 -0
  131. /package/lib/{webrtc → oldCode/webrtc}/temasys/adapter-loader.js +0 -0
  132. /package/lib/{webrtc → oldCode/webrtc}/temasys/adapter.js +0 -0
  133. /package/lib/{webrtc → oldCode/webrtc}/webrtc-ie-shim.js +0 -0
@@ -0,0 +1,21 @@
1
+ import { Nullable } from '@techsee/techsee-common';
2
+ import { LocalMediaConstraints, LocalVideoStreamConstraints, MediaRequestSuccessResult, IMediaEnvironment } from './MediaContracts';
3
+ declare global {
4
+ interface Window {
5
+ latestUserMediaStream: Nullable<MediaRequestSuccessResult>;
6
+ latestDesktopMediaStream: Nullable<MediaRequestSuccessResult>;
7
+ }
8
+ }
9
+ export declare class LocalStreamManager {
10
+ private environment;
11
+ constructor(environment: IMediaEnvironment);
12
+ getUserMediaStream(constraints: LocalMediaConstraints): Promise<MediaRequestSuccessResult>;
13
+ getDesktopMediaStream(constraints: LocalVideoStreamConstraints): Promise<MediaRequestSuccessResult>;
14
+ destroyUserMediaStream(): Promise<void>;
15
+ destroyDesktopMediaStream(): Promise<void>;
16
+ clearAllStreams(): Promise<void>;
17
+ private getHighestResolutionStream;
18
+ private getStreamPromiseByParsedConstraints;
19
+ private getParsedConstraints;
20
+ private parseMediaErrorThenThrow;
21
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/LocalStreamManager.ts"],"names":[],"mappings":"AAGA,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';\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"]}
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+
3
+ var __assign = undefined && undefined.__assign || function () {
4
+ __assign = Object.assign || function (t) {
5
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6
+ s = arguments[i];
7
+ for (var p in s) {
8
+ if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
9
+ }
10
+ }
11
+ return t;
12
+ };
13
+ return __assign.apply(this, arguments);
14
+ };
15
+ var __importDefault = undefined && undefined.__importDefault || function (mod) {
16
+ return mod && mod.__esModule ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ var assign_1 = __importDefault(require("lodash/assign"));
20
+ var get_1 = __importDefault(require("lodash/get"));
21
+ var MediaConstants_1 = require("./MediaConstants");
22
+ window.latestUserMediaStream = null;
23
+ var userMediaPromise = null;
24
+ window.latestDesktopMediaStream = null;
25
+ var desktopMediaPromise = null;
26
+ var MediaTracer_1 = require("./MediaUtils/MediaTracer");
27
+ var trace = MediaTracer_1.getMediaTracer('LocalStreamManager');
28
+ var LocalStreamManager = /** @class */function () {
29
+ function LocalStreamManager(environment) {
30
+ this.environment = environment;
31
+ this.parseMediaErrorThenThrow = this.parseMediaErrorThenThrow.bind(this);
32
+ this.clearAllStreams = this.clearAllStreams.bind(this);
33
+ }
34
+ LocalStreamManager.prototype.getUserMediaStream = function (constraints) {
35
+ var _this = this;
36
+ trace.info('getUserMediaStream', constraints);
37
+ if (userMediaPromise) {
38
+ return userMediaPromise;
39
+ }
40
+ if (window.latestUserMediaStream) {
41
+ var videoTrack = window.latestUserMediaStream.mediaStream.getVideoTracks();
42
+ if (videoTrack.length > 0 && videoTrack[0].readyState === 'live') {
43
+ return Promise.resolve(__assign({}, window.latestUserMediaStream, { isNew: false }));
44
+ }
45
+ this.destroyUserMediaStream();
46
+ }
47
+ userMediaPromise = new Promise(function (resolve, reject) {
48
+ var catchHandler = function catchHandler(err) {
49
+ userMediaPromise = null;
50
+ window.latestUserMediaStream = null;
51
+ trace.error('getUserMedia error', err);
52
+ reject(err);
53
+ };
54
+ try {
55
+ _this.getHighestResolutionStream(false, constraints).then(function (streamResult) {
56
+ userMediaPromise = null;
57
+ window.latestUserMediaStream = streamResult;
58
+ resolve(__assign({}, window.latestUserMediaStream, { isNew: true }));
59
+ }).catch(catchHandler);
60
+ } catch (err) {
61
+ catchHandler(err);
62
+ }
63
+ });
64
+ return userMediaPromise;
65
+ };
66
+ LocalStreamManager.prototype.getDesktopMediaStream = function (constraints) {
67
+ var _this = this;
68
+ if (desktopMediaPromise) {
69
+ return desktopMediaPromise;
70
+ }
71
+ if (window.latestDesktopMediaStream) {
72
+ var track = window.latestDesktopMediaStream.mediaStream.getVideoTracks();
73
+ if (track.length > 0 && track[0].readyState === 'live') {
74
+ //return Promise.resolve();
75
+ return Promise.resolve(__assign({}, window.latestDesktopMediaStream, { isNew: false }));
76
+ }
77
+ this.destroyDesktopMediaStream().catch(function (error) {
78
+ trace.error('Error destroying desktop media stream', error);
79
+ });
80
+ }
81
+ desktopMediaPromise = new Promise(function (resolve, reject) {
82
+ var mediaCatchHandler = function mediaCatchHandler(err) {
83
+ desktopMediaPromise = null;
84
+ window.latestDesktopMediaStream = null;
85
+ trace.error('getDisplayMedia error', err);
86
+ reject(err);
87
+ };
88
+ try {
89
+ _this.getHighestResolutionStream(true, { video: constraints, audio: false }).then(function (streamResult) {
90
+ desktopMediaPromise = null;
91
+ window.latestDesktopMediaStream = streamResult;
92
+ resolve(__assign({}, window.latestDesktopMediaStream, { isNew: true }));
93
+ }).catch(mediaCatchHandler);
94
+ } catch (err) {
95
+ mediaCatchHandler(err);
96
+ }
97
+ });
98
+ return desktopMediaPromise;
99
+ };
100
+ LocalStreamManager.prototype.destroyUserMediaStream = function () {
101
+ var streamResult = window.latestUserMediaStream;
102
+ window.latestUserMediaStream = null;
103
+ userMediaPromise = null;
104
+ if (streamResult) {
105
+ streamResult.mediaStream.getTracks().forEach(function (track) {
106
+ track.stop();
107
+ });
108
+ }
109
+ return Promise.resolve();
110
+ };
111
+ LocalStreamManager.prototype.destroyDesktopMediaStream = function () {
112
+ var streamResult = window.latestDesktopMediaStream;
113
+ window.latestDesktopMediaStream = null;
114
+ desktopMediaPromise = null;
115
+ if (streamResult) {
116
+ streamResult.mediaStream.getTracks().forEach(function (track) {
117
+ track.stop();
118
+ });
119
+ }
120
+ return Promise.resolve();
121
+ };
122
+ LocalStreamManager.prototype.clearAllStreams = function () {
123
+ trace.info('LocalStreamManager Clearing all streams');
124
+ return Promise.all([this.destroyDesktopMediaStream(), this.destroyUserMediaStream()]).then(function () {
125
+ return undefined;
126
+ });
127
+ };
128
+ LocalStreamManager.prototype.getHighestResolutionStream = function (isDesktopMedia, constraints) {
129
+ var _this = this;
130
+ var constraintsCandidates = this.getParsedConstraints(isDesktopMedia, constraints);
131
+ if (constraintsCandidates.length === 0) {
132
+ return Promise.reject(new Error('No constraints to retrieve the stream'));
133
+ }
134
+ return new Promise(function (resolve, reject) {
135
+ var lastSuccessfulResult = null;
136
+ var lastFailedResult = null;
137
+ var isStreamRequestFulfilled = false;
138
+ Promise.reduce(constraintsCandidates, function (total, candidate) {
139
+ if (isStreamRequestFulfilled) {
140
+ return;
141
+ }
142
+ var constraintType = get_1.default(constraints, 'video.videoResolution.constraintType') || get_1.default(constraints, 'video.videoResolution[0].constraintType');
143
+ return _this.getStreamPromiseByParsedConstraints(candidate, isDesktopMedia).then(function (stream) {
144
+ lastSuccessfulResult = {
145
+ mediaStream: stream,
146
+ constraint: candidate,
147
+ constraintType: constraintType,
148
+ isNew: true
149
+ };
150
+ trace.info('getHighestResolutionStream Success', lastSuccessfulResult);
151
+ isStreamRequestFulfilled = true;
152
+ resolve(lastSuccessfulResult);
153
+ }).catch(function (failResult) {
154
+ lastFailedResult = failResult;
155
+ if (lastFailedResult.errorCode === MediaConstants_1.MediaRequestErrorCode.PermissionDenied) {
156
+ isStreamRequestFulfilled = true;
157
+ reject(lastFailedResult);
158
+ }
159
+ });
160
+ }, 0).then(function () {
161
+ if (!isStreamRequestFulfilled) {
162
+ if (!lastFailedResult) {
163
+ lastFailedResult = {
164
+ errorCode: MediaConstants_1.MediaRequestErrorCode.GeneralError,
165
+ message: 'Suitable stream cannot be created'
166
+ };
167
+ }
168
+ reject(lastFailedResult);
169
+ }
170
+ });
171
+ });
172
+ };
173
+ //@ts-ignore
174
+ LocalStreamManager.prototype.getStreamPromiseByParsedConstraints = function (constraints, isDesktopMedia) {
175
+ var streamPromise = null;
176
+ trace.info('getStreamPromiseByParsedConstraints', constraints);
177
+ try {
178
+ if (!isDesktopMedia) {
179
+ streamPromise = navigator.mediaDevices.getUserMedia(constraints);
180
+ } else {
181
+ //@ts-ignore
182
+ streamPromise = navigator.mediaDevices.getDisplayMedia
183
+ //@ts-ignore
184
+ ? navigator.mediaDevices.getDisplayMedia(constraints) : navigator.getDisplayMedia(constraints);
185
+ }
186
+ return streamPromise.catch(this.parseMediaErrorThenThrow);
187
+ } catch (e) {
188
+ this.parseMediaErrorThenThrow(e);
189
+ }
190
+ };
191
+ LocalStreamManager.prototype.getParsedConstraints = function (isDesktopMedia, streamConstraints) {
192
+ var constraintCandidates = [];
193
+ //TODO - Alex: need to understand which constraints not compatible with screen share
194
+ if (isDesktopMedia) {
195
+ return [{ video: true }];
196
+ }
197
+ if (!streamConstraints) {
198
+ return constraintCandidates;
199
+ }
200
+ var baseConstraints = {};
201
+ baseConstraints.audio = typeof streamConstraints.audio === 'boolean' ? streamConstraints.audio : undefined;
202
+ if (!streamConstraints.video) {
203
+ return [baseConstraints];
204
+ }
205
+ baseConstraints.video = {
206
+ facingMode: 'environment',
207
+ frameRate: { ideal: 15, max: 30 }
208
+ };
209
+ var assignConstraint = function assignConstraint(videoResolution) {
210
+ var _a = videoResolution.resolution.split('x'),
211
+ width = _a[0],
212
+ height = _a[1];
213
+ var constraintCandidate = assign_1.default({}, baseConstraints);
214
+ constraintCandidate.video = assign_1.default({}, baseConstraints.video, {
215
+ width: _constraintByType(width, videoResolution.constraintType),
216
+ height: _constraintByType(height, videoResolution.constraintType)
217
+ });
218
+ constraintCandidates.push(constraintCandidate);
219
+ };
220
+ if (baseConstraints.video && typeof streamConstraints.video === 'boolean' || !(streamConstraints.video.videoResolution instanceof Array)) {
221
+ var defaultResolution = {
222
+ resolution: MediaConstants_1.DEFAULT_VIDEO_RESOLUTION,
223
+ constraintType: MediaConstants_1.DEFAULT_VIDEO_CONSTRAINT_TYPE
224
+ };
225
+ assignConstraint(defaultResolution);
226
+ return constraintCandidates;
227
+ }
228
+ streamConstraints.video.videoResolution.forEach(assignConstraint);
229
+ return constraintCandidates;
230
+ };
231
+ LocalStreamManager.prototype.parseMediaErrorThenThrow = function (error) {
232
+ trace.error('Get media stream error.', error);
233
+ var errorName = error && error.name ? error.name : '';
234
+ var permissionErrorNames = ['NotAllowedError', 'PermissionDismissedError', 'PermissionDeniedError'];
235
+ // const generalError = [
236
+ // 'NotFoundError',
237
+ // 'DevicesNotFoundError',
238
+ // 'NotReadableError',
239
+ // 'TrackStartError'
240
+ // ];
241
+ var constraintsErrors = ['OverconstrainedError', 'ConstraintNotSatisfiedError'];
242
+ var isErrorOfType = function isErrorOfType(errorsArr) {
243
+ return errorsArr.filter(function (err) {
244
+ return err === errorName;
245
+ }).length > 0;
246
+ };
247
+ if (isErrorOfType(permissionErrorNames)) {
248
+ throw { errorCode: MediaConstants_1.MediaRequestErrorCode.PermissionDenied, message: errorName };
249
+ }
250
+ if (isErrorOfType(constraintsErrors)) {
251
+ throw { errorCode: MediaConstants_1.MediaRequestErrorCode.Overconstrained, message: errorName };
252
+ }
253
+ throw { errorCode: MediaConstants_1.MediaRequestErrorCode.GeneralError, message: errorName };
254
+ };
255
+ return LocalStreamManager;
256
+ }();
257
+ exports.LocalStreamManager = LocalStreamManager;
258
+ function _constraintByType(value, type) {
259
+ switch (type) {
260
+ case MediaConstants_1.ConstraintType.MIN:
261
+ return { min: value };
262
+ default:
263
+ return { ideal: value };
264
+ }
265
+ }
266
+
267
+ //# sourceMappingURL=LocalStreamManager.js.map
268
+ //# sourceMappingURL=LocalStreamManager.js.map
@@ -0,0 +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","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 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 Promise.resolve(__assign({}, window.latestUserMediaStream, { isNew: false }));\n }\n this.destroyUserMediaStream();\n }\n userMediaPromise = new 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 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 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 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 Promise.resolve();\n };\n LocalStreamManager.prototype.clearAllStreams = function () {\n trace.info('LocalStreamManager Clearing all streams');\n return 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 Promise.reject(new Error('No constraints to retrieve the stream'));\n }\n return new Promise(function (resolve, reject) {\n var lastSuccessfulResult = null;\n var lastFailedResult = null;\n var isStreamRequestFulfilled = false;\n 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';\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"]}
@@ -0,0 +1,52 @@
1
+ export declare enum LocalVideoSourceType {
2
+ CAMERA = "CAMERA",
3
+ DESKTOP_SHARE = "DESKTOP_SHARE"
4
+ }
5
+ export declare enum ConstraintType {
6
+ MIN = "min",
7
+ IDEAL = "ideal"
8
+ }
9
+ export declare enum MediaServiceType {
10
+ OPENTOK = "OPENTOK",
11
+ TURNSERVER = "TURN_SERVER"
12
+ }
13
+ export declare enum SessionClientRole {
14
+ AGENT = "AGENT",
15
+ OBSERVER = "OBSERVER",
16
+ USER = "USER"
17
+ }
18
+ export declare enum SessionClientType {
19
+ INITIATOR = "publisher",
20
+ GUEST = "subscriber"
21
+ }
22
+ export declare enum MediaRequestErrorCode {
23
+ Overconstrained = "Overconstrained",
24
+ PermissionDenied = "PermissionDenied",
25
+ GeneralError = "GeneralError"
26
+ }
27
+ export declare enum KnownMediaStreamKind {
28
+ Audio = "audio",
29
+ Video = "video"
30
+ }
31
+ export declare enum KnownMediaStream {
32
+ AGENT_AUDIO_STREAM = "DASHBOARD_AUDIO_STREAM",
33
+ USER_AUDIO_STREAM = "MOBILE_CLIENT_AUDIO_STREAM",
34
+ USER_VIDEO_STREAM = "MOBILE_CLIENT_VIDEO_STREAM",
35
+ USER_SCREEN_SHARE_STREAM = "USER_SCREEN_SHARE_STREAM"
36
+ }
37
+ export declare enum MediaSessionDisconnectReason {
38
+ UserPeerReconnected = "UserPeerReconnected",
39
+ PublishedStreamDestroyed = "PublishedStreamDestroyed",
40
+ PeerDisconnected = "PeerDisconnected",
41
+ PeerConnectionInterrupted = "PeerConnectionFailed",
42
+ ForcedByConsumer = "ForcedByConsumer",
43
+ SignalingChannelDisconnect = "SignalingChannelDisconnect"
44
+ }
45
+ export declare enum MediaStreamUnregisterReason {
46
+ NativeEvent = "NativeEvent",
47
+ ReplacingStream = "ReplacingStream",
48
+ ClosedRemotely = "ClosedRemotely",
49
+ ServiceCleanUp = "ServiceCleanUp"
50
+ }
51
+ export declare const DEFAULT_VIDEO_RESOLUTION = "640x480";
52
+ export declare const DEFAULT_VIDEO_CONSTRAINT_TYPE = ConstraintType.IDEAL;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/MediaConstants.ts"],"names":[],"mappings":"AAAA,oBAAY,oBAAoB;IAC5B,MAAM,WAAW;IACjB,aAAa,kBAAkB;CAClC;AAED,oBAAY,cAAc;IACtB,GAAG,QAAQ;IACX,KAAK,UAAU;CAClB;AAED,oBAAY,gBAAgB;IACxB,OAAO,YAAY;IACnB,UAAU,gBAAgB;CAC7B;AAED,oBAAY,iBAAiB;IACzB,KAAK,UAAU;IACf,QAAQ,aAAa;IACrB,IAAI,SAAS;CAChB;AAED,oBAAY,iBAAiB;IACzB,SAAS,cAAc;IACvB,KAAK,eAAe;CACvB;AAED,oBAAY,qBAAqB;IAC7B,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;CAChC;AAED,oBAAY,oBAAoB;IAC5B,KAAK,UAAU;IACf,KAAK,UAAU;CAClB;AAED,oBAAY,gBAAgB;IACxB,kBAAkB,2BAA2B;IAC7C,iBAAiB,+BAA+B;IAChD,iBAAiB,+BAA+B;IAChD,wBAAwB,6BAA6B;CACxD;AAED,oBAAY,4BAA4B;IACpC,mBAAmB,wBAAwB;IAC3C,wBAAwB,6BAA6B;IACrD,gBAAgB,qBAAqB;IACrC,yBAAyB,yBAAyB;IAClD,gBAAgB,qBAAqB;IACrC,0BAA0B,+BAA+B;CAC5D;AAED,oBAAY,2BAA2B;IACnC,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;CACpC;AAED,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAClD,eAAO,MAAM,6BAA6B,uBAAuB,CAAC","file":"MediaConstants.d.ts","sourcesContent":["export enum LocalVideoSourceType {\n CAMERA = 'CAMERA',\n DESKTOP_SHARE = 'DESKTOP_SHARE'\n}\n\nexport enum ConstraintType {\n MIN = 'min',\n IDEAL = 'ideal'\n}\n\nexport enum MediaServiceType {\n OPENTOK = 'OPENTOK',\n TURNSERVER = 'TURN_SERVER'\n}\n\nexport enum SessionClientRole {\n AGENT = 'AGENT',\n OBSERVER = 'OBSERVER',\n USER = 'USER'\n}\n\nexport enum SessionClientType {\n INITIATOR = 'publisher',\n GUEST = 'subscriber'\n}\n\nexport enum MediaRequestErrorCode {\n Overconstrained = 'Overconstrained',\n PermissionDenied = 'PermissionDenied',\n GeneralError = 'GeneralError'\n}\n\nexport enum KnownMediaStreamKind {\n Audio = 'audio',\n Video = 'video'\n}\n\nexport enum KnownMediaStream {\n AGENT_AUDIO_STREAM = 'DASHBOARD_AUDIO_STREAM',\n USER_AUDIO_STREAM = 'MOBILE_CLIENT_AUDIO_STREAM',\n USER_VIDEO_STREAM = 'MOBILE_CLIENT_VIDEO_STREAM',\n USER_SCREEN_SHARE_STREAM = 'USER_SCREEN_SHARE_STREAM'\n}\n\nexport enum MediaSessionDisconnectReason {\n UserPeerReconnected = 'UserPeerReconnected',\n PublishedStreamDestroyed = 'PublishedStreamDestroyed',\n PeerDisconnected = 'PeerDisconnected',\n PeerConnectionInterrupted = 'PeerConnectionFailed',\n ForcedByConsumer = 'ForcedByConsumer',\n SignalingChannelDisconnect = 'SignalingChannelDisconnect'\n}\n\nexport enum MediaStreamUnregisterReason {\n NativeEvent = 'NativeEvent',\n ReplacingStream = 'ReplacingStream',\n ClosedRemotely = 'ClosedRemotely',\n ServiceCleanUp = 'ServiceCleanUp'\n}\n\nexport const DEFAULT_VIDEO_RESOLUTION = '640x480';\nexport const DEFAULT_VIDEO_CONSTRAINT_TYPE = ConstraintType.IDEAL;\n"]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ var LocalVideoSourceType;
5
+ (function (LocalVideoSourceType) {
6
+ LocalVideoSourceType["CAMERA"] = "CAMERA";
7
+ LocalVideoSourceType["DESKTOP_SHARE"] = "DESKTOP_SHARE";
8
+ })(LocalVideoSourceType = exports.LocalVideoSourceType || (exports.LocalVideoSourceType = {}));
9
+ var ConstraintType;
10
+ (function (ConstraintType) {
11
+ ConstraintType["MIN"] = "min";
12
+ ConstraintType["IDEAL"] = "ideal";
13
+ })(ConstraintType = exports.ConstraintType || (exports.ConstraintType = {}));
14
+ var MediaServiceType;
15
+ (function (MediaServiceType) {
16
+ MediaServiceType["OPENTOK"] = "OPENTOK";
17
+ MediaServiceType["TURNSERVER"] = "TURN_SERVER";
18
+ })(MediaServiceType = exports.MediaServiceType || (exports.MediaServiceType = {}));
19
+ var SessionClientRole;
20
+ (function (SessionClientRole) {
21
+ SessionClientRole["AGENT"] = "AGENT";
22
+ SessionClientRole["OBSERVER"] = "OBSERVER";
23
+ SessionClientRole["USER"] = "USER";
24
+ })(SessionClientRole = exports.SessionClientRole || (exports.SessionClientRole = {}));
25
+ var SessionClientType;
26
+ (function (SessionClientType) {
27
+ SessionClientType["INITIATOR"] = "publisher";
28
+ SessionClientType["GUEST"] = "subscriber";
29
+ })(SessionClientType = exports.SessionClientType || (exports.SessionClientType = {}));
30
+ var MediaRequestErrorCode;
31
+ (function (MediaRequestErrorCode) {
32
+ MediaRequestErrorCode["Overconstrained"] = "Overconstrained";
33
+ MediaRequestErrorCode["PermissionDenied"] = "PermissionDenied";
34
+ MediaRequestErrorCode["GeneralError"] = "GeneralError";
35
+ })(MediaRequestErrorCode = exports.MediaRequestErrorCode || (exports.MediaRequestErrorCode = {}));
36
+ var KnownMediaStreamKind;
37
+ (function (KnownMediaStreamKind) {
38
+ KnownMediaStreamKind["Audio"] = "audio";
39
+ KnownMediaStreamKind["Video"] = "video";
40
+ })(KnownMediaStreamKind = exports.KnownMediaStreamKind || (exports.KnownMediaStreamKind = {}));
41
+ var KnownMediaStream;
42
+ (function (KnownMediaStream) {
43
+ KnownMediaStream["AGENT_AUDIO_STREAM"] = "DASHBOARD_AUDIO_STREAM";
44
+ KnownMediaStream["USER_AUDIO_STREAM"] = "MOBILE_CLIENT_AUDIO_STREAM";
45
+ KnownMediaStream["USER_VIDEO_STREAM"] = "MOBILE_CLIENT_VIDEO_STREAM";
46
+ KnownMediaStream["USER_SCREEN_SHARE_STREAM"] = "USER_SCREEN_SHARE_STREAM";
47
+ })(KnownMediaStream = exports.KnownMediaStream || (exports.KnownMediaStream = {}));
48
+ var MediaSessionDisconnectReason;
49
+ (function (MediaSessionDisconnectReason) {
50
+ MediaSessionDisconnectReason["UserPeerReconnected"] = "UserPeerReconnected";
51
+ MediaSessionDisconnectReason["PublishedStreamDestroyed"] = "PublishedStreamDestroyed";
52
+ MediaSessionDisconnectReason["PeerDisconnected"] = "PeerDisconnected";
53
+ MediaSessionDisconnectReason["PeerConnectionInterrupted"] = "PeerConnectionFailed";
54
+ MediaSessionDisconnectReason["ForcedByConsumer"] = "ForcedByConsumer";
55
+ MediaSessionDisconnectReason["SignalingChannelDisconnect"] = "SignalingChannelDisconnect";
56
+ })(MediaSessionDisconnectReason = exports.MediaSessionDisconnectReason || (exports.MediaSessionDisconnectReason = {}));
57
+ var MediaStreamUnregisterReason;
58
+ (function (MediaStreamUnregisterReason) {
59
+ MediaStreamUnregisterReason["NativeEvent"] = "NativeEvent";
60
+ MediaStreamUnregisterReason["ReplacingStream"] = "ReplacingStream";
61
+ MediaStreamUnregisterReason["ClosedRemotely"] = "ClosedRemotely";
62
+ MediaStreamUnregisterReason["ServiceCleanUp"] = "ServiceCleanUp";
63
+ })(MediaStreamUnregisterReason = exports.MediaStreamUnregisterReason || (exports.MediaStreamUnregisterReason = {}));
64
+ exports.DEFAULT_VIDEO_RESOLUTION = '640x480';
65
+ exports.DEFAULT_VIDEO_CONSTRAINT_TYPE = ConstraintType.IDEAL;
66
+
67
+ //# sourceMappingURL=MediaConstants.js.map
68
+ //# sourceMappingURL=MediaConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["MediaConstants.js","../src/MediaConstants.ts"],"names":["Object","defineProperty","exports","value","LocalVideoSourceType","ConstraintType","MediaServiceType","SessionClientRole","SessionClientType","MediaRequestErrorCode","KnownMediaStreamKind","KnownMediaStream","MediaSessionDisconnectReason","MediaStreamUnregisterReason","DEFAULT_VIDEO_RESOLUTION","DEFAULT_VIDEO_CONSTRAINT_TYPE","IDEAL"],"mappings":"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","file":"MediaConstants.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LocalVideoSourceType;\n(function (LocalVideoSourceType) {\n LocalVideoSourceType[\"CAMERA\"] = \"CAMERA\";\n LocalVideoSourceType[\"DESKTOP_SHARE\"] = \"DESKTOP_SHARE\";\n})(LocalVideoSourceType = exports.LocalVideoSourceType || (exports.LocalVideoSourceType = {}));\nvar ConstraintType;\n(function (ConstraintType) {\n ConstraintType[\"MIN\"] = \"min\";\n ConstraintType[\"IDEAL\"] = \"ideal\";\n})(ConstraintType = exports.ConstraintType || (exports.ConstraintType = {}));\nvar MediaServiceType;\n(function (MediaServiceType) {\n MediaServiceType[\"OPENTOK\"] = \"OPENTOK\";\n MediaServiceType[\"TURNSERVER\"] = \"TURN_SERVER\";\n})(MediaServiceType = exports.MediaServiceType || (exports.MediaServiceType = {}));\nvar SessionClientRole;\n(function (SessionClientRole) {\n SessionClientRole[\"AGENT\"] = \"AGENT\";\n SessionClientRole[\"OBSERVER\"] = \"OBSERVER\";\n SessionClientRole[\"USER\"] = \"USER\";\n})(SessionClientRole = exports.SessionClientRole || (exports.SessionClientRole = {}));\nvar SessionClientType;\n(function (SessionClientType) {\n SessionClientType[\"INITIATOR\"] = \"publisher\";\n SessionClientType[\"GUEST\"] = \"subscriber\";\n})(SessionClientType = exports.SessionClientType || (exports.SessionClientType = {}));\nvar MediaRequestErrorCode;\n(function (MediaRequestErrorCode) {\n MediaRequestErrorCode[\"Overconstrained\"] = \"Overconstrained\";\n MediaRequestErrorCode[\"PermissionDenied\"] = \"PermissionDenied\";\n MediaRequestErrorCode[\"GeneralError\"] = \"GeneralError\";\n})(MediaRequestErrorCode = exports.MediaRequestErrorCode || (exports.MediaRequestErrorCode = {}));\nvar KnownMediaStreamKind;\n(function (KnownMediaStreamKind) {\n KnownMediaStreamKind[\"Audio\"] = \"audio\";\n KnownMediaStreamKind[\"Video\"] = \"video\";\n})(KnownMediaStreamKind = exports.KnownMediaStreamKind || (exports.KnownMediaStreamKind = {}));\nvar KnownMediaStream;\n(function (KnownMediaStream) {\n KnownMediaStream[\"AGENT_AUDIO_STREAM\"] = \"DASHBOARD_AUDIO_STREAM\";\n KnownMediaStream[\"USER_AUDIO_STREAM\"] = \"MOBILE_CLIENT_AUDIO_STREAM\";\n KnownMediaStream[\"USER_VIDEO_STREAM\"] = \"MOBILE_CLIENT_VIDEO_STREAM\";\n KnownMediaStream[\"USER_SCREEN_SHARE_STREAM\"] = \"USER_SCREEN_SHARE_STREAM\";\n})(KnownMediaStream = exports.KnownMediaStream || (exports.KnownMediaStream = {}));\nvar MediaSessionDisconnectReason;\n(function (MediaSessionDisconnectReason) {\n MediaSessionDisconnectReason[\"UserPeerReconnected\"] = \"UserPeerReconnected\";\n MediaSessionDisconnectReason[\"PublishedStreamDestroyed\"] = \"PublishedStreamDestroyed\";\n MediaSessionDisconnectReason[\"PeerDisconnected\"] = \"PeerDisconnected\";\n MediaSessionDisconnectReason[\"PeerConnectionInterrupted\"] = \"PeerConnectionFailed\";\n MediaSessionDisconnectReason[\"ForcedByConsumer\"] = \"ForcedByConsumer\";\n MediaSessionDisconnectReason[\"SignalingChannelDisconnect\"] = \"SignalingChannelDisconnect\";\n})(MediaSessionDisconnectReason = exports.MediaSessionDisconnectReason || (exports.MediaSessionDisconnectReason = {}));\nvar MediaStreamUnregisterReason;\n(function (MediaStreamUnregisterReason) {\n MediaStreamUnregisterReason[\"NativeEvent\"] = \"NativeEvent\";\n MediaStreamUnregisterReason[\"ReplacingStream\"] = \"ReplacingStream\";\n MediaStreamUnregisterReason[\"ClosedRemotely\"] = \"ClosedRemotely\";\n MediaStreamUnregisterReason[\"ServiceCleanUp\"] = \"ServiceCleanUp\";\n})(MediaStreamUnregisterReason = exports.MediaStreamUnregisterReason || (exports.MediaStreamUnregisterReason = {}));\nexports.DEFAULT_VIDEO_RESOLUTION = '640x480';\nexports.DEFAULT_VIDEO_CONSTRAINT_TYPE = ConstraintType.IDEAL;\n\n//# sourceMappingURL=MediaConstants.js.map\n","export enum LocalVideoSourceType {\n CAMERA = 'CAMERA',\n DESKTOP_SHARE = 'DESKTOP_SHARE'\n}\n\nexport enum ConstraintType {\n MIN = 'min',\n IDEAL = 'ideal'\n}\n\nexport enum MediaServiceType {\n OPENTOK = 'OPENTOK',\n TURNSERVER = 'TURN_SERVER'\n}\n\nexport enum SessionClientRole {\n AGENT = 'AGENT',\n OBSERVER = 'OBSERVER',\n USER = 'USER'\n}\n\nexport enum SessionClientType {\n INITIATOR = 'publisher',\n GUEST = 'subscriber'\n}\n\nexport enum MediaRequestErrorCode {\n Overconstrained = 'Overconstrained',\n PermissionDenied = 'PermissionDenied',\n GeneralError = 'GeneralError'\n}\n\nexport enum KnownMediaStreamKind {\n Audio = 'audio',\n Video = 'video'\n}\n\nexport enum KnownMediaStream {\n AGENT_AUDIO_STREAM = 'DASHBOARD_AUDIO_STREAM',\n USER_AUDIO_STREAM = 'MOBILE_CLIENT_AUDIO_STREAM',\n USER_VIDEO_STREAM = 'MOBILE_CLIENT_VIDEO_STREAM',\n USER_SCREEN_SHARE_STREAM = 'USER_SCREEN_SHARE_STREAM'\n}\n\nexport enum MediaSessionDisconnectReason {\n UserPeerReconnected = 'UserPeerReconnected',\n PublishedStreamDestroyed = 'PublishedStreamDestroyed',\n PeerDisconnected = 'PeerDisconnected',\n PeerConnectionInterrupted = 'PeerConnectionFailed',\n ForcedByConsumer = 'ForcedByConsumer',\n SignalingChannelDisconnect = 'SignalingChannelDisconnect'\n}\n\nexport enum MediaStreamUnregisterReason {\n NativeEvent = 'NativeEvent',\n ReplacingStream = 'ReplacingStream',\n ClosedRemotely = 'ClosedRemotely',\n ServiceCleanUp = 'ServiceCleanUp'\n}\n\nexport const DEFAULT_VIDEO_RESOLUTION = '640x480';\nexport const DEFAULT_VIDEO_CONSTRAINT_TYPE = ConstraintType.IDEAL;\n"]}