89 lines
2.3 KiB
TypeScript
89 lines
2.3 KiB
TypeScript
import express, { Application, Request, Response } from "express";
|
|
|
|
const webrtc = require("wrtc");
|
|
|
|
export default function getRtcRoutes() {
|
|
const router = express.Router();
|
|
|
|
router.use(express.json());
|
|
|
|
// get user details based on id token
|
|
router.post("/join/:lineId", handleJoin);
|
|
|
|
return router;
|
|
}
|
|
|
|
// a mapping between a certain line and the streams for it
|
|
const linesStreams: {
|
|
[lineId: string]: any[];
|
|
} = {};
|
|
|
|
let testMainStream: any = null;
|
|
|
|
async function handleJoin(req: Request, res: Response) {
|
|
try {
|
|
const { lineId } = req.params;
|
|
const { sdp } = req.body;
|
|
|
|
const peer = new webrtc.RTCPeerConnection({
|
|
iceServers: [
|
|
{
|
|
urls: "stun:stun.l.google.com:19302",
|
|
},
|
|
],
|
|
});
|
|
|
|
// allow this peer connection to receive other peoples' streams
|
|
peer.ontrack = (e: any) => handleStreams(e, peer, lineId);
|
|
|
|
// create connection between server and client who hit this endpoint
|
|
const desc = new webrtc.RTCSessionDescription(sdp);
|
|
await peer.setRemoteDescription(desc);
|
|
|
|
// now that remote is set
|
|
// allow this peer connection for this specific line to get tracks for this line already
|
|
try {
|
|
testMainStream?.getTracks().forEach((track: any) => {
|
|
peer.addTrack(track, testMainStream);
|
|
});
|
|
} catch (e) {
|
|
console.log(`hacking around small problem with adding track`, e);
|
|
}
|
|
|
|
const answer = await peer.createAnswer();
|
|
await peer.setLocalDescription(answer);
|
|
|
|
const payload = {
|
|
sdp: peer.localDescription,
|
|
};
|
|
|
|
res
|
|
.status(200)
|
|
.json({ message: `You can now broadcast to ${lineId}!`, data: payload });
|
|
} catch (error) {
|
|
console.log(error);
|
|
|
|
res.status(500).json({
|
|
message: "Problem in setting up peer connection with media server",
|
|
error,
|
|
});
|
|
}
|
|
}
|
|
|
|
function handleStreams(e: any, peer: any, lineId: string) {
|
|
// if the room/line exists already, then add to the list of streams
|
|
if (lineId in linesStreams) {
|
|
const newStreamsForLine = [...(linesStreams[lineId] ?? []), e.streams[0]];
|
|
|
|
linesStreams[lineId] = newStreamsForLine;
|
|
} else {
|
|
// create a new list of streams
|
|
linesStreams[lineId] = [e.streams[0]];
|
|
}
|
|
|
|
// dumb smoke test
|
|
if (!testMainStream) testMainStream = e.streams[0];
|
|
|
|
console.log(testMainStream);
|
|
}
|