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(-)
This commit is contained in:
MythEclipse
2026-06-14 00:45:31 +07:00
parent c886dfb184
commit ac661b64f4
3 changed files with 42 additions and 1 deletions
@@ -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 {
@@ -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);
@@ -17,6 +17,8 @@ export interface SpeakingHandlerContext {
eventBroadcaster: EventBroadcaster | undefined;
activeSessions: Map<string, RecordingSession>;
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) => {
if (pcmSender) {
pcmSender(pcm, userId);
} else {
eventBroadcaster?.voicePcmData(pcm, userId);
}
},
});