From 1569fec0cf23442b176b2a9a775208349aa719ed Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sun, 16 Jan 2022 02:37:38 +1100 Subject: [PATCH] boilerplate stuff --- bundle/src/Server.ts | 28 ++++++++++----------- util/src/util/Constants.ts | 3 +++ webrtc/.vscode/launch.json | 23 +++++++++++++++++ webrtc/package-lock.json | Bin 25101 -> 31537 bytes webrtc/package.json | 4 ++- webrtc/src/Server.ts | 36 +++++++++++---------------- webrtc/src/opcodes/Connect.ts | 5 ++++ webrtc/src/opcodes/Heartbeat.ts | 7 ++++++ webrtc/src/opcodes/Identify.ts | 20 +++++++++++++++ webrtc/src/opcodes/Resume.ts | 5 ++++ webrtc/src/opcodes/SelectProtocol.ts | 16 ++++++++++++ webrtc/src/opcodes/Speaking.ts | 6 +++++ webrtc/src/opcodes/index.ts | 35 ++++++++++++++++++++++++++ webrtc/src/start.ts | 1 + webrtc/src/util/Heartbeat.ts | 18 ++++++++++++++ webrtc/src/util/index.ts | 1 + webrtc/tsconfig.json | 19 +++++++++++--- 17 files changed, 187 insertions(+), 40 deletions(-) create mode 100644 webrtc/.vscode/launch.json create mode 100644 webrtc/src/opcodes/Connect.ts create mode 100644 webrtc/src/opcodes/Heartbeat.ts create mode 100644 webrtc/src/opcodes/Identify.ts create mode 100644 webrtc/src/opcodes/Resume.ts create mode 100644 webrtc/src/opcodes/SelectProtocol.ts create mode 100644 webrtc/src/opcodes/Speaking.ts create mode 100644 webrtc/src/opcodes/index.ts create mode 100644 webrtc/src/util/Heartbeat.ts create mode 100644 webrtc/src/util/index.ts diff --git a/bundle/src/Server.ts b/bundle/src/Server.ts index 71a60d49..bc1d7cbc 100644 --- a/bundle/src/Server.ts +++ b/bundle/src/Server.ts @@ -50,20 +50,20 @@ async function main() { endpointPublic: `ws://localhost:${port}`, }), }, - // regions: { - // default: "fosscord", - // useDefaultAsOptimal: true, - // available: [ - // { - // id: "fosscord", - // name: "Fosscord", - // endpoint: "127.0.0.1:3001", - // vip: false, - // custom: false, - // deprecated: false, - // }, - // ], - // }, + regions: { + default: "fosscord", + useDefaultAsOptimal: true, + available: [ + { + id: "fosscord", + name: "Fosscord", + endpoint: "127.0.0.1:3004", + vip: false, + custom: false, + deprecated: false, + }, + ], + }, } as any); //Sentry diff --git a/util/src/util/Constants.ts b/util/src/util/Constants.ts index 5fdf5bc0..a1892105 100644 --- a/util/src/util/Constants.ts +++ b/util/src/util/Constants.ts @@ -73,7 +73,10 @@ export const VoiceOPCodes = { HEARTBEAT: 3, SESSION_DESCRIPTION: 4, SPEAKING: 5, + HEARTBEAT_ACK: 6, + RESUME: 7, HELLO: 8, + RESUMED: 9, CLIENT_CONNECT: 12, CLIENT_DISCONNECT: 13, }; diff --git a/webrtc/.vscode/launch.json b/webrtc/.vscode/launch.json new file mode 100644 index 00000000..92403164 --- /dev/null +++ b/webrtc/.vscode/launch.json @@ -0,0 +1,23 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ts-node", + "type": "node", + "request": "launch", + "args": [ + "src/start.ts" + ], + "runtimeArgs": [ + "-r", + "ts-node/register" + ], + "cwd": "${workspaceRoot}", + "protocol": "inspector", + "internalConsoleOptions": "openOnSessionStart" + } + ] +} \ No newline at end of file diff --git a/webrtc/package-lock.json b/webrtc/package-lock.json index a5db2de13632936e54cc30ed1e8df396443d47a0..6c3726dc425b0a2cc59c41eb82b859538beb60c6 100644 GIT binary patch literal 31537 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 { - socket.on("message", (message) => { - socket.emit( - JSON.stringify({ - op: 2, - d: { - ssrc: 1, - ip: "127.0.0.1", - port: 3004, - modes: [ - "xsalsa20_poly1305", - "xsalsa20_poly1305_suffix", - "xsalsa20_poly1305_lite", - ], - heartbeat_interval: 1, - }, - }) - ); + this.ws.on("connection", async (socket: WebSocket) => { + await setHeartbeat(socket); + + socket.on("message", async (message: string) => { + const payload: Payload = JSON.parse(message); + + if (OPCodeHandlers[payload.op]) + await OPCodeHandlers[payload.op](socket, payload); + else + console.error(`Unimplemented`, payload) }); }); } async listen(): Promise { // @ts-ignore - await (db as Promise); + await initDatabase(); await Config.init(); console.log("[DB] connected"); console.log(`[WebRTC] online on 0.0.0.0:${port}`); diff --git a/webrtc/src/opcodes/Connect.ts b/webrtc/src/opcodes/Connect.ts new file mode 100644 index 00000000..5cc66506 --- /dev/null +++ b/webrtc/src/opcodes/Connect.ts @@ -0,0 +1,5 @@ +import { WebSocket } from "@fosscord/gateway"; +import { Payload } from "./index"; + +export async function onConnect(socket: WebSocket, data: Payload) { +} \ No newline at end of file diff --git a/webrtc/src/opcodes/Heartbeat.ts b/webrtc/src/opcodes/Heartbeat.ts new file mode 100644 index 00000000..04150e36 --- /dev/null +++ b/webrtc/src/opcodes/Heartbeat.ts @@ -0,0 +1,7 @@ +import { WebSocket } from "@fosscord/gateway"; +import { Payload } from "./index"; +import { setHeartbeat } from "./../util"; + +export async function onHeartbeat(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 new file mode 100644 index 00000000..2026d7c9 --- /dev/null +++ b/webrtc/src/opcodes/Identify.ts @@ -0,0 +1,20 @@ +import { WebSocket } from "@fosscord/gateway"; +import { Payload } from "./index" +import { VoiceOPCodes } from "@fosscord/util"; + +export async function onIdentify(socket: WebSocket, data: Payload) { + socket.send(JSON.stringify({ + op: VoiceOPCodes.READY, + d: { + ssrc: 1, + ip: "127.0.0.1", + port: 3005, + modes: [ + "xsalsa20_poly1305", + "xsalsa20_poly1305_suffix", + "xsalsa20_poly1305_lite", + ], + heartbeat_interval: 1, + }, + })); +} \ No newline at end of file diff --git a/webrtc/src/opcodes/Resume.ts b/webrtc/src/opcodes/Resume.ts new file mode 100644 index 00000000..de21eba6 --- /dev/null +++ b/webrtc/src/opcodes/Resume.ts @@ -0,0 +1,5 @@ +import { WebSocket } from "@fosscord/gateway"; +import { Payload } from "./index"; + +export async function onResume(socket: WebSocket, data: Payload) { +} \ No newline at end of file diff --git a/webrtc/src/opcodes/SelectProtocol.ts b/webrtc/src/opcodes/SelectProtocol.ts new file mode 100644 index 00000000..f1732dd9 --- /dev/null +++ b/webrtc/src/opcodes/SelectProtocol.ts @@ -0,0 +1,16 @@ +import { WebSocket } from "@fosscord/gateway"; +import { Payload } from "./index"; +import { VoiceOPCodes } from "@fosscord/util"; + +export async function onSelectProtocol(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", + audio_codec: "opus", + } + })); +} \ No newline at end of file diff --git a/webrtc/src/opcodes/Speaking.ts b/webrtc/src/opcodes/Speaking.ts new file mode 100644 index 00000000..14f86b3c --- /dev/null +++ b/webrtc/src/opcodes/Speaking.ts @@ -0,0 +1,6 @@ +import { WebSocket } from "@fosscord/gateway"; +import { Payload } from "./index" +import { VoiceOPCodes } from "@fosscord/util"; + +export async function onSpeaking(socket: WebSocket, data: Payload) { +} \ No newline at end of file diff --git a/webrtc/src/opcodes/index.ts b/webrtc/src/opcodes/index.ts new file mode 100644 index 00000000..2fe69c38 --- /dev/null +++ b/webrtc/src/opcodes/index.ts @@ -0,0 +1,35 @@ +import { WebSocket } from "@fosscord/gateway"; +import { VoiceOPCodes } from "@fosscord/util"; + +export interface Payload { + op: number; + d?: any; + s?: number; + t?: string; +} + +import { onIdentify } from "./Identify"; +import { onSelectProtocol } from "./SelectProtocol"; +import { onHeartbeat } from "./Heartbeat"; +import { onSpeaking } from "./Speaking"; +import { onResume } from "./Resume"; +import { onConnect } from "./Connect"; + +export type OPCodeHandler = (this: WebSocket, data: Payload) => any; + +export default { + [VoiceOPCodes.IDENTIFY]: onIdentify, //op 0 + [VoiceOPCodes.SELECT_PROTOCOL]: onSelectProtocol, //op 1 + //op 2 voice_ready + [VoiceOPCodes.HEARTBEAT]: onHeartbeat, //op 3 + //op 4 session_description + [VoiceOPCodes.SPEAKING]: onSpeaking, //op 5 + //op 6 heartbeat_ack + [VoiceOPCodes.RESUME]: onResume, //op 7 + //op 8 hello + //op 9 resumed + //op 10? + //op 11? + [VoiceOPCodes.CLIENT_CONNECT]: onConnect, //op 12 + //op 13? +}; \ No newline at end of file diff --git a/webrtc/src/start.ts b/webrtc/src/start.ts index 68867a2c..5614982d 100644 --- a/webrtc/src/start.ts +++ b/webrtc/src/start.ts @@ -1,3 +1,4 @@ import { Server } from "./Server"; const server = new Server(); +server.listen(); \ No newline at end of file diff --git a/webrtc/src/util/Heartbeat.ts b/webrtc/src/util/Heartbeat.ts new file mode 100644 index 00000000..7b5ed9cd --- /dev/null +++ b/webrtc/src/util/Heartbeat.ts @@ -0,0 +1,18 @@ +import { WebSocket, CLOSECODES } from "@fosscord/gateway"; +import { VoiceOPCodes } from "@fosscord/util"; + +export async function setHeartbeat(socket: WebSocket) { + if (socket.heartbeatTimeout) clearTimeout(socket.heartbeatTimeout); + + socket.heartbeatTimeout = setTimeout(() => { + return socket.close(CLOSECODES.Session_timed_out); + }, 1000 * 45); + + socket.send(JSON.stringify({ + op: VoiceOPCodes.HEARTBEAT_ACK, + d: { + v: 6, + heartbeat_interval: 13750, + } + })); +} \ No newline at end of file diff --git a/webrtc/src/util/index.ts b/webrtc/src/util/index.ts new file mode 100644 index 00000000..e8557452 --- /dev/null +++ b/webrtc/src/util/index.ts @@ -0,0 +1 @@ +export * from "./Heartbeat" \ No newline at end of file diff --git a/webrtc/tsconfig.json b/webrtc/tsconfig.json index 77353db0..fb93b0bd 100644 --- a/webrtc/tsconfig.json +++ b/webrtc/tsconfig.json @@ -1,5 +1,8 @@ { "include": ["src/**/*.ts"], + "ts-node": { + "require": ["tsconfig-paths/register"], + }, "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ @@ -18,7 +21,7 @@ "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist/" /* Redirect output structure to the directory. */, - "rootDir": "./src/" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + "rootDir": "../" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ @@ -62,11 +65,19 @@ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ /* Advanced Options */ "skipLibCheck": true /* Skip type checking of declaration files. */, - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + + "baseUrl": "../", + "paths": { + "@fosscord/api": ["api/src/index"], + "@fosscord/gateway": ["gateway/src/index"], + "@fosscord/cdn": ["cdn/src/index"], + "@fosscord/util": ["util/src/index"] + }, } }