UDP upgrade/downgrade
This commit is contained in:
parent
7948291ad2
commit
6355270519
97
core/rfb.js
97
core/rfb.js
|
|
@ -136,7 +136,7 @@ export default class RFB extends EventTargetMixin {
|
||||||
this._maxVideoResolutionX = 960;
|
this._maxVideoResolutionX = 960;
|
||||||
this._maxVideoResolutionY = 540;
|
this._maxVideoResolutionY = 540;
|
||||||
this._clipboardBinary = true;
|
this._clipboardBinary = true;
|
||||||
this._useUdp = true;
|
this._useUdp = false;
|
||||||
|
|
||||||
this._trackFrameStats = false;
|
this._trackFrameStats = false;
|
||||||
|
|
||||||
|
|
@ -922,12 +922,9 @@ export default class RFB extends EventTargetMixin {
|
||||||
this._canvas.addEventListener("gesturemove", this._eventHandlers.handleGesture);
|
this._canvas.addEventListener("gesturemove", this._eventHandlers.handleGesture);
|
||||||
this._canvas.addEventListener("gestureend", this._eventHandlers.handleGesture);
|
this._canvas.addEventListener("gestureend", this._eventHandlers.handleGesture);
|
||||||
|
|
||||||
// WebRTC UDP datachannel
|
// WebRTC UDP datachannel inits
|
||||||
if (this._useUdp) {
|
{
|
||||||
this._udpBuffer= new Map();
|
this._udpBuffer = new Map();
|
||||||
|
|
||||||
let udpurl = this._url.split("/")[2];
|
|
||||||
udpurl = window.location.protocol + "//" + udpurl + "/webrtc";
|
|
||||||
|
|
||||||
this._udpPeer = new RTCPeerConnection({
|
this._udpPeer = new RTCPeerConnection({
|
||||||
iceServers: [{
|
iceServers: [{
|
||||||
|
|
@ -1029,31 +1026,6 @@ export default class RFB extends EventTargetMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
peer.createOffer().then(function(offer) {
|
|
||||||
return peer.setLocalDescription(offer);
|
|
||||||
}).then(function() {
|
|
||||||
var request = new XMLHttpRequest();
|
|
||||||
request.open("POST", udpurl);
|
|
||||||
request.onload = function() {
|
|
||||||
if (request.status == 200) {
|
|
||||||
var response = JSON.parse(request.responseText);
|
|
||||||
peer.setRemoteDescription(new RTCSessionDescription(response.answer)).then(function() {
|
|
||||||
var candidate = new RTCIceCandidate(response.candidate);
|
|
||||||
peer.addIceCandidate(candidate).then(function() {
|
|
||||||
Log.Debug("success in addicecandidate");
|
|
||||||
}).catch(function(err) {
|
|
||||||
Log.Error("Failure in addIceCandidate", err);
|
|
||||||
});
|
|
||||||
}).catch(function(e) {
|
|
||||||
Log.Error("Failure in setRemoteDescription", e);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
request.send(peer.localDescription.sdp);
|
|
||||||
}).catch(function(reason) {
|
|
||||||
Log.Error("Failed to create offer " + reason);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.Debug("<< RFB.connect");
|
Log.Debug("<< RFB.connect");
|
||||||
|
|
@ -2850,6 +2822,9 @@ export default class RFB extends EventTargetMixin {
|
||||||
case 180: // KASM binary clipboard
|
case 180: // KASM binary clipboard
|
||||||
return this._handleBinaryClipboard();
|
return this._handleBinaryClipboard();
|
||||||
|
|
||||||
|
case 181: // KASM UDP upgrade
|
||||||
|
return this._handleUdpUpgrade();
|
||||||
|
|
||||||
case 248: // ServerFence
|
case 248: // ServerFence
|
||||||
return this._handleServerFenceMsg();
|
return this._handleServerFenceMsg();
|
||||||
|
|
||||||
|
|
@ -2907,6 +2882,64 @@ export default class RFB extends EventTargetMixin {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_sendUdpUpgrade() {
|
||||||
|
let peer = this._udpPeer;
|
||||||
|
let sock = this._sock;
|
||||||
|
|
||||||
|
peer.createOffer().then(function(offer) {
|
||||||
|
return peer.setLocalDescription(offer);
|
||||||
|
}).then(function() {
|
||||||
|
const buff = sock._sQ;
|
||||||
|
const offset = sock._sQlen;
|
||||||
|
const str = Uint8Array.from(Array.from(peer.localDescription.sdp).map(letter => letter.charCodeAt(0)));
|
||||||
|
|
||||||
|
buff[offset] = 181; // msg-type
|
||||||
|
buff[offset + 1] = str.length >> 8; // u16 len
|
||||||
|
buff[offset + 2] = str.length;
|
||||||
|
|
||||||
|
buff.set(str, offset + 3);
|
||||||
|
|
||||||
|
sock._sQlen += 3 + str.length;
|
||||||
|
sock.flush();
|
||||||
|
}).catch(function(reason) {
|
||||||
|
Log.Error("Failed to create offer " + reason);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_sendUdpDowngrade() {
|
||||||
|
const buff = sock._sQ;
|
||||||
|
const offset = sock._sQlen;
|
||||||
|
|
||||||
|
buff[offset] = 181; // msg-type
|
||||||
|
buff[offset + 1] = 0; // u16 len
|
||||||
|
buff[offset + 2] = 0;
|
||||||
|
|
||||||
|
sock._sQlen += 3;
|
||||||
|
sock.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
_handleUdpUpgrade() {
|
||||||
|
if (this._sock.rQwait("UdpUgrade header", 2, 1)) { return false; }
|
||||||
|
let len = this._sock.rQshift16();
|
||||||
|
if (this._sock.rQwait("UdpUpgrade payload", len, 3)) { return false; }
|
||||||
|
|
||||||
|
const payload = this._sock.rQshiftStr(len);
|
||||||
|
|
||||||
|
let peer = this._udpPeer;
|
||||||
|
|
||||||
|
var response = JSON.parse(payload);
|
||||||
|
peer.setRemoteDescription(new RTCSessionDescription(response.answer)).then(function() {
|
||||||
|
var candidate = new RTCIceCandidate(response.candidate);
|
||||||
|
peer.addIceCandidate(candidate).then(function() {
|
||||||
|
Log.Debug("success in addicecandidate");
|
||||||
|
}).catch(function(err) {
|
||||||
|
Log.Error("Failure in addIceCandidate", err);
|
||||||
|
});
|
||||||
|
}).catch(function(e) {
|
||||||
|
Log.Error("Failure in setRemoteDescription", e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
_framebufferUpdate() {
|
_framebufferUpdate() {
|
||||||
if (this._FBU.rects === 0) {
|
if (this._FBU.rects === 0) {
|
||||||
if (this._sock.rQwait("FBU header", 3, 1)) { return false; }
|
if (this._sock.rQwait("FBU header", 3, 1)) { return false; }
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue