Skip to content

Instantly share code, notes, and snippets.

@Robbilie
Last active December 11, 2016 02:34
Show Gist options
  • Save Robbilie/c9bf2db5ec5477c56288142b1ca7aaa1 to your computer and use it in GitHub Desktop.
Save Robbilie/c9bf2db5ec5477c56288142b1ca7aaa1 to your computer and use it in GitHub Desktop.
"use strict";
const http = require("http");
const { Server } = require("ws");
const { RTCPeerConnection, RTCSessionDescription } = require("wrtc");
const mumble = require("mumble");
const fs = require("fs");
const options = {
key: fs.readFileSync("key.pem"),
cert: fs.readFileSync("cert.pem")
};
const server = http.createServer();
const ws = new Server({ server });
server.listen(8182);
ws.on("connection", socket => {
var pc = new RTCPeerConnection({ "iceServers": [{ "url": "stun:23.21.150.121" }] });
socket.on("message", data => {
if(data.constructor.name == "String") {
try {
let message = JSON.parse(data);
switch (message.type) {
case "login":
mumble.connect("mumble://service.eneticum.de", options, (error, connection) => {
if(error) { throw new Error(error); }
console.log("Connected…");
connection.on("error", e => console.log(e));
connection.on("initialized", () => {
pc.addEventListener("icecandidate", function (event) {
if(event.candidate) {
socket.send(JSON.stringify({ type: "icecandidate", candidate: event.candidate }));
}
});
pc.addEventListener("answer", function (event) {
console.log("answer");
//socket.send(JSON.stringify({ type: "answer", answer: event.answer }));
});
pc.addEventListener("audio", function (event) {
console.log("audio", event);
//connection.sendVoice(event.data);
});
pc.addEventListener("addstream", function (event) {
console.log("stream", event);
});
pc.addEventListener("signalingchange", function (event) {
console.log("signaling", event);
});
pc.addEventListener("data", function (event) {
console.log("data", event);
});
pc.addEventListener("datachannel", function (event) {
console.log("data", event);
});
pc.addEventListener("error", function (event) {
console.log("error", event);
});
connection.on("voice", function (event) {
console.log(event);
// pc.transmit(event.data);
});
socket.send(JSON.stringify({ type: "init" }));
});
connection.authenticate(message.username, message.password);
});
break;
case "icecandidate":
console.log("Adding ice candidate…");
console.dir(message.candidate);
pc.addIceCandidate(message.candidate);
console.log(pc);
break;
case "sdp":
console.log("sdp", message.desc);
pc.setRemoteDescription(new RTCSessionDescription(message.desc));
pc.createAnswer(function (desc) {
console.log("desc", desc);
pc.setLocalDescription(desc);
socket.send(JSON.stringify({ type: "answer", desc: desc }));
}, function (error) { console.log(error); });
break;
}
} catch (e) {
console.log("not JSON", e);
}
}
});
socket.on("error", error => console.log("ws error", error));
});
<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
var configuration = { "iceServers": [{ "url": "stun:23.21.150.121" }] };
var pc;
var str;
var ws = new WebSocket("ws://localhost:8182/");
ws.binaryType = "arraybuffer";
ws.onmessage = e => {
if(e.data.constructor.name == "String") {
try {
var message = JSON.parse(e.data);
switch (message.type) {
case "init":
var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
var RTCI = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
pc = new RTCPeerConnection(configuration);
pc.onicecandidate = function (evt) {
console.log("onicecandidate", evt);
if(evt.candidate) {
ws.send(JSON.stringify({ type: "icecandidate", candidate: evt.candidate }));
}
};
pc.onaddstream = function (evt) {
console.log("Adding stream…", evt.stream);
var element = document.getElementById("stream");
element.src = webkitURL.createObjectURL(evt.stream);
};
pc.onopen = function (evt) {
console.log("onopen");
};
pc.onremovestream = function (evt) {
console.log("onremovestream");
};
console.log("um");
navigator.getUserMedia({ "audio": true }, function (stream) {
console.log("stream", stream);
str = stream;
pc.addStream(stream);
pc.createOffer(function (desc) {
console.log("desc", desc);
pc.setLocalDescription(desc);
ws.send(JSON.stringify({ type: "sdp", desc: desc }));
}, function (error) { console.log(error); });
}, function (error) { console.log(error); });
break;
case "icecandidate":
pc.addIceCandidate(new RTCIceCandidate(message.candidate));
break;
case "answer":
pc.setRemoteDescription(new RTCSessionDescription(message.desc));
break;
}
} catch (e) {
console.log("not JSON", e);
}
}
};
ws.onopen = () => ws.send(JSON.stringify({ type: "login", username: "rschuh", password: "asdnajkshdas" }));
</script>
</head>
<body>
<audio id="stream" autoplay="autoplay" />
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment