@flashphoner/websdk 2.0.208 → 2.0.212
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/docTemplate/README.md +1 -1
- package/examples/demo/streaming/2players/2players.js +0 -5
- package/examples/demo/streaming/canvas_streaming/canvas_streaming.js +0 -12
- package/examples/demo/streaming/conference/conference.html +6 -0
- package/examples/demo/streaming/conference/conference.js +83 -23
- package/examples/demo/streaming/embed_player/player.js +127 -198
- package/examples/demo/streaming/firewall-traversal-streaming/firewall-traversal-streaming.js +0 -12
- package/examples/demo/streaming/mcu_client/mcu_client.js +0 -8
- package/examples/demo/streaming/media_devices_manager/manager.js +0 -12
- package/examples/demo/streaming/player/player.js +10 -9
- package/examples/demo/streaming/stream-auto-restore/stream-auto-restore.html +77 -1
- package/examples/demo/streaming/stream-auto-restore/stream-auto-restore.js +472 -84
- package/examples/demo/streaming/stream-diagnostic/stream-diagnostic.js +0 -8
- package/examples/demo/streaming/stream-local-snapshot/stream-local-snapshot.js +0 -6
- package/examples/demo/streaming/stream-snapshot/stream-snapshot.js +0 -6
- package/examples/demo/streaming/stream_recording/recording.js +0 -6
- package/examples/demo/streaming/streamer/streamer.js +0 -8
- package/examples/demo/streaming/two_way_streaming/two_way_streaming.js +0 -11
- package/examples/demo/streaming/webrtc-as-rtmp-republishing/webrtc-as-rtmp-republishing.js +0 -6
- package/flashphoner-no-flash.js +118 -14
- package/flashphoner-no-flash.min.js +2 -2
- package/flashphoner-no-webrtc.js +89 -5
- package/flashphoner-no-webrtc.min.js +1 -1
- package/flashphoner-no-wsplayer.js +118 -14
- package/flashphoner-no-wsplayer.min.js +2 -2
- package/flashphoner-room-api.js +104 -9
- package/flashphoner-room-api.min.js +2 -2
- package/flashphoner-temasys-flash-websocket-without-adapterjs.js +89 -5
- package/flashphoner-temasys-flash-websocket.js +89 -5
- package/flashphoner-temasys-flash-websocket.min.js +1 -1
- package/flashphoner-webrtc-only.js +118 -14
- package/flashphoner-webrtc-only.min.js +1 -1
- package/flashphoner.js +118 -14
- package/flashphoner.min.js +2 -2
- package/package.json +1 -1
- package/src/flashphoner-core.d.ts +22 -5
- package/src/flashphoner-core.js +79 -3
- package/src/webrtc-media-provider.js +25 -6
package/flashphoner.js
CHANGED
|
@@ -11487,6 +11487,9 @@ var getSession = function getSession(id) {
|
|
|
11487
11487
|
* @param {Object=} options.sipOptions Sip configuration
|
|
11488
11488
|
* @param {Object=} options.mediaOptions Media connection configuration
|
|
11489
11489
|
* @param {Integer=} options.timeout Connection timeout in milliseconds
|
|
11490
|
+
* @param {Integer=} options.pingInterval Server ping interval in milliseconds [0]
|
|
11491
|
+
* @param {Integer=} options.receiveProbes A maximum subsequental pings received missing count [0]
|
|
11492
|
+
* @param {Integer=} options.probesInterval Interval to check subsequental pings received [0]
|
|
11490
11493
|
* @returns {Session} Created session
|
|
11491
11494
|
* @throws {Error} Error if API is not initialized
|
|
11492
11495
|
* @throws {TypeError} Error if options.urlServer is not specified
|
|
@@ -11513,6 +11516,8 @@ var createSession = function createSession(options) {
|
|
|
11513
11516
|
var mediaOptions = options.mediaOptions;
|
|
11514
11517
|
var keepAlive = options.keepAlive;
|
|
11515
11518
|
var timeout = options.timeout;
|
|
11519
|
+
var wsPingSender = new WSPingSender(options.pingInterval || 0);
|
|
11520
|
+
var wsPingReceiver = new WSPingReceiver(options.receiveProbes || 0, options.probesInterval || 0);
|
|
11516
11521
|
var connectionTimeout;
|
|
11517
11522
|
var cConfig; //SIP config
|
|
11518
11523
|
|
|
@@ -11630,7 +11635,7 @@ var createSession = function createSession(options) {
|
|
|
11630
11635
|
mediaProviders: Object.keys(MediaProvider),
|
|
11631
11636
|
keepAlive: keepAlive,
|
|
11632
11637
|
authToken: authToken,
|
|
11633
|
-
clientVersion: "2.0.
|
|
11638
|
+
clientVersion: "2.0.212",
|
|
11634
11639
|
clientOSVersion: window.navigator.appVersion,
|
|
11635
11640
|
clientBrowserVersion: window.navigator.userAgent,
|
|
11636
11641
|
msePacketizationVersion: 2,
|
|
@@ -11643,7 +11648,11 @@ var createSession = function createSession(options) {
|
|
|
11643
11648
|
|
|
11644
11649
|
|
|
11645
11650
|
send("connection", cConfig);
|
|
11646
|
-
logger.setConnection(wsConnection);
|
|
11651
|
+
logger.setConnection(wsConnection); // Send ping messages to server to check if connection is still alive #WCS-3410
|
|
11652
|
+
|
|
11653
|
+
wsPingSender.start(); // Check subsequintel pings received from server to check if connection is still alive #WCS-3410
|
|
11654
|
+
|
|
11655
|
+
wsPingReceiver.start();
|
|
11647
11656
|
};
|
|
11648
11657
|
|
|
11649
11658
|
wsConnection.onmessage = function (event) {
|
|
@@ -11659,6 +11668,7 @@ var createSession = function createSession(options) {
|
|
|
11659
11668
|
switch (data.message) {
|
|
11660
11669
|
case 'ping':
|
|
11661
11670
|
send("pong", null);
|
|
11671
|
+
wsPingReceiver.success();
|
|
11662
11672
|
break;
|
|
11663
11673
|
|
|
11664
11674
|
case 'getUserData':
|
|
@@ -11818,7 +11828,11 @@ var createSession = function createSession(options) {
|
|
|
11818
11828
|
sessionStatus = newStatus;
|
|
11819
11829
|
|
|
11820
11830
|
if (sessionStatus == SESSION_STATUS.DISCONNECTED || sessionStatus == SESSION_STATUS.FAILED) {
|
|
11821
|
-
//
|
|
11831
|
+
// Stop pinging server #WCS-3410
|
|
11832
|
+
wsPingSender.stop(); // Stop checking pings received #WCS-3410
|
|
11833
|
+
|
|
11834
|
+
wsPingReceiver.stop(); //remove streams
|
|
11835
|
+
|
|
11822
11836
|
for (var prop in streamRefreshHandlers) {
|
|
11823
11837
|
if (streamRefreshHandlers.hasOwnProperty(prop) && typeof streamRefreshHandlers[prop] === 'function') {
|
|
11824
11838
|
streamRefreshHandlers[prop]({
|
|
@@ -11834,6 +11848,73 @@ var createSession = function createSession(options) {
|
|
|
11834
11848
|
if (callbacks[sessionStatus]) {
|
|
11835
11849
|
callbacks[sessionStatus](session, obj);
|
|
11836
11850
|
}
|
|
11851
|
+
} // Websocket periodic ping sender
|
|
11852
|
+
|
|
11853
|
+
|
|
11854
|
+
function WSPingSender(interval) {
|
|
11855
|
+
this.interval = interval || 0;
|
|
11856
|
+
this.intervalId = null;
|
|
11857
|
+
|
|
11858
|
+
this.start = function () {
|
|
11859
|
+
if (this.interval > 0) {
|
|
11860
|
+
this.intervalId = setInterval(function () {
|
|
11861
|
+
send("ping", null);
|
|
11862
|
+
}, this.interval);
|
|
11863
|
+
}
|
|
11864
|
+
};
|
|
11865
|
+
|
|
11866
|
+
this.stop = function () {
|
|
11867
|
+
if (this.intervalId) {
|
|
11868
|
+
clearInterval(this.intervalId);
|
|
11869
|
+
}
|
|
11870
|
+
};
|
|
11871
|
+
|
|
11872
|
+
return this;
|
|
11873
|
+
} // Websocket ping receive prober
|
|
11874
|
+
|
|
11875
|
+
|
|
11876
|
+
function WSPingReceiver(receiveProbes, probesInterval) {
|
|
11877
|
+
this.maxPings = receiveProbes || 0;
|
|
11878
|
+
this.interval = probesInterval || 0;
|
|
11879
|
+
this.intervalId = null;
|
|
11880
|
+
this.pingsMissing = 0;
|
|
11881
|
+
|
|
11882
|
+
this.start = function () {
|
|
11883
|
+
if (this.maxPings > 0 && this.interval > 0) {
|
|
11884
|
+
var receiver = this;
|
|
11885
|
+
this.intervalId = setInterval(function () {
|
|
11886
|
+
receiver.checkPingsReceived();
|
|
11887
|
+
}, this.interval);
|
|
11888
|
+
}
|
|
11889
|
+
};
|
|
11890
|
+
|
|
11891
|
+
this.stop = function () {
|
|
11892
|
+
if (this.intervalId) {
|
|
11893
|
+
clearInterval(this.intervalId);
|
|
11894
|
+
}
|
|
11895
|
+
|
|
11896
|
+
this.pingsMissing = 0;
|
|
11897
|
+
};
|
|
11898
|
+
|
|
11899
|
+
this.checkPingsReceived = function () {
|
|
11900
|
+
this.pingsMissing++;
|
|
11901
|
+
|
|
11902
|
+
if (this.pingsMissing >= this.maxPings) {
|
|
11903
|
+
this.failure();
|
|
11904
|
+
}
|
|
11905
|
+
};
|
|
11906
|
+
|
|
11907
|
+
this.success = function () {
|
|
11908
|
+
this.pingsMissing = 0;
|
|
11909
|
+
};
|
|
11910
|
+
|
|
11911
|
+
this.failure = function () {
|
|
11912
|
+
logger.info(LOG_PREFIX, "Missing " + this.pingsMissing + " pings from server, connection seems to be down");
|
|
11913
|
+
onSessionStatusChange(SESSION_STATUS.FAILED);
|
|
11914
|
+
wsConnection.close();
|
|
11915
|
+
};
|
|
11916
|
+
|
|
11917
|
+
return this;
|
|
11837
11918
|
}
|
|
11838
11919
|
/**
|
|
11839
11920
|
* @callback sdpHook
|
|
@@ -12698,7 +12779,7 @@ var createSession = function createSession(options) {
|
|
|
12698
12779
|
* @param {HTMLElement} options.display Div element stream should be displayed in
|
|
12699
12780
|
* @param {Object=} options.custom User provided custom object that will be available in REST App code
|
|
12700
12781
|
* @param {Integer} [options.flashBufferTime=0] Specifies how long to buffer messages before starting to display the stream (Flash-only)
|
|
12701
|
-
* @param {
|
|
12782
|
+
* @param {string=} options.stripCodecs Comma separated string of codecs which should be stripped from WebRTC SDP (ex. "H264,PCMA,PCMU,G722")
|
|
12702
12783
|
* @param {string=} options.rtmpUrl Rtmp url stream should be forwarded to
|
|
12703
12784
|
* @param {Object=} options.mediaConnectionConstraints Stream specific constraints for underlying RTCPeerConnection
|
|
12704
12785
|
* @param {Boolean=} options.flashShowFullScreenButton Show full screen button in flash
|
|
@@ -12707,6 +12788,7 @@ var createSession = function createSession(options) {
|
|
|
12707
12788
|
* @param {Integer=} options.playoutDelay Time delay between network reception of media and playout
|
|
12708
12789
|
* @param {string=} options.useCanvasMediaStream EXPERIMENTAL: when publish bind browser's media stream to the canvas. It can be useful for image filtering
|
|
12709
12790
|
* @param {string=} options.videoContentHint Video content hint for browser ('detail' by default to maintain resolution), {@link Flashphoner.constants.CONTENT_HINT_TYPE}
|
|
12791
|
+
* @param {Boolean=} options.unmutePlayOnStart Unmute playback on start. May be used after user gesture only, so set 'unmutePlayOnStart: false' for autoplay
|
|
12710
12792
|
* @param {sdpHook} sdpHook The callback that handles sdp from the server
|
|
12711
12793
|
* @returns {Stream} Stream
|
|
12712
12794
|
* @throws {TypeError} Error if no options provided
|
|
@@ -12818,6 +12900,7 @@ var createSession = function createSession(options) {
|
|
|
12818
12900
|
var playoutDelay = options.playoutDelay;
|
|
12819
12901
|
var useCanvasMediaStream = options.useCanvasMediaStream;
|
|
12820
12902
|
var videoContentHint = options.videoContentHint;
|
|
12903
|
+
var unmutePlayOnStart = options.unmutePlayOnStart;
|
|
12821
12904
|
var audioState_;
|
|
12822
12905
|
var videoState_;
|
|
12823
12906
|
var connectionQuality;
|
|
@@ -12994,7 +13077,8 @@ var createSession = function createSession(options) {
|
|
|
12994
13077
|
connectionConstraints: mediaConnectionConstraints,
|
|
12995
13078
|
audioOutputId: audioOutputId,
|
|
12996
13079
|
remoteVideo: remoteVideo,
|
|
12997
|
-
playoutDelay: playoutDelay
|
|
13080
|
+
playoutDelay: playoutDelay,
|
|
13081
|
+
unmutePlayOnStart: unmutePlayOnStart
|
|
12998
13082
|
}, streamRefreshHandlers[id_]).then(function (newConnection) {
|
|
12999
13083
|
mediaConnection = newConnection;
|
|
13000
13084
|
|
|
@@ -14522,7 +14606,9 @@ var createConnection = function createConnection(options) {
|
|
|
14522
14606
|
var screenShare = false;
|
|
14523
14607
|
var playoutDelay = options.playoutDelay; // Set video track contentHint to `detail` by default to workaround Chromium 91 bug #WCS-3257
|
|
14524
14608
|
|
|
14525
|
-
var videoContentHint = options.videoContentHint ? options.videoContentHint : 'detail';
|
|
14609
|
+
var videoContentHint = options.videoContentHint ? options.videoContentHint : 'detail'; // Pass the option to unmute automatically (true by default) #WCS-2425
|
|
14610
|
+
|
|
14611
|
+
var unmutePlayOnStart = options.unmutePlayOnStart !== undefined ? options.unmutePlayOnStart : true;
|
|
14526
14612
|
|
|
14527
14613
|
if (bidirectional) {
|
|
14528
14614
|
localVideo = getCacheInstance(localDisplay);
|
|
@@ -14541,7 +14627,7 @@ var createConnection = function createConnection(options) {
|
|
|
14541
14627
|
remoteVideo = getCacheInstance(remoteDisplay);
|
|
14542
14628
|
|
|
14543
14629
|
if (!remoteVideo) {
|
|
14544
|
-
remoteVideo =
|
|
14630
|
+
remoteVideo = createVideoElement();
|
|
14545
14631
|
remoteDisplay.appendChild(remoteVideo);
|
|
14546
14632
|
}
|
|
14547
14633
|
|
|
@@ -14566,7 +14652,7 @@ var createConnection = function createConnection(options) {
|
|
|
14566
14652
|
if (cachedVideo) {
|
|
14567
14653
|
remoteVideo = cachedVideo;
|
|
14568
14654
|
} else {
|
|
14569
|
-
remoteVideo =
|
|
14655
|
+
remoteVideo = createVideoElement();
|
|
14570
14656
|
display.appendChild(remoteVideo);
|
|
14571
14657
|
}
|
|
14572
14658
|
|
|
@@ -14630,7 +14716,12 @@ var createConnection = function createConnection(options) {
|
|
|
14630
14716
|
|
|
14631
14717
|
remoteVideo.onloadedmetadata = function (e) {
|
|
14632
14718
|
if (remoteVideo) {
|
|
14633
|
-
remoteVideo.play()
|
|
14719
|
+
remoteVideo.play().then(function () {
|
|
14720
|
+
// Automatically unmute video if needed #WCS-2425
|
|
14721
|
+
if (unmutePlayOnStart) {
|
|
14722
|
+
remoteVideo.muted = false;
|
|
14723
|
+
}
|
|
14724
|
+
})["catch"](function (e) {
|
|
14634
14725
|
if (validBrowsers.includes(browserDetails.browser)) {
|
|
14635
14726
|
//WCS-1698. fixed autoplay in chromium based browsers
|
|
14636
14727
|
//WCS-2375. fixed autoplay in ios safari
|
|
@@ -15399,14 +15490,12 @@ var loadOrdinaryVideo = function loadOrdinaryVideo(display, stream, screenShare,
|
|
|
15399
15490
|
var vEl = video;
|
|
15400
15491
|
|
|
15401
15492
|
if (!vEl) {
|
|
15402
|
-
vEl =
|
|
15493
|
+
vEl = createVideoElement();
|
|
15403
15494
|
display.appendChild(vEl);
|
|
15404
15495
|
}
|
|
15405
15496
|
|
|
15406
15497
|
vEl.id = uuid_v1() + LOCAL_CACHED_VIDEO;
|
|
15407
|
-
vEl.srcObject = stream;
|
|
15408
|
-
|
|
15409
|
-
vEl.muted = true;
|
|
15498
|
+
vEl.srcObject = stream;
|
|
15410
15499
|
|
|
15411
15500
|
vEl.onloadedmetadata = function (e) {
|
|
15412
15501
|
//WCS-2751 Add screen capture using getDisplayMedia in Safari
|
|
@@ -15782,6 +15871,19 @@ function getCacheInstance(display) {
|
|
|
15782
15871
|
}
|
|
15783
15872
|
}
|
|
15784
15873
|
|
|
15874
|
+
function createVideoElement() {
|
|
15875
|
+
var video = document.createElement('video'); // Prepare video tag to auto play and add specific Safari tweaks #WCS-2425
|
|
15876
|
+
|
|
15877
|
+
video.muted = true;
|
|
15878
|
+
|
|
15879
|
+
if (util.Browser.isSafariWebRTC()) {
|
|
15880
|
+
video.setAttribute("playsinline", "");
|
|
15881
|
+
video.setAttribute("webkit-playsinline", "");
|
|
15882
|
+
}
|
|
15883
|
+
|
|
15884
|
+
return video;
|
|
15885
|
+
}
|
|
15886
|
+
|
|
15785
15887
|
function removeVideoElement(video) {
|
|
15786
15888
|
if (video.srcObject) {
|
|
15787
15889
|
//pause
|
|
@@ -16015,7 +16117,9 @@ var playFirstVideo = function playFirstVideo(display, isLocal, src) {
|
|
|
16015
16117
|
if (!getCacheInstance(display)) {
|
|
16016
16118
|
var video = document.createElement('video');
|
|
16017
16119
|
video.setAttribute("playsinline", "");
|
|
16018
|
-
video.setAttribute("webkit-playsinline", "");
|
|
16120
|
+
video.setAttribute("webkit-playsinline", ""); //Mute video tag to prevent local audio playback in Safari #WCS-3430
|
|
16121
|
+
|
|
16122
|
+
video.muted = true;
|
|
16019
16123
|
video.id = uuid_v1() + (isLocal ? LOCAL_CACHED_VIDEO : REMOTE_CACHED_VIDEO); //in WCS-1560 we removed video.play() call, because it triggers the “Unhandled Promise Rejection” exception in iOS Safari
|
|
16020
16124
|
//in WCS-2160 we rolled back the changes made in WCS-1560 due to no audio on first playback in iOS Safari
|
|
16021
16125
|
|