diff --git a/server/src/dev.ts b/server/src/dev.ts index 7afc33c..eb836c6 100644 --- a/server/src/dev.ts +++ b/server/src/dev.ts @@ -5,11 +5,10 @@ import expressWs from "express-ws"; import { AdriftServer, connectTracker } from "./server"; import WebSocket from "isomorphic-ws"; -import { answerRtc, bufferToArrayBuffer, connect } from "./rtc"; +import { answerRtc, bufferToArrayBuffer } from "./rtc"; dotenv.config(); - const app = express() as unknown as expressWs.Application; expressWs(app); @@ -23,9 +22,6 @@ app.use((_req, res, next) => { next(); }); - - - app.post("/connect", (req, res) => { const data = req.body; answerRtc(data, (d) => { @@ -51,12 +47,9 @@ app.ws("/dev-ws", (ws, _req) => { }); try { - let tracker = new WebSocket("ws://localhost:17776/join"); tracker.onerror = console.error; connectTracker(tracker); -} catch (_) { - -} +} catch (_) {} app.listen(3000, () => console.log("listening")); diff --git a/server/src/rtc.ts b/server/src/rtc.ts index 4017551..2e2bbf8 100644 --- a/server/src/rtc.ts +++ b/server/src/rtc.ts @@ -1,102 +1,101 @@ const configuration = { - iceServers: [ - { - urls: "stun:stun.l.google.com:19302", - }, - ], + iceServers: [ + { + urls: "stun:stun.l.google.com:19302", + }, + ], }; import wrtc from "wrtc"; import { AdriftServer } from "./server"; export async function connect( - offer: RTCSessionDescriptionInit, - candidates: RTCIceCandidateInit[], - onAnswer: (answer: Record) => void + offer: RTCSessionDescriptionInit, + candidates: RTCIceCandidateInit[], + onAnswer: (answer: Record) => void ): Promise { - const localCandidates: any[] = []; - let dataChannel; - const peer: RTCPeerConnection = new wrtc.RTCPeerConnection(configuration); - let promise = new Promise((resolve) => { - peer.ondatachannel = (event) => { - dataChannel = event.channel; - resolve(dataChannel); - }; - }); - peer.onconnectionstatechange = () => { - console.log("Connection state:", peer.connectionState); + const localCandidates: any[] = []; + let dataChannel; + const peer: RTCPeerConnection = new wrtc.RTCPeerConnection(configuration); + let promise = new Promise((resolve) => { + peer.ondatachannel = (event) => { + dataChannel = event.channel; + resolve(dataChannel); }; - peer.onsignalingstatechange = () => { - console.log("Signaling state:", peer.signalingState); - }; - peer.oniceconnectionstatechange = () => { - console.log("ICE connection state:", peer.iceConnectionState); - }; - peer.onicegatheringstatechange = () => { - console.log("ICE gathering state:", peer.iceGatheringState); - }; - peer.onicecandidate = (event: any) => { - console.log("onicecandidate"); - if (event.candidate) { - localCandidates.push(event.candidate); - return; - } - let payload = { - answer: peer.localDescription, - candidates: localCandidates, - }; - onAnswer(payload); - }; - await peer.setRemoteDescription(offer); - let answer = await peer.createAnswer(); - await peer.setLocalDescription(answer); - for (let candidate of candidates) { - if (!candidate.candidate) continue; - console.log({ candidate }); - await peer.addIceCandidate(candidate); + }); + peer.onconnectionstatechange = () => { + console.log("Connection state:", peer.connectionState); + }; + peer.onsignalingstatechange = () => { + console.log("Signaling state:", peer.signalingState); + }; + peer.oniceconnectionstatechange = () => { + console.log("ICE connection state:", peer.iceConnectionState); + }; + peer.onicegatheringstatechange = () => { + console.log("ICE gathering state:", peer.iceGatheringState); + }; + peer.onicecandidate = (event: any) => { + console.log("onicecandidate"); + if (event.candidate) { + localCandidates.push(event.candidate); + return; } + let payload = { + answer: peer.localDescription, + candidates: localCandidates, + }; + onAnswer(payload); + }; + await peer.setRemoteDescription(offer); + let answer = await peer.createAnswer(); + await peer.setLocalDescription(answer); + for (let candidate of candidates) { + if (!candidate.candidate) continue; + console.log({ candidate }); + await peer.addIceCandidate(candidate); + } - return promise as any; + return promise as any; } export async function answerRtc(data: any, onrespond: (answer: any) => void) { - if (data && data.offer && data.localCandidates) { - const { offer, localCandidates } = data; - let didAnswer = false; + if (data && data.offer && data.localCandidates) { + const { offer, localCandidates } = data; + let didAnswer = false; - let dataChannel = await connect(offer, localCandidates, (answer) => { - if (!didAnswer) { - didAnswer = true; - onrespond(answer); - // res.json(answer); - } - }); - dataChannel.binaryType = "arraybuffer"; + let dataChannel = await connect(offer, localCandidates, (answer) => { + if (!didAnswer) { + didAnswer = true; + onrespond(answer); + // res.json(answer); + } + }); + dataChannel.binaryType = "arraybuffer"; - let server: AdriftServer; + let server: AdriftServer; - dataChannel.onopen = () => { - console.log("opened"); - server = new AdriftServer((msg) => { - if (dataChannel.readyState === "open") - dataChannel.send(msg) - }); - }; - dataChannel.onclose = () => { - console.log("closed"); - server.onClose(); - }; - dataChannel.onmessage = (event) => { - if (event.data instanceof ArrayBuffer) { - server.onMsg(event.data); - return; - } - if (event.data instanceof Buffer) { - server.onMsg(bufferToArrayBuffer(event.data)); - return; - } - throw new Error("Unexpected datachannel message type"); - }; - } + dataChannel.onopen = () => { + console.log("opened"); + server = new AdriftServer((msg) => { + if (dataChannel.readyState === "open") dataChannel.send(msg); + }); + }; + dataChannel.onclose = () => { + console.log("closed"); + server.onClose(); + }; + dataChannel.onmessage = (event) => { + if (event.data instanceof ArrayBuffer) { + server.onMsg(event.data); + return; + } + if (event.data instanceof Buffer) { + server.onMsg(bufferToArrayBuffer(event.data)); + return; + } + throw new Error("Unexpected datachannel message type"); + }; + } } export function bufferToArrayBuffer(buf: Buffer): ArrayBuffer { - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); } diff --git a/server/src/server.ts b/server/src/server.ts index 7ded816..2ab9a04 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -16,7 +16,6 @@ import { Readable, Writable } from "stream"; import { BareError, bareInitialFetch, fetchResponse, options } from "./http"; import { answerRtc } from "./rtc"; - function bareErrorToResponse(e: BareError): { payload: HTTPResponsePayload; body: AsyncIterable; @@ -382,6 +381,6 @@ export function connectTracker(tracker: WebSocket) { answerRtc(data, (answer) => { console.log("have an answer"); tracker.send(JSON.stringify(answer)); - }) + }); }); -} \ No newline at end of file +}