Client prototype, signaling server & PWA client
This commit is contained in:
195
clientV/scripts/rtc3.js
Normal file
195
clientV/scripts/rtc3.js
Normal file
@@ -0,0 +1,195 @@
|
||||
var name;
|
||||
var connections = {};
|
||||
|
||||
const configuration = {
|
||||
iceServers: [{ urls: "stun:stun.l.google.com:19302" }]
|
||||
};
|
||||
|
||||
const offerOptions = {
|
||||
offerToReceiveAudio: 1,
|
||||
offerToReceiveVideo: 1
|
||||
};
|
||||
|
||||
function handleLogin(success) {
|
||||
if (success === false) {
|
||||
alert("try a different username");
|
||||
} else {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
async function createPeerConnection(target) {
|
||||
console.log("CREATED PEER CONNECTION");
|
||||
var connection = new RTCPeerConnection(configuration);
|
||||
connections[target] = connection;
|
||||
|
||||
connection.onicecandidate = function(event) {
|
||||
if (event.candidate) {
|
||||
send({
|
||||
type: "candidate",
|
||||
name: name,
|
||||
target: target,
|
||||
candidate: event.candidate
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
connection.onnegotiationneeded = function() { handleNegotiationNeededEvent(target); };
|
||||
connection.ontrack = function(event) { handleTrackEvent(event); }
|
||||
connection.onsignalingstatechange = function() { handleSignalingStateChangeEvent(connection); }
|
||||
connection.oniceconnectionstatechange = function() { handleICEConnectionStateChangeEvent(connection); }
|
||||
connection.onicegatheringstatechange = function() { handleICEGatheringStateChangeEvent(connection); }
|
||||
|
||||
//window.setInterval(getConnectionStats, 1000);
|
||||
}
|
||||
|
||||
function handleICEConnectionStateChangeEvent(connection) {
|
||||
console.log("ICE CONNECTION CHANGE "+connection.iceConnectionState);
|
||||
}
|
||||
|
||||
function handleICEGatheringStateChangeEvent(connection) {
|
||||
console.log("ICE GATHERING CHANGE "+connection.iceGatheringState);
|
||||
}
|
||||
|
||||
async function makeOffer(target) {
|
||||
createPeerConnection(target);
|
||||
|
||||
var connection = connections[target];
|
||||
|
||||
var offer = await connection.createOffer();
|
||||
send({
|
||||
type: "offer",
|
||||
name: name,
|
||||
target: target,
|
||||
offer: offer
|
||||
});
|
||||
await connection.setLocalDescription(offer);
|
||||
|
||||
}
|
||||
|
||||
async function handleOffer(offer, target) {
|
||||
console.log("GOT OFFER FROM "+target);
|
||||
await createPeerConnection(target);
|
||||
|
||||
var connection = connections[target];
|
||||
|
||||
await connection.setRemoteDescription(new RTCSessionDescription(offer));
|
||||
|
||||
if (stream) {
|
||||
console.log("STREAM DETECTED");
|
||||
stream.getTracks().forEach((track) => {
|
||||
console.log("ADDED TRACK");
|
||||
connection.addTrack(track, stream);
|
||||
});
|
||||
}
|
||||
|
||||
//create an answer to an offer
|
||||
var answer = await connection.createAnswer();
|
||||
|
||||
await connection.setLocalDescription(answer);
|
||||
|
||||
send({
|
||||
type: "answer",
|
||||
name: name,
|
||||
target: target,
|
||||
answer: answer
|
||||
});
|
||||
};
|
||||
|
||||
async function handleAnswer(answer, target) {
|
||||
console.log("GOT ANSWER FROM "+target);
|
||||
var connection = connections[target];
|
||||
await connection.setRemoteDescription(new RTCSessionDescription(answer));
|
||||
};
|
||||
|
||||
async function handleCandidate(candidate, target) {
|
||||
console.log("GOT CANDIDATE FROM "+target);
|
||||
var connection = connections[target];
|
||||
await connection.addIceCandidate(new RTCIceCandidate(candidate));
|
||||
};
|
||||
|
||||
async function handleNegotiationNeededEvent(target) {
|
||||
console.log("NEGOTIATION NEEDED FROM "+target);
|
||||
|
||||
var connection = connections[target];
|
||||
var offer = await connection.createOffer(offerOptions);
|
||||
|
||||
await connection.setLocalDescription(offer);
|
||||
|
||||
send({
|
||||
type: "video-offer",
|
||||
name: name,
|
||||
target: target,
|
||||
sdp: connection.localDescription
|
||||
});
|
||||
}
|
||||
|
||||
function handleLeave() {
|
||||
connections.foreach( (connection) => {
|
||||
connection.close();
|
||||
connection.onicecandidate = null;
|
||||
//connection.onaddstream = null;
|
||||
connection = null;
|
||||
});
|
||||
connections = {};
|
||||
|
||||
remoteVideo.src = null;
|
||||
};
|
||||
|
||||
function handleUserlist(list) {
|
||||
console.log("GOT USER LIST");
|
||||
|
||||
}
|
||||
|
||||
async function handleVideoOffer(sdp, target) {
|
||||
console.log("GOT VIDEO OFFER FROM "+target);
|
||||
await createPeerConnection(target);
|
||||
var connection = connections[target];
|
||||
await connection.setRemoteDescription(new RTCSessionDescription(sdp))
|
||||
|
||||
if (stream) {
|
||||
console.log("STREAM DETECTED");
|
||||
stream.getTracks().forEach((track) => {
|
||||
console.log("ADDED TRACK");
|
||||
connection.addTrack(track, stream);
|
||||
});
|
||||
}
|
||||
|
||||
var answer = await connection.createAnswer();
|
||||
await connection.setLocalDescription(answer);
|
||||
|
||||
send({
|
||||
type: "video-answer",
|
||||
name: name,
|
||||
target: target,
|
||||
sdp: answer
|
||||
});
|
||||
}
|
||||
|
||||
async function handleVideoAnswer(sdp, target) {
|
||||
console.log("GOT VIDEO ANSWER FROM "+target);
|
||||
|
||||
var connection = connections[target];
|
||||
await connection.setRemoteDescription(new RTCSessionDescription(sdp));
|
||||
}
|
||||
|
||||
async function handleSignalingStateChangeEvent(connection) {
|
||||
console.log("STATE CHANGED TO : " + connection.signalingState);
|
||||
switch(connection.signalingState) {
|
||||
case "closed":
|
||||
await connection.close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function handleTrackEvent(event) {
|
||||
console.log("GOT TRACK");
|
||||
remoteVideo.srcObject = event.streams[0];
|
||||
//document.getElementById("hangup-button").disabled = false;
|
||||
}
|
||||
|
||||
function getConnectionStats() {
|
||||
for ([connection, target] in connections) {
|
||||
console.log("[" + target + "] " + connection.connectionState);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user