diff --git a/src/app/bootstrap.ts b/src/app/bootstrap.ts index 0a888ee..01cfe6f 100644 --- a/src/app/bootstrap.ts +++ b/src/app/bootstrap.ts @@ -1,15 +1,15 @@ import { Client } from "discord.js-selfbot-v13"; -import { config } from "../config"; -import { closeDatabase, initializeDatabase } from "../database/drizzle"; -import { createDiscordClientOptions } from "../discordClientOptions"; -import { createChildLogger } from "../logger"; -import { startPendingAIAnalysisWorker } from "../moderation/aiAnalyzer"; -import { syncBacklogMessages } from "../moderation/backlogSync"; -import { registerMessageCapture } from "../moderation/messageCapture"; -import { discordPlayer } from "../player"; -import { VoiceController } from "../voiceController"; -import { startWebserver } from "../webserver"; -import { createGracefulShutdown } from "./shutdown"; +import { config } from "../config.js"; +import { closeDatabase, initializeDatabase } from "../database/drizzle.js"; +import { createDiscordClientOptions } from "../discordClientOptions.js"; +import { createChildLogger } from "../logger.js"; +import { startPendingAIAnalysisWorker } from "../moderation/aiAnalyzer.js"; +import { syncBacklogMessages } from "../moderation/backlogSync.js"; +import { registerMessageCapture } from "../moderation/messageCapture.js"; +import { discordPlayer } from "../player.js"; +import { VoiceController } from "../voiceController.js"; +import { startWebserver } from "../webserver.js"; +import { createGracefulShutdown } from "./shutdown.js"; export async function initializeApp() { const logger = createChildLogger("bot"); diff --git a/src/app/shutdown.ts b/src/app/shutdown.ts index fc5791e..42a7b11 100644 --- a/src/app/shutdown.ts +++ b/src/app/shutdown.ts @@ -1,8 +1,8 @@ import type { Client } from "discord.js-selfbot-v13"; -import type { closeDatabase } from "../database/drizzle"; -import type { createChildLogger } from "../logger"; -import type { discordPlayer } from "../player"; -import type { VoiceController } from "../voiceController"; +import type { closeDatabase } from "../database/drizzle.js"; +import type { createChildLogger } from "../logger.js"; +import type { discordPlayer } from "../player.js"; +import type { VoiceController } from "../voiceController.js"; type Logger = ReturnType; type CloseDatabase = typeof closeDatabase; diff --git a/src/config.ts b/src/config.ts index 0410dea..62b14a1 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { ConfigError } from "./errors.ts"; +import { ConfigError } from "./errors.js"; const configSchema = z .object({ diff --git a/src/database/drizzle.ts b/src/database/drizzle.ts index 39ba49e..0149e7b 100644 --- a/src/database/drizzle.ts +++ b/src/database/drizzle.ts @@ -2,9 +2,9 @@ import Database from "better-sqlite3"; import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres"; import { Pool } from "pg"; -import { config } from "../config.ts"; -import { createChildLogger } from "../logger.ts"; -import * as schema from "./schema.ts"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import * as schema from "./schema.js"; const logger = createChildLogger("drizzle"); diff --git a/src/database/migrate.ts b/src/database/migrate.ts index fa3df42..92ccaff 100644 --- a/src/database/migrate.ts +++ b/src/database/migrate.ts @@ -3,9 +3,9 @@ import Database from "better-sqlite3"; import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; import { migrate as migrateSqlite } from "drizzle-orm/better-sqlite3/migrator"; import { migrate as migratePostgres } from "drizzle-orm/node-postgres/migrator"; -import { config } from "../config"; -import { createChildLogger } from "../logger"; -import { closeDatabase, initializeDatabase } from "./drizzle"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import { closeDatabase, initializeDatabase } from "./drizzle.js"; const logger = createChildLogger("migrate"); diff --git a/src/database/schema.ts b/src/database/schema.ts index e6800ca..a332237 100644 --- a/src/database/schema.ts +++ b/src/database/schema.ts @@ -14,7 +14,7 @@ import { sqliteTable, text as sqliteText, } from "drizzle-orm/sqlite-core"; -import { config } from "../config.ts"; +import { config } from "../config.js"; // PostgreSQL Schema // ================== diff --git a/src/database/voiceRecordingRepo.ts b/src/database/voiceRecordingRepo.ts index debd005..6496a01 100644 --- a/src/database/voiceRecordingRepo.ts +++ b/src/database/voiceRecordingRepo.ts @@ -1,11 +1,11 @@ import { desc, eq } from "drizzle-orm"; -import { createChildLogger } from "../logger"; -import { getDatabase } from "./drizzle"; +import { createChildLogger } from "../logger.js"; +import { getDatabase } from "./drizzle.js"; import { type VoiceRecording, type VoiceRecordingInsert, voiceRecordingsTable, -} from "./schema"; +} from "./schema.js"; const logger = createChildLogger("voice-recording-repo"); diff --git a/src/http/app.ts b/src/http/app.ts index eb2675e..3e5bb40 100644 --- a/src/http/app.ts +++ b/src/http/app.ts @@ -8,20 +8,20 @@ import express, { type Response, } from "express"; import helmet from "helmet"; -import { AppError } from "../errors"; -import type { createChildLogger } from "../logger"; -import type { MediaController } from "../media/mediaController"; -import type { ModerationBroadcaster } from "../moderation/types"; -import { createAnalysisRoutes } from "../routes/analysisRoutes"; -import { createMediaRoutes } from "../routes/mediaRoutes"; -import { createMessageRoutes } from "../routes/messageRoutes"; -import { createRecordingsRoutes } from "../routes/recordingsRoutes"; -import { createSyncRoutes } from "../routes/syncRoutes"; -import { createUIStateRoutes } from "../routes/uiStateRoutes"; -import { createVoiceRoutes } from "../routes/voiceRoutes"; -import type { SharedUIStatePatch } from "../state/uiState"; -import type { VoiceController } from "../voiceController"; -import { createHealthRoutes } from "./health"; +import { AppError } from "../errors.js"; +import type { createChildLogger } from "../logger.js"; +import type { MediaController } from "../media/mediaController.js"; +import type { ModerationBroadcaster } from "../moderation/types.js"; +import { createAnalysisRoutes } from "../routes/analysisRoutes.js"; +import { createMediaRoutes } from "../routes/mediaRoutes.js"; +import { createMessageRoutes } from "../routes/messageRoutes.js"; +import { createRecordingsRoutes } from "../routes/recordingsRoutes.js"; +import { createSyncRoutes } from "../routes/syncRoutes.js"; +import { createUIStateRoutes } from "../routes/uiStateRoutes.js"; +import { createVoiceRoutes } from "../routes/voiceRoutes.js"; +import type { SharedUIStatePatch } from "../state/uiState.js"; +import type { VoiceController } from "../voiceController.js"; +import { createHealthRoutes } from "./health.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/src/http/health.ts b/src/http/health.ts index acc25ef..3b6b516 100644 --- a/src/http/health.ts +++ b/src/http/health.ts @@ -1,5 +1,5 @@ import { Router } from "express"; -import { getMetrics, uptimeGauge } from "../metrics"; +import { getMetrics, uptimeGauge } from "../metrics.js"; export interface HealthRoutesOptions { adminPassword: string; diff --git a/src/http/server.ts b/src/http/server.ts index af8cc5f..48d1517 100644 --- a/src/http/server.ts +++ b/src/http/server.ts @@ -1,25 +1,25 @@ import http from "node:http"; import type { Client } from "discord.js-selfbot-v13"; -import { config } from "../config"; -import { createChildLogger } from "../logger"; -import { MediaController } from "../media/mediaController"; -import { createScreenShareController } from "../media/screenShareController"; -import { createBroadcaster } from "../moderation/broadcaster"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import { MediaController } from "../media/mediaController.js"; +import { createScreenShareController } from "../media/screenShareController.js"; +import { createBroadcaster } from "../moderation/broadcaster.js"; import { initializeMediaSettings, persistMediaSettings, -} from "../state/mediaSettings"; -import { createSharedUIStateStore } from "../state/uiState"; -import { Streamer } from "../streaming"; -import type { VoiceController } from "../voiceController"; +} from "../state/mediaSettings.js"; +import { createSharedUIStateStore } from "../state/uiState.js"; +import { Streamer } from "../streaming/index.js"; +import type { VoiceController } from "../voiceController.js"; import { exposeActiveUserGlobal, exposeModerationGlobals, exposePcmBroadcastGlobal, exposeVideoBroadcastGlobal, -} from "../ws/broadcastGlobals"; -import { startWebSocketServer } from "../ws/server"; -import { createHttpApp } from "./app"; +} from "../ws/broadcastGlobals.js"; +import { startWebSocketServer } from "../ws/server.js"; +import { createHttpApp } from "./app.js"; const serverLogger = createChildLogger("webserver"); diff --git a/src/index.ts b/src/index.ts index 313cf58..6dbd22c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,8 +2,8 @@ import "./mock-crc"; import "libsodium-wrappers"; import "@snazzah/davey"; import "dotenv/config"; -import { initializeApp } from "./app/bootstrap"; -import { createChildLogger } from "./logger"; +import { initializeApp } from "./app/bootstrap.js"; +import { createChildLogger } from "./logger.js"; const logger = createChildLogger("bot"); diff --git a/src/logger.ts b/src/logger.ts index 117d25d..d678510 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import winston from "winston"; -import { formatLogMetadata, serializeLogValue } from "./loggerSerialization"; +import { formatLogMetadata, serializeLogValue } from "./loggerSerialization.js"; const isDev = process.env.NODE_ENV !== "production"; const logLevel = process.env.LOG_LEVEL || (isDev ? "debug" : "info"); diff --git a/src/media/mediaController.ts b/src/media/mediaController.ts index b5c3fe8..f6534f5 100644 --- a/src/media/mediaController.ts +++ b/src/media/mediaController.ts @@ -1,8 +1,8 @@ -import { AppError } from "../errors"; -import { createChildLogger } from "../logger"; -import { discordPlayer } from "../player"; -import { MediaQueue } from "./mediaQueue"; -import { resolveMediaSource } from "./mediaResolver"; +import { AppError } from "../errors.js"; +import { createChildLogger } from "../logger.js"; +import { discordPlayer } from "../player.js"; +import { MediaQueue } from "./mediaQueue.js"; +import { resolveMediaSource } from "./mediaResolver.js"; import type { MediaMode, MediaState, @@ -12,8 +12,8 @@ import type { ResolvedMediaSource, ScreenShareController, ScreenSharePlayback, -} from "./mediaTypes"; -import { createMusicPlayer } from "./musicPlayer"; +} from "./mediaTypes.js"; +import { createMusicPlayer } from "./musicPlayer.js"; const logger = createChildLogger("mediaController"); diff --git a/src/media/mediaQueue.ts b/src/media/mediaQueue.ts index 9194f0f..55c5fde 100644 --- a/src/media/mediaQueue.ts +++ b/src/media/mediaQueue.ts @@ -3,7 +3,7 @@ import type { MediaQueueItem, MediaState, ResolvedMediaSource, -} from "./mediaTypes"; +} from "./mediaTypes.js"; export class MediaQueue { private current: MediaQueueItem | null = null; diff --git a/src/media/mediaResolver.ts b/src/media/mediaResolver.ts index a87bfed..40d569e 100644 --- a/src/media/mediaResolver.ts +++ b/src/media/mediaResolver.ts @@ -1,9 +1,9 @@ import { existsSync, statSync } from "node:fs"; import path from "node:path"; -import { AppError } from "../errors"; -import type { MediaMode, ResolvedMediaSource } from "./mediaTypes"; -import { createPlayDlResolver } from "./playDlResolver"; -import { createYtDlp, type YtDlpClient } from "./ytdlp"; +import { AppError } from "../errors.js"; +import type { MediaMode, ResolvedMediaSource } from "./mediaTypes.js"; +import { createPlayDlResolver } from "./playDlResolver.js"; +import { createYtDlp, type YtDlpClient } from "./ytdlp.js"; type PlayDlResolver = ReturnType; diff --git a/src/media/musicPlayer.ts b/src/media/musicPlayer.ts index 0500359..55a521e 100644 --- a/src/media/musicPlayer.ts +++ b/src/media/musicPlayer.ts @@ -1,13 +1,13 @@ import type { ChildProcessWithoutNullStreams } from "node:child_process"; import { spawn as nodeSpawn } from "node:child_process"; import { StreamType } from "@discordjs/voice"; -import { discordPlayer } from "../player"; +import { discordPlayer } from "../player.js"; import type { DiscordAudioPlayer, MusicPlayback, MusicPlayer, ResolvedMediaSource, -} from "./mediaTypes"; +} from "./mediaTypes.js"; export interface MusicPlayerDependencies { spawn?: typeof nodeSpawn; diff --git a/src/media/screenShareController.ts b/src/media/screenShareController.ts index 9688a3a..34127be 100644 --- a/src/media/screenShareController.ts +++ b/src/media/screenShareController.ts @@ -1,12 +1,12 @@ -import { AppError } from "../errors"; -import { createChildLogger } from "../logger"; -import { discordPlayer } from "../player"; -import { playPreparedStream, Streamer } from "../streaming"; +import { AppError } from "../errors.js"; +import { createChildLogger } from "../logger.js"; +import { discordPlayer } from "../player.js"; +import { playPreparedStream, Streamer } from "../streaming/index.js"; const logger = createChildLogger("screen-share"); -import type { DiscordPlayerOwner, ScreenSharePlayback } from "./mediaTypes"; -import { createYtDlp } from "./ytdlp"; +import type { DiscordPlayerOwner, ScreenSharePlayback } from "./mediaTypes.js"; +import { createYtDlp } from "./ytdlp.js"; export interface ScreenShareVoiceStatus { connected: boolean; @@ -105,8 +105,8 @@ export function createScreenShareController( let stopped = false; const playFn = dependencies.useTranscoder - ? (await import("../streaming")).playTranscodedPreparedStream - : (await import("../streaming")).playPreparedStream; + ? (await import("../streaming/index.js")).playTranscodedPreparedStream + : (await import("../streaming/index.js")).playPreparedStream; const done = playFn(directUrl, session, { fps: 30, diff --git a/src/middleware.ts b/src/middleware.ts index cff7cf7..1ab4981 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,6 +1,6 @@ import { NextFunction, Request, Response } from "express"; -import { AppError } from "./errors"; -import { createChildLogger } from "./logger"; +import { AppError } from "./errors.js"; +import { createChildLogger } from "./logger.js"; const logger = createChildLogger("middleware"); diff --git a/src/moderation/aiAnalysisWorker.ts b/src/moderation/aiAnalysisWorker.ts index 0e1422c..fb806c2 100644 --- a/src/moderation/aiAnalysisWorker.ts +++ b/src/moderation/aiAnalysisWorker.ts @@ -1,14 +1,14 @@ import { parentPort } from "node:worker_threads"; -import { config } from "../config.ts"; -import { initializeDatabase } from "../database/drizzle.ts"; -import { buildConversationPromptMessages } from "./conversationContext.ts"; -import { runModerationAnalysis } from "./llmModerationClient.ts"; +import { config } from "../config.js"; +import { initializeDatabase } from "../database/drizzle.js"; +import { buildConversationPromptMessages } from "./conversationContext.js"; +import { runModerationAnalysis } from "./llmModerationClient.js"; import { getAttachmentsForMessages, getConversationContextBefore, updateMessageAIAnalysis, -} from "./messageStore.ts"; -import type { MessageRecord } from "./types"; +} from "./messageStore.js"; +import type { MessageRecord } from "./types.js"; let dbInitialized = false; diff --git a/src/moderation/aiAnalyzer.ts b/src/moderation/aiAnalyzer.ts index 0ae315e..f409660 100644 --- a/src/moderation/aiAnalyzer.ts +++ b/src/moderation/aiAnalyzer.ts @@ -1,16 +1,16 @@ import { Worker } from "node:worker_threads"; -import { config } from "../config"; -import { createChildLogger } from "../logger"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; import { getMessageById, getPendingConversationKeys, getPendingMessagesByConversation, -} from "./messageStore"; +} from "./messageStore.js"; import type { AnalysisQueueStatus, MessageRecord, ModerationBroadcaster, -} from "./types"; +} from "./types.js"; const logger = createChildLogger("ai-analyzer"); @@ -163,7 +163,7 @@ async function runAnalysisInWorker( ): Promise { return new Promise((resolve, reject) => { const worker = new Worker( - new URL("./aiAnalysisWorker.ts", import.meta.url), + new URL("./aiAnalysisWorker.js", import.meta.url), { execArgv: process.execArgv }, ); diff --git a/src/moderation/attachmentUploader.ts b/src/moderation/attachmentUploader.ts index 25c390e..014493e 100644 --- a/src/moderation/attachmentUploader.ts +++ b/src/moderation/attachmentUploader.ts @@ -1,11 +1,11 @@ -import { config } from "../config"; -import { createChildLogger } from "../logger"; -import { uploadToTele } from "../uploader/teleUpload"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import { uploadToTele } from "../uploader/teleUpload.js"; import { updateAttachmentAsFailedUpload, updateAttachmentAsUploaded, updateAttachmentDiscordUrl, -} from "./messageStore"; +} from "./messageStore.js"; const logger = createChildLogger("attachment-uploader"); diff --git a/src/moderation/backlogSync.ts b/src/moderation/backlogSync.ts index 0d5146c..ee0d3f5 100644 --- a/src/moderation/backlogSync.ts +++ b/src/moderation/backlogSync.ts @@ -1,7 +1,7 @@ import type { Channel, Client, Message } from "discord.js-selfbot-v13"; -import { config } from "../config"; -import { createChildLogger } from "../logger"; -import { captureMessage } from "./messageCapture"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import { captureMessage } from "./messageCapture.js"; const logger = createChildLogger("backlog-sync"); diff --git a/src/moderation/broadcaster.ts b/src/moderation/broadcaster.ts index 4dec06a..ebb1296 100644 --- a/src/moderation/broadcaster.ts +++ b/src/moderation/broadcaster.ts @@ -1,12 +1,12 @@ import type { WebSocket } from "ws"; -import { createChildLogger } from "../logger"; +import { createChildLogger } from "../logger.js"; import type { AnalysisQueueStatus, AttachmentRecord, MediaState, MessageRecord, ModerationWsEvent, -} from "./types"; +} from "./types.js"; export type BroadcasterClient = Pick; diff --git a/src/moderation/conversationContext.ts b/src/moderation/conversationContext.ts index 26434b1..fdb4ade 100644 --- a/src/moderation/conversationContext.ts +++ b/src/moderation/conversationContext.ts @@ -1,4 +1,4 @@ -import type { MessageRecord } from "./types"; +import type { MessageRecord } from "./types.js"; export interface ConversationContextInput { contextBefore: MessageRecord[]; diff --git a/src/moderation/llmModerationClient.ts b/src/moderation/llmModerationClient.ts index 4166ed7..7dae1c8 100644 --- a/src/moderation/llmModerationClient.ts +++ b/src/moderation/llmModerationClient.ts @@ -1,8 +1,8 @@ import OpenAI from "openai"; -import { config } from "../config.ts"; -import { createChildLogger } from "../logger.ts"; -import { retryWithBackoff } from "../retry.ts"; -import type { AnalysisResult, AttachmentRecord, MessageRecord } from "./types"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import { retryWithBackoff } from "../retry.js"; +import type { AnalysisResult, AttachmentRecord, MessageRecord } from "./types.js"; const log = createChildLogger("llmModerationClient"); const openai = new OpenAI({ @@ -35,9 +35,13 @@ const openai = new OpenAI({ } } + const headers = new Headers(response.headers ?? undefined); + headers.set("Content-Type", "application/json"); + headers.delete("Content-Length"); + return new Response(normalizedBody, { status: response.status ?? 200, - headers: response.headers ?? { "Content-Type": "application/json" }, + headers, }); }, }); @@ -592,6 +596,17 @@ Return ONLY valid JSON, no other text.`; ? parseError.message : String(parseError); lastInvalidContent = content; + log.warn( + { + error: lastParseError, + contentLength: content.length, + contentPreview: content.substring(0, 1000), + fullContent: content, + targetIds, + model: config.AI_LLM_MODEL, + }, + "Failed to parse moderation response from LLM", + ); throw parseError; } }, diff --git a/src/moderation/messageCapture.ts b/src/moderation/messageCapture.ts index c4083ba..011f008 100644 --- a/src/moderation/messageCapture.ts +++ b/src/moderation/messageCapture.ts @@ -1,22 +1,22 @@ import type { Client, Message } from "discord.js-selfbot-v13"; -import { config } from "../config"; -import { createChildLogger } from "../logger"; -import { getModerationBroadcaster } from "../ws/broadcastGlobals"; -import { queueMessageAnalysis } from "./aiAnalyzer"; -import { processAttachmentUpload } from "./attachmentUploader"; +import { config } from "../config.js"; +import { createChildLogger } from "../logger.js"; +import { getModerationBroadcaster } from "../ws/broadcastGlobals.js"; +import { queueMessageAnalysis } from "./aiAnalyzer.js"; +import { processAttachmentUpload } from "./attachmentUploader.js"; import { getDisplayContent, getMessageLocation, getMessageMetadata, -} from "./messageMetadata"; +} from "./messageMetadata.js"; import { getMessageById, insertAttachment, updateMessageAsDeleted, updateMessageAsEdited, upsertMessageForCapture, -} from "./messageStore"; -import type { AttachmentRecord, MessageRecord } from "./types"; +} from "./messageStore.js"; +import type { AttachmentRecord, MessageRecord } from "./types.js"; const logger = createChildLogger("message-capture"); diff --git a/src/moderation/messageStore.ts b/src/moderation/messageStore.ts index f533395..fbc1308 100644 --- a/src/moderation/messageStore.ts +++ b/src/moderation/messageStore.ts @@ -9,16 +9,16 @@ import { type SQL, sql, } from "drizzle-orm"; -import { getDatabase } from "../database/drizzle.ts"; -import { attachmentsTable, messagesTable } from "../database/schema.ts"; -import { createChildLogger } from "../logger.ts"; -import { decodeCursor, encodeCursor } from "./pagination.ts"; +import { getDatabase } from "../database/drizzle.js"; +import { attachmentsTable, messagesTable } from "../database/schema.js"; +import { createChildLogger } from "../logger.js"; +import { decodeCursor, encodeCursor } from "./pagination.js"; import type { AttachmentRecord, MessageQuery, MessageRecord, PageResult, -} from "./types"; +} from "./types.js"; const logger = createChildLogger("message-store"); @@ -105,7 +105,7 @@ function pageMessages( return { data, nextCursor }; } -export { decodeCursor, encodeCursor } from "./pagination.ts"; +export { decodeCursor, encodeCursor } from "./pagination.js"; export async function insertMessage(message: MessageRecord): Promise { try { diff --git a/src/moderation/types.ts b/src/moderation/types.ts index 2084477..bc70e0f 100644 --- a/src/moderation/types.ts +++ b/src/moderation/types.ts @@ -1,4 +1,4 @@ -import type { BroadcasterClient, ModerationBroadcaster } from "./broadcaster"; +import type { BroadcasterClient, ModerationBroadcaster } from "./broadcaster.js"; export type AIStatus = "pending" | "clean" | "warn" | "flagged" | "error"; diff --git a/src/muxer-aup3.ts b/src/muxer-aup3.ts index 807cecc..244937b 100644 --- a/src/muxer-aup3.ts +++ b/src/muxer-aup3.ts @@ -1,6 +1,6 @@ import fs from "fs"; import path from "path"; -import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess"; +import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess.js"; const recordingsDir = process.env.RECORDINGS_DIR ?? "./recordings"; diff --git a/src/muxer-queue.ts b/src/muxer-queue.ts index 3c49144..8aa6f43 100644 --- a/src/muxer-queue.ts +++ b/src/muxer-queue.ts @@ -2,9 +2,9 @@ import { and, asc, eq, lt, sql } from "drizzle-orm"; import { getDatabase as getDrizzleDatabase, initializeDatabase, -} from "./database/drizzle"; -import { muxerJobsTable, uiStateTable } from "./database/schema"; -import { createChildLogger } from "./logger"; +} from "./database/drizzle.js"; +import { muxerJobsTable, uiStateTable } from "./database/schema.js"; +import { createChildLogger } from "./logger.js"; const logger = createChildLogger("muxer-queue"); diff --git a/src/muxer.ts b/src/muxer.ts index 070c0eb..5a2a3c4 100644 --- a/src/muxer.ts +++ b/src/muxer.ts @@ -1,6 +1,6 @@ import fs from "fs"; import path from "path"; -import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess"; +import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess.js"; const recordingsDir = process.env.RECORDINGS_DIR ?? "./recordings"; diff --git a/src/player.ts b/src/player.ts index 66afedb..ed7d6ee 100644 --- a/src/player.ts +++ b/src/player.ts @@ -11,7 +11,7 @@ import { import type { DiscordPlayerOwner, DiscordPlayOptions, -} from "./media/mediaTypes"; +} from "./media/mediaTypes.js"; export class DiscordPlayer { private player: AudioPlayer; diff --git a/src/recorder.ts b/src/recorder.ts index e0dbbfb..abf5fca 100644 --- a/src/recorder.ts +++ b/src/recorder.ts @@ -10,24 +10,24 @@ import { VoiceConnectionStatus, } from "@discordjs/voice"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; -import { config } from "./config"; -import { createChildLogger } from "./logger"; -import { PacketFilter } from "./packetFilter"; -import { subscribeToAudioStream } from "./recorder/audioStream"; -import { OpusDecoder } from "./recorder/decoder"; +import { config } from "./config.js"; +import { createChildLogger } from "./logger.js"; +import { PacketFilter } from "./packetFilter.js"; +import { subscribeToAudioStream } from "./recorder/audioStream.js"; +import { OpusDecoder } from "./recorder/decoder.js"; import { collectUserMetadata, createSegmentMetadata, -} from "./recorder/metadata"; -import { SegmentManager } from "./recorder/segment"; +} from "./recorder/metadata.js"; +import { SegmentManager } from "./recorder/segment.js"; import { createRecordingSession, finalizeRecordingSession, type RecordingSession, -} from "./recorder/sessionRecording"; -import { uploadRecordingSegment } from "./recorder/uploader"; -import { retryWithBackoff } from "./retry"; -import type { PcmBroadcaster } from "./types"; +} from "./recorder/sessionRecording.js"; +import { uploadRecordingSegment } from "./recorder/uploader.js"; +import { retryWithBackoff } from "./retry.js"; +import type { PcmBroadcaster } from "./types.js"; const logger = createChildLogger("recorder"); diff --git a/src/recorder/audioStream.ts b/src/recorder/audioStream.ts index 4bb6f81..cfdd623 100644 --- a/src/recorder/audioStream.ts +++ b/src/recorder/audioStream.ts @@ -1,5 +1,5 @@ import { EndBehaviorType, type VoiceReceiver } from "@discordjs/voice"; -import { config } from "../config"; +import { config } from "../config.js"; export interface AudioStreamHandlers { onPacket: (chunk: Buffer) => void; diff --git a/src/recorder/decoder.ts b/src/recorder/decoder.ts index 0803716..699f53f 100644 --- a/src/recorder/decoder.ts +++ b/src/recorder/decoder.ts @@ -1,6 +1,6 @@ import { createRequire } from "node:module"; import * as prism from "prism-media"; -import { config } from "../config"; +import { config } from "../config.js"; const require = createRequire(import.meta.url); diff --git a/src/recorder/metadata.ts b/src/recorder/metadata.ts index 5638cf8..afd1f36 100644 --- a/src/recorder/metadata.ts +++ b/src/recorder/metadata.ts @@ -1,7 +1,7 @@ import path from "node:path"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; -import { config } from "../config"; -import type { SegmentMetadata, SegmentState, UserMetadata } from "../types"; +import { config } from "../config.js"; +import type { SegmentMetadata, SegmentState, UserMetadata } from "../types.js"; export async function collectUserMetadata( client: Client, diff --git a/src/recorder/segment.ts b/src/recorder/segment.ts index e850d29..c0018a9 100644 --- a/src/recorder/segment.ts +++ b/src/recorder/segment.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import * as prism from "prism-media"; -import type { SegmentState } from "../types"; +import type { SegmentState } from "../types.js"; export function buildSegmentPaths( userDir: string, diff --git a/src/recorder/sessionRecording.ts b/src/recorder/sessionRecording.ts index 3cb7937..de2f38d 100644 --- a/src/recorder/sessionRecording.ts +++ b/src/recorder/sessionRecording.ts @@ -3,8 +3,8 @@ import path from "node:path"; import { buildMuxFfmpegArgs, runFfmpeg as defaultRunFfmpeg, -} from "../audio/ffmpegProcess"; -import type { UserMetadata } from "../types"; +} from "../audio/ffmpegProcess.js"; +import type { UserMetadata } from "../types.js"; export type SessionRecordingStatus = | "pending" diff --git a/src/recorder/uploader.ts b/src/recorder/uploader.ts index 0843aad..3751874 100644 --- a/src/recorder/uploader.ts +++ b/src/recorder/uploader.ts @@ -1,13 +1,13 @@ import fs from "node:fs"; import path from "node:path"; -import { config } from "../config"; +import { config } from "../config.js"; import { insertVoiceRecording, updateVoiceRecordingAsFailed, updateVoiceRecordingAsUploaded, -} from "../database/voiceRecordingRepo"; -import { createChildLogger } from "../logger"; -import { uploadToTele } from "../uploader/teleUpload"; +} from "../database/voiceRecordingRepo.js"; +import { createChildLogger } from "../logger.js"; +import { uploadToTele } from "../uploader/teleUpload.js"; const logger = createChildLogger("recording-uploader"); diff --git a/src/retry.ts b/src/retry.ts index 819ab0e..1b4ca8a 100644 --- a/src/retry.ts +++ b/src/retry.ts @@ -1,5 +1,5 @@ import pRetry from "p-retry"; -import type { CustomLogger } from "./logger.ts"; +import type { CustomLogger } from "./logger.js"; export interface RetryOptions { retries?: number; diff --git a/src/routes/analysisRoutes.ts b/src/routes/analysisRoutes.ts index 4befc08..d58c670 100644 --- a/src/routes/analysisRoutes.ts +++ b/src/routes/analysisRoutes.ts @@ -1,16 +1,16 @@ import type { Router } from "express"; import express from "express"; -import { AppError } from "../errors"; +import { AppError } from "../errors.js"; import { getAnalysisQueueStatus, queueMessageAnalysis, -} from "../moderation/aiAnalyzer"; +} from "../moderation/aiAnalyzer.js"; import { getMessageById, searchMessages, updateMessageAIAnalysis, -} from "../moderation/messageStore"; -import type { MessageRecord } from "../moderation/types"; +} from "../moderation/messageStore.js"; +import type { MessageRecord } from "../moderation/types.js"; export function createAnalysisRoutes(): Router { const router = express.Router(); diff --git a/src/routes/mediaRoutes.ts b/src/routes/mediaRoutes.ts index ff892ca..0713d40 100644 --- a/src/routes/mediaRoutes.ts +++ b/src/routes/mediaRoutes.ts @@ -1,8 +1,8 @@ import type { NextFunction, Request, Response, Router } from "express"; import express from "express"; -import { AppError } from "../errors"; -import type { MediaController } from "../media/mediaController"; -import type { MediaMode } from "../media/mediaTypes"; +import { AppError } from "../errors.js"; +import type { MediaController } from "../media/mediaController.js"; +import type { MediaMode } from "../media/mediaTypes.js"; export type MediaRouteController = Pick< MediaController, diff --git a/src/routes/messageRoutes.ts b/src/routes/messageRoutes.ts index 63c9024..610b7e1 100644 --- a/src/routes/messageRoutes.ts +++ b/src/routes/messageRoutes.ts @@ -1,14 +1,14 @@ import type { Router } from "express"; import express from "express"; -import { AppError } from "../errors"; +import { AppError } from "../errors.js"; import { getAttachmentsByChannel, getMessageById, getMessagesByChannel, listMessages, listReviewMessages, -} from "../moderation/messageStore"; -import type { AIStatus, MessageQuery } from "../moderation/types"; +} from "../moderation/messageStore.js"; +import type { AIStatus, MessageQuery } from "../moderation/types.js"; const aiStatuses = new Set([ "pending", diff --git a/src/routes/recordingsRoutes.ts b/src/routes/recordingsRoutes.ts index 31df3ef..56ca5ba 100644 --- a/src/routes/recordingsRoutes.ts +++ b/src/routes/recordingsRoutes.ts @@ -4,9 +4,9 @@ import { type Response, Router, } from "express"; -import { listVoiceRecordings } from "../database/voiceRecordingRepo"; -import { AppError } from "../errors"; -import { createChildLogger } from "../logger"; +import { listVoiceRecordings } from "../database/voiceRecordingRepo.js"; +import { AppError } from "../errors.js"; +import { createChildLogger } from "../logger.js"; const logger = createChildLogger("recordings-routes"); diff --git a/src/routes/syncRoutes.ts b/src/routes/syncRoutes.ts index f858878..f34549e 100644 --- a/src/routes/syncRoutes.ts +++ b/src/routes/syncRoutes.ts @@ -1,9 +1,9 @@ import type { Client } from "discord.js-selfbot-v13"; import type { Router } from "express"; import express from "express"; -import { AppError } from "../errors"; -import { createChildLogger } from "../logger"; -import { syncSelectedChannelBacklog } from "../moderation/backlogSync"; +import { AppError } from "../errors.js"; +import { createChildLogger } from "../logger.js"; +import { syncSelectedChannelBacklog } from "../moderation/backlogSync.js"; const logger = createChildLogger("sync-routes"); const BACKLOG_SYNC_COOLDOWN_MS = 5 * 60 * 1000; diff --git a/src/routes/uiStateRoutes.ts b/src/routes/uiStateRoutes.ts index ac1d59c..6a0842c 100644 --- a/src/routes/uiStateRoutes.ts +++ b/src/routes/uiStateRoutes.ts @@ -1,6 +1,6 @@ import type { Router } from "express"; import express from "express"; -import type { SharedUIState, SharedUIStatePatch } from "../state/uiState"; +import type { SharedUIState, SharedUIStatePatch } from "../state/uiState.js"; export { SharedUIState, SharedUIStatePatch }; diff --git a/src/routes/voiceRoutes.ts b/src/routes/voiceRoutes.ts index 9c49db9..895fd7d 100644 --- a/src/routes/voiceRoutes.ts +++ b/src/routes/voiceRoutes.ts @@ -1,10 +1,10 @@ import type { NextFunction, Request, Response, Router } from "express"; import express from "express"; -import { AppError } from "../errors"; -import { createChildLogger } from "../logger"; -import type { ModerationBroadcaster } from "../moderation/broadcaster"; -import type { VoiceController } from "../voiceController"; -import type { SharedUIState } from "./uiStateRoutes"; +import { AppError } from "../errors.js"; +import { createChildLogger } from "../logger.js"; +import type { ModerationBroadcaster } from "../moderation/broadcaster.js"; +import type { VoiceController } from "../voiceController.js"; +import type { SharedUIState } from "./uiStateRoutes.js"; const logger = createChildLogger("voice-routes"); diff --git a/src/state/mediaSettings.ts b/src/state/mediaSettings.ts index 84064e1..ed38d75 100644 --- a/src/state/mediaSettings.ts +++ b/src/state/mediaSettings.ts @@ -1,4 +1,4 @@ -import { getPersistedValue, setPersistedValue } from "../muxer-queue"; +import { getPersistedValue, setPersistedValue } from "../muxer-queue.js"; export interface MediaSettings { musicVolume: number; diff --git a/src/state/uiState.ts b/src/state/uiState.ts index ac2b99d..e3cd9c2 100644 --- a/src/state/uiState.ts +++ b/src/state/uiState.ts @@ -1,4 +1,4 @@ -import { getPersistedValue, setPersistedValue } from "../muxer-queue"; +import { getPersistedValue, setPersistedValue } from "../muxer-queue.js"; export type ActiveTab = | "voice" diff --git a/src/streaming/transcoder.ts b/src/streaming/transcoder.ts index 0107291..48d0067 100644 --- a/src/streaming/transcoder.ts +++ b/src/streaming/transcoder.ts @@ -1,9 +1,9 @@ import { ChildProcess, spawn } from "node:child_process"; import type { Readable } from "node:stream"; import { PassThrough } from "node:stream"; -import { createChildLogger } from "../logger"; -import { transcoderRestartsCounter, transcoderRunningGauge } from "../metrics"; -import { retryWithBackoff } from "../retry"; +import { createChildLogger } from "../logger.js"; +import { transcoderRestartsCounter, transcoderRunningGauge } from "../metrics.js"; +import { retryWithBackoff } from "../retry.js"; const logger = createChildLogger("transcoder"); diff --git a/src/uploader/teleUpload.ts b/src/uploader/teleUpload.ts index 6309322..16839be 100644 --- a/src/uploader/teleUpload.ts +++ b/src/uploader/teleUpload.ts @@ -1,5 +1,5 @@ -import type { CustomLogger } from "../logger"; -import { retryWithBackoff } from "../retry"; +import type { CustomLogger } from "../logger.js"; +import { retryWithBackoff } from "../retry.js"; export interface TeleUploadResponse { download_url: string; diff --git a/src/voiceController.ts b/src/voiceController.ts index 20e66c0..50fa528 100644 --- a/src/voiceController.ts +++ b/src/voiceController.ts @@ -1,9 +1,9 @@ import { getVoiceConnection, type VoiceConnection } from "@discordjs/voice"; import type { Client, Guild, VoiceChannel } from "discord.js-selfbot-v13"; -import { AppError } from "./errors"; -import { createChildLogger } from "./logger"; -import { discordPlayer } from "./player"; -import { startRecording, stopRecording } from "./recorder"; +import { AppError } from "./errors.js"; +import { createChildLogger } from "./logger.js"; +import { discordPlayer } from "./player.js"; +import { startRecording, stopRecording } from "./recorder.js"; const logger = createChildLogger("voice-controller"); diff --git a/src/webserver.ts b/src/webserver.ts index 0dc0b9f..cd12a2b 100644 --- a/src/webserver.ts +++ b/src/webserver.ts @@ -1 +1 @@ -export { startWebserver } from "./http/server"; +export { startWebserver } from "./http/server.js"; diff --git a/src/ws/broadcastGlobals.ts b/src/ws/broadcastGlobals.ts index 832c326..54b2a59 100644 --- a/src/ws/broadcastGlobals.ts +++ b/src/ws/broadcastGlobals.ts @@ -1,8 +1,8 @@ -import type { createChildLogger } from "../logger"; +import type { createChildLogger } from "../logger.js"; import type { BroadcasterClient, ModerationBroadcaster, -} from "../moderation/types"; +} from "../moderation/types.js"; type Logger = ReturnType; diff --git a/src/ws/server.ts b/src/ws/server.ts index 4229ff1..be2c879 100644 --- a/src/ws/server.ts +++ b/src/ws/server.ts @@ -1,9 +1,9 @@ import type { Server as HttpServer } from "node:http"; import { WebSocketServer } from "ws"; -import type { createChildLogger } from "../logger"; -import type { MediaController } from "../media/mediaController"; -import type { ModerationBroadcaster } from "../moderation/types"; -import { createVoiceAudioBridge } from "./voiceAudioBridge"; +import type { createChildLogger } from "../logger.js"; +import type { MediaController } from "../media/mediaController.js"; +import type { ModerationBroadcaster } from "../moderation/types.js"; +import { createVoiceAudioBridge } from "./voiceAudioBridge.js"; type Logger = ReturnType; diff --git a/src/ws/voiceAudioBridge.ts b/src/ws/voiceAudioBridge.ts index b98c4cc..bb605be 100644 --- a/src/ws/voiceAudioBridge.ts +++ b/src/ws/voiceAudioBridge.ts @@ -1,8 +1,8 @@ import { AudioPlayerStatus } from "@discordjs/voice"; import * as prism from "prism-media"; -import { rmsDb, upsample24kMonoTo48kStereo } from "../audio/pcm"; -import type { createChildLogger } from "../logger"; -import { discordPlayer } from "../player"; +import { rmsDb, upsample24kMonoTo48kStereo } from "../audio/pcm.js"; +import type { createChildLogger } from "../logger.js"; +import { discordPlayer } from "../player.js"; type Logger = ReturnType;