@techsee/techsee-media-service 999.0.2-switch → 999.0.3-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/lib/LocalStreamManager.d.ts +12 -0
  2. package/lib/LocalStreamManager.d.ts.map +1 -1
  3. package/lib/LocalStreamManager.js +440 -283
  4. package/lib/LocalStreamManager.js.map +1 -1
  5. package/lib/MediaConstants.d.ts +14 -4
  6. package/lib/MediaConstants.d.ts.map +1 -1
  7. package/lib/MediaConstants.js +83 -38
  8. package/lib/MediaConstants.js.map +1 -1
  9. package/lib/MediaContracts.d.ts +17 -14
  10. package/lib/MediaContracts.d.ts.map +1 -1
  11. package/lib/MediaContracts.js +3 -3
  12. package/lib/MediaContracts.js.map +1 -1
  13. package/lib/MediaPublisher.d.ts +3 -3
  14. package/lib/MediaPublisher.d.ts.map +1 -1
  15. package/lib/MediaPublisher.js +46 -35
  16. package/lib/MediaPublisher.js.map +1 -1
  17. package/lib/MediaServiceBase.d.ts +21 -7
  18. package/lib/MediaServiceBase.d.ts.map +1 -1
  19. package/lib/MediaServiceBase.js +924 -586
  20. package/lib/MediaServiceBase.js.map +1 -1
  21. package/lib/MediaSession/MediaServer.d.ts +45 -0
  22. package/lib/MediaSession/MediaServer.d.ts.map +1 -0
  23. package/lib/MediaSession/MediaServer.js +538 -0
  24. package/lib/MediaSession/MediaServer.js.map +1 -0
  25. package/lib/MediaSession/MediaSessionBase.d.ts +10 -1
  26. package/lib/MediaSession/MediaSessionBase.d.ts.map +1 -1
  27. package/lib/MediaSession/MediaSessionBase.js +128 -66
  28. package/lib/MediaSession/MediaSessionBase.js.map +1 -1
  29. package/lib/MediaSession/SessionOpentok.d.ts +11 -9
  30. package/lib/MediaSession/SessionOpentok.d.ts.map +1 -1
  31. package/lib/MediaSession/SessionOpentok.js +500 -352
  32. package/lib/MediaSession/SessionOpentok.js.map +1 -1
  33. package/lib/MediaSession/SessionTurn.d.ts +4 -1
  34. package/lib/MediaSession/SessionTurn.d.ts.map +1 -1
  35. package/lib/MediaSession/SessionTurn.js +611 -422
  36. package/lib/MediaSession/SessionTurn.js.map +1 -1
  37. package/lib/MediaSession/TurnConstants.js +31 -30
  38. package/lib/MediaSession/TurnConstants.js.map +1 -1
  39. package/lib/MediaSubscriber.d.ts +11 -11
  40. package/lib/MediaSubscriber.d.ts.map +1 -1
  41. package/lib/MediaSubscriber.js +236 -192
  42. package/lib/MediaSubscriber.js.map +1 -1
  43. package/lib/MediaUtils/Compatibility.d.ts +2 -1
  44. package/lib/MediaUtils/Compatibility.d.ts.map +1 -1
  45. package/lib/MediaUtils/Compatibility.js +130 -85
  46. package/lib/MediaUtils/Compatibility.js.map +1 -1
  47. package/lib/MediaUtils/MediaDomUtils.d.ts +3 -2
  48. package/lib/MediaUtils/MediaDomUtils.d.ts.map +1 -1
  49. package/lib/MediaUtils/MediaDomUtils.js +235 -174
  50. package/lib/MediaUtils/MediaDomUtils.js.map +1 -1
  51. package/lib/MediaUtils/MediaTracer.js +9 -4
  52. package/lib/MediaUtils/MediaTracer.js.map +1 -1
  53. package/lib/MediaUtils/index.d.ts +1 -0
  54. package/lib/MediaUtils/index.d.ts.map +1 -0
  55. package/lib/MediaUtils/index.js +16 -0
  56. package/lib/MediaUtils/index.js.map +1 -0
  57. package/lib/MultiParty/Contracts.d.ts +16 -0
  58. package/lib/MultiParty/Contracts.d.ts.map +1 -0
  59. package/lib/MultiParty/Contracts.js +6 -0
  60. package/lib/MultiParty/Contracts.js.map +1 -0
  61. package/lib/MultiParty/DetectWebRtcService.d.ts +16 -0
  62. package/lib/MultiParty/DetectWebRtcService.d.ts.map +1 -0
  63. package/lib/MultiParty/DetectWebRtcService.js +79 -0
  64. package/lib/MultiParty/DetectWebRtcService.js.map +1 -0
  65. package/lib/MultiParty/MediaCapabilitiesService.d.ts +23 -0
  66. package/lib/MultiParty/MediaCapabilitiesService.d.ts.map +1 -0
  67. package/lib/MultiParty/MediaCapabilitiesService.js +369 -0
  68. package/lib/MultiParty/MediaCapabilitiesService.js.map +1 -0
  69. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts +5 -0
  70. package/lib/MultiParty/MediaCapabilitiesUtils.d.ts.map +1 -0
  71. package/lib/MultiParty/MediaCapabilitiesUtils.js +305 -0
  72. package/lib/MultiParty/MediaCapabilitiesUtils.js.map +1 -0
  73. package/lib/MultiParty/MultiPartyService.d.ts +41 -0
  74. package/lib/MultiParty/MultiPartyService.d.ts.map +1 -0
  75. package/lib/MultiParty/MultiPartyService.js +72 -0
  76. package/lib/MultiParty/MultiPartyService.js.map +1 -0
  77. package/lib/MultiParty/MultiPartyServiceFactory.d.ts +3 -0
  78. package/lib/MultiParty/MultiPartyServiceFactory.d.ts.map +1 -0
  79. package/lib/MultiParty/MultiPartyServiceFactory.js +21 -0
  80. package/lib/MultiParty/MultiPartyServiceFactory.js.map +1 -0
  81. package/lib/MultiParty/OpentokMultiPartyService.d.ts +29 -0
  82. package/lib/MultiParty/OpentokMultiPartyService.d.ts.map +1 -0
  83. package/lib/MultiParty/OpentokMultiPartyService.js +888 -0
  84. package/lib/MultiParty/OpentokMultiPartyService.js.map +1 -0
  85. package/lib/MultiParty/VideoLayoutType.d.ts +4 -0
  86. package/lib/MultiParty/VideoLayoutType.d.ts.map +1 -0
  87. package/lib/MultiParty/VideoLayoutType.js +13 -0
  88. package/lib/MultiParty/VideoLayoutType.js.map +1 -0
  89. package/lib/MultiParty/index.d.ts +4 -0
  90. package/lib/MultiParty/index.d.ts.map +1 -0
  91. package/lib/MultiParty/index.js +61 -0
  92. package/lib/MultiParty/index.js.map +1 -0
  93. package/lib/MultiParty/opentok.d.ts +503 -0
  94. package/lib/TechseeMediaStream.d.ts +6 -6
  95. package/lib/TechseeMediaStream.d.ts.map +1 -1
  96. package/lib/TechseeMediaStream.js +59 -53
  97. package/lib/TechseeMediaStream.js.map +1 -1
  98. package/lib/oldCode/constants.js +20 -15
  99. package/lib/oldCode/constants.js.map +1 -1
  100. package/lib/oldCode/event-emitter.js +45 -22
  101. package/lib/oldCode/event-emitter.js.map +1 -1
  102. package/lib/oldCode/index.js +48 -52
  103. package/lib/oldCode/index.js.map +1 -1
  104. package/lib/oldCode/opentok/session.js +261 -236
  105. package/lib/oldCode/opentok/session.js.map +1 -1
  106. package/lib/oldCode/opentok/stream.js +283 -269
  107. package/lib/oldCode/opentok/stream.js.map +1 -1
  108. package/lib/oldCode/publisher.js +96 -71
  109. package/lib/oldCode/publisher.js.map +1 -1
  110. package/lib/oldCode/service.js +294 -272
  111. package/lib/oldCode/service.js.map +1 -1
  112. package/lib/oldCode/session.js +82 -60
  113. package/lib/oldCode/session.js.map +1 -1
  114. package/lib/oldCode/stream.js +153 -125
  115. package/lib/oldCode/stream.js.map +1 -1
  116. package/lib/oldCode/subscriber.js +60 -35
  117. package/lib/oldCode/subscriber.js.map +1 -1
  118. package/lib/oldCode/tracer.d.ts +3 -2
  119. package/lib/oldCode/tracer.d.ts.map +1 -1
  120. package/lib/oldCode/tracer.js +181 -130
  121. package/lib/oldCode/tracer.js.map +1 -1
  122. package/lib/oldCode/utils/ImageFixer.js +67 -44
  123. package/lib/oldCode/utils/ImageFixer.js.map +1 -1
  124. package/lib/oldCode/webrtc/constants.js +102 -110
  125. package/lib/oldCode/webrtc/constants.js.map +1 -1
  126. package/lib/oldCode/webrtc/helper.js +176 -124
  127. package/lib/oldCode/webrtc/helper.js.map +1 -1
  128. package/lib/oldCode/webrtc/session-kms.js +408 -393
  129. package/lib/oldCode/webrtc/session-kms.js.map +1 -1
  130. package/lib/oldCode/webrtc/session-loopback.js +245 -227
  131. package/lib/oldCode/webrtc/session-loopback.js.map +1 -1
  132. package/lib/oldCode/webrtc/session-turn.js +705 -658
  133. package/lib/oldCode/webrtc/session-turn.js.map +1 -1
  134. package/lib/oldCode/webrtc/session-turn.v2.js +480 -471
  135. package/lib/oldCode/webrtc/session-turn.v2.js.map +1 -1
  136. package/lib/oldCode/webrtc/session.js +12 -6
  137. package/lib/oldCode/webrtc/session.js.map +1 -1
  138. package/lib/oldCode/webrtc/stream.js +526 -504
  139. package/lib/oldCode/webrtc/stream.js.map +1 -1
  140. package/lib/oldCode/webrtc/temasys/adapter-loader.js +5 -6
  141. package/lib/oldCode/webrtc/temasys/adapter-loader.js.map +1 -1
  142. package/lib/oldCode/webrtc/temasys/adapter.js +5264 -5192
  143. package/lib/oldCode/webrtc/temasys/adapter.js.map +1 -1
  144. package/lib/oldCode/webrtc/webrtc-ie-shim.js +3357 -2927
  145. package/lib/oldCode/webrtc/webrtc-ie-shim.js.map +1 -1
  146. package/lib/qos/raw-qos.js +348 -273
  147. package/lib/qos/raw-qos.js.map +1 -1
  148. package/lib/webrtc-ie-shim.js +3386 -2985
  149. package/lib/webrtc-ie-shim.js.map +1 -1
  150. package/package.json +54 -42
