diff --git a/webrtc/src/Server.ts b/webrtc/src/Server.ts
index 06a36df9..cdda10ec 100644
--- a/webrtc/src/Server.ts
+++ b/webrtc/src/Server.ts
@@ -1,15 +1,19 @@
import { Server as WebSocketServer } from "ws";
-import { WebSocket, CLOSECODES, Payload, OPCODES } from "@fosscord/gateway";
+import { WebSocket, Payload, } from "@fosscord/gateway";
import { Config, initDatabase } from "@fosscord/util";
import OPCodeHandlers from "./opcodes";
-import { setHeartbeat } from "./util"
-import mediasoup from "mediasoup";
+import { setHeartbeat } from "./util";
+import * as mediasoup from "mediasoup";
+import { types as MediasoupTypes } from "mediasoup";
var port = Number(process.env.PORT);
if (isNaN(port)) port = 3004;
export class Server {
public ws: WebSocketServer;
+ public mediasoupWorkers: MediasoupTypes.Worker[] = [];
+ public mediasoupRouters: MediasoupTypes.Router[] = [];
+ public mediasoupTransports: MediasoupTypes.Transport[] = [];
constructor() {
this.ws = new WebSocketServer({
@@ -23,9 +27,9 @@ export class Server {
const payload: Payload = JSON.parse(message);
if (OPCodeHandlers[payload.op])
- await OPCodeHandlers[payload.op](socket, payload);
+ await OPCodeHandlers[payload.op].call(this, socket, payload);
else
- console.error(`Unimplemented`, payload)
+ console.error(`Unimplemented`, payload);
});
});
}
@@ -34,7 +38,63 @@ export class Server {
// @ts-ignore
await initDatabase();
await Config.init();
+ await this.createWorkers();
console.log("[DB] connected");
console.log(`[WebRTC] online on 0.0.0.0:${port}`);
}
+
+ async createWorkers(): Promise<void> {
+ const numWorkers = 1;
+ for (let i = 0; i < numWorkers; i++) {
+ const worker = await mediasoup.createWorker();
+ if (!worker) return;
+
+ worker.on("died", () => {
+ console.error("mediasoup worker died");
+ });
+
+ worker.observer.on("newrouter", async (router: MediasoupTypes.Router) => {
+ console.log("new router");
+
+ this.mediasoupRouters.push(router);
+
+ router.observer.on("newtransport", (transport: MediasoupTypes.Transport) => {
+ console.log("new transport");
+
+ this.mediasoupTransports.push(transport);
+ })
+
+ await router.createWebRtcTransport({
+ listenIps: [{ ip: "127.0.0.1" }],
+ enableUdp: true,
+ enableTcp: true,
+ preferUdp: true
+ });
+ });
+
+ await worker.createRouter({
+ mediaCodecs: [
+ {
+ kind: "audio",
+ mimeType: "audio/opus",
+ clockRate: 48000,
+ channels: 2
+ },
+ {
+ kind: "video",
+ mimeType: "video/H264",
+ clockRate: 90000,
+ parameters:
+ {
+ "packetization-mode": 1,
+ "profile-level-id": "42e01f",
+ "level-asymmetry-allowed": 1
+ }
+ }
+ ]
+ });
+
+ this.mediasoupWorkers.push(worker);
+ }
+ }
}
diff --git a/webrtc/src/opcodes/Connect.ts b/webrtc/src/opcodes/Connect.ts
index 5cc66506..5db11638 100644
--- a/webrtc/src/opcodes/Connect.ts
+++ b/webrtc/src/opcodes/Connect.ts
@@ -1,5 +1,6 @@
import { WebSocket } from "@fosscord/gateway";
import { Payload } from "./index";
+import { Server } from "../Server"
-export async function onConnect(socket: WebSocket, data: Payload) {
+export async function onConnect(this: Server, socket: WebSocket, data: Payload) {
}
\ No newline at end of file
diff --git a/webrtc/src/opcodes/Heartbeat.ts b/webrtc/src/opcodes/Heartbeat.ts
index 04150e36..06d6bcb1 100644
--- a/webrtc/src/opcodes/Heartbeat.ts
+++ b/webrtc/src/opcodes/Heartbeat.ts
@@ -1,7 +1,8 @@
import { WebSocket } from "@fosscord/gateway";
import { Payload } from "./index";
import { setHeartbeat } from "./../util";
+import { Server } from "../Server"
-export async function onHeartbeat(socket: WebSocket, data: Payload) {
+export async function onHeartbeat(this: Server, socket: WebSocket, data: Payload) {
await setHeartbeat(socket);
}
\ No newline at end of file
diff --git a/webrtc/src/opcodes/Identify.ts b/webrtc/src/opcodes/Identify.ts
index 2026d7c9..6043a460 100644
--- a/webrtc/src/opcodes/Identify.ts
+++ b/webrtc/src/opcodes/Identify.ts
@@ -1,14 +1,17 @@
import { WebSocket } from "@fosscord/gateway";
import { Payload } from "./index"
import { VoiceOPCodes } from "@fosscord/util";
+import { Server } from "../Server"
-export async function onIdentify(socket: WebSocket, data: Payload) {
+export async function onIdentify(this: Server, socket: WebSocket, data: Payload) {
socket.send(JSON.stringify({
op: VoiceOPCodes.READY,
d: {
ssrc: 1,
ip: "127.0.0.1",
- port: 3005,
+
+ //@ts-ignore
+ port: this.mediasoupTransports[0].iceCandidates.port,
modes: [
"xsalsa20_poly1305",
"xsalsa20_poly1305_suffix",
diff --git a/webrtc/src/opcodes/Resume.ts b/webrtc/src/opcodes/Resume.ts
index de21eba6..dcd4f4cd 100644
--- a/webrtc/src/opcodes/Resume.ts
+++ b/webrtc/src/opcodes/Resume.ts
@@ -1,5 +1,6 @@
import { WebSocket } from "@fosscord/gateway";
import { Payload } from "./index";
+import { Server } from "../Server"
-export async function onResume(socket: WebSocket, data: Payload) {
+export async function onResume(this: Server, socket: WebSocket, data: Payload) {
}
\ No newline at end of file
diff --git a/webrtc/src/opcodes/SelectProtocol.ts b/webrtc/src/opcodes/SelectProtocol.ts
index f1732dd9..fcc45855 100644
--- a/webrtc/src/opcodes/SelectProtocol.ts
+++ b/webrtc/src/opcodes/SelectProtocol.ts
@@ -1,15 +1,16 @@
import { WebSocket } from "@fosscord/gateway";
import { Payload } from "./index";
import { VoiceOPCodes } from "@fosscord/util";
+import { Server } from "../Server"
-export async function onSelectProtocol(socket: WebSocket, data: Payload) {
+export async function onSelectProtocol(this: Server, socket: WebSocket, data: Payload) {
socket.send(JSON.stringify({
op: VoiceOPCodes.SESSION_DESCRIPTION,
d: {
video_codec: "H264",
secret_key: new Array(32).fill(null).map(x => Math.random() * 256),
mode: "aead_aes256_gcm_rtpsize",
- media_session_id: "d8eb5c84d987c6642ec4ce72ffa97f00",
+ media_session_id: this.mediasoupTransports[0].id,
audio_codec: "opus",
}
}));
diff --git a/webrtc/src/opcodes/Speaking.ts b/webrtc/src/opcodes/Speaking.ts
index 14f86b3c..861a7c3d 100644
--- a/webrtc/src/opcodes/Speaking.ts
+++ b/webrtc/src/opcodes/Speaking.ts
@@ -1,6 +1,7 @@
import { WebSocket } from "@fosscord/gateway";
import { Payload } from "./index"
import { VoiceOPCodes } from "@fosscord/util";
+import { Server } from "../Server"
-export async function onSpeaking(socket: WebSocket, data: Payload) {
+export async function onSpeaking(this: Server, socket: WebSocket, data: Payload) {
}
\ No newline at end of file
|