84 lines
2.9 KiB
JavaScript
84 lines
2.9 KiB
JavaScript
// https://web.dev/articles/webrtc-basics
|
|
|
|
// handles JSON.stringify/parse
|
|
|
|
class SignalingChannel {
|
|
send(message) {
|
|
console.log(message);
|
|
}
|
|
}
|
|
|
|
|
|
function createPeerConnection(targetPeer) {
|
|
|
|
const signaling = new SignalingChannel();
|
|
|
|
// const constraints = {audio: true, video: true};
|
|
const configuration = { iceServers: [{ urls: 'stun:stunserver2024.stunprotocol.org' }] };
|
|
const peerConnection = new RTCPeerConnection(configuration);
|
|
const sendChannel = peerConnection.createDataChannel('default');
|
|
|
|
|
|
// Send any ice candidates to the other peer.
|
|
peerConnection.onicecandidate = ({ candidate }) => signaling.send({ candidate });
|
|
|
|
// Let the "negotiationneeded" event trigger offer generation.
|
|
peerConnection.onnegotiationneeded = async () => {
|
|
try {
|
|
await peerConnection.setLocalDescription(await peerConnection.createOffer());
|
|
// Send the offer to the other peer.
|
|
signaling.send({ desc: peerConnection.localDescription });
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
};
|
|
|
|
// // Once remote track media arrives, show it in remote video element.
|
|
// peerConnection.ontrack = (event) => {
|
|
// // Don't set srcObject again if it is already set.
|
|
// if (remoteView.srcObject) return;
|
|
// remoteView.srcObject = event.streams[0];
|
|
// };
|
|
|
|
// Call start() to initiate.
|
|
async function start() {
|
|
// try {
|
|
// Get local stream, show it in self-view, and add it to be sent.
|
|
// const stream =
|
|
// await navigator.mediaDevices.getUserMedia(constraints);
|
|
// stream.getTracks().forEach((track) =>
|
|
// peerConnection.addTrack(track, stream));
|
|
// selfView.srcObject = stream;
|
|
// } catch (err) {
|
|
// console.error(err);
|
|
// }
|
|
}
|
|
|
|
signaling.onmessage = async ({ desc, candidate }) => {
|
|
try {
|
|
if (desc) {
|
|
// If you get an offer, you need to reply with an answer.
|
|
if (desc.type === 'offer') {
|
|
await peerConnection.setRemoteDescription(desc);
|
|
// const stream =
|
|
// await navigator.mediaDevices.getUserMedia(constraints);
|
|
// stream.getTracks().forEach((track) =>
|
|
// peerConnection.addTrack(track, stream));
|
|
await peerConnection.setLocalDescription(await peerConnection.createAnswer());
|
|
signaling.send({ desc: peerConnection.localDescription });
|
|
} else if (desc.type === 'answer') {
|
|
await peerConnection.setRemoteDescription(desc);
|
|
} else {
|
|
console.log('Unsupported SDP type.');
|
|
}
|
|
} else if (candidate) {
|
|
await peerConnection.addIceCandidate(candidate);
|
|
}
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
};
|
|
|
|
}
|
|
|