diff --git a/src/util/migration/postgres/1745625724865-voice.ts b/src/util/migration/postgres/1745625724865-voice.ts new file mode 100644 index 00000000..d9f7101f --- /dev/null +++ b/src/util/migration/postgres/1745625724865-voice.ts @@ -0,0 +1,43 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Voice1745625724865 implements MigrationInterface { + name = "Voice1745625724865"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE "streams" ("id" character varying NOT NULL, "owner_id" character varying NOT NULL, "channel_id" character varying NOT NULL, "endpoint" character varying NOT NULL, CONSTRAINT "PK_40440b6f569ebc02bc71c25c499" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `CREATE TABLE "stream_sessions" ("id" character varying NOT NULL, "stream_id" character varying NOT NULL, "user_id" character varying NOT NULL, "token" character varying, "session_id" character varying NOT NULL, "used" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_49bdc3f66394c12478f8371c546" PRIMARY KEY ("id"))`, + ); + await queryRunner.query( + `ALTER TABLE "streams" ADD CONSTRAINT "FK_1b566f9b54d1cda271da53ac82f" FOREIGN KEY ("owner_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "streams" ADD CONSTRAINT "FK_5101f0cded27ff0aae78fc4eed7" FOREIGN KEY ("channel_id") REFERENCES "channels"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "stream_sessions" ADD CONSTRAINT "FK_8b5a028a34dae9ee54af37c9c32" FOREIGN KEY ("stream_id") REFERENCES "streams"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + await queryRunner.query( + `ALTER TABLE "stream_sessions" ADD CONSTRAINT "FK_13ae5c29aff4d0890c54179511a" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "stream_sessions" DROP CONSTRAINT "FK_13ae5c29aff4d0890c54179511a"`, + ); + await queryRunner.query( + `ALTER TABLE "stream_sessions" DROP CONSTRAINT "FK_8b5a028a34dae9ee54af37c9c32"`, + ); + await queryRunner.query( + `ALTER TABLE "streams" DROP CONSTRAINT "FK_5101f0cded27ff0aae78fc4eed7"`, + ); + await queryRunner.query( + `ALTER TABLE "streams" DROP CONSTRAINT "FK_1b566f9b54d1cda271da53ac82f"`, + ); + await queryRunner.query(`DROP TABLE "stream_sessions"`); + await queryRunner.query(`DROP TABLE "streams"`); + } +} diff --git a/src/webrtc/Server.ts b/src/webrtc/Server.ts index 0bf67dad..08f9439f 100644 --- a/src/webrtc/Server.ts +++ b/src/webrtc/Server.ts @@ -83,7 +83,7 @@ export class Server { await loadWebRtcLibrary(); } catch (e) { console.log(`[WebRTC] ${yellow("WEBRTC disabled")}`); - return Promise.resolve(); + return; } await mediaServer.start(WRTC_PUBLIC_IP, WRTC_PORT_MIN, WRTC_PORT_MAX); diff --git a/src/webrtc/opcodes/Video.ts b/src/webrtc/opcodes/Video.ts index e0379506..a126712e 100644 --- a/src/webrtc/opcodes/Video.ts +++ b/src/webrtc/opcodes/Video.ts @@ -129,9 +129,10 @@ export async function onVideo(this: WebRtcWebSocket, payload: VoicePayload) { op: VoiceOPCodes.VIDEO, d: { user_id: this.user_id, + // can never send audio ssrc as 0, it will mess up client state for some reason. send server generated ssrc as backup audio_ssrc: ssrcs.audio_ssrc ?? - this.webRtcClient!.getIncomingStreamSSRCs().audio_ssrc, // can never send audio ssrc as 0, it will mess up client state for some reason + this.webRtcClient!.getIncomingStreamSSRCs().audio_ssrc, video_ssrc: ssrcs.video_ssrc ?? 0, rtx_ssrc: ssrcs.rtx_ssrc ?? 0, streams: d.streams?.map((x) => ({ @@ -162,9 +163,6 @@ export async function subscribeToProducers( if (client.user_id === this.user_id) return Promise.resolve(); // cannot subscribe to self - if (!client.isProducingAudio() && !client.isProducingVideo) - return Promise.resolve(); - if ( client.isProducingAudio() && !this.webRtcClient!.isSubscribedToTrack(client.user_id, "audio") @@ -191,9 +189,10 @@ export async function subscribeToProducers( op: VoiceOPCodes.VIDEO, d: { user_id: client.user_id, + // can never send audio ssrc as 0, it will mess up client state for some reason. send server generated ssrc as backup audio_ssrc: ssrcs.audio_ssrc ?? - client.getIncomingStreamSSRCs().audio_ssrc, // can never send audio ssrc as 0, it will mess up client state for some reason + client.getIncomingStreamSSRCs().audio_ssrc, video_ssrc: ssrcs.video_ssrc ?? 0, rtx_ssrc: ssrcs.rtx_ssrc ?? 0, streams: [