diff --git a/webrtc/src/util/Constants.ts b/webrtc/src/util/Constants.ts
new file mode 100644
index 00000000..64d78e22
--- /dev/null
+++ b/webrtc/src/util/Constants.ts
@@ -0,0 +1,26 @@
+export enum VoiceStatus {
+ CONNECTED = 0,
+ CONNECTING = 1,
+ AUTHENTICATING = 2,
+ RECONNECTING = 3,
+ DISCONNECTED = 4
+}
+
+export enum VoiceOPCodes {
+ IDENTIFY = 0,
+ SELECT_PROTOCOL = 1,
+ READY = 2,
+ HEARTBEAT = 3,
+ SELECT_PROTOCOL_ACK = 4,
+ SPEAKING = 5,
+ HEARTBEAT_ACK = 6,
+ RESUME = 7,
+ HELLO = 8,
+ RESUMED = 9,
+ VIDEO = 12,
+ CLIENT_DISCONNECT = 13,
+ SESSION_UPDATE = 14,
+ MEDIA_SINK_WANTS = 15,
+ VOICE_BACKEND_VERSION = 16,
+ CHANNEL_OPTIONS_UPDATE = 17
+}
\ No newline at end of file
diff --git a/webrtc/src/util/Heartbeat.ts b/webrtc/src/util/Heartbeat.ts
deleted file mode 100644
index 8c5e3a7a..00000000
--- a/webrtc/src/util/Heartbeat.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { WebSocket, CLOSECODES } from "@fosscord/gateway";
-import { VoiceOPCodes } from "@fosscord/util";
-
-export async function setHeartbeat(socket: WebSocket, nonce?: Number) {
- if (socket.heartbeatTimeout) clearTimeout(socket.heartbeatTimeout);
-
- socket.heartbeatTimeout = setTimeout(() => {
- return socket.close(CLOSECODES.Session_timed_out);
- }, 1000 * 45);
-
- if (!nonce) {
- socket.send(JSON.stringify({
- op: VoiceOPCodes.HELLO,
- d: {
- v: 5,
- heartbeat_interval: 13750,
- }
- }));
- }
- else {
- socket.send(JSON.stringify({ op: VoiceOPCodes.HEARTBEAT_ACK, d: nonce }));
- }
-}
\ No newline at end of file
diff --git a/webrtc/src/util/MediaServer.ts b/webrtc/src/util/MediaServer.ts
new file mode 100644
index 00000000..93230c91
--- /dev/null
+++ b/webrtc/src/util/MediaServer.ts
@@ -0,0 +1,51 @@
+import { WebSocket } from "@fosscord/gateway";
+import MediaServer, { IncomingStream, OutgoingStream, Transport } from "medooze-media-server";
+import SemanticSDP from "semantic-sdp";
+MediaServer.enableLog(true);
+
+export const PublicIP = process.env.PUBLIC_IP || "127.0.0.1";
+
+try {
+ const range = process.env.WEBRTC_PORT_RANGE || "4000";
+ var ports = range.split("-");
+ const min = Number(ports[0]);
+ const max = Number(ports[1]);
+
+ MediaServer.setPortRange(min, max);
+} catch (error) {
+ console.error("Invalid env var: WEBRTC_PORT_RANGE", process.env.WEBRTC_PORT_RANGE, error);
+ process.exit(1);
+}
+
+export const endpoint = MediaServer.createEndpoint(PublicIP);
+
+export const channels = new Map<string, Set<Client>>();
+
+export interface Client {
+ transport?: Transport;
+ websocket: WebSocket;
+ out: {
+ stream?: OutgoingStream;
+ tracks: Map<
+ string,
+ {
+ audio_ssrc: number;
+ video_ssrc: number;
+ rtx_ssrc: number;
+ }
+ >;
+ };
+ in: {
+ stream?: IncomingStream;
+ audio_ssrc: number;
+ video_ssrc: number;
+ rtx_ssrc: number;
+ };
+ sdp: SemanticSDP.SDPInfo;
+ channel_id: string;
+}
+
+export function getClients(channel_id: string) {
+ if (!channels.has(channel_id)) channels.set(channel_id, new Set());
+ return channels.get(channel_id)!;
+}
\ No newline at end of file
diff --git a/webrtc/src/util/index.ts b/webrtc/src/util/index.ts
index e8557452..2e09bc48 100644
--- a/webrtc/src/util/index.ts
+++ b/webrtc/src/util/index.ts
@@ -1 +1,2 @@
-export * from "./Heartbeat"
\ No newline at end of file
+export * from "./Constants";
+export * from "./MediaServer";
\ No newline at end of file
|