summary refs log tree commit diff
path: root/webrtc/src/Server.ts
diff options
context:
space:
mode:
authorMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2022-07-11 19:14:05 +1000
committerMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2022-07-11 19:14:05 +1000
commit71d22a193b96e7fc6c0736d1cf5a338838972e3b (patch)
tree007fd867d4a891717b7a10518c91aa865ee5a7bb /webrtc/src/Server.ts
parentChange bundle start to only start listening once DB and config have been loaded (diff)
parentMerge branch 'maddyrtc' of github.com:MaddyUnderStars/fosscord-server into ma... (diff)
downloadserver-71d22a193b96e7fc6c0736d1cf5a338838972e3b.tar.xz
Merge branch 'maddyrtc' into slowcord
Diffstat (limited to 'webrtc/src/Server.ts')
-rw-r--r--webrtc/src/Server.ts102
1 files changed, 96 insertions, 6 deletions
diff --git a/webrtc/src/Server.ts b/webrtc/src/Server.ts

index 42b82c6a..7a1070b9 100644 --- a/webrtc/src/Server.ts +++ b/webrtc/src/Server.ts
@@ -5,8 +5,9 @@ import OPCodeHandlers, { Payload } from "./opcodes"; import { setHeartbeat } from "./util"; import * as mediasoup from "mediasoup"; import { types as MediasoupTypes } from "mediasoup"; - import udp from "dgram"; +import sodium from "libsodium-wrappers"; +import { assert } from "console"; var port = Number(process.env.PORT); if (isNaN(port)) port = 3004; @@ -19,6 +20,9 @@ export class Server { public mediasoupProducers: MediasoupTypes.Producer[] = []; public mediasoupConsumers: MediasoupTypes.Consumer[] = []; + public decryptKey: Uint8Array; + public testUdp = udp.createSocket("udp6"); + constructor() { this.ws = new WebSocketServer({ port, @@ -43,8 +47,79 @@ export class Server { socket.close(CLOSECODES.Unknown_opcode); } }); + + socket.on("close", (code: number, reason: string) => { + console.log(`client closed ${code} ${reason}`); + for (var consumer of this.mediasoupConsumers) consumer.close(); + for (var producer of this.mediasoupProducers) producer.close(); + for (var transport of this.mediasoupTransports) transport.close(); + + this.mediasoupConsumers = []; + this.mediasoupProducers = []; + this.mediasoupTransports = []; + }) }); + this.testUdp.bind(60000); + this.testUdp.on("message", (msg, rinfo) => { + //random key from like, the libsodium examples on npm lol + + //give me my remote port? + if (sodium.to_hex(msg) == "0001004600000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") { + this.testUdp.send(Buffer.from([rinfo.port, 0]), rinfo.port, rinfo.address); + console.log(`got magic packet to send remote port? ${rinfo.address}:${rinfo.port}`); + return; + } + + //Hello + if (sodium.to_hex(msg) == "0100000000000000") { + console.log(`[UDP] client helloed`); + return; + } + + const nonce = Buffer.concat([msg.slice(-4), Buffer.from("\x00".repeat(20))]); + console.log(`[UDP] nonce for this message: ${nonce.toString("hex")}`); + + console.log(`[UDP] message: ${sodium.to_hex(msg)}`); + + // let encrypted; + // if (Buffer.from(msg).indexOf("\x81\xc9") == 0) { + // encrypted = msg.slice(0x18, -4); + // } + // else if (Buffer.from(msg).indexOf("\x90\x78") == 0) { + // encrypted = msg.slice(0x1C, -4); + // } + // else { + // encrypted = msg.slice(0x18, -4); + // console.log(`wtf header received: ${encrypted.toString("hex")}`); + // } + + let encrypted = msg; + + if (sodium.to_hex(msg).indexOf("80c8000600000001") == 0) { + //call status + + encrypted = encrypted.slice(8, -4); + assert(encrypted.length == 40); + + try { + const decrypted = sodium.crypto_secretbox_open_easy(encrypted, nonce, Buffer.from(this.decryptKey)); + console.log("[UDP] [ call status ]" + decrypted); + } + catch (e) { + console.error(`[UDP] decrypt failure\n${e}\n${encrypted.toString("base64")}`); + } + return; + } + + // try { + // const decrypted = sodium.crypto_secretbox_open_easy(encrypted, nonce, Buffer.from(this.decryptKey.map(x => String.fromCharCode(x)).join(""))); + // console.log("[UDP] " + decrypted); + // } + // catch (e) { + // console.error(`[UDP] decrypt failure\n${e}\n${msg.toString("base64")}`); + // } + }); } async listen(): Promise<void> { @@ -59,7 +134,7 @@ export class Server { async createWorkers(): Promise<void> { const numWorkers = 1; for (let i = 0; i < numWorkers; i++) { - const worker = await mediasoup.createWorker({ logLevel: "debug" }); + const worker = await mediasoup.createWorker({ logLevel: "debug", logTags: ["dtls", "ice", "info", "message", "bwe"] }); if (!worker) return; worker.on("died", () => { @@ -76,9 +151,23 @@ export class Server { await transport.enableTraceEvent(); + transport.on('dtlsstatechange', (dtlsstate) => { + console.log(dtlsstate); + }); + + transport.on("sctpstatechange", (sctpstate) => { + console.log(sctpstate); + }); + + router.observer.on("newrtpobserver", (rtpObserver: MediasoupTypes.RtpObserver) => { + console.log("new RTP observer created [id:%s]", rtpObserver.id); + + // rtpObserver.observer.on("") + }); + transport.on("connect", () => { - console.log("transport connect") - }) + console.log("transport connect"); + }); transport.observer.on("newproducer", (producer: MediasoupTypes.Producer) => { console.log("new producer created [id:%s]", producer.id); @@ -114,9 +203,10 @@ export class Server { kind: "audio", mimeType: "audio/opus", clockRate: 48000, - channels: 2 + channels: 2, + preferredPayloadType: 111, }, - ] + ], }); this.mediasoupWorkers.push(worker);