@techsee/techsee-media-service 0.6.1-alpha.7 → 0.6.1-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/MediaSubscriber.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/MediaSubscriber.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAC,gBAAgB,EAAuB,MAAM,kBAAkB,CAAC;AAWxE,qBAAa,sBAAuB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwB;gBAE9C,gBAAgB,EAAE,qBAAqB;aAW/C,UAAU,EAAI,gBAAgB;aAI9B,SAAS,EAAI,cAAc;aAI3B,SAAS,EAAI,OAAO;aAIpB,YAAY,EAAI,OAAO;aAQvB,QAAQ,EAAI,OAAO;aAInB,QAAQ,EAAI,OAAO;aAInB,YAAY,EAAI,QAAQ,CAAC,gBAAgB,CAAC;aAI1C,UAAU,EAAI,MAAM;aAIpB,WAAW,EAAI,MAAM;aAIrB,WAAW,EAAI,MAAM;aAIrB,YAAY,EAAI,MAAM;IAI1B,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASjC,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAK1C,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IASrC,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"sources":["../src/MediaSubscriber.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAC,gBAAgB,EAAuB,MAAM,kBAAkB,CAAC;AAWxE,qBAAa,sBAAuB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwB;gBAE9C,gBAAgB,EAAE,qBAAqB;aAW/C,UAAU,EAAI,gBAAgB;aAI9B,SAAS,EAAI,cAAc;aAI3B,SAAS,EAAI,OAAO;aAIpB,YAAY,EAAI,OAAO;aAQvB,QAAQ,EAAI,OAAO;aAInB,QAAQ,EAAI,OAAO;aAInB,YAAY,EAAI,QAAQ,CAAC,gBAAgB,CAAC;aAI1C,UAAU,EAAI,MAAM;aAIpB,WAAW,EAAI,MAAM;aAIrB,WAAW,EAAI,MAAM;aAIrB,YAAY,EAAI,MAAM;IAI1B,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASjC,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAK1C,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IASrC,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAc9C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,IAAI,IAAI;IAgBf,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,eAAe;CAK1B","file":"MediaSubscriber.d.ts","sourcesContent":["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';\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 .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 const resizeHandler = (): void => {\n finalize();\n this._mediaElement && this._mediaElement.removeEventListener('resize', resizeHandler);\n this._mediaElement && this._mediaElement.addEventListener('resize', this.videoResizeHandler);\n };\n\n //Todo actually, from here we can know on dimensions changes\n this._mediaElement.addEventListener('resize', resizeHandler, false);\n } else {\n this._mediaElement.addEventListener('resize', 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"]}
|
package/lib/MediaSubscriber.js
CHANGED
|
@@ -125,7 +125,9 @@ var TechseeMediaSubscriber = /** @class */function () {
|
|
|
125
125
|
TechseeMediaSubscriber.prototype.renderStream = function (stream) {
|
|
126
126
|
var _this = this;
|
|
127
127
|
this.throwIfDisposed();
|
|
128
|
-
|
|
128
|
+
this.stopRenderInternal().then(function () {
|
|
129
|
+
return MediaDomUtils_1.renderMediaStreamToVideoEl(_this.container, stream.mediaStream);
|
|
130
|
+
}).then(function (videoEl) {
|
|
129
131
|
_this._hasAudio = stream.mediaStream.getAudioTracks().length > 0;
|
|
130
132
|
_this._hasVideo = stream.mediaStream.getVideoTracks().length > 0;
|
|
131
133
|
_this.setPlayingState(videoEl, stream.streamKind);
|
|
@@ -135,12 +137,9 @@ var TechseeMediaSubscriber = /** @class */function () {
|
|
|
135
137
|
};
|
|
136
138
|
TechseeMediaSubscriber.prototype.stopRendering = function () {
|
|
137
139
|
var _this = this;
|
|
138
|
-
|
|
139
|
-
return
|
|
140
|
-
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
return Promise.resolve();
|
|
140
|
+
return this.stopRenderInternal().then(function () {
|
|
141
|
+
return _this.setPlayingState();
|
|
142
|
+
});
|
|
144
143
|
};
|
|
145
144
|
TechseeMediaSubscriber.prototype.dispose = function () {
|
|
146
145
|
if (this._isDisposed) {
|
|
@@ -174,6 +173,7 @@ var TechseeMediaSubscriber = /** @class */function () {
|
|
|
174
173
|
this._mediaElement.addEventListener('resize', resizeHandler_1, false);
|
|
175
174
|
} else {
|
|
176
175
|
this._mediaElement.addEventListener('resize', this.videoResizeHandler);
|
|
176
|
+
finalize();
|
|
177
177
|
}
|
|
178
178
|
} else {
|
|
179
179
|
finalize();
|
|
@@ -183,6 +183,12 @@ var TechseeMediaSubscriber = /** @class */function () {
|
|
|
183
183
|
trace.info("Video resize, new size = w: " + this.videoWidth + " h:" + this.videoHeight);
|
|
184
184
|
this.emitEvent(privateEvents.STREAM_STATE_CHANGE);
|
|
185
185
|
};
|
|
186
|
+
TechseeMediaSubscriber.prototype.stopRenderInternal = function () {
|
|
187
|
+
if (this._mediaElement && document.body.contains(this._mediaElement)) {
|
|
188
|
+
return MediaDomUtils_1.removeVideoElementFromDom(this._mediaElement);
|
|
189
|
+
}
|
|
190
|
+
return Promise.resolve();
|
|
191
|
+
};
|
|
186
192
|
TechseeMediaSubscriber.prototype.emitEvent = function (event, eventArgs) {
|
|
187
193
|
var _this = this;
|
|
188
194
|
setTimeout(function () {
|
|
@@ -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","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","renderMediaStreamToVideoEl","mediaStream","then","videoEl","getAudioTracks","length","getVideoTracks","setPlayingState","streamKind","catch","error","warn","stopRendering","document","body","contains","removeVideoElementFromDom","Promise","resolve","dispose","undefined","removeAllListeners","finalize","isPlaying","KnownMediaStreamKind","Video","resizeHandler_1","removeEventListener","addEventListener","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 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 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 })\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 if (this._mediaElement && document.body.contains(this._mediaElement)) {\n return MediaDomUtils_1.removeVideoElementFromDom(this._mediaElement)\n .then(function () {\n _this.setPlayingState();\n });\n }\n return Promise.resolve();\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 resizeHandler_1 = function () {\n finalize();\n _this._mediaElement && _this._mediaElement.removeEventListener('resize', resizeHandler_1);\n _this._mediaElement && _this._mediaElement.addEventListener('resize', _this.videoResizeHandler);\n };\n //Todo actually, from here we can know on dimensions changes\n this._mediaElement.addEventListener('resize', resizeHandler_1, false);\n }\n else {\n this._mediaElement.addEventListener('resize', this.videoResizeHandler);\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.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';\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\n 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 .catch((error) => {\n trace.warn('Error while rendering stream on video element', error);\n });\n }\n\n stopRendering(): Promise<void> {\n if (this._mediaElement && document.body.contains(this._mediaElement)) {\n return removeVideoElementFromDom(this._mediaElement)\n .then(() => {\n this.setPlayingState();\n });\n }\n\n return Promise.resolve();\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 const resizeHandler = (): void => {\n finalize();\n this._mediaElement && this._mediaElement.removeEventListener('resize', resizeHandler);\n this._mediaElement && this._mediaElement.addEventListener('resize', this.videoResizeHandler);\n };\n\n //Todo actually, from here we can know on dimensions changes\n this._mediaElement.addEventListener('resize', resizeHandler, false);\n } else {\n this._mediaElement.addEventListener('resize', this.videoResizeHandler);\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 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","events_1","require","MediaDomUtils_1","MediaConstants_1","MediaTracer_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","resizeHandler_1","removeEventListener","addEventListener","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 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 })\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 resizeHandler_1 = function () {\n finalize();\n _this._mediaElement && _this._mediaElement.removeEventListener('resize', resizeHandler_1);\n _this._mediaElement && _this._mediaElement.addEventListener('resize', _this.videoResizeHandler);\n };\n //Todo actually, from here we can know on dimensions changes\n this._mediaElement.addEventListener('resize', resizeHandler_1, false);\n }\n else {\n this._mediaElement.addEventListener('resize', 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';\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 .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 const resizeHandler = (): void => {\n finalize();\n this._mediaElement && this._mediaElement.removeEventListener('resize', resizeHandler);\n this._mediaElement && this._mediaElement.addEventListener('resize', this.videoResizeHandler);\n };\n\n //Todo actually, from here we can know on dimensions changes\n this._mediaElement.addEventListener('resize', resizeHandler, false);\n } else {\n this._mediaElement.addEventListener('resize', 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"]}
|