@@ -1,212 +1,256 @@
1
1
  "use strict";
2
2
 
3
- Object.defineProperty(exports, "__esModule", { value: true });
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TechseeMediaSubscriber = void 0;
7
+
4
8
  var events_1 = require("events");
9
+
5
10
  var MediaDomUtils_1 = require("./MediaUtils/MediaDomUtils");
11
+
6
12
  var MediaConstants_1 = require("./MediaConstants");
13
+
7
14
  var MediaTracer_1 = require("./MediaUtils/MediaTracer");
15
+
8
16
  var Compatibility_1 = require("./MediaUtils/Compatibility");
17
+
9
18
  var trace = MediaTracer_1.getMediaTracer('MediaSubscriber');
10
19
  var privateEvents;
20
+
11
21
  (function (privateEvents) {
12
- privateEvents["STREAM_STATE_CHANGE"] = "STREAM_STATE_CHANGE";
13
- privateEvents["SUBSCRIBER_DISPOSE"] = "SUBSCRIBER_DISPOSE";
22
+ privateEvents["STREAM_STATE_CHANGE"] = "STREAM_STATE_CHANGE";
23
+ privateEvents["SUBSCRIBER_DISPOSE"] = "SUBSCRIBER_DISPOSE";
14
24
  })(privateEvents || (privateEvents = {}));
15
- var TechseeMediaSubscriber = /** @class */function () {
16
- function TechseeMediaSubscriber(subscriberParams) {
17
- this._isDisposed = false;
18
- this._isPlaying = false;
19
- this._hasVideo = false;
20
- this._hasAudio = false;
21
- this._mediaElement = null;
22
- trace.info('Subscriber created');
23
- this.videoResizeHandler = this.videoResizeHandler.bind(this);
24
- this._emitter = new events_1.EventEmitter();
25
- this._subscriberParams = subscriberParams;
25
+
26
+ var TechseeMediaSubscriber =
27
+ /** @class */
28
+ function () {
29
+ function TechseeMediaSubscriber(subscriberParams) {
30
+ this._isDisposed = false;
31
+ this._isPlaying = false;
32
+ this._hasVideo = false;
33
+ this._hasAudio = false;
34
+ this._mediaElement = null;
35
+ trace.info('Subscriber created');
36
+ this.videoResizeHandler = this.videoResizeHandler.bind(this);
37
+ this._emitter = new events_1.EventEmitter();
38
+ this._subscriberParams = subscriberParams;
39
+ }
40
+
41
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "streamType", {
42
+ //#region IMediaSubscriber
43
+ get: function get() {
44
+ return this._subscriberParams.streamType;
45
+ },
46
+ enumerable: false,
47
+ configurable: true
48
+ });
49
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "container", {
50
+ get: function get() {
51
+ return this._subscriberParams.container;
52
+ },
53
+ enumerable: false,
54
+ configurable: true
55
+ });
56
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "isPlaying", {
57
+ get: function get() {
58
+ return this._isPlaying;
59
+ },
60
+ enumerable: false,
61
+ configurable: true
62
+ });
63
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "isSoundMuted", {
64
+ get: function get() {
65
+ if (!this._mediaElement) {
66
+ return true;
67
+ }
68
+
69
+ return this._mediaElement.muted;
70
+ },
71
+ enumerable: false,
72
+ configurable: true
73
+ });
74
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "hasAudio", {
75
+ get: function get() {
76
+ return this._hasAudio;
77
+ },
78
+ enumerable: false,
79
+ configurable: true
80
+ });
81
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "hasVideo", {
82
+ get: function get() {
83
+ return this._hasVideo;
84
+ },
85
+ enumerable: false,
86
+ configurable: true
87
+ });
88
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "mediaElement", {
89
+ get: function get() {
90
+ return this._mediaElement;
91
+ },
92
+ enumerable: false,
93
+ configurable: true
94
+ });
95
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "videoWidth", {
96
+ get: function get() {
97
+ return this.mediaElement ? this.mediaElement.videoWidth : 0;
98
+ },
99
+ enumerable: false,
100
+ configurable: true
101
+ });
102
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "videoHeight", {
103
+ get: function get() {
104
+ return this.mediaElement ? this.mediaElement.videoHeight : 0;
105
+ },
106
+ enumerable: false,
107
+ configurable: true
108
+ });
109
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "renderWidth", {
110
+ get: function get() {
111
+ return this.container.offsetWidth;
112
+ },
113
+ enumerable: false,
114
+ configurable: true
115
+ });
116
+ Object.defineProperty(TechseeMediaSubscriber.prototype, "renderHeight", {
117
+ get: function get() {
118
+ return this.container.offsetHeight;
119
+ },
120
+ enumerable: false,
121
+ configurable: true
122
+ });
123
+
124
+ TechseeMediaSubscriber.prototype.muteSound = function (isMuted) {
125
+ this.throwIfDisposed();
126
+ trace.info('Subscriber mute change - isMuted =', isMuted);
127
+
128
+ if (this._mediaElement && this._mediaElement.muted !== isMuted) {
129
+ this._mediaElement.muted = isMuted;
130
+ this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
26
131
  }
27
- Object.defineProperty(TechseeMediaSubscriber.prototype, "streamType", {
28
- //#region IMediaSubscriber
29
- get: function get() {
30
- return this._subscriberParams.streamType;
31
- },
32
- enumerable: true,
33
- configurable: true
34
- });
35
- Object.defineProperty(TechseeMediaSubscriber.prototype, "container", {
36
- get: function get() {
37
- return this._subscriberParams.container;
38
- },
39
- enumerable: true,
40
- configurable: true
41
- });
42
- Object.defineProperty(TechseeMediaSubscriber.prototype, "isPlaying", {
43
- get: function get() {
44
- return this._isPlaying;
45
- },
46
- enumerable: true,
47
- configurable: true
48
- });
49
- Object.defineProperty(TechseeMediaSubscriber.prototype, "isSoundMuted", {
50
- get: function get() {
51
- if (!this._mediaElement) {
52
- return true;
53
- }
54
- return this._mediaElement.muted;
55
- },
56
- enumerable: true,
57
- configurable: true
58
- });
59
- Object.defineProperty(TechseeMediaSubscriber.prototype, "hasAudio", {
60
- get: function get() {
61
- return this._hasAudio;
62
- },
63
- enumerable: true,
64
- configurable: true
65
- });
66
- Object.defineProperty(TechseeMediaSubscriber.prototype, "hasVideo", {
67
- get: function get() {
68
- return this._hasVideo;
69
- },
70
- enumerable: true,
71
- configurable: true
72
- });
73
- Object.defineProperty(TechseeMediaSubscriber.prototype, "mediaElement", {
74
- get: function get() {
75
- return this._mediaElement;
76
- },
77
- enumerable: true,
78
- configurable: true
79
- });
80
- Object.defineProperty(TechseeMediaSubscriber.prototype, "videoWidth", {
81
- get: function get() {
82
- return this.mediaElement ? this.mediaElement.videoWidth : 0;
83
- },
84
- enumerable: true,
85
- configurable: true
86
- });
87
- Object.defineProperty(TechseeMediaSubscriber.prototype, "videoHeight", {
88
- get: function get() {
89
- return this.mediaElement ? this.mediaElement.videoHeight : 0;
90
- },
91
- enumerable: true,
92
- configurable: true
132
+ };
133
+
134
+ TechseeMediaSubscriber.prototype.onStateChanged = function (callback) {
135
+ this.throwIfDisposed();
136
+
137
+ this._emitter.on(privateEvents.STREAM_STATE_CHANGE, callback);
138
+ };
139
+
140
+ TechseeMediaSubscriber.prototype.onDispose = function (callback) {
141
+ this.throwIfDisposed();
142
+
143
+ this._emitter.on(privateEvents.SUBSCRIBER_DISPOSE, callback);
144
+ }; //#endregion
145
+ //#region Non Interface Methods
146
+
147
+
148
+ TechseeMediaSubscriber.prototype.renderStream = function (stream) {
149
+ var _this = this;
150
+
151
+ this.throwIfDisposed();
152
+ this.stopRenderInternal().then(function () {
153
+ return MediaDomUtils_1.renderMediaStreamToVideoEl(_this.container, stream.mediaStream, stream.streamType);
154
+ }).then(function (videoEl) {
155
+ _this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;
156
+ _this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;
157
+
158
+ _this.setPlayingState(videoEl, stream.streamKind);
159
+
160
+ if (_this._hasAudio) {
161
+ _this.muteSound(false);
162
+ }
163
+ })["catch"](function (error) {
164
+ trace.warn('Error while rendering stream on video element', error);
93
165
  });
94
- Object.defineProperty(TechseeMediaSubscriber.prototype, "renderWidth", {
95
- get: function get() {
96
- return this.container.offsetWidth;
97
- },
98
- enumerable: true,
99
- configurable: true
166
+ };
167
+
168
+ TechseeMediaSubscriber.prototype.stopRendering = function () {
169
+ var _this = this;
170
+
171
+ return this.stopRenderInternal().then(function () {
172
+ return _this.setPlayingState();
100
173
  });
101
- Object.defineProperty(TechseeMediaSubscriber.prototype, "renderHeight", {
102
- get: function get() {
103
- return this.container.offsetHeight;
104
- },
105
- enumerable: true,
106
- configurable: true
174
+ };
175
+
176
+ TechseeMediaSubscriber.prototype.dispose = function () {
177
+ if (this._isDisposed) {
178
+ return;
179
+ }
180
+
181
+ this.stopRendering()["catch"](function () {
182
+ return undefined;
107
183
  });
108
- TechseeMediaSubscriber.prototype.muteSound = function (isMuted) {
109
- this.throwIfDisposed();
110
- trace.info('Subscriber mute change - isMuted =', isMuted);
111
- if (this._mediaElement && this._mediaElement.muted !== isMuted) {
112
- this._mediaElement.muted = isMuted;
113
- this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
114
- }
115
- };
116
- TechseeMediaSubscriber.prototype.onStateChanged = function (callback) {
117
- this.throwIfDisposed();
118
- this._emitter.on(privateEvents.STREAM_STATE_CHANGE, callback);
119
- };
120
- TechseeMediaSubscriber.prototype.onDispose = function (callback) {
121
- this.throwIfDisposed();
122
- this._emitter.on(privateEvents.SUBSCRIBER_DISPOSE, callback);
123
- };
124
- //#endregion
125
- //#region Non Interface Methods
126
- TechseeMediaSubscriber.prototype.renderStream = function (stream) {
127
- var _this = this;
128
- this.throwIfDisposed();
129
- this.stopRenderInternal().then(function () {
130
- return MediaDomUtils_1.renderMediaStreamToVideoEl(_this.container, stream.mediaStream);
131
- }).then(function (videoEl) {
132
- _this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;
133
- _this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;
134
- _this.setPlayingState(videoEl, stream.streamKind);
135
- if (_this._hasAudio) {
136
- _this.muteSound(false);
137
- }
138
- }).catch(function (error) {
139
- trace.warn('Error while rendering stream on video element', error);
140
- });
141
- };
142
- TechseeMediaSubscriber.prototype.stopRendering = function () {
143
- var _this = this;
144
- return this.stopRenderInternal().then(function () {
145
- return _this.setPlayingState();
146
- });
147
- };
148
- TechseeMediaSubscriber.prototype.dispose = function () {
149
- if (this._isDisposed) {
150
- return;
151
- }
152
- this.stopRendering().catch(function () {
153
- return undefined;
154
- });
155
- this._isDisposed = true;
156
- this._emitter.removeAllListeners();
157
- trace.info('Subscriber disposed');
158
- this.emitEvent(privateEvents.SUBSCRIBER_DISPOSE);
184
+ this._isDisposed = true;
185
+
186
+ this._emitter.removeAllListeners();
187
+
188
+ trace.info('Subscriber disposed');
189
+ this.emitEvent(privateEvents.SUBSCRIBER_DISPOSE);
190
+ }; //#endregion
191
+
192
+
193
+ TechseeMediaSubscriber.prototype.setPlayingState = function (mediaElement, streamKind) {
194
+ var _this = this;
195
+
196
+ this._isPlaying = !!mediaElement;
197
+ this._mediaElement = mediaElement || null;
198
+
199
+ var finalize = function finalize() {
200
+ _this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
201
+
202
+ trace.info("Video element " + (streamKind || '') + " " + (_this.isPlaying ? 'play' : 'stop') + " success");
159
203
  };
160
- //#endregion
161
- TechseeMediaSubscriber.prototype.setPlayingState = function (mediaElement, streamKind) {
162
- var _this = this;
163
- this._isPlaying = !!mediaElement;
164
- this._mediaElement = mediaElement || null;
165
- var finalize = function finalize() {
166
- _this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
167
- trace.info("Video element " + (streamKind || '') + " " + (_this.isPlaying ? 'play' : 'stop') + " success");
204
+
205
+ if (this._mediaElement && streamKind === MediaConstants_1.KnownMediaStreamKind.Video) {
206
+ if (this._mediaElement.videoHeight === 0) {
207
+ var disposeResizeHandler_1 = null;
208
+
209
+ var resizeHandler = function resizeHandler() {
210
+ disposeResizeHandler_1 && disposeResizeHandler_1();
211
+ Compatibility_1.onMediaElementResize(_this._mediaElement, _this.videoResizeHandler);
212
+ finalize();
168
213
  };
169
- if (this._mediaElement && streamKind === MediaConstants_1.KnownMediaStreamKind.Video) {
170
- if (this._mediaElement.videoHeight === 0) {
171
- var disposeResizeHandler_1 = null;
172
- var resizeHandler = function resizeHandler() {
173
- disposeResizeHandler_1 && disposeResizeHandler_1();
174
- Compatibility_1.onMediaElementResize(_this._mediaElement, _this.videoResizeHandler);
175
- finalize();
176
- };
177
- disposeResizeHandler_1 = Compatibility_1.onMediaElementResize(this._mediaElement, resizeHandler);
178
- } else {
179
- Compatibility_1.onMediaElementResize(this._mediaElement, this.videoResizeHandler);
180
- finalize();
181
- }
182
- } else {
183
- finalize();
184
- }
185
- };
186
- TechseeMediaSubscriber.prototype.videoResizeHandler = function () {
187
- trace.info("Video resize, new size = w: " + this.videoWidth + " h:" + this.videoHeight);
188
- this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
189
- };
190
- TechseeMediaSubscriber.prototype.stopRenderInternal = function () {
191
- if (this._mediaElement && document.body.contains(this._mediaElement)) {
192
- return MediaDomUtils_1.removeVideoElementFromDom(this._mediaElement);
193
- }
194
- return Promise.resolve();
195
- };
196
- TechseeMediaSubscriber.prototype.emitEvent = function (event, eventArgs) {
197
- var _this = this;
198
- setTimeout(function () {
199
- _this._emitter.emit(event, eventArgs);
200
- });
201
- };
202
- TechseeMediaSubscriber.prototype.throwIfDisposed = function () {
203
- if (this._isDisposed) {
204
- throw new Error('Subscriber is already disposed');
205
- }
206
- };
207
- return TechseeMediaSubscriber;
214
+
215
+ disposeResizeHandler_1 = Compatibility_1.onMediaElementResize(this._mediaElement, resizeHandler);
216
+ } else {
217
+ Compatibility_1.onMediaElementResize(this._mediaElement, this.videoResizeHandler);
218
+ finalize();
219
+ }
220
+ } else {
221
+ finalize();
222
+ }
223
+ };
224
+
225
+ TechseeMediaSubscriber.prototype.videoResizeHandler = function () {
226
+ trace.info("Video resize, new size = w: " + this.videoWidth + " h:" + this.videoHeight);
227
+ this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
228
+ };
229
+
230
+ TechseeMediaSubscriber.prototype.stopRenderInternal = function () {
231
+ if (this._mediaElement && document.body.contains(this._mediaElement)) {
232
+ return MediaDomUtils_1.removeVideoElementFromDom(this._mediaElement);
233
+ }
234
+
235
+ return Promise.resolve();
236
+ };
237
+
238
+ TechseeMediaSubscriber.prototype.emitEvent = function (event, eventArgs) {
239
+ var _this = this;
240
+
241
+ setTimeout(function () {
242
+ _this._emitter.emit(event, eventArgs);
243
+ });
244
+ };
245
+
246
+ TechseeMediaSubscriber.prototype.throwIfDisposed = function () {
247
+ if (this._isDisposed) {
248
+ throw new Error('Subscriber is already disposed');
249
+ }
250
+ };
251
+
252
+ return TechseeMediaSubscriber;
208
253
  }();
209
- exports.TechseeMediaSubscriber = TechseeMediaSubscriber;
210
254
 
211
- //# sourceMappingURL=MediaSubscriber.js.map
255
+ exports.TechseeMediaSubscriber = TechseeMediaSubscriber;
212
256
  //# sourceMappingURL=MediaSubscriber.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["MediaSubscriber.js","../src/MediaSubscriber.ts"],"names":["Object","defineProperty","exports","value","events_1","require","MediaDomUtils_1","MediaConstants_1","MediaTracer_1","Compatibility_1","trace","getMediaTracer","privateEvents","TechseeMediaSubscriber","subscriberParams","_isDisposed","_isPlaying","_hasVideo","_hasAudio","_mediaElement","info","videoResizeHandler","bind","_emitter","EventEmitter","_subscriberParams","prototype","get","streamType","enumerable","configurable","container","muted","mediaElement","videoWidth","videoHeight","offsetWidth","offsetHeight","muteSound","isMuted","throwIfDisposed","emitEvent","STREAM_STATE_CHANGE","onStateChanged","callback","on","onDispose","SUBSCRIBER_DISPOSE","renderStream","stream","_this","stopRenderInternal","then","renderMediaStreamToVideoEl","mediaStream","videoEl","getAudioTracks","length","getVideoTracks","setPlayingState","streamKind","catch","error","warn","stopRendering","dispose","undefined","removeAllListeners","finalize","isPlaying","KnownMediaStreamKind","Video","disposeResizeHandler_1","resizeHandler","onMediaElementResize","document","body","contains","removeVideoElementFromDom","Promise","resolve","event","eventArgs","setTimeout","emit","Error"],"mappings":"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","file":"MediaSubscriber.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar events_1 = require(\"events\");\nvar MediaDomUtils_1 = require(\"./MediaUtils/MediaDomUtils\");\nvar MediaConstants_1 = require(\"./MediaConstants\");\nvar MediaTracer_1 = require(\"./MediaUtils/MediaTracer\");\nvar Compatibility_1 = require(\"./MediaUtils/Compatibility\");\nvar trace = MediaTracer_1.getMediaTracer('MediaSubscriber');\nvar privateEvents;\n(function (privateEvents) {\n privateEvents[\"STREAM_STATE_CHANGE\"] = \"STREAM_STATE_CHANGE\";\n privateEvents[\"SUBSCRIBER_DISPOSE\"] = \"SUBSCRIBER_DISPOSE\";\n})(privateEvents || (privateEvents = {}));\nvar TechseeMediaSubscriber = /** @class */ (function () {\n function TechseeMediaSubscriber(subscriberParams) {\n this._isDisposed = false;\n this._isPlaying = false;\n this._hasVideo = false;\n this._hasAudio = false;\n this._mediaElement = null;\n trace.info('Subscriber created');\n this.videoResizeHandler = this.videoResizeHandler.bind(this);\n this._emitter = new events_1.EventEmitter();\n this._subscriberParams = subscriberParams;\n }\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"streamType\", {\n //#region IMediaSubscriber\n get: function () {\n return this._subscriberParams.streamType;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"container\", {\n get: function () {\n return this._subscriberParams.container;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"isPlaying\", {\n get: function () {\n return this._isPlaying;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"isSoundMuted\", {\n get: function () {\n if (!this._mediaElement) {\n return true;\n }\n return this._mediaElement.muted;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"hasAudio\", {\n get: function () {\n return this._hasAudio;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"hasVideo\", {\n get: function () {\n return this._hasVideo;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"mediaElement\", {\n get: function () {\n return this._mediaElement;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"videoWidth\", {\n get: function () {\n return this.mediaElement ? this.mediaElement.videoWidth : 0;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"videoHeight\", {\n get: function () {\n return this.mediaElement ? this.mediaElement.videoHeight : 0;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"renderWidth\", {\n get: function () {\n return this.container.offsetWidth;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"renderHeight\", {\n get: function () {\n return this.container.offsetHeight;\n },\n enumerable: true,\n configurable: true\n });\n TechseeMediaSubscriber.prototype.muteSound = function (isMuted) {\n this.throwIfDisposed();\n trace.info('Subscriber mute change - isMuted =', isMuted);\n if (this._mediaElement && this._mediaElement.muted !== isMuted) {\n this._mediaElement.muted = isMuted;\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n }\n };\n TechseeMediaSubscriber.prototype.onStateChanged = function (callback) {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.STREAM_STATE_CHANGE, callback);\n };\n TechseeMediaSubscriber.prototype.onDispose = function (callback) {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.SUBSCRIBER_DISPOSE, callback);\n };\n //#endregion\n //#region Non Interface Methods\n TechseeMediaSubscriber.prototype.renderStream = function (stream) {\n var _this = this;\n this.throwIfDisposed();\n this.stopRenderInternal().then(function () { return MediaDomUtils_1.renderMediaStreamToVideoEl(_this.container, stream.mediaStream); })\n .then(function (videoEl) {\n _this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;\n _this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;\n _this.setPlayingState(videoEl, stream.streamKind);\n if (_this._hasAudio) {\n _this.muteSound(false);\n }\n })\n .catch(function (error) {\n trace.warn('Error while rendering stream on video element', error);\n });\n };\n TechseeMediaSubscriber.prototype.stopRendering = function () {\n var _this = this;\n return this.stopRenderInternal().then(function () { return _this.setPlayingState(); });\n };\n TechseeMediaSubscriber.prototype.dispose = function () {\n if (this._isDisposed) {\n return;\n }\n this.stopRendering().catch(function () { return undefined; });\n this._isDisposed = true;\n this._emitter.removeAllListeners();\n trace.info('Subscriber disposed');\n this.emitEvent(privateEvents.SUBSCRIBER_DISPOSE);\n };\n //#endregion\n TechseeMediaSubscriber.prototype.setPlayingState = function (mediaElement, streamKind) {\n var _this = this;\n this._isPlaying = !!mediaElement;\n this._mediaElement = mediaElement || null;\n var finalize = function () {\n _this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n trace.info(\"Video element \" + (streamKind || '') + \" \" + (_this.isPlaying ? 'play' : 'stop') + \" success\");\n };\n if (this._mediaElement && streamKind === MediaConstants_1.KnownMediaStreamKind.Video) {\n if (this._mediaElement.videoHeight === 0) {\n var disposeResizeHandler_1 = null;\n var resizeHandler = function () {\n disposeResizeHandler_1 && disposeResizeHandler_1();\n Compatibility_1.onMediaElementResize(_this._mediaElement, _this.videoResizeHandler);\n finalize();\n };\n disposeResizeHandler_1 = Compatibility_1.onMediaElementResize(this._mediaElement, resizeHandler);\n }\n else {\n Compatibility_1.onMediaElementResize(this._mediaElement, this.videoResizeHandler);\n finalize();\n }\n }\n else {\n finalize();\n }\n };\n TechseeMediaSubscriber.prototype.videoResizeHandler = function () {\n trace.info(\"Video resize, new size = w: \" + this.videoWidth + \" h:\" + this.videoHeight);\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n };\n TechseeMediaSubscriber.prototype.stopRenderInternal = function () {\n if (this._mediaElement && document.body.contains(this._mediaElement)) {\n return MediaDomUtils_1.removeVideoElementFromDom(this._mediaElement);\n }\n return Promise.resolve();\n };\n TechseeMediaSubscriber.prototype.emitEvent = function (event, eventArgs) {\n var _this = this;\n setTimeout(function () {\n _this._emitter.emit(event, eventArgs);\n });\n };\n TechseeMediaSubscriber.prototype.throwIfDisposed = function () {\n if (this._isDisposed) {\n throw new Error('Subscriber is already disposed');\n }\n };\n return TechseeMediaSubscriber;\n}());\nexports.TechseeMediaSubscriber = TechseeMediaSubscriber;\n\n//# sourceMappingURL=MediaSubscriber.js.map\n","import {EventEmitter} from 'events';\nimport {Nullable} from '@techsee/techsee-common';\nimport {IMediaSubscriber, MediaSubscriberParams} from './MediaContracts';\nimport {TechseeMediaStream} from './TechseeMediaStream';\nimport {removeVideoElementFromDom, renderMediaStreamToVideoEl} from './MediaUtils/MediaDomUtils';\nimport {KnownMediaStream, KnownMediaStreamKind} from './MediaConstants';\n\nimport {getMediaTracer} from './MediaUtils/MediaTracer';\nimport {onMediaElementResize} from './MediaUtils/Compatibility';\n\nconst trace = getMediaTracer('MediaSubscriber');\n\nenum privateEvents {\n STREAM_STATE_CHANGE = 'STREAM_STATE_CHANGE',\n SUBSCRIBER_DISPOSE = 'SUBSCRIBER_DISPOSE'\n}\n\nexport class TechseeMediaSubscriber implements IMediaSubscriber {\n private _emitter: EventEmitter;\n private _isDisposed: boolean = false;\n private _isPlaying: boolean = false;\n private _hasVideo: boolean = false;\n private _hasAudio: boolean = false;\n private _mediaElement: Nullable<HTMLVideoElement> = null;\n\n private readonly _subscriberParams: MediaSubscriberParams;\n\n constructor(subscriberParams: MediaSubscriberParams) {\n trace.info('Subscriber created');\n\n this.videoResizeHandler = this.videoResizeHandler.bind(this);\n\n this._emitter = new EventEmitter();\n this._subscriberParams = subscriberParams;\n }\n\n //#region IMediaSubscriber\n\n get streamType(): KnownMediaStream {\n return this._subscriberParams.streamType;\n }\n\n get container(): HTMLDivElement {\n return this._subscriberParams.container;\n }\n\n get isPlaying(): boolean {\n return this._isPlaying;\n }\n\n get isSoundMuted(): boolean {\n if (!this._mediaElement) {\n return true;\n }\n\n return this._mediaElement.muted;\n }\n\n get hasAudio(): boolean {\n return this._hasAudio;\n }\n\n get hasVideo(): boolean {\n return this._hasVideo;\n }\n\n get mediaElement(): Nullable<HTMLVideoElement> {\n return this._mediaElement;\n }\n\n get videoWidth(): number {\n return this.mediaElement ? this.mediaElement.videoWidth : 0;\n }\n\n get videoHeight(): number {\n return this.mediaElement ? this.mediaElement.videoHeight : 0;\n }\n\n get renderWidth(): number {\n return this.container.offsetWidth;\n }\n\n get renderHeight(): number {\n return this.container.offsetHeight;\n }\n\n muteSound(isMuted: boolean): void {\n this.throwIfDisposed();\n trace.info('Subscriber mute change - isMuted =', isMuted);\n if (this._mediaElement && this._mediaElement.muted !== isMuted) {\n this._mediaElement.muted = isMuted;\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n }\n }\n\n onStateChanged(callback: () => void): void {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.STREAM_STATE_CHANGE, callback);\n }\n\n onDispose(callback: () => void): void {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.SUBSCRIBER_DISPOSE, callback);\n }\n\n //#endregion\n\n //#region Non Interface Methods\n\n renderStream(stream: TechseeMediaStream): void {\n this.throwIfDisposed();\n this.stopRenderInternal().then(() => renderMediaStreamToVideoEl(this.container, stream.mediaStream))\n .then((videoEl) => {\n this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;\n this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;\n\n this.setPlayingState(videoEl, stream.streamKind);\n\n if (this._hasAudio) {\n this.muteSound(false);\n }\n })\n .catch((error) => {\n trace.warn('Error while rendering stream on video element', error);\n });\n }\n\n stopRendering(): Promise<void> {\n return this.stopRenderInternal().then(() => this.setPlayingState());\n }\n\n dispose(): void {\n if (this._isDisposed) {\n return;\n }\n\n this.stopRendering().catch(() => undefined);\n\n\n this._isDisposed = true;\n this._emitter.removeAllListeners();\n trace.info('Subscriber disposed');\n this.emitEvent(privateEvents.SUBSCRIBER_DISPOSE);\n }\n\n //#endregion\n\n private setPlayingState(mediaElement?: HTMLVideoElement, streamKind?: KnownMediaStreamKind): void {\n this._isPlaying = !!mediaElement;\n this._mediaElement = mediaElement || null;\n\n const finalize = (): void => {\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n trace.info(`Video element ${streamKind || ''} ${this.isPlaying ? 'play' : 'stop'} success`);\n };\n\n if (this._mediaElement && streamKind === KnownMediaStreamKind.Video) {\n if (this._mediaElement.videoHeight === 0) {\n let disposeResizeHandler: any = null;\n const resizeHandler = (): void => {\n disposeResizeHandler && disposeResizeHandler();\n onMediaElementResize(this._mediaElement, this.videoResizeHandler);\n finalize();\n };\n\n disposeResizeHandler = onMediaElementResize(this._mediaElement, resizeHandler);\n } else {\n onMediaElementResize(this._mediaElement, this.videoResizeHandler);\n finalize();\n }\n } else {\n finalize();\n }\n }\n\n private videoResizeHandler(): void {\n trace.info(`Video resize, new size = w: ${this.videoWidth} h:${this.videoHeight}`);\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n }\n\n private stopRenderInternal() {\n if (this._mediaElement && document.body.contains(this._mediaElement)) {\n return removeVideoElementFromDom(this._mediaElement);\n }\n\n return Promise.resolve();\n }\n\n private emitEvent(event: string, eventArgs?: any): void {\n setTimeout(() => {\n this._emitter.emit(event, eventArgs);\n });\n }\n\n private throwIfDisposed(): void {\n if (this._isDisposed) {\n throw new Error('Subscriber is already disposed');\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["MediaSubscriber.js","../src/MediaSubscriber.ts"],"names":["Object","defineProperty","exports","value","TechseeMediaSubscriber","events_1","require","MediaDomUtils_1","MediaConstants_1","MediaTracer_1","Compatibility_1","trace","getMediaTracer","privateEvents","subscriberParams","_isDisposed","_isPlaying","_hasVideo","_hasAudio","_mediaElement","info","videoResizeHandler","bind","_emitter","EventEmitter","_subscriberParams","prototype","get","streamType","enumerable","configurable","container","muted","mediaElement","videoWidth","videoHeight","offsetWidth","offsetHeight","muteSound","isMuted","throwIfDisposed","emitEvent","STREAM_STATE_CHANGE","onStateChanged","callback","on","onDispose","SUBSCRIBER_DISPOSE","renderStream","stream","_this","stopRenderInternal","then","renderMediaStreamToVideoEl","mediaStream","videoEl","getAudioTracks","length","getVideoTracks","setPlayingState","streamKind","error","warn","stopRendering","dispose","undefined","removeAllListeners","finalize","isPlaying","KnownMediaStreamKind","Video","disposeResizeHandler_1","resizeHandler","onMediaElementResize","document","body","contains","removeVideoElementFromDom","Promise","resolve","event","eventArgs","setTimeout","emit","Error"],"mappings":"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","file":"MediaSubscriber.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TechseeMediaSubscriber = void 0;\nvar events_1 = require(\"events\");\nvar MediaDomUtils_1 = require(\"./MediaUtils/MediaDomUtils\");\nvar MediaConstants_1 = require(\"./MediaConstants\");\nvar MediaTracer_1 = require(\"./MediaUtils/MediaTracer\");\nvar Compatibility_1 = require(\"./MediaUtils/Compatibility\");\nvar trace = MediaTracer_1.getMediaTracer('MediaSubscriber');\nvar privateEvents;\n(function (privateEvents) {\n privateEvents[\"STREAM_STATE_CHANGE\"] = \"STREAM_STATE_CHANGE\";\n privateEvents[\"SUBSCRIBER_DISPOSE\"] = \"SUBSCRIBER_DISPOSE\";\n})(privateEvents || (privateEvents = {}));\nvar TechseeMediaSubscriber = /** @class */ (function () {\n function TechseeMediaSubscriber(subscriberParams) {\n this._isDisposed = false;\n this._isPlaying = false;\n this._hasVideo = false;\n this._hasAudio = false;\n this._mediaElement = null;\n trace.info('Subscriber created');\n this.videoResizeHandler = this.videoResizeHandler.bind(this);\n this._emitter = new events_1.EventEmitter();\n this._subscriberParams = subscriberParams;\n }\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"streamType\", {\n //#region IMediaSubscriber\n get: function () {\n return this._subscriberParams.streamType;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"container\", {\n get: function () {\n return this._subscriberParams.container;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"isPlaying\", {\n get: function () {\n return this._isPlaying;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"isSoundMuted\", {\n get: function () {\n if (!this._mediaElement) {\n return true;\n }\n return this._mediaElement.muted;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"hasAudio\", {\n get: function () {\n return this._hasAudio;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"hasVideo\", {\n get: function () {\n return this._hasVideo;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"mediaElement\", {\n get: function () {\n return this._mediaElement;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"videoWidth\", {\n get: function () {\n return this.mediaElement ? this.mediaElement.videoWidth : 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"videoHeight\", {\n get: function () {\n return this.mediaElement ? this.mediaElement.videoHeight : 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"renderWidth\", {\n get: function () {\n return this.container.offsetWidth;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TechseeMediaSubscriber.prototype, \"renderHeight\", {\n get: function () {\n return this.container.offsetHeight;\n },\n enumerable: false,\n configurable: true\n });\n TechseeMediaSubscriber.prototype.muteSound = function (isMuted) {\n this.throwIfDisposed();\n trace.info('Subscriber mute change - isMuted =', isMuted);\n if (this._mediaElement && this._mediaElement.muted !== isMuted) {\n this._mediaElement.muted = isMuted;\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n }\n };\n TechseeMediaSubscriber.prototype.onStateChanged = function (callback) {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.STREAM_STATE_CHANGE, callback);\n };\n TechseeMediaSubscriber.prototype.onDispose = function (callback) {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.SUBSCRIBER_DISPOSE, callback);\n };\n //#endregion\n //#region Non Interface Methods\n TechseeMediaSubscriber.prototype.renderStream = function (stream) {\n var _this = this;\n this.throwIfDisposed();\n this.stopRenderInternal().then(function () { return MediaDomUtils_1.renderMediaStreamToVideoEl(_this.container, stream.mediaStream, stream.streamType); })\n .then(function (videoEl) {\n _this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;\n _this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;\n _this.setPlayingState(videoEl, stream.streamKind);\n if (_this._hasAudio) {\n _this.muteSound(false);\n }\n })\n .catch(function (error) {\n trace.warn('Error while rendering stream on video element', error);\n });\n };\n TechseeMediaSubscriber.prototype.stopRendering = function () {\n var _this = this;\n return this.stopRenderInternal().then(function () { return _this.setPlayingState(); });\n };\n TechseeMediaSubscriber.prototype.dispose = function () {\n if (this._isDisposed) {\n return;\n }\n this.stopRendering().catch(function () { return undefined; });\n this._isDisposed = true;\n this._emitter.removeAllListeners();\n trace.info('Subscriber disposed');\n this.emitEvent(privateEvents.SUBSCRIBER_DISPOSE);\n };\n //#endregion\n TechseeMediaSubscriber.prototype.setPlayingState = function (mediaElement, streamKind) {\n var _this = this;\n this._isPlaying = !!mediaElement;\n this._mediaElement = mediaElement || null;\n var finalize = function () {\n _this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n trace.info(\"Video element \" + (streamKind || '') + \" \" + (_this.isPlaying ? 'play' : 'stop') + \" success\");\n };\n if (this._mediaElement && streamKind === MediaConstants_1.KnownMediaStreamKind.Video) {\n if (this._mediaElement.videoHeight === 0) {\n var disposeResizeHandler_1 = null;\n var resizeHandler = function () {\n disposeResizeHandler_1 && disposeResizeHandler_1();\n Compatibility_1.onMediaElementResize(_this._mediaElement, _this.videoResizeHandler);\n finalize();\n };\n disposeResizeHandler_1 = Compatibility_1.onMediaElementResize(this._mediaElement, resizeHandler);\n }\n else {\n Compatibility_1.onMediaElementResize(this._mediaElement, this.videoResizeHandler);\n finalize();\n }\n }\n else {\n finalize();\n }\n };\n TechseeMediaSubscriber.prototype.videoResizeHandler = function () {\n trace.info(\"Video resize, new size = w: \" + this.videoWidth + \" h:\" + this.videoHeight);\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n };\n TechseeMediaSubscriber.prototype.stopRenderInternal = function () {\n if (this._mediaElement && document.body.contains(this._mediaElement)) {\n return MediaDomUtils_1.removeVideoElementFromDom(this._mediaElement);\n }\n return Promise.resolve();\n };\n TechseeMediaSubscriber.prototype.emitEvent = function (event, eventArgs) {\n var _this = this;\n setTimeout(function () {\n _this._emitter.emit(event, eventArgs);\n });\n };\n TechseeMediaSubscriber.prototype.throwIfDisposed = function () {\n if (this._isDisposed) {\n throw new Error('Subscriber is already disposed');\n }\n };\n return TechseeMediaSubscriber;\n}());\nexports.TechseeMediaSubscriber = TechseeMediaSubscriber;\n\n//# sourceMappingURL=MediaSubscriber.js.map\n","import {EventEmitter} from 'events';\nimport {Nullable} from '@techsee/techsee-common';\nimport {IMediaSubscriber, MediaSubscriberParams} from './MediaContracts';\nimport {TechseeMediaStream} from './TechseeMediaStream';\nimport {removeVideoElementFromDom, renderMediaStreamToVideoEl} from './MediaUtils/MediaDomUtils';\nimport {KnownMediaStream, KnownMediaStreamKind} from './MediaConstants';\n\nimport {getMediaTracer} from './MediaUtils/MediaTracer';\nimport {onMediaElementResize} from './MediaUtils/Compatibility';\n\nconst trace = getMediaTracer('MediaSubscriber');\n\nenum privateEvents {\n STREAM_STATE_CHANGE = 'STREAM_STATE_CHANGE',\n SUBSCRIBER_DISPOSE = 'SUBSCRIBER_DISPOSE'\n}\n\nexport class TechseeMediaSubscriber implements IMediaSubscriber {\n private _emitter: EventEmitter;\n private _isDisposed = false;\n private _isPlaying = false;\n private _hasVideo = false;\n private _hasAudio = false;\n private _mediaElement: Nullable<HTMLVideoElement> = null;\n\n private readonly _subscriberParams: MediaSubscriberParams;\n\n constructor(subscriberParams: MediaSubscriberParams) {\n trace.info('Subscriber created');\n\n this.videoResizeHandler = this.videoResizeHandler.bind(this);\n\n this._emitter = new EventEmitter();\n this._subscriberParams = subscriberParams;\n }\n\n //#region IMediaSubscriber\n\n get streamType(): KnownMediaStream {\n return this._subscriberParams.streamType;\n }\n\n get container(): HTMLDivElement {\n return this._subscriberParams.container;\n }\n\n get isPlaying(): boolean {\n return this._isPlaying;\n }\n\n get isSoundMuted(): boolean {\n if (!this._mediaElement) {\n return true;\n }\n\n return this._mediaElement.muted;\n }\n\n get hasAudio(): boolean {\n return this._hasAudio;\n }\n\n get hasVideo(): boolean {\n return this._hasVideo;\n }\n\n get mediaElement(): Nullable<HTMLVideoElement> {\n return this._mediaElement;\n }\n\n get videoWidth(): number {\n return this.mediaElement ? this.mediaElement.videoWidth : 0;\n }\n\n get videoHeight(): number {\n return this.mediaElement ? this.mediaElement.videoHeight : 0;\n }\n\n get renderWidth(): number {\n return this.container.offsetWidth;\n }\n\n get renderHeight(): number {\n return this.container.offsetHeight;\n }\n\n muteSound(isMuted: boolean): void {\n this.throwIfDisposed();\n trace.info('Subscriber mute change - isMuted =', isMuted);\n if (this._mediaElement && this._mediaElement.muted !== isMuted) {\n this._mediaElement.muted = isMuted;\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n }\n }\n\n onStateChanged(callback: () => void): void {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.STREAM_STATE_CHANGE, callback);\n }\n\n onDispose(callback: () => void): void {\n this.throwIfDisposed();\n this._emitter.on(privateEvents.SUBSCRIBER_DISPOSE, callback);\n }\n\n //#endregion\n\n //#region Non Interface Methods\n\n renderStream(stream: TechseeMediaStream): void {\n this.throwIfDisposed();\n this.stopRenderInternal().then(() => renderMediaStreamToVideoEl(this.container, stream.mediaStream, stream.streamType))\n .then((videoEl) => {\n this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;\n this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;\n\n this.setPlayingState(videoEl, stream.streamKind);\n\n if (this._hasAudio) {\n this.muteSound(false);\n }\n })\n .catch((error) => {\n trace.warn('Error while rendering stream on video element', error);\n });\n }\n\n stopRendering(): Promise<void> {\n return this.stopRenderInternal().then(() => this.setPlayingState());\n }\n\n dispose(): void {\n if (this._isDisposed) {\n return;\n }\n\n this.stopRendering().catch(() => undefined);\n\n\n this._isDisposed = true;\n this._emitter.removeAllListeners();\n trace.info('Subscriber disposed');\n this.emitEvent(privateEvents.SUBSCRIBER_DISPOSE);\n }\n\n //#endregion\n\n private setPlayingState(mediaElement?: HTMLVideoElement, streamKind?: KnownMediaStreamKind): void {\n this._isPlaying = !!mediaElement;\n this._mediaElement = mediaElement || null;\n\n const finalize = (): void => {\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n trace.info(`Video element ${streamKind || ''} ${this.isPlaying ? 'play' : 'stop'} success`);\n };\n\n if (this._mediaElement && streamKind === KnownMediaStreamKind.Video) {\n if (this._mediaElement.videoHeight === 0) {\n let disposeResizeHandler: any = null;\n const resizeHandler = (): void => {\n disposeResizeHandler && disposeResizeHandler();\n onMediaElementResize(this._mediaElement, this.videoResizeHandler);\n finalize();\n };\n\n disposeResizeHandler = onMediaElementResize(this._mediaElement, resizeHandler);\n } else {\n onMediaElementResize(this._mediaElement, this.videoResizeHandler);\n finalize();\n }\n } else {\n finalize();\n }\n }\n\n private videoResizeHandler(): void {\n trace.info(`Video resize, new size = w: ${this.videoWidth} h:${this.videoHeight}`);\n this.emitEvent(privateEvents.STREAM_STATE_CHANGE);\n }\n\n private stopRenderInternal() {\n if (this._mediaElement && document.body.contains(this._mediaElement)) {\n return removeVideoElementFromDom(this._mediaElement);\n }\n\n return Promise.resolve();\n }\n\n private emitEvent(event: string, eventArgs?: any): void {\n setTimeout(() => {\n this._emitter.emit(event, eventArgs);\n });\n }\n\n private throwIfDisposed(): void {\n if (this._isDisposed) {\n throw new Error('Subscriber is already disposed');\n }\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { MediaServiceType } from '../MediaConstants';
1
2
  declare global {
2
3
  interface Window {
3
4
  OT: any;
@@ -8,6 +9,6 @@ export declare const WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS = 10;
8
9
  export declare const WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL = 500;
9
10
  export declare function waitForOpenTokIsLoaded(): Promise<void>;
10
11
  export declare function enumerateMediaDevices(): Promise<MediaDeviceInfo[]>;
11
- export declare function isVideoPlaySupportedOnDevice(isOpenTokService: boolean): Promise<boolean>;
12
+ export declare function isVideoPlaySupportedOnDevice(mediaServiceType: MediaServiceType): Promise<boolean>;
12
13
  export declare function onMediaElementResize(mediaElement: any, onResizeHandler: any): () => void;
13
14
  export declare function registerWebRTCAdapters(): void;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/MediaUtils/Compatibility.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,EAAE,EAAE,GAAG,CAAC;QACR,QAAQ,EAAE,GAAG,CAAC;KACjB;CACJ;AAeD,eAAO,MAAM,4CAA4C,KAAK,CAAC;AAC/D,eAAO,MAAM,wCAAwC,MAAM,CAAC;AAU5D,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBtD;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAUlE;AAED,wBAAgB,4BAA4B,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAcxF;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,MAAM,IAAI,CAyCxF;AAED,wBAAgB,sBAAsB,SAQrC","file":"Compatibility.d.ts","sourcesContent":["declare const require: any;\n\ndeclare global {\n interface Window {\n OT: any;\n OTPlugin: any;\n }\n}\nimport isEqual from 'lodash/isEqual';\n\n//@ts-ignore\nimport {TsEnvironmentDetect} from '@techsee/techsee-common/lib/helpers/ts-environment-detect';\nimport {getMediaTracer} from './MediaTracer';\n\nconst trace = getMediaTracer('Compatibility');\n\nconst environmentDetect = new TsEnvironmentDetect();\nconst isIE11 = environmentDetect.isIE11();\nconst monitoredIeElements = new Map();\n\n// Grace period to wait in the unlikely case that Opentok has not finished initializing,\n// and a session initialization was requested\nexport const WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS = 10;\nexport const WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL = 500;\n\nfunction _isOTDefined(): boolean {\n try {\n return !!window.OT;\n } catch (e) {\n return false;\n }\n}\n\nexport function waitForOpenTokIsLoaded(): Promise<void> {\n if (_isOTDefined()) {\n return Promise.resolve();\n }\n\n let isDefined = false;\n\n return (Promise as any).reduce(\n new Array(WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS),\n () => {\n if (isDefined || _isOTDefined()) {\n isDefined = true;\n\n return Promise.resolve();\n }\n\n return (Promise as any).delay(WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL);\n }, 0)\n .then(() => isDefined || Promise.reject(new Error('OT is undefined')));\n}\n\nexport function enumerateMediaDevices(): Promise<MediaDeviceInfo[]> {\n return new Promise((resolve, reject) => {\n if ((typeof window.OT !== 'undefined') && window.OT && window.OT.getDevices) {\n window.OT.getDevices((error: any, devices: any) => (error ? reject(error) : resolve(devices)));\n } else if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {\n navigator.mediaDevices.enumerateDevices().then(resolve).catch(reject);\n } else {\n reject(new Error('Enumerating media devices is not supported'));\n }\n });\n}\n\nexport function isVideoPlaySupportedOnDevice(isOpenTokService: boolean): Promise<boolean> {\n if (!isIE11) {\n return Promise.resolve(true);\n }\n\n if (isOpenTokService) {\n return waitForOpenTokIsLoaded().then(() => window.OT && window.OTPlugin && window.OTPlugin.isInstalled && window.OTPlugin.isInstalled());\n }\n\n if ((window as any).WebRTCAdapter) {\n return Promise.resolve(true);\n }\n\n return Promise.resolve(false);\n}\n\nexport function onMediaElementResize(mediaElement: any, onResizeHandler: any): () => void {\n let checkTimeoutPtr: any = null;\n const unsubscribeIE = () => {\n clearTimeout(checkTimeoutPtr);\n monitoredIeElements.delete(mediaElement);\n };\n\n if (!isIE11) {\n mediaElement.addEventListener('resize', onResizeHandler, false);\n } else {\n monitoredIeElements.set(mediaElement, {\n videoWidth: mediaElement.videoWidth,\n videoHeight: mediaElement.videoHeight\n });\n\n const checkElementSize = () => {\n const lastElementSize = monitoredIeElements.get(mediaElement);\n\n if (!lastElementSize) {\n unsubscribeIE();\n } else {\n const currentSize = {videoWidth: mediaElement.videoWidth, videoHeight: mediaElement.videoHeight};\n\n checkTimeoutPtr = setTimeout(checkElementSize, 500);\n if (!isEqual(currentSize, lastElementSize)) {\n monitoredIeElements.set(mediaElement, lastElementSize);\n setTimeout(onResizeHandler);\n }\n }\n };\n\n checkElementSize();\n }\n\n return function () {\n if (!isIE11) {\n mediaElement && mediaElement.removeEventListener('resize', onResizeHandler);\n } else {\n unsubscribeIE();\n }\n };\n}\n\nexport function registerWebRTCAdapters() {\n if (isIE11) {\n require('../webrtc-ie-shim.js');\n } else if (!(environmentDetect.isChrome() && (environmentDetect.majorVersion() < 49))) {\n require('webrtc-adapter/src/js/adapter_core'); // eslint-disable-line global-require\n } else {\n trace.warn('no WebRTC adapters loaded.');\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/MediaUtils/Compatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AAInD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,EAAE,EAAE,GAAG,CAAC;QACR,QAAQ,EAAE,GAAG,CAAC;KACjB;CACJ;AAgBD,eAAO,MAAM,4CAA4C,KAAK,CAAC;AAC/D,eAAO,MAAM,wCAAwC,MAAM,CAAC;AAU5D,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBtD;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAUlE;AAED,wBAAgB,4BAA4B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBjG;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,MAAM,IAAI,CAyCxF;AAED,wBAAgB,sBAAsB,SAQrC","file":"Compatibility.d.ts","sourcesContent":["import {MediaServiceType} from '../MediaConstants';\n\ndeclare const require: any;\n\ndeclare global {\n interface Window {\n OT: any;\n OTPlugin: any;\n }\n}\nimport isEqual from 'lodash/isEqual';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n//@ts-ignore\nimport {TsEnvironmentDetect} from '@techsee/techsee-common/lib/helpers/ts-environment-detect';\nimport {getMediaTracer} from './MediaTracer';\n\nconst trace = getMediaTracer('Compatibility');\n\nconst environmentDetect = new TsEnvironmentDetect();\nconst isIE11 = environmentDetect.isIE11();\nconst monitoredIeElements = new Map();\n\n// Grace period to wait in the unlikely case that Opentok has not finished initializing,\n// and a session initialization was requested\nexport const WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS = 10;\nexport const WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL = 500;\n\nfunction _isOTDefined(): boolean {\n try {\n return !!window.OT;\n } catch (e) {\n return false;\n }\n}\n\nexport function waitForOpenTokIsLoaded(): Promise<void> {\n if (_isOTDefined()) {\n return Promise.resolve();\n }\n\n let isDefined = false;\n\n return (Promise as any).reduce(\n new Array(WAIT_FOR_OPENTOK_INITIALIZATION_MAX_ATTEMPTS),\n () => {\n if (isDefined || _isOTDefined()) {\n isDefined = true;\n\n return Promise.resolve();\n }\n\n return (Promise as any).delay(WAIT_FOR_OPENTOK_INITIALIZATION_INTERVAL);\n }, 0)\n .then(() => isDefined || Promise.reject(new Error('OT is undefined')));\n}\n\nexport function enumerateMediaDevices(): Promise<MediaDeviceInfo[]> {\n return new Promise((resolve, reject) => {\n if ((typeof window.OT !== 'undefined') && window.OT && window.OT.getDevices) {\n window.OT.getDevices((error: any, devices: any) => (error ? reject(error) : resolve(devices)));\n } else if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {\n navigator.mediaDevices.enumerateDevices().then(resolve).catch(reject);\n } else {\n reject(new Error('Enumerating media devices is not supported'));\n }\n });\n}\n\nexport function isVideoPlaySupportedOnDevice(mediaServiceType: MediaServiceType): Promise<boolean> {\n const isOpenTokService = mediaServiceType === MediaServiceType.OPENTOK;\n const isMediaServer = mediaServiceType === MediaServiceType.MEDIASERVER;\n\n if (!isIE11) {\n return Promise.resolve(true);\n }\n\n if (isOpenTokService) {\n return waitForOpenTokIsLoaded().then(() => window.OT && window.OTPlugin && window.OTPlugin.isInstalled && window.OTPlugin.isInstalled());\n }\n\n if (isMediaServer) {\n return Promise.resolve(false);\n }\n\n if ((window as any).WebRTCAdapter) {\n return Promise.resolve(true);\n }\n\n return Promise.resolve(false);\n}\n\nexport function onMediaElementResize(mediaElement: any, onResizeHandler: any): () => void {\n let checkTimeoutPtr: any = null;\n const unsubscribeIE = () => {\n clearTimeout(checkTimeoutPtr);\n monitoredIeElements.delete(mediaElement);\n };\n\n if (!isIE11) {\n mediaElement.addEventListener('resize', onResizeHandler, false);\n } else {\n monitoredIeElements.set(mediaElement, {\n videoWidth: mediaElement.videoWidth,\n videoHeight: mediaElement.videoHeight\n });\n\n const checkElementSize = () => {\n const lastElementSize = monitoredIeElements.get(mediaElement);\n\n if (!lastElementSize) {\n unsubscribeIE();\n } else {\n const currentSize = {videoWidth: mediaElement.videoWidth, videoHeight: mediaElement.videoHeight};\n\n checkTimeoutPtr = setTimeout(checkElementSize, 500);\n if (!isEqual(currentSize, lastElementSize)) {\n monitoredIeElements.set(mediaElement, lastElementSize);\n setTimeout(onResizeHandler);\n }\n }\n };\n\n checkElementSize();\n }\n\n return function () {\n if (!isIE11) {\n mediaElement && mediaElement.removeEventListener('resize', onResizeHandler);\n } else {\n unsubscribeIE();\n }\n };\n}\n\nexport function registerWebRTCAdapters() {\n if (isIE11) {\n require('../webrtc-ie-shim.js');\n } else if (!(environmentDetect.isChrome() && (environmentDetect.majorVersion() < 49))) {\n require('webrtc-adapter/dist/adapter_core'); // eslint-disable-line global-require\n } else {\n trace.warn('no WebRTC adapters loaded.');\n }\n}\n"]}