@techsee/techsee-media-service 0.6.1-alpha.9 → 0.7.0
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/MediaServiceBase.d.ts.map +1 -1
- package/lib/MediaServiceBase.js +4 -4
- package/lib/MediaServiceBase.js.map +1 -1
- package/lib/MediaSession/{SessionOpentok.v3.d.ts → SessionOpentok.d.ts} +1 -1
- package/lib/MediaSession/SessionOpentok.d.ts.map +1 -0
- package/lib/MediaSession/{SessionOpentok.v3.js → SessionOpentok.js} +26 -26
- package/lib/MediaSession/SessionOpentok.js.map +1 -0
- package/lib/MediaSession/{SessionTurn.v3.d.ts → SessionTurn.d.ts} +1 -1
- package/lib/MediaSession/SessionTurn.d.ts.map +1 -0
- package/lib/MediaSession/{SessionTurn.v3.js → SessionTurn.js} +29 -29
- package/lib/MediaSession/SessionTurn.js.map +1 -0
- package/package.json +5 -5
- package/lib/MediaSession/SessionOpentok.v3.d.ts.map +0 -1
- package/lib/MediaSession/SessionOpentok.v3.js.map +0 -1
- package/lib/MediaSession/SessionTurn.v3.d.ts.map +0 -1
- package/lib/MediaSession/SessionTurn.v3.js.map +0 -1
|
@@ -26,9 +26,9 @@ var MediaSessionBase_1 = require("./MediaSessionBase");
|
|
|
26
26
|
var MediaTracer_1 = require("../MediaUtils/MediaTracer");
|
|
27
27
|
var trace = MediaTracer_1.getMediaTracer('OpentokSessionV3');
|
|
28
28
|
//Currently this version supports subscribing only. Publishing will be implemented as needed.
|
|
29
|
-
var
|
|
30
|
-
__extends(
|
|
31
|
-
function
|
|
29
|
+
var OpentokSession = /** @class */function (_super) {
|
|
30
|
+
__extends(OpentokSession, _super);
|
|
31
|
+
function OpentokSession(sessionParams, streamFactory) {
|
|
32
32
|
var _this = _super.call(this, sessionParams, streamFactory) || this;
|
|
33
33
|
_this._session = null;
|
|
34
34
|
_this._credentials = sessionParams.credentials;
|
|
@@ -44,21 +44,21 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
44
44
|
_this.streamDestroyedHandler = _this.streamDestroyedHandler.bind(_this);
|
|
45
45
|
return _this;
|
|
46
46
|
}
|
|
47
|
-
Object.defineProperty(
|
|
47
|
+
Object.defineProperty(OpentokSession.prototype, "id", {
|
|
48
48
|
get: function get() {
|
|
49
49
|
return this._session && this._session.sessionId ? this._session.sessionId : '';
|
|
50
50
|
},
|
|
51
51
|
enumerable: true,
|
|
52
52
|
configurable: true
|
|
53
53
|
});
|
|
54
|
-
Object.defineProperty(
|
|
54
|
+
Object.defineProperty(OpentokSession.prototype, "ownPeerId", {
|
|
55
55
|
get: function get() {
|
|
56
56
|
return this._session && this._session.connection ? this._session.connection.connectionId : '';
|
|
57
57
|
},
|
|
58
58
|
enumerable: true,
|
|
59
59
|
configurable: true
|
|
60
60
|
});
|
|
61
|
-
|
|
61
|
+
OpentokSession.prototype.connect = function () {
|
|
62
62
|
var _this = this;
|
|
63
63
|
trace.info('Connect to session', this._credentials);
|
|
64
64
|
if (this._session) {
|
|
@@ -90,7 +90,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
90
90
|
_this._session.connect(_this._credentials.token, connectHandler);
|
|
91
91
|
});
|
|
92
92
|
};
|
|
93
|
-
|
|
93
|
+
OpentokSession.prototype.disconnect = function () {
|
|
94
94
|
var _this = this;
|
|
95
95
|
return new Promise(function (resolve) {
|
|
96
96
|
trace.info('Disconnecting from session');
|
|
@@ -109,7 +109,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
109
109
|
resolve();
|
|
110
110
|
});
|
|
111
111
|
};
|
|
112
|
-
|
|
112
|
+
OpentokSession.prototype.onMediaStreamDestroyed = function (clientRole) {
|
|
113
113
|
var _this = this;
|
|
114
114
|
var promises = [];
|
|
115
115
|
this._peerConnections.forEach(function (peerConnection) {
|
|
@@ -121,11 +121,11 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
121
121
|
return undefined;
|
|
122
122
|
});
|
|
123
123
|
};
|
|
124
|
-
|
|
124
|
+
OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
|
|
125
125
|
//TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)
|
|
126
126
|
return Promise.resolve();
|
|
127
127
|
};
|
|
128
|
-
|
|
128
|
+
OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {
|
|
129
129
|
var _this = this;
|
|
130
130
|
return new Promise(function (resolve, reject) {
|
|
131
131
|
var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);
|
|
@@ -144,7 +144,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
144
144
|
});
|
|
145
145
|
};
|
|
146
146
|
//#region OpenTok Events Handlers
|
|
147
|
-
|
|
147
|
+
OpentokSession.prototype.connectionCreatedHandler = function (event) {
|
|
148
148
|
var _this = this;
|
|
149
149
|
trace.info('connectionCreatedHandler', event);
|
|
150
150
|
var connection = event.connection;
|
|
@@ -198,7 +198,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
198
198
|
trace.error('Error handling new peer connection', error);
|
|
199
199
|
});
|
|
200
200
|
};
|
|
201
|
-
|
|
201
|
+
OpentokSession.prototype.connectionDestroyedHandler = function (event) {
|
|
202
202
|
trace.info('connectionDestroyedHandler', event);
|
|
203
203
|
var connection = event.connection;
|
|
204
204
|
if (!this.sessionExistsGuard(false) || !connection) {
|
|
@@ -208,7 +208,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
208
208
|
this.destroyPeerConnection(this._peerConnections.get(connection.connectionId));
|
|
209
209
|
}
|
|
210
210
|
};
|
|
211
|
-
|
|
211
|
+
OpentokSession.prototype.streamCreatedHandler = function (event) {
|
|
212
212
|
var _this = this;
|
|
213
213
|
trace.info('streamCreatedHandler', event.stream);
|
|
214
214
|
var stream = event.stream;
|
|
@@ -238,7 +238,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
238
238
|
});
|
|
239
239
|
});
|
|
240
240
|
};
|
|
241
|
-
|
|
241
|
+
OpentokSession.prototype.streamDestroyedHandler = function (event) {
|
|
242
242
|
trace.info('streamDestroyedHandler', event);
|
|
243
243
|
var stream = event.stream;
|
|
244
244
|
if (!this.sessionExistsGuard(false) || !stream) {
|
|
@@ -255,7 +255,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
255
255
|
};
|
|
256
256
|
//#endregion
|
|
257
257
|
//#region PeerConnection
|
|
258
|
-
|
|
258
|
+
OpentokSession.prototype.destroyPeerConnection = function (peerConnection) {
|
|
259
259
|
this._peerConnections.delete(peerConnection.peerId);
|
|
260
260
|
this.destroyPublisherOnPeerConnection(peerConnection).catch(function () {
|
|
261
261
|
return undefined;
|
|
@@ -266,7 +266,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
266
266
|
};
|
|
267
267
|
//#endregion
|
|
268
268
|
//#region Publisher
|
|
269
|
-
|
|
269
|
+
OpentokSession.prototype.createStreamForPublishing = function (destinationRole) {
|
|
270
270
|
var _this = this;
|
|
271
271
|
trace.info('createStreamForPublishing');
|
|
272
272
|
return this._sessionStreamsManager.getMediaStreamForRole(destinationRole).then(function (mediaStream) {
|
|
@@ -286,7 +286,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
286
286
|
return stream;
|
|
287
287
|
});
|
|
288
288
|
};
|
|
289
|
-
|
|
289
|
+
OpentokSession.prototype.createMediaPublisher = function (stream, streamName) {
|
|
290
290
|
var otParams = {
|
|
291
291
|
videoSource: stream.videoSource ? stream.videoSource : false,
|
|
292
292
|
audioSource: stream.audioSource ? stream.audioSource : false,
|
|
@@ -315,7 +315,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
315
315
|
});
|
|
316
316
|
});
|
|
317
317
|
};
|
|
318
|
-
|
|
318
|
+
OpentokSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {
|
|
319
319
|
if (this.sessionExistsGuard(false) && peerConnection.publisher) {
|
|
320
320
|
this._session.unpublish(peerConnection.publisher);
|
|
321
321
|
}
|
|
@@ -325,7 +325,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
325
325
|
};
|
|
326
326
|
//#endregion
|
|
327
327
|
//#region Subscriber
|
|
328
|
-
|
|
328
|
+
OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {
|
|
329
329
|
var _this = this;
|
|
330
330
|
return new Promise(function (resolve, reject) {
|
|
331
331
|
if (!_this.sessionExistsGuard(false)) {
|
|
@@ -346,7 +346,7 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
346
346
|
});
|
|
347
347
|
});
|
|
348
348
|
};
|
|
349
|
-
|
|
349
|
+
OpentokSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {
|
|
350
350
|
if (this.sessionExistsGuard(false) && peerConnection.subscriber) {
|
|
351
351
|
this._session.unsubscribe(peerConnection.subscriber);
|
|
352
352
|
}
|
|
@@ -357,23 +357,23 @@ var OpentokSessionV3 = /** @class */function (_super) {
|
|
|
357
357
|
});
|
|
358
358
|
};
|
|
359
359
|
//#endregion
|
|
360
|
-
|
|
360
|
+
OpentokSession.prototype.calculateDestinationRole = function () {
|
|
361
361
|
if (this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {
|
|
362
362
|
var isAgentConnected = false;
|
|
363
363
|
return !isAgentConnected ? MediaConstants_1.SessionClientRole.AGENT : MediaConstants_1.SessionClientRole.OBSERVER;
|
|
364
364
|
}
|
|
365
365
|
return MediaConstants_1.SessionClientRole.USER;
|
|
366
366
|
};
|
|
367
|
-
|
|
367
|
+
OpentokSession.prototype.sessionExistsGuard = function (shouldThrow) {
|
|
368
368
|
if (shouldThrow === void 0) {
|
|
369
369
|
shouldThrow = true;
|
|
370
370
|
}
|
|
371
371
|
var connected = !!(this._session && this._session.connection && this._session.connection.connectionId);
|
|
372
372
|
return guards_1.throwableGuard(connected, 'There no active session', shouldThrow);
|
|
373
373
|
};
|
|
374
|
-
return
|
|
374
|
+
return OpentokSession;
|
|
375
375
|
}(MediaSessionBase_1.MediaSessionBase);
|
|
376
|
-
exports.
|
|
376
|
+
exports.OpentokSession = OpentokSession;
|
|
377
377
|
|
|
378
|
-
//# sourceMappingURL=SessionOpentok.
|
|
379
|
-
//# sourceMappingURL=SessionOpentok.
|
|
378
|
+
//# sourceMappingURL=SessionOpentok.js.map
|
|
379
|
+
//# sourceMappingURL=SessionOpentok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["MediaSession/SessionOpentok.js"],"names":["__extends","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__","constructor","prototype","create","defineProperty","exports","value","MediaConstants_1","require","guards_1","MediaSessionBase_1","MediaTracer_1","trace","getMediaTracer","OpentokSession","_super","sessionParams","streamFactory","_this","call","_session","_credentials","credentials","connect","bind","disconnect","onMediaStreamDestroyed","onMediaStreamRenewed","createStreamForPublishing","createMediaPublisher","connectionCreatedHandler","connectionDestroyedHandler","streamCreatedHandler","streamDestroyedHandler","get","sessionId","enumerable","configurable","connection","connectionId","info","error","Promise","reject","resolve","handleError","off","_a","_sessionParams","apiKey","window","OTSESSION","OT","initSession","on","connectHandler","token","currentSession","_peerConnections","forEach","peerConnection","destroyPeerConnection","clientRole","promises","peerRole","push","destroyPublisherOnPeerConnection","all","then","undefined","mediaStream","getRemoteTrackStats","mediaTrack","peerConnectionOfTrack","getPeerConnectionByMediaTrack","subscriber","Error","getStats","stats","warn","trackId","id","trackStats","event","sessionExistsGuard","ownPeerId","destinationRole","calculateDestinationRole","streams","peerId","peerType","clientType","SessionClientType","INITIATOR","GUEST","publisher","remoteMediaTracks","localStream","videoSource","audioSource","streamName","SessionClientRole","USER","KnownMediaStream","AGENT_AUDIO_STREAM","USER_VIDEO_STREAM","set","publish","catch","has","stream","createMediaSubscriber","subcriber","args","element","otMediaStream","srcObject","getTracks","registerMediaTrackFromPeer","destroySubscriberOnPeerConnection","delete","_sessionStreamsManager","getMediaStreamForRole","track","kind","otParams","publishAudio","publishVideo","showControls","name","otPublisher","initPublisher","preventDefault","document","getElementById","style","display","muted","unpublish","remoteStream","subscribe","err","unsubscribe","unregisterPeersRemoteMediaTracks","isAgentConnected","AGENT","OBSERVER","shouldThrow","connected","throwableGuard","MediaSessionBase"],"mappings":"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","file":"SessionOpentok.js","sourcesContent":["\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar guards_1 = require(\"@techsee/techsee-common/lib/core/guards\");\nvar MediaSessionBase_1 = require(\"./MediaSessionBase\");\nvar MediaTracer_1 = require(\"../MediaUtils/MediaTracer\");\nvar trace = MediaTracer_1.getMediaTracer('OpentokSessionV3');\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nvar OpentokSession = /** @class */ (function (_super) {\n __extends(OpentokSession, _super);\n function OpentokSession(sessionParams, streamFactory) {\n var _this = _super.call(this, sessionParams, streamFactory) || this;\n _this._session = null;\n _this._credentials = sessionParams.credentials;\n _this.connect = _this.connect.bind(_this);\n _this.disconnect = _this.disconnect.bind(_this);\n _this.onMediaStreamDestroyed = _this.onMediaStreamDestroyed.bind(_this);\n _this.onMediaStreamRenewed = _this.onMediaStreamRenewed.bind(_this);\n _this.createStreamForPublishing = _this.createStreamForPublishing.bind(_this);\n _this.createMediaPublisher = _this.createMediaPublisher.bind(_this);\n _this.connectionCreatedHandler = _this.connectionCreatedHandler.bind(_this);\n _this.connectionDestroyedHandler = _this.connectionDestroyedHandler.bind(_this);\n _this.streamCreatedHandler = _this.streamCreatedHandler.bind(_this);\n _this.streamDestroyedHandler = _this.streamDestroyedHandler.bind(_this);\n return _this;\n }\n Object.defineProperty(OpentokSession.prototype, \"id\", {\n get: function () {\n return this._session && this._session.sessionId ? this._session.sessionId : '';\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(OpentokSession.prototype, \"ownPeerId\", {\n get: function () {\n return this._session && this._session.connection ? this._session.connection.connectionId : '';\n },\n enumerable: true,\n configurable: true\n });\n OpentokSession.prototype.connect = function () {\n var _this = this;\n trace.info('Connect to session', this._credentials);\n if (this._session) {\n trace.error('Session already exists');\n return Promise.reject('Cannot connect to session while another session is active');\n }\n return new Promise(function (resolve, reject) {\n var handleError = function (error) {\n _this._session && _this._session.off();\n _this._session = null;\n trace.error('handleConnect error:', error);\n reject(error);\n };\n var _a = _this._sessionParams.credentials, apiKey = _a.apiKey, sessionId = _a.sessionId;\n _this._session = window.OTSESSION = window.OT.initSession(apiKey, sessionId);\n _this._session.on('connectionCreated', _this.connectionCreatedHandler);\n _this._session.on('connectionDestroyed', _this.connectionDestroyedHandler);\n _this._session.on('streamCreated', _this.streamCreatedHandler);\n _this._session.on('streamDestroyed', _this.streamDestroyedHandler);\n var connectHandler = function (error) {\n if (error) {\n handleError(error);\n return;\n }\n resolve();\n };\n _this._session.connect(_this._credentials.token, connectHandler);\n });\n };\n OpentokSession.prototype.disconnect = function () {\n var _this = this;\n return new Promise(function (resolve) {\n trace.info('Disconnecting from session');\n var currentSession = _this._session;\n _this._session = null;\n _this._peerConnections.forEach(function (peerConnection) {\n _this.destroyPeerConnection(peerConnection);\n });\n if (!currentSession) {\n trace.info('No active session - resolving');\n resolve();\n return;\n }\n currentSession.off();\n currentSession.disconnect();\n resolve();\n });\n };\n OpentokSession.prototype.onMediaStreamDestroyed = function (clientRole) {\n var _this = this;\n var promises = [];\n this._peerConnections.forEach(function (peerConnection) {\n if (peerConnection.peerRole === clientRole) {\n promises.push(_this.destroyPublisherOnPeerConnection(peerConnection));\n }\n });\n return Promise.all(promises).then(function () { return undefined; });\n };\n OpentokSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation (in OT API)\n return Promise.resolve();\n };\n OpentokSession.prototype.getRemoteTrackStats = function (mediaTrack) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n var peerConnectionOfTrack = _this.getPeerConnectionByMediaTrack(mediaTrack);\n if (!peerConnectionOfTrack || !peerConnectionOfTrack.subscriber) {\n reject(new Error('Cannot find peer or subscriber for getting stats'));\n }\n //https://tokbox.com/developer/sdks/js/reference/Subscriber.html#getStats\n peerConnectionOfTrack.subscriber.getStats(function (error, stats) {\n if (error) {\n trace.warn('Error getting stats', error);\n resolve({ trackId: mediaTrack.id, trackStats: {} });\n return;\n }\n resolve({ trackId: mediaTrack.id, trackStats: stats });\n });\n });\n };\n //#region OpenTok Events Handlers\n OpentokSession.prototype.connectionCreatedHandler = function (event) {\n var _this = this;\n trace.info('connectionCreatedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n //In case we got our own connection, we have nothing to do with it\n if (connection.connectionId === this.ownPeerId) {\n return;\n }\n var destinationRole = this.calculateDestinationRole();\n this.createStreamForPublishing(destinationRole)\n .then(function (streams) {\n var peerConnection = {\n peerId: connection.connectionId,\n peerRole: destinationRole,\n peerType: _this._sessionParams.clientType === MediaConstants_1.SessionClientType.INITIATOR\n ? MediaConstants_1.SessionClientType.GUEST : MediaConstants_1.SessionClientType.INITIATOR,\n connection: connection,\n publisher: null,\n subscriber: null,\n remoteMediaTracks: [],\n localStream: streams\n };\n if (!streams.videoSource && !streams.audioSource) {\n trace.info('Peer connection without publisher was created', peerConnection);\n return peerConnection;\n }\n var streamName = destinationRole === MediaConstants_1.SessionClientRole.USER\n ? MediaConstants_1.KnownMediaStream.AGENT_AUDIO_STREAM : MediaConstants_1.KnownMediaStream.USER_VIDEO_STREAM;\n return _this.createMediaPublisher(streams, streamName)\n .then(function (publisher) {\n peerConnection.publisher = publisher;\n trace.info('Peer connection with publisher was created', peerConnection);\n return peerConnection;\n });\n })\n .then(function (peerConnection) {\n _this._peerConnections.set(peerConnection.peerId, peerConnection);\n if (peerConnection.publisher) {\n return new Promise(function (resolve, reject) {\n trace.info('Starting publish to peerConnection.publisher');\n _this._session.publish(peerConnection.publisher, function (error) {\n if (error) {\n trace.error('Publish to peerConnection error', error);\n return reject(error);\n }\n trace.info('Publish to peerConnection success');\n return resolve();\n });\n });\n }\n return Promise.resolve();\n })\n .catch(function (error) {\n //Need to handle fail cases during reliability\n trace.error('Error handling new peer connection', error);\n });\n };\n OpentokSession.prototype.connectionDestroyedHandler = function (event) {\n trace.info('connectionDestroyedHandler', event);\n var connection = event.connection;\n if (!this.sessionExistsGuard(false) || !connection) {\n return;\n }\n if (this._peerConnections.has(connection.connectionId)) {\n this.destroyPeerConnection(this._peerConnections.get(connection.connectionId));\n }\n };\n OpentokSession.prototype.streamCreatedHandler = function (event) {\n var _this = this;\n trace.info('streamCreatedHandler', event.stream);\n var stream = event.stream;\n var connection = (stream || { connection: null }).connection;\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n if (!this._peerConnections.has(connection.connectionId)) {\n trace.warn('Unexpected case, connection should exist on this stage');\n return;\n }\n var peerConnection = this._peerConnections.get(connection.connectionId);\n trace.info('Subscribing the stream');\n this.createMediaSubscriber(stream).then(function (subcriber) {\n peerConnection.subscriber = subcriber;\n peerConnection.subscriber.on('videoElementCreated', function (args) {\n var element = args.element;\n var otMediaStream = element.srcObject;\n if (!otMediaStream) {\n trace.warn('MediaStream not found in OT video element');\n return;\n }\n trace.info('Registering remote media tracks', peerConnection.subscriber, otMediaStream);\n otMediaStream.getTracks().forEach(function (mediaTrack) {\n _this.registerMediaTrackFromPeer(peerConnection, mediaTrack);\n });\n });\n });\n };\n OpentokSession.prototype.streamDestroyedHandler = function (event) {\n trace.info('streamDestroyedHandler', event);\n var stream = event.stream;\n if (!this.sessionExistsGuard(false) || !stream) {\n return;\n }\n var peerConnection = this._peerConnections.get(stream.connection.connectionId);\n if (!peerConnection) {\n trace.warn('Peer connection for remote stream not found');\n return;\n }\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region PeerConnection\n OpentokSession.prototype.destroyPeerConnection = function (peerConnection) {\n this._peerConnections.delete(peerConnection.peerId);\n this.destroyPublisherOnPeerConnection(peerConnection).catch(function () { return undefined; });\n this.destroySubscriberOnPeerConnection(peerConnection).catch(function () { return undefined; });\n };\n //#endregion\n //#region Publisher\n OpentokSession.prototype.createStreamForPublishing = function (destinationRole) {\n var _this = this;\n trace.info('createStreamForPublishing');\n return this._sessionStreamsManager.getMediaStreamForRole(destinationRole)\n .then(function (mediaStream) {\n var stream = { videoSource: null, audioSource: null };\n if (mediaStream) {\n trace.info('Media stream found for publishing', mediaStream);\n mediaStream.getTracks().forEach(function (track) {\n if (track.kind === 'video') {\n stream.videoSource = track;\n }\n else if (track.kind === 'audio') {\n stream.audioSource = track;\n }\n });\n }\n else if (_this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n trace.warn('No local media was found for publishing to destinationRole:', destinationRole);\n }\n return stream;\n });\n };\n OpentokSession.prototype.createMediaPublisher = function (stream, streamName) {\n var otParams = {\n videoSource: stream.videoSource ? stream.videoSource : false,\n audioSource: stream.audioSource ? stream.audioSource : false,\n publishAudio: !!stream.audioSource,\n publishVideo: !!stream.videoSource,\n showControls: false,\n name: streamName\n };\n return new Promise(function (resolve, reject) {\n var otPublisher = window.OT.initPublisher(undefined, otParams, function (error) {\n if (error) {\n reject(error);\n return;\n }\n otPublisher.on('streamDestroyed', function (event) {\n trace.info('Publisher stream destroyed', event);\n //We preventing the default, in order to prevent stop the stream by OT.\n //We managing streams by ourselves and if we allow OT to close the stream, it cannot be reused.\n event.preventDefault();\n });\n otPublisher.on('videoElementCreated', function (event) {\n document.getElementById(otPublisher.id).style.display = 'none';\n event.element.muted = true;\n });\n resolve(otPublisher);\n });\n });\n };\n OpentokSession.prototype.destroyPublisherOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.publisher) {\n this._session.unpublish(peerConnection.publisher);\n }\n peerConnection.publisher = null;\n peerConnection.localStream = null;\n return Promise.resolve();\n };\n //#endregion\n //#region Subscriber\n OpentokSession.prototype.createMediaSubscriber = function (remoteStream) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (!_this.sessionExistsGuard(false)) {\n reject('Session not exists');\n return;\n }\n var subscriber = _this._session.subscribe(remoteStream, null, null, function (err) {\n if (err) {\n trace.warn('Error creating subscriber', err);\n reject(err);\n return;\n }\n subscriber.on('videoElementCreated', function (event) {\n document.getElementById(subscriber.id).style.display = 'none';\n event.element.muted = true;\n });\n resolve(subscriber);\n });\n });\n };\n OpentokSession.prototype.destroySubscriberOnPeerConnection = function (peerConnection) {\n if (this.sessionExistsGuard(false) && peerConnection.subscriber) {\n this._session.unsubscribe(peerConnection.subscriber);\n }\n return this.unregisterPeersRemoteMediaTracks(peerConnection)\n .catch(function () { return trace.warn('Error removing remote streams from peerConnection'); })\n .then(function () {\n peerConnection.subscriber = null;\n });\n };\n //#endregion\n OpentokSession.prototype.calculateDestinationRole = function () {\n if (this._sessionParams.clientRole === MediaConstants_1.SessionClientRole.USER) {\n var isAgentConnected = false;\n return !isAgentConnected ? MediaConstants_1.SessionClientRole.AGENT : MediaConstants_1.SessionClientRole.OBSERVER;\n }\n return MediaConstants_1.SessionClientRole.USER;\n };\n OpentokSession.prototype.sessionExistsGuard = function (shouldThrow) {\n if (shouldThrow === void 0) { shouldThrow = true; }\n var connected = !!(this._session && this._session.connection && this._session.connection.connectionId);\n return guards_1.throwableGuard(connected, 'There no active session', shouldThrow);\n };\n return OpentokSession;\n}(MediaSessionBase_1.MediaSessionBase));\nexports.OpentokSession = OpentokSession;\n\n//# sourceMappingURL=SessionOpentok.js.map\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IMediaSession, ISessionStreamsManager, MediaSessionHandlers, MediaSessionParams, RemoteTrackStats } from '../MediaContracts';
|
|
2
2
|
import { SessionClientRole } from '../MediaConstants';
|
|
3
3
|
import { MediaSessionBase } from './MediaSessionBase';
|
|
4
|
-
export declare class
|
|
4
|
+
export declare class TurnWebRtcSession extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {
|
|
5
5
|
private readonly _sessionHandlers;
|
|
6
6
|
private readonly _pendingPeersIce;
|
|
7
7
|
private readonly _configuration;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/MediaSession/SessionTurn.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EACA,gBAAgB,EACrC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAGH,iBAAiB,EAEpB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAKpD,qBAAa,iBAAkB,SAAQ,gBAAgB,CAAC,iBAAiB,CAAE,YAAW,aAAa;IAC/F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAM;IACrC,OAAO,CAAC,OAAO,CAAM;aAEjB,EAAE,EAAI,MAAM;gBAIJ,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,aAAa,EAAE,sBAAsB;IA4B3H,OAAO,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkChE,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBlD,iBAAiB,CAAC,kBAAkB,EAAE,GAAG,GAAG,IAAI;IAsDhD,oBAAoB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAwBjD,wBAAwB,CAAC,qBAAqB,EAAE,GAAG,GAAG,IAAI;IAe1D,gBAAgB,CAAC,aAAa,EAAE,GAAG,GAAG,IAAI;IA2E1C,yBAAyB,IAAI,IAAI;IAcjC,sBAAsB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5F,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAY5E,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,mBAAmB;IAY3B,4BAA4B,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAuBzD,sBAAsB,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvG,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAejD,kBAAkB,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvE,qBAAqB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI;CAKjE","file":"SessionTurn.d.ts","sourcesContent":["import * as io from 'socket.io-client';\nimport once from 'lodash/once';\nimport {Nullable} from '@techsee/techsee-common';\n\nimport {\n IMediaSession,\n ISessionStreamsManager,\n MediaSessionHandlers,\n MediaSessionParams,\n RemoteMediaTrack, RemoteTrackStats\n} from '../MediaContracts';\n\nimport {\n KnownMediaStream,\n MediaSessionDisconnectReason,\n SessionClientRole,\n SessionClientType\n} from '../MediaConstants';\n\nimport {\n SOCKET_EVENTS, SOCKET_PATH,\n SOCKET_RECONNECTION_ATTEMPTS,\n SOCKET_RECONNECTION_DELAY,\n SOCKET_RECONNECTION_DELAY_MAX\n} from './TurnConstants';\n\nimport {getMediaTracer} from '../MediaUtils/MediaTracer';\nimport {MediaSessionBase} from './MediaSessionBase';\n\nconst trace = getMediaTracer('TurnSessionV3');\n\n//Currently this version supports subscribing only. Publishing will be implemented as needed.\nexport class TurnWebRtcSession extends MediaSessionBase<RTCPeerConnection> implements IMediaSession {\n private readonly _sessionHandlers: MediaSessionHandlers;\n private readonly _pendingPeersIce: any;\n private readonly _configuration: any;\n private _socket: any;\n\n get id(): string {\n return this._sessionParams.sessionId;\n }\n\n constructor(sessionParams: MediaSessionParams, sessionHandlers: MediaSessionHandlers, streamFactory: ISessionStreamsManager) {\n super(sessionParams, streamFactory);\n this._sessionHandlers = sessionHandlers;\n this._socket = null;\n this._pendingPeersIce = {};\n\n const iceServers = sessionParams.credentials.ice.map((item: any) => ({\n urls: item.url,\n username: item.login,\n credential: item.password\n }));\n\n this._configuration = {\n iceServers,\n iceTransportPolicy: 'relay'\n };\n\n this._joinResponseHandler = this._joinResponseHandler.bind(this);\n this._iceCandidateReceivedHandler = this._iceCandidateReceivedHandler.bind(this);\n this._sendOfferHandler = this._sendOfferHandler.bind(this);\n this._sdpOfferHandler = this._sdpOfferHandler.bind(this);\n this._userPeerReconnectHandler = this._userPeerReconnectHandler.bind(this);\n this._peerDisconnectedHandler = this._peerDisconnectedHandler.bind(this);\n this._onSocketDisconnectedHandler = this._onSocketDisconnectedHandler.bind(this);\n }\n\n //#region Socket Connectivity\n\n connect(connectOnly = false): Promise<void> {\n trace.info('Connect to session');\n\n return this._connectSocket(this._sessionParams.credentials.url, connectOnly)\n .then(() => {\n trace.info('Joining SessionId: ' + this._sessionParams.sessionId);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.JOIN_ROOM, {\n clientType: this._sessionParams.clientType,\n sessionId: this._sessionParams.sessionId\n });\n })\n .catch((error) => {\n throw error;\n });\n }\n\n disconnect(): Promise<void> {\n return this._disconnectInternal(MediaSessionDisconnectReason.ForcedByConsumer);\n }\n\n _connectSocket(url: string, connectOnly: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = this._socket = io.connect(url, {\n 'forceNew': true,\n 'reconnectionDelay': SOCKET_RECONNECTION_DELAY,\n 'reconnectionDelayMax': SOCKET_RECONNECTION_DELAY_MAX,\n 'reconnectionAttempts': SOCKET_RECONNECTION_ATTEMPTS,\n 'path': SOCKET_PATH\n });\n\n const done = once((err?: any) => {\n err ? reject(err) : resolve();\n });\n\n socket.once('connect', () => done());\n socket.on(SOCKET_EVENTS.INCOMING.ERROR, done);\n socket.on('connect_error', done);\n socket.on('connect_timeout', done);\n socket.on('disconnect', this._onSocketDisconnectedHandler);\n\n if (!connectOnly) {\n trace.info('Subscribing socket events');\n\n //PUBLISHING NOT SUPPORTED YET\n socket.on(SOCKET_EVENTS.INCOMING.SEND_OFFER, this._sendOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.JOIN_RESPONSE, this._joinResponseHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PEER_DISCONNECTED, this._peerDisconnectedHandler);\n socket.on(SOCKET_EVENTS.INCOMING.SDP_OFFER, this._sdpOfferHandler);\n socket.on(SOCKET_EVENTS.INCOMING.PUBLISHER_RECONNECT, this._userPeerReconnectHandler);\n socket.on(SOCKET_EVENTS.INCOMING.ICE_CANDIDATE, this._iceCandidateReceivedHandler);\n }\n });\n }\n\n _onSocketDisconnectedHandler(reason: string): void {\n if (this._socket) {\n // The initial example of differentiating between \"forced\" disconnect and \"network\" disconnect is taken from:\n // https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99\n if (reason !== 'io server disconnect' && reason !== 'io client disconnect') {\n // the disconnection was initiated by the server or by client, you need to call (connect) manually\n this._disconnectInternal(MediaSessionDisconnectReason.SignalingChannelDisconnect).catch(() => undefined);\n }\n }\n }\n\n //#endregion\n\n //#region WebRTC Initiator - session Initiator (User on mobile device)\n\n // Received by Initiator, causing him to emit SDP_OFFER\n _sendOfferHandler(sendOfferEventData: any): void {\n const {uid, peerId} = sendOfferEventData;\n\n trace.info('_sendOfferHandler');\n\n //Currently we not support of passing role through signaling, so we assume every connection is \"AGENT\" like\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.GUEST, SessionClientRole.AGENT);\n const offerParams = {offerToReceiveAudio: true, offerToReceiveVideo: true};\n\n peerConnection.ontrack = (trackEvent: any) => {\n const track: MediaStreamTrack = trackEvent.track;\n\n trace.info(`MediaStreamTrack arrived from peerConnection: ${track.kind}`, track);\n this.registerMediaTrackFromPeer(peerConnection, track);\n };\n\n //TODO - Alex: Currently we not sending \"role\" through signaling, and by default we assume that the one who asks fot offer, is agent.\n //On later stages we can send or the client \"role\" or the list of \"streams\" that peer is interested in.\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.AGENT)\n .then((mediaStream: Nullable<MediaStream>) => {\n trace.info('_sendOfferHandler stream and peer created');\n\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => peerConnection.createOffer(offerParams))\n .then((offerDesc) => {\n trace.info('Initiator has created sdp offer', {offerDesc});\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_OFFER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpOffer: offerDesc.sdp\n });\n\n return peerConnection.setLocalDescription(offerDesc)\n .then(() => {\n trace.info('Local description was set on peerConnection', peerConnection);\n });\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n }\n\n // Received by the Initiator: Indicates that publish should be started\n _joinResponseHandler(joinResponseData: any): void {\n const {sdpAnswer, uid, peerId} = joinResponseData;\n\n trace.info('joinResponse Received', {sdpAnswer});\n\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const answer = new RTCSessionDescription({\n type: 'answer',\n sdp: sdpAnswer\n });\n\n peerConnection.setRemoteDescription(answer)\n .then(() => {\n trace.info('Remote description was set', answer);\n\n this._processQueuedIceCandidates(peerId);\n })\n .catch((e) => {\n trace.warn('Error', e);\n });\n });\n }\n\n // Received by Initiator after a guests socket has been disconnected\n _peerDisconnectedHandler(peerDisconnectedEvent: any): void {\n const {peerId} = peerDisconnectedEvent;\n\n trace.info('_peerDisconnectedHandler');\n\n this._withPeerConnection(peerId, (peerConnection: any) => {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerDisconnected).catch(() => undefined);\n });\n }\n\n //#endregion WebRTC Initiator - session Initiator (User on mobile device)\n\n //#region WebRTC Guest - session Guest (Agent on dashboard platform)\n\n // Received by Guest, causing him to emit SDP_ANSWER\n _sdpOfferHandler(sdpOfferEvent: any): void {\n const {sdpOffer, peerId, uid} = sdpOfferEvent;\n\n trace.info('sdpOffer Received', {sdpOffer});\n\n const peerConnection = this._createPeerConnection(peerId, SessionClientType.INITIATOR, SessionClientRole.USER);\n\n peerConnection.ontrack = (trackEvent: any) => {\n const {track} = trackEvent;\n\n trace.info(`MediaStreamTrack arrived from peerConnection: ${track.kind}`, track);\n\n const remoteTrack: RemoteMediaTrack = {\n mediaTrack: track,\n trackType: track.kind === 'video'\n //Although we can have desktop share stream, we still name it USER_VIDEO_STREAM in dashboard.\n //Because currently we support only one video stream to be streamed at the time, it's not an issue.\n //But when we will need to stream more than one stream of a kind from single peer, this will be need to change.\n ? KnownMediaStream.USER_VIDEO_STREAM : KnownMediaStream.USER_AUDIO_STREAM\n };\n\n peerConnection.remoteMediaTracks.push(remoteTrack);\n this._sessionStreamsManager.addRemoteMediaTrack(remoteTrack)\n .catch(() => {\n trace.warn('Error adding remote track to stream manager', remoteTrack);\n });\n };\n\n this._sessionStreamsManager.getMediaStreamForRole(SessionClientRole.USER)\n .then((mediaStream: Nullable<MediaStream>) => {\n if (mediaStream) {\n trace.info('Adding local tracks to peer connection');\n mediaStream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, mediaStream);\n trace.info(`Local ${track.kind} track added to peer connection`);\n });\n } else {\n trace.info('No media stream was found for publishing');\n }\n })\n .then(() => {\n const remoteDesc = new RTCSessionDescription({type: 'offer', sdp: sdpOffer});\n\n return peerConnection.setRemoteDescription(remoteDesc)\n .then(() => {\n trace.info('Remote description was set', remoteDesc);\n\n return peerConnection.createAnswer()\n .then((sdpAnswer) => {\n trace.info('_sdpOfferHandler answer created', sdpAnswer);\n\n this._socket.emit(SOCKET_EVENTS.OUTGOING.SDP_ANSWER, {\n uid,\n peerId,\n sessionId: this._sessionParams.sessionId,\n sdpAnswer: sdpAnswer.sdp\n });\n\n return peerConnection.setLocalDescription(sdpAnswer)\n .then(() => {\n trace.info('_sdpOfferHandler local desc was set');\n\n this._processQueuedIceCandidates(peerId);\n });\n });\n });\n\n })\n .catch((e) => {\n trace.error('Error in _sdpOfferHandler', e);\n throw e;\n });\n }\n\n // Received by Guest after an Initiator reconnects to room\n _userPeerReconnectHandler(): void {\n trace.info('_userPeerReconnectHandler');\n this._disconnectInternal(MediaSessionDisconnectReason.UserPeerReconnected)\n .catch((error: any) => {\n trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);\n });\n }\n\n //#endregion WebRTC Guest - session Guest (Agent on dashboard platform)\n\n //#region Peer Connection\n\n //#region Streams Handling\n\n onMediaStreamDestroyed(clientRole: SessionClientRole): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._disconnectInternal(MediaSessionDisconnectReason.PublishedStreamDestroyed).catch(() => undefined);\n });\n\n return Promise.resolve();\n }\n\n onMediaStreamRenewed(clientRole: SessionClientRole, mediaStream: MediaStream): Promise<void> {\n //TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation\n return Promise.resolve();\n }\n\n getRemoteTrackStats(mediaTrack: MediaStreamTrack): Promise<RemoteTrackStats> {\n const peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);\n\n if (peerConnectionOfTrack !== null) {\n return (peerConnectionOfTrack as any).getStats(mediaTrack);\n }\n\n return Promise.reject(new Error('Provided track is not remote track'));\n }\n\n //#endregion\n\n private _disconnectInternal(reason: MediaSessionDisconnectReason): Promise<void> {\n this._peerConnections.forEach((peerConnection: RTCPeerConnection) => {\n this._destroyPeerConnection(peerConnection);\n });\n\n trace.info('Disconnecting from session', reason);\n\n if (this._socket) {\n this._socket.off();\n this._socket.disconnect();\n }\n\n this._socket = null;\n setTimeout(() => this._sessionHandlers.onDisconnectedHandler(reason));\n\n return Promise.resolve();\n }\n\n private _createPeerConnection(peerId: string, peerConnectionType: SessionClientType, peerConnectionRole: SessionClientRole): RTCPeerConnection {\n if (this._peerConnections.get(peerId)) {\n throw new Error(`${this._sessionParams.clientType} peer connection for ${peerId} already exists`);\n }\n\n const peerConnection: any = new RTCPeerConnection(this._configuration);\n\n peerConnection.peerId = peerId;\n peerConnection.peerType = peerConnectionType;\n peerConnection.remoteMediaTracks = [];\n peerConnection.peerRole = peerConnectionRole;\n\n peerConnection.onconnectionstatechange = () => {\n trace.info('onconnectionstatechange', peerConnection);\n };\n\n peerConnection.oniceconnectionstatechange = (state: any) => {\n trace.info(`ICE Connection state for peer ${peerId} was changed to: ${state.currentTarget.iceConnectionState}`, state);\n const cnState = state.currentTarget.iceConnectionState;\n\n if (['closed', 'disconnected', 'failed'].indexOf(cnState) > -1) {\n this._iceStateDisconnected(peerConnection);\n }\n };\n\n peerConnection.onicecandidate = (event: any) => {\n if (event.candidate) {\n trace.info(`${this._sessionParams.clientType} peerConn.onicecandidate`, event.candidate);\n this._socket.emit(SOCKET_EVENTS.OUTGOING.ICE_CANDIDATE, {\n sessionId: this._sessionParams.sessionId,\n peerId: peerId,\n candidate: event.candidate,\n clientType: this._sessionParams.clientType\n });\n } else {\n trace.info('ICE Candidate is null in peerConnection', event);\n }\n };\n\n this._peerConnections.set(peerId, peerConnection);\n\n trace.info(`${peerConnectionType} peerConnection created`);\n\n return peerConnection;\n }\n\n private _destroyPeerConnection(peerConnection: RTCPeerConnection): void {\n trace.info('Destroying PeerConnection', peerConnection.peerType);\n peerConnection.ontrack = null;\n peerConnection.onicecandidate = null;\n peerConnection.onconnectionstatechange = null;\n peerConnection.oniceconnectionstatechange = null;\n peerConnection.onicegatheringstatechange = null;\n\n this.unregisterPeersRemoteMediaTracks(peerConnection);\n\n this._peerConnections.delete(peerConnection.peerId);\n peerConnection.close();\n }\n\n private _withPeerConnection(peerId: any, callback: any): void | undefined {\n if (this._peerConnections.get(peerId)) {\n return callback(this._peerConnections.get(peerId));\n }\n\n return undefined;\n }\n\n //#endregion\n\n //#region ICE Candidates\n\n _iceCandidateReceivedHandler(iceCandidateData: any): void {\n const {candidate, peerId} = iceCandidateData;\n\n trace.info('_iceCandidateReceivedHandler', candidate);\n if (!candidate) {\n trace.info('Unexpected case, iceCandidate message arrived without candidate');\n\n return;\n }\n\n const peerConnection = this._peerConnections.get(peerId);\n\n if (!peerConnection || !peerConnection.remoteDescription) {\n trace.info('Queueing iceCandidate', candidate);\n this._queueIceCandidate(candidate, peerId);\n\n return;\n }\n\n trace.info('Going to add iceCandidate', candidate);\n this._addIceCandidateToPeer(candidate, peerConnection).catch(() => undefined);\n }\n\n _addIceCandidateToPeer(iceCandidate: RTCIceCandidate, peerConnection: RTCPeerConnection): Promise<void> {\n return peerConnection.addIceCandidate(iceCandidate)\n .then(() => {\n trace.info('ICE Candidate add to peer connection');\n })\n .catch((e) => {\n trace.warn('Error adding ICE Candidate to peer connection', e);\n throw e;\n });\n }\n\n _processQueuedIceCandidates(peerId: string): void {\n this._withPeerConnection(peerId, (peerConnection: RTCPeerConnection) => {\n const pendingIces = this._pendingPeersIce[peerId];\n\n if (pendingIces) {\n pendingIces.forEach((pendingIce: RTCIceCandidate) => {\n trace.info('Adding pending ICE to peer connections');\n this._addIceCandidateToPeer(pendingIce, peerConnection).catch(() => undefined);\n });\n } else {\n trace.info('No pending ICE found for peer', peerId);\n }\n });\n }\n\n _queueIceCandidate(iceCandidate: RTCIceCandidate, peerId: string): void {\n if (!this._pendingPeersIce[peerId]) {\n this._pendingPeersIce[peerId] = [];\n }\n\n this._pendingPeersIce[peerId].push(iceCandidate);\n }\n\n _iceStateDisconnected(peerConnection: RTCPeerConnection): void {\n this._disconnectInternal(MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(() => undefined);\n }\n\n //#endregion\n}\n"]}
|
|
@@ -39,9 +39,9 @@ var MediaTracer_1 = require("../MediaUtils/MediaTracer");
|
|
|
39
39
|
var MediaSessionBase_1 = require("./MediaSessionBase");
|
|
40
40
|
var trace = MediaTracer_1.getMediaTracer('TurnSessionV3');
|
|
41
41
|
//Currently this version supports subscribing only. Publishing will be implemented as needed.
|
|
42
|
-
var
|
|
43
|
-
__extends(
|
|
44
|
-
function
|
|
42
|
+
var TurnWebRtcSession = /** @class */function (_super) {
|
|
43
|
+
__extends(TurnWebRtcSession, _super);
|
|
44
|
+
function TurnWebRtcSession(sessionParams, sessionHandlers, streamFactory) {
|
|
45
45
|
var _this = _super.call(this, sessionParams, streamFactory) || this;
|
|
46
46
|
_this._sessionHandlers = sessionHandlers;
|
|
47
47
|
_this._socket = null;
|
|
@@ -66,7 +66,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
66
66
|
_this._onSocketDisconnectedHandler = _this._onSocketDisconnectedHandler.bind(_this);
|
|
67
67
|
return _this;
|
|
68
68
|
}
|
|
69
|
-
Object.defineProperty(
|
|
69
|
+
Object.defineProperty(TurnWebRtcSession.prototype, "id", {
|
|
70
70
|
get: function get() {
|
|
71
71
|
return this._sessionParams.sessionId;
|
|
72
72
|
},
|
|
@@ -74,7 +74,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
74
74
|
configurable: true
|
|
75
75
|
});
|
|
76
76
|
//#region Socket Connectivity
|
|
77
|
-
|
|
77
|
+
TurnWebRtcSession.prototype.connect = function (connectOnly) {
|
|
78
78
|
var _this = this;
|
|
79
79
|
if (connectOnly === void 0) {
|
|
80
80
|
connectOnly = false;
|
|
@@ -90,10 +90,10 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
90
90
|
throw error;
|
|
91
91
|
});
|
|
92
92
|
};
|
|
93
|
-
|
|
93
|
+
TurnWebRtcSession.prototype.disconnect = function () {
|
|
94
94
|
return this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.ForcedByConsumer);
|
|
95
95
|
};
|
|
96
|
-
|
|
96
|
+
TurnWebRtcSession.prototype._connectSocket = function (url, connectOnly) {
|
|
97
97
|
var _this = this;
|
|
98
98
|
return new Promise(function (resolve, reject) {
|
|
99
99
|
var socket = _this._socket = io.connect(url, {
|
|
@@ -125,7 +125,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
125
125
|
}
|
|
126
126
|
});
|
|
127
127
|
};
|
|
128
|
-
|
|
128
|
+
TurnWebRtcSession.prototype._onSocketDisconnectedHandler = function (reason) {
|
|
129
129
|
if (this._socket) {
|
|
130
130
|
// The initial example of differentiating between "forced" disconnect and "network" disconnect is taken from:
|
|
131
131
|
// https://socket.io/docs/client-api/#Event-%E2%80%98disconnect%E2%80%99
|
|
@@ -140,7 +140,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
140
140
|
//#endregion
|
|
141
141
|
//#region WebRTC Initiator - session Initiator (User on mobile device)
|
|
142
142
|
// Received by Initiator, causing him to emit SDP_OFFER
|
|
143
|
-
|
|
143
|
+
TurnWebRtcSession.prototype._sendOfferHandler = function (sendOfferEventData) {
|
|
144
144
|
var _this = this;
|
|
145
145
|
var uid = sendOfferEventData.uid,
|
|
146
146
|
peerId = sendOfferEventData.peerId;
|
|
@@ -184,7 +184,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
184
184
|
});
|
|
185
185
|
};
|
|
186
186
|
// Received by the Initiator: Indicates that publish should be started
|
|
187
|
-
|
|
187
|
+
TurnWebRtcSession.prototype._joinResponseHandler = function (joinResponseData) {
|
|
188
188
|
var _this = this;
|
|
189
189
|
var sdpAnswer = joinResponseData.sdpAnswer,
|
|
190
190
|
uid = joinResponseData.uid,
|
|
@@ -204,7 +204,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
204
204
|
});
|
|
205
205
|
};
|
|
206
206
|
// Received by Initiator after a guests socket has been disconnected
|
|
207
|
-
|
|
207
|
+
TurnWebRtcSession.prototype._peerDisconnectedHandler = function (peerDisconnectedEvent) {
|
|
208
208
|
var _this = this;
|
|
209
209
|
var peerId = peerDisconnectedEvent.peerId;
|
|
210
210
|
trace.info('_peerDisconnectedHandler');
|
|
@@ -217,7 +217,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
217
217
|
//#endregion WebRTC Initiator - session Initiator (User on mobile device)
|
|
218
218
|
//#region WebRTC Guest - session Guest (Agent on dashboard platform)
|
|
219
219
|
// Received by Guest, causing him to emit SDP_ANSWER
|
|
220
|
-
|
|
220
|
+
TurnWebRtcSession.prototype._sdpOfferHandler = function (sdpOfferEvent) {
|
|
221
221
|
var _this = this;
|
|
222
222
|
var sdpOffer = sdpOfferEvent.sdpOffer,
|
|
223
223
|
peerId = sdpOfferEvent.peerId,
|
|
@@ -274,7 +274,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
274
274
|
});
|
|
275
275
|
};
|
|
276
276
|
// Received by Guest after an Initiator reconnects to room
|
|
277
|
-
|
|
277
|
+
TurnWebRtcSession.prototype._userPeerReconnectHandler = function () {
|
|
278
278
|
trace.info('_userPeerReconnectHandler');
|
|
279
279
|
this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.UserPeerReconnected).catch(function (error) {
|
|
280
280
|
trace.warn('Error while disconnecting during userPeerReconnectHandler.', error);
|
|
@@ -283,7 +283,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
283
283
|
//#endregion WebRTC Guest - session Guest (Agent on dashboard platform)
|
|
284
284
|
//#region Peer Connection
|
|
285
285
|
//#region Streams Handling
|
|
286
|
-
|
|
286
|
+
TurnWebRtcSession.prototype.onMediaStreamDestroyed = function (clientRole) {
|
|
287
287
|
var _this = this;
|
|
288
288
|
//TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation
|
|
289
289
|
this._peerConnections.forEach(function (peerConnection) {
|
|
@@ -293,11 +293,11 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
293
293
|
});
|
|
294
294
|
return Promise.resolve();
|
|
295
295
|
};
|
|
296
|
-
|
|
296
|
+
TurnWebRtcSession.prototype.onMediaStreamRenewed = function (clientRole, mediaStream) {
|
|
297
297
|
//TODO - Alex: need to implement adding new tracks to peer connection and forcing negotiation
|
|
298
298
|
return Promise.resolve();
|
|
299
299
|
};
|
|
300
|
-
|
|
300
|
+
TurnWebRtcSession.prototype.getRemoteTrackStats = function (mediaTrack) {
|
|
301
301
|
var peerConnectionOfTrack = this.getPeerConnectionByMediaTrack(mediaTrack);
|
|
302
302
|
if (peerConnectionOfTrack !== null) {
|
|
303
303
|
return peerConnectionOfTrack.getStats(mediaTrack);
|
|
@@ -305,7 +305,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
305
305
|
return Promise.reject(new Error('Provided track is not remote track'));
|
|
306
306
|
};
|
|
307
307
|
//#endregion
|
|
308
|
-
|
|
308
|
+
TurnWebRtcSession.prototype._disconnectInternal = function (reason) {
|
|
309
309
|
var _this = this;
|
|
310
310
|
this._peerConnections.forEach(function (peerConnection) {
|
|
311
311
|
_this._destroyPeerConnection(peerConnection);
|
|
@@ -321,7 +321,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
321
321
|
});
|
|
322
322
|
return Promise.resolve();
|
|
323
323
|
};
|
|
324
|
-
|
|
324
|
+
TurnWebRtcSession.prototype._createPeerConnection = function (peerId, peerConnectionType, peerConnectionRole) {
|
|
325
325
|
var _this = this;
|
|
326
326
|
if (this._peerConnections.get(peerId)) {
|
|
327
327
|
throw new Error(this._sessionParams.clientType + " peer connection for " + peerId + " already exists");
|
|
@@ -358,7 +358,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
358
358
|
trace.info(peerConnectionType + " peerConnection created");
|
|
359
359
|
return peerConnection;
|
|
360
360
|
};
|
|
361
|
-
|
|
361
|
+
TurnWebRtcSession.prototype._destroyPeerConnection = function (peerConnection) {
|
|
362
362
|
trace.info('Destroying PeerConnection', peerConnection.peerType);
|
|
363
363
|
peerConnection.ontrack = null;
|
|
364
364
|
peerConnection.onicecandidate = null;
|
|
@@ -369,7 +369,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
369
369
|
this._peerConnections.delete(peerConnection.peerId);
|
|
370
370
|
peerConnection.close();
|
|
371
371
|
};
|
|
372
|
-
|
|
372
|
+
TurnWebRtcSession.prototype._withPeerConnection = function (peerId, callback) {
|
|
373
373
|
if (this._peerConnections.get(peerId)) {
|
|
374
374
|
return callback(this._peerConnections.get(peerId));
|
|
375
375
|
}
|
|
@@ -377,7 +377,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
377
377
|
};
|
|
378
378
|
//#endregion
|
|
379
379
|
//#region ICE Candidates
|
|
380
|
-
|
|
380
|
+
TurnWebRtcSession.prototype._iceCandidateReceivedHandler = function (iceCandidateData) {
|
|
381
381
|
var candidate = iceCandidateData.candidate,
|
|
382
382
|
peerId = iceCandidateData.peerId;
|
|
383
383
|
trace.info('_iceCandidateReceivedHandler', candidate);
|
|
@@ -396,7 +396,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
396
396
|
return undefined;
|
|
397
397
|
});
|
|
398
398
|
};
|
|
399
|
-
|
|
399
|
+
TurnWebRtcSession.prototype._addIceCandidateToPeer = function (iceCandidate, peerConnection) {
|
|
400
400
|
return peerConnection.addIceCandidate(iceCandidate).then(function () {
|
|
401
401
|
trace.info('ICE Candidate add to peer connection');
|
|
402
402
|
}).catch(function (e) {
|
|
@@ -404,7 +404,7 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
404
404
|
throw e;
|
|
405
405
|
});
|
|
406
406
|
};
|
|
407
|
-
|
|
407
|
+
TurnWebRtcSession.prototype._processQueuedIceCandidates = function (peerId) {
|
|
408
408
|
var _this = this;
|
|
409
409
|
this._withPeerConnection(peerId, function (peerConnection) {
|
|
410
410
|
var pendingIces = _this._pendingPeersIce[peerId];
|
|
@@ -420,20 +420,20 @@ var TurnWebRtcSessionV3 = /** @class */function (_super) {
|
|
|
420
420
|
}
|
|
421
421
|
});
|
|
422
422
|
};
|
|
423
|
-
|
|
423
|
+
TurnWebRtcSession.prototype._queueIceCandidate = function (iceCandidate, peerId) {
|
|
424
424
|
if (!this._pendingPeersIce[peerId]) {
|
|
425
425
|
this._pendingPeersIce[peerId] = [];
|
|
426
426
|
}
|
|
427
427
|
this._pendingPeersIce[peerId].push(iceCandidate);
|
|
428
428
|
};
|
|
429
|
-
|
|
429
|
+
TurnWebRtcSession.prototype._iceStateDisconnected = function (peerConnection) {
|
|
430
430
|
this._disconnectInternal(MediaConstants_1.MediaSessionDisconnectReason.PeerConnectionInterrupted).catch(function () {
|
|
431
431
|
return undefined;
|
|
432
432
|
});
|
|
433
433
|
};
|
|
434
|
-
return
|
|
434
|
+
return TurnWebRtcSession;
|
|
435
435
|
}(MediaSessionBase_1.MediaSessionBase);
|
|
436
|
-
exports.
|
|
436
|
+
exports.TurnWebRtcSession = TurnWebRtcSession;
|
|
437
437
|
|
|
438
|
-
//# sourceMappingURL=SessionTurn.
|
|
439
|
-
//# sourceMappingURL=SessionTurn.
|
|
438
|
+
//# sourceMappingURL=SessionTurn.js.map
|
|
439
|
+
//# sourceMappingURL=SessionTurn.js.map
|