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:
@@ -28,7 +28,9 @@ import {
|
|||||||
stopMuxerWorker,
|
stopMuxerWorker,
|
||||||
} from "../modules/voice-recording/muxer.js";
|
} from "../modules/voice-recording/muxer.js";
|
||||||
import { setEventBroadcaster as setRecorderEventBroadcaster } from "../modules/voice-recording/recorder.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 { VoiceController } from "../modules/voice-recording/voiceController.js";
|
||||||
|
import { VoicePcmWsClient } from "../modules/voice-pcm-ws/index.js";
|
||||||
import { config } from "../shared/config/config.js";
|
import { config } from "../shared/config/config.js";
|
||||||
import {
|
import {
|
||||||
closeDatabase,
|
closeDatabase,
|
||||||
@@ -218,6 +220,27 @@ export async function initializeDiscordGateway() {
|
|||||||
// Initialize Redis command handler for backend→gateway commands
|
// Initialize Redis command handler for backend→gateway commands
|
||||||
const commandHandler = new CommandHandler();
|
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({
|
const gracefulShutdown = createGracefulShutdown({
|
||||||
logger,
|
logger,
|
||||||
closeDatabase,
|
closeDatabase,
|
||||||
@@ -226,6 +249,7 @@ export async function initializeDiscordGateway() {
|
|||||||
eventBroadcaster,
|
eventBroadcaster,
|
||||||
commandHandler,
|
commandHandler,
|
||||||
stopMetricsServer,
|
stopMetricsServer,
|
||||||
|
pcmWsClient,
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import {
|
|||||||
import type { Client, VoiceChannel } from "discord.js-selfbot-v13";
|
import type { Client, VoiceChannel } from "discord.js-selfbot-v13";
|
||||||
import { config } from "../../shared/config/config.js";
|
import { config } from "../../shared/config/config.js";
|
||||||
import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js";
|
import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js";
|
||||||
|
import type { VoicePcmWsClient } from "../voice-pcm-ws/index.js";
|
||||||
import {
|
import {
|
||||||
createRecordingSession,
|
createRecordingSession,
|
||||||
type RecordingSession,
|
type RecordingSession,
|
||||||
@@ -30,6 +31,12 @@ export function setEventBroadcaster(broadcaster: EventBroadcaster | undefined) {
|
|||||||
_eventBroadcaster = broadcaster;
|
_eventBroadcaster = broadcaster;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _pcmWsClient: VoicePcmWsClient | undefined;
|
||||||
|
|
||||||
|
export function setPcmWsClient(client: VoicePcmWsClient | undefined) {
|
||||||
|
_pcmWsClient = client;
|
||||||
|
}
|
||||||
|
|
||||||
const recordingsDir = config.RECORDINGS_DIR;
|
const recordingsDir = config.RECORDINGS_DIR;
|
||||||
|
|
||||||
// Ensure recordings directory exists
|
// Ensure recordings directory exists
|
||||||
@@ -133,6 +140,9 @@ export async function startRecording(
|
|||||||
eventBroadcaster: _eventBroadcaster,
|
eventBroadcaster: _eventBroadcaster,
|
||||||
activeSessions,
|
activeSessions,
|
||||||
recordingsDir,
|
recordingsDir,
|
||||||
|
pcmSender: _pcmWsClient
|
||||||
|
? (pcm, userId) => _pcmWsClient.sendPcm(userId, pcm)
|
||||||
|
: undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
receiver.speaking.on("start", speakingHandler);
|
receiver.speaking.on("start", speakingHandler);
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ export interface SpeakingHandlerContext {
|
|||||||
eventBroadcaster: EventBroadcaster | undefined;
|
eventBroadcaster: EventBroadcaster | undefined;
|
||||||
activeSessions: Map<string, RecordingSession>;
|
activeSessions: Map<string, RecordingSession>;
|
||||||
recordingsDir: string;
|
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,
|
eventBroadcaster,
|
||||||
activeSessions,
|
activeSessions,
|
||||||
recordingsDir,
|
recordingsDir,
|
||||||
|
pcmSender,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
|
|
||||||
return async (userId: string) => {
|
return async (userId: string) => {
|
||||||
@@ -81,7 +84,11 @@ export function createSpeakingHandler(
|
|||||||
receiver,
|
receiver,
|
||||||
userDir,
|
userDir,
|
||||||
onPcmData: (pcm) => {
|
onPcmData: (pcm) => {
|
||||||
|
if (pcmSender) {
|
||||||
|
pcmSender(pcm, userId);
|
||||||
|
} else {
|
||||||
eventBroadcaster?.voicePcmData(pcm, userId);
|
eventBroadcaster?.voicePcmData(pcm, userId);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user