From ac661b64f4d86a37e359864e4ab8f75696deced9 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Sun, 14 Jun 2026 00:45:31 +0700 Subject: [PATCH] chore(services): update components based on recent changes Changes: services/discord-gateway/src/app/bootstrap.ts | 24 ++++++++++++++++++++++++ services/discord-gateway/src/modules/voice-recording/recorder.ts | 10 ++++++++++ services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts | 9 ++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) --- services/discord-gateway/src/app/bootstrap.ts | 24 +++++++++++++++++++ .../src/modules/voice-recording/recorder.ts | 10 ++++++++ .../recorder/speakingHandler.ts | 9 ++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/services/discord-gateway/src/app/bootstrap.ts b/services/discord-gateway/src/app/bootstrap.ts index 6cb5539..239243f 100644 --- a/services/discord-gateway/src/app/bootstrap.ts +++ b/services/discord-gateway/src/app/bootstrap.ts @@ -28,7 +28,9 @@ import { stopMuxerWorker, } from "../modules/voice-recording/muxer.js"; import { setEventBroadcaster as setRecorderEventBroadcaster } from "../modules/voice-recording/recorder.js"; +import { setPcmWsClient } from "../modules/voice-recording/recorder.js"; import { VoiceController } from "../modules/voice-recording/voiceController.js"; +import { VoicePcmWsClient } from "../modules/voice-pcm-ws/index.js"; import { config } from "../shared/config/config.js"; import { closeDatabase, @@ -218,6 +220,27 @@ export async function initializeDiscordGateway() { // Initialize Redis command handler for backend→gateway commands const commandHandler = new CommandHandler(); + // Initialize Voice PCM WebSocket client (bypasses Redis for real-time audio) + let pcmWsClient: VoicePcmWsClient | undefined; + if (config.VOICE_PCM_WS_ENABLED && config.BACKEND_WS_TOKEN) { + pcmWsClient = new VoicePcmWsClient( + config.BACKEND_WS_URL, + config.BACKEND_WS_TOKEN, + ); + pcmWsClient.connect(); + setPcmWsClient(pcmWsClient); + logger.info( + { url: config.BACKEND_WS_URL }, + "Voice PCM WS client enabled", + ); + } else if (config.VOICE_PCM_WS_ENABLED && !config.BACKEND_WS_TOKEN) { + logger.warn( + "VOICE_PCM_WS_ENABLED=true but BACKEND_WS_TOKEN is empty — falling back to Redis for PCM", + ); + } else { + logger.info("Voice PCM WS disabled — using Redis for PCM"); + } + const gracefulShutdown = createGracefulShutdown({ logger, closeDatabase, @@ -226,6 +249,7 @@ export async function initializeDiscordGateway() { eventBroadcaster, commandHandler, stopMetricsServer, + pcmWsClient, }); try { diff --git a/services/discord-gateway/src/modules/voice-recording/recorder.ts b/services/discord-gateway/src/modules/voice-recording/recorder.ts index 83c1d54..32c3b63 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder.ts @@ -12,6 +12,7 @@ import { import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; +import type { VoicePcmWsClient } from "../voice-pcm-ws/index.js"; import { createRecordingSession, type RecordingSession, @@ -30,6 +31,12 @@ export function setEventBroadcaster(broadcaster: EventBroadcaster | undefined) { _eventBroadcaster = broadcaster; } +let _pcmWsClient: VoicePcmWsClient | undefined; + +export function setPcmWsClient(client: VoicePcmWsClient | undefined) { + _pcmWsClient = client; +} + const recordingsDir = config.RECORDINGS_DIR; // Ensure recordings directory exists @@ -133,6 +140,9 @@ export async function startRecording( eventBroadcaster: _eventBroadcaster, activeSessions, recordingsDir, + pcmSender: _pcmWsClient + ? (pcm, userId) => _pcmWsClient.sendPcm(userId, pcm) + : undefined, }); receiver.speaking.on("start", speakingHandler); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts b/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts index 9517836..3cd0452 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts @@ -17,6 +17,8 @@ export interface SpeakingHandlerContext { eventBroadcaster: EventBroadcaster | undefined; activeSessions: Map; recordingsDir: string; + /** Direct WS sender for real-time PCM — takes priority over Redis if set. */ + pcmSender?: (pcm: Buffer, userId: string) => void; } /** @@ -40,6 +42,7 @@ export function createSpeakingHandler( eventBroadcaster, activeSessions, recordingsDir, + pcmSender, } = ctx; return async (userId: string) => { @@ -81,7 +84,11 @@ export function createSpeakingHandler( receiver, userDir, onPcmData: (pcm) => { - eventBroadcaster?.voicePcmData(pcm, userId); + if (pcmSender) { + pcmSender(pcm, userId); + } else { + eventBroadcaster?.voicePcmData(pcm, userId); + } }, });