<html>
<body>
Message: <textarea id="message">This is my DataChannel message!</textarea>
<br />
<button onclick="window.sendMessage()">Send Message</button> <br />
<div id="logs"></div>
</body>
<script>
async function run() {
let pc = new RTCPeerConnection({
iceServers: [
{
urls: "stun:stun.l.google.com:19302",
},
],
});
let log = (msg) => {
document.getElementById("logs").innerHTML += msg + "<br>";
};
let sendChannel = pc.createDataChannel("foo");
sendChannel.onclose = () => console.log("sendChannel has closed");
sendChannel.onopen = () => console.log("sendChannel has opened");
sendChannel.onmessage = (e) =>
log(
`Message from DataChannel '${sendChannel.label}' payload '${e.data}'`
);
pc.oniceconnectionstatechange = (e) => log(pc.iceConnectionState);
pc.onicecandidate = async (event) => {
if (event.candidate === null) {
const localDescription = btoa(JSON.stringify(pc.localDescription));
const result = await fetch("/connect", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(localDescription),
});
const answer = await result.json();
pc.setRemoteDescription(
new RTCSessionDescription(JSON.parse(atob(answer)))
);
}
};
pc.onnegotiationneeded = (e) =>
pc
.createOffer()
.then((d) => pc.setLocalDescription(d))
.catch(log);
window.sendMessage = () => {
let message = document.getElementById("message").value;
if (message === "") {
return alert("Message must not be empty");
}
sendChannel.send(message);
};
}
run().then();
</script>
</html>