refactor: update import statements to use .js extensions

- Changed all import statements across the project to include the .js extension for consistency and to comply with ES module standards.
- Updated imports in various files including bootstrap.ts, shutdown.ts, config.ts, and many others.
- Ensured that all related modules and types are correctly imported with the new extension.
This commit is contained in:
Asep Haryana Saputra
2026-05-21 12:03:31 +00:00
parent 4cd92303ef
commit 0ef6fc8d31
56 changed files with 208 additions and 193 deletions
+11 -11
View File
@@ -1,15 +1,15 @@
import { Client } from "discord.js-selfbot-v13"; import { Client } from "discord.js-selfbot-v13";
import { config } from "../config"; import { config } from "../config.js";
import { closeDatabase, initializeDatabase } from "../database/drizzle"; import { closeDatabase, initializeDatabase } from "../database/drizzle.js";
import { createDiscordClientOptions } from "../discordClientOptions"; import { createDiscordClientOptions } from "../discordClientOptions.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { startPendingAIAnalysisWorker } from "../moderation/aiAnalyzer"; import { startPendingAIAnalysisWorker } from "../moderation/aiAnalyzer.js";
import { syncBacklogMessages } from "../moderation/backlogSync"; import { syncBacklogMessages } from "../moderation/backlogSync.js";
import { registerMessageCapture } from "../moderation/messageCapture"; import { registerMessageCapture } from "../moderation/messageCapture.js";
import { discordPlayer } from "../player"; import { discordPlayer } from "../player.js";
import { VoiceController } from "../voiceController"; import { VoiceController } from "../voiceController.js";
import { startWebserver } from "../webserver"; import { startWebserver } from "../webserver.js";
import { createGracefulShutdown } from "./shutdown"; import { createGracefulShutdown } from "./shutdown.js";
export async function initializeApp() { export async function initializeApp() {
const logger = createChildLogger("bot"); const logger = createChildLogger("bot");
+4 -4
View File
@@ -1,8 +1,8 @@
import type { Client } from "discord.js-selfbot-v13"; import type { Client } from "discord.js-selfbot-v13";
import type { closeDatabase } from "../database/drizzle"; import type { closeDatabase } from "../database/drizzle.js";
import type { createChildLogger } from "../logger"; import type { createChildLogger } from "../logger.js";
import type { discordPlayer } from "../player"; import type { discordPlayer } from "../player.js";
import type { VoiceController } from "../voiceController"; import type { VoiceController } from "../voiceController.js";
type Logger = ReturnType<typeof createChildLogger>; type Logger = ReturnType<typeof createChildLogger>;
type CloseDatabase = typeof closeDatabase; type CloseDatabase = typeof closeDatabase;
+1 -1
View File
@@ -1,5 +1,5 @@
import { z } from "zod"; import { z } from "zod";
import { ConfigError } from "./errors.ts"; import { ConfigError } from "./errors.js";
const configSchema = z const configSchema = z
.object({ .object({
+3 -3
View File
@@ -2,9 +2,9 @@ import Database from "better-sqlite3";
import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3";
import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres"; import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres";
import { Pool } from "pg"; import { Pool } from "pg";
import { config } from "../config.ts"; import { config } from "../config.js";
import { createChildLogger } from "../logger.ts"; import { createChildLogger } from "../logger.js";
import * as schema from "./schema.ts"; import * as schema from "./schema.js";
const logger = createChildLogger("drizzle"); const logger = createChildLogger("drizzle");
+3 -3
View File
@@ -3,9 +3,9 @@ import Database from "better-sqlite3";
import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3";
import { migrate as migrateSqlite } from "drizzle-orm/better-sqlite3/migrator"; import { migrate as migrateSqlite } from "drizzle-orm/better-sqlite3/migrator";
import { migrate as migratePostgres } from "drizzle-orm/node-postgres/migrator"; import { migrate as migratePostgres } from "drizzle-orm/node-postgres/migrator";
import { config } from "../config"; import { config } from "../config.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { closeDatabase, initializeDatabase } from "./drizzle"; import { closeDatabase, initializeDatabase } from "./drizzle.js";
const logger = createChildLogger("migrate"); const logger = createChildLogger("migrate");
+1 -1
View File
@@ -14,7 +14,7 @@ import {
sqliteTable, sqliteTable,
text as sqliteText, text as sqliteText,
} from "drizzle-orm/sqlite-core"; } from "drizzle-orm/sqlite-core";
import { config } from "../config.ts"; import { config } from "../config.js";
// PostgreSQL Schema // PostgreSQL Schema
// ================== // ==================
+3 -3
View File
@@ -1,11 +1,11 @@
import { desc, eq } from "drizzle-orm"; import { desc, eq } from "drizzle-orm";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { getDatabase } from "./drizzle"; import { getDatabase } from "./drizzle.js";
import { import {
type VoiceRecording, type VoiceRecording,
type VoiceRecordingInsert, type VoiceRecordingInsert,
voiceRecordingsTable, voiceRecordingsTable,
} from "./schema"; } from "./schema.js";
const logger = createChildLogger("voice-recording-repo"); const logger = createChildLogger("voice-recording-repo");
+14 -14
View File
@@ -8,20 +8,20 @@ import express, {
type Response, type Response,
} from "express"; } from "express";
import helmet from "helmet"; import helmet from "helmet";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import type { createChildLogger } from "../logger"; import type { createChildLogger } from "../logger.js";
import type { MediaController } from "../media/mediaController"; import type { MediaController } from "../media/mediaController.js";
import type { ModerationBroadcaster } from "../moderation/types"; import type { ModerationBroadcaster } from "../moderation/types.js";
import { createAnalysisRoutes } from "../routes/analysisRoutes"; import { createAnalysisRoutes } from "../routes/analysisRoutes.js";
import { createMediaRoutes } from "../routes/mediaRoutes"; import { createMediaRoutes } from "../routes/mediaRoutes.js";
import { createMessageRoutes } from "../routes/messageRoutes"; import { createMessageRoutes } from "../routes/messageRoutes.js";
import { createRecordingsRoutes } from "../routes/recordingsRoutes"; import { createRecordingsRoutes } from "../routes/recordingsRoutes.js";
import { createSyncRoutes } from "../routes/syncRoutes"; import { createSyncRoutes } from "../routes/syncRoutes.js";
import { createUIStateRoutes } from "../routes/uiStateRoutes"; import { createUIStateRoutes } from "../routes/uiStateRoutes.js";
import { createVoiceRoutes } from "../routes/voiceRoutes"; import { createVoiceRoutes } from "../routes/voiceRoutes.js";
import type { SharedUIStatePatch } from "../state/uiState"; import type { SharedUIStatePatch } from "../state/uiState.js";
import type { VoiceController } from "../voiceController"; import type { VoiceController } from "../voiceController.js";
import { createHealthRoutes } from "./health"; import { createHealthRoutes } from "./health.js";
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);
+1 -1
View File
@@ -1,5 +1,5 @@
import { Router } from "express"; import { Router } from "express";
import { getMetrics, uptimeGauge } from "../metrics"; import { getMetrics, uptimeGauge } from "../metrics.js";
export interface HealthRoutesOptions { export interface HealthRoutesOptions {
adminPassword: string; adminPassword: string;
+12 -12
View File
@@ -1,25 +1,25 @@
import http from "node:http"; import http from "node:http";
import type { Client } from "discord.js-selfbot-v13"; import type { Client } from "discord.js-selfbot-v13";
import { config } from "../config"; import { config } from "../config.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { MediaController } from "../media/mediaController"; import { MediaController } from "../media/mediaController.js";
import { createScreenShareController } from "../media/screenShareController"; import { createScreenShareController } from "../media/screenShareController.js";
import { createBroadcaster } from "../moderation/broadcaster"; import { createBroadcaster } from "../moderation/broadcaster.js";
import { import {
initializeMediaSettings, initializeMediaSettings,
persistMediaSettings, persistMediaSettings,
} from "../state/mediaSettings"; } from "../state/mediaSettings.js";
import { createSharedUIStateStore } from "../state/uiState"; import { createSharedUIStateStore } from "../state/uiState.js";
import { Streamer } from "../streaming"; import { Streamer } from "../streaming/index.js";
import type { VoiceController } from "../voiceController"; import type { VoiceController } from "../voiceController.js";
import { import {
exposeActiveUserGlobal, exposeActiveUserGlobal,
exposeModerationGlobals, exposeModerationGlobals,
exposePcmBroadcastGlobal, exposePcmBroadcastGlobal,
exposeVideoBroadcastGlobal, exposeVideoBroadcastGlobal,
} from "../ws/broadcastGlobals"; } from "../ws/broadcastGlobals.js";
import { startWebSocketServer } from "../ws/server"; import { startWebSocketServer } from "../ws/server.js";
import { createHttpApp } from "./app"; import { createHttpApp } from "./app.js";
const serverLogger = createChildLogger("webserver"); const serverLogger = createChildLogger("webserver");
+2 -2
View File
@@ -2,8 +2,8 @@ import "./mock-crc";
import "libsodium-wrappers"; import "libsodium-wrappers";
import "@snazzah/davey"; import "@snazzah/davey";
import "dotenv/config"; import "dotenv/config";
import { initializeApp } from "./app/bootstrap"; import { initializeApp } from "./app/bootstrap.js";
import { createChildLogger } from "./logger"; import { createChildLogger } from "./logger.js";
const logger = createChildLogger("bot"); const logger = createChildLogger("bot");
+1 -1
View File
@@ -1,7 +1,7 @@
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";
import winston from "winston"; import winston from "winston";
import { formatLogMetadata, serializeLogValue } from "./loggerSerialization"; import { formatLogMetadata, serializeLogValue } from "./loggerSerialization.js";
const isDev = process.env.NODE_ENV !== "production"; const isDev = process.env.NODE_ENV !== "production";
const logLevel = process.env.LOG_LEVEL || (isDev ? "debug" : "info"); const logLevel = process.env.LOG_LEVEL || (isDev ? "debug" : "info");
+7 -7
View File
@@ -1,8 +1,8 @@
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { discordPlayer } from "../player"; import { discordPlayer } from "../player.js";
import { MediaQueue } from "./mediaQueue"; import { MediaQueue } from "./mediaQueue.js";
import { resolveMediaSource } from "./mediaResolver"; import { resolveMediaSource } from "./mediaResolver.js";
import type { import type {
MediaMode, MediaMode,
MediaState, MediaState,
@@ -12,8 +12,8 @@ import type {
ResolvedMediaSource, ResolvedMediaSource,
ScreenShareController, ScreenShareController,
ScreenSharePlayback, ScreenSharePlayback,
} from "./mediaTypes"; } from "./mediaTypes.js";
import { createMusicPlayer } from "./musicPlayer"; import { createMusicPlayer } from "./musicPlayer.js";
const logger = createChildLogger("mediaController"); const logger = createChildLogger("mediaController");
+1 -1
View File
@@ -3,7 +3,7 @@ import type {
MediaQueueItem, MediaQueueItem,
MediaState, MediaState,
ResolvedMediaSource, ResolvedMediaSource,
} from "./mediaTypes"; } from "./mediaTypes.js";
export class MediaQueue { export class MediaQueue {
private current: MediaQueueItem | null = null; private current: MediaQueueItem | null = null;
+4 -4
View File
@@ -1,9 +1,9 @@
import { existsSync, statSync } from "node:fs"; import { existsSync, statSync } from "node:fs";
import path from "node:path"; import path from "node:path";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import type { MediaMode, ResolvedMediaSource } from "./mediaTypes"; import type { MediaMode, ResolvedMediaSource } from "./mediaTypes.js";
import { createPlayDlResolver } from "./playDlResolver"; import { createPlayDlResolver } from "./playDlResolver.js";
import { createYtDlp, type YtDlpClient } from "./ytdlp"; import { createYtDlp, type YtDlpClient } from "./ytdlp.js";
type PlayDlResolver = ReturnType<typeof createPlayDlResolver>; type PlayDlResolver = ReturnType<typeof createPlayDlResolver>;
+2 -2
View File
@@ -1,13 +1,13 @@
import type { ChildProcessWithoutNullStreams } from "node:child_process"; import type { ChildProcessWithoutNullStreams } from "node:child_process";
import { spawn as nodeSpawn } from "node:child_process"; import { spawn as nodeSpawn } from "node:child_process";
import { StreamType } from "@discordjs/voice"; import { StreamType } from "@discordjs/voice";
import { discordPlayer } from "../player"; import { discordPlayer } from "../player.js";
import type { import type {
DiscordAudioPlayer, DiscordAudioPlayer,
MusicPlayback, MusicPlayback,
MusicPlayer, MusicPlayer,
ResolvedMediaSource, ResolvedMediaSource,
} from "./mediaTypes"; } from "./mediaTypes.js";
export interface MusicPlayerDependencies { export interface MusicPlayerDependencies {
spawn?: typeof nodeSpawn; spawn?: typeof nodeSpawn;
+8 -8
View File
@@ -1,12 +1,12 @@
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { discordPlayer } from "../player"; import { discordPlayer } from "../player.js";
import { playPreparedStream, Streamer } from "../streaming"; import { playPreparedStream, Streamer } from "../streaming/index.js";
const logger = createChildLogger("screen-share"); const logger = createChildLogger("screen-share");
import type { DiscordPlayerOwner, ScreenSharePlayback } from "./mediaTypes"; import type { DiscordPlayerOwner, ScreenSharePlayback } from "./mediaTypes.js";
import { createYtDlp } from "./ytdlp"; import { createYtDlp } from "./ytdlp.js";
export interface ScreenShareVoiceStatus { export interface ScreenShareVoiceStatus {
connected: boolean; connected: boolean;
@@ -105,8 +105,8 @@ export function createScreenShareController(
let stopped = false; let stopped = false;
const playFn = dependencies.useTranscoder const playFn = dependencies.useTranscoder
? (await import("../streaming")).playTranscodedPreparedStream ? (await import("../streaming/index.js")).playTranscodedPreparedStream
: (await import("../streaming")).playPreparedStream; : (await import("../streaming/index.js")).playPreparedStream;
const done = playFn(directUrl, session, { const done = playFn(directUrl, session, {
fps: 30, fps: 30,
+2 -2
View File
@@ -1,6 +1,6 @@
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import { AppError } from "./errors"; import { AppError } from "./errors.js";
import { createChildLogger } from "./logger"; import { createChildLogger } from "./logger.js";
const logger = createChildLogger("middleware"); const logger = createChildLogger("middleware");
+6 -6
View File
@@ -1,14 +1,14 @@
import { parentPort } from "node:worker_threads"; import { parentPort } from "node:worker_threads";
import { config } from "../config.ts"; import { config } from "../config.js";
import { initializeDatabase } from "../database/drizzle.ts"; import { initializeDatabase } from "../database/drizzle.js";
import { buildConversationPromptMessages } from "./conversationContext.ts"; import { buildConversationPromptMessages } from "./conversationContext.js";
import { runModerationAnalysis } from "./llmModerationClient.ts"; import { runModerationAnalysis } from "./llmModerationClient.js";
import { import {
getAttachmentsForMessages, getAttachmentsForMessages,
getConversationContextBefore, getConversationContextBefore,
updateMessageAIAnalysis, updateMessageAIAnalysis,
} from "./messageStore.ts"; } from "./messageStore.js";
import type { MessageRecord } from "./types"; import type { MessageRecord } from "./types.js";
let dbInitialized = false; let dbInitialized = false;
+5 -5
View File
@@ -1,16 +1,16 @@
import { Worker } from "node:worker_threads"; import { Worker } from "node:worker_threads";
import { config } from "../config"; import { config } from "../config.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { import {
getMessageById, getMessageById,
getPendingConversationKeys, getPendingConversationKeys,
getPendingMessagesByConversation, getPendingMessagesByConversation,
} from "./messageStore"; } from "./messageStore.js";
import type { import type {
AnalysisQueueStatus, AnalysisQueueStatus,
MessageRecord, MessageRecord,
ModerationBroadcaster, ModerationBroadcaster,
} from "./types"; } from "./types.js";
const logger = createChildLogger("ai-analyzer"); const logger = createChildLogger("ai-analyzer");
@@ -163,7 +163,7 @@ async function runAnalysisInWorker(
): Promise<AnalysisWorkerResponse> { ): Promise<AnalysisWorkerResponse> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const worker = new Worker( const worker = new Worker(
new URL("./aiAnalysisWorker.ts", import.meta.url), new URL("./aiAnalysisWorker.js", import.meta.url),
{ execArgv: process.execArgv }, { execArgv: process.execArgv },
); );
+4 -4
View File
@@ -1,11 +1,11 @@
import { config } from "../config"; import { config } from "../config.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { uploadToTele } from "../uploader/teleUpload"; import { uploadToTele } from "../uploader/teleUpload.js";
import { import {
updateAttachmentAsFailedUpload, updateAttachmentAsFailedUpload,
updateAttachmentAsUploaded, updateAttachmentAsUploaded,
updateAttachmentDiscordUrl, updateAttachmentDiscordUrl,
} from "./messageStore"; } from "./messageStore.js";
const logger = createChildLogger("attachment-uploader"); const logger = createChildLogger("attachment-uploader");
+3 -3
View File
@@ -1,7 +1,7 @@
import type { Channel, Client, Message } from "discord.js-selfbot-v13"; import type { Channel, Client, Message } from "discord.js-selfbot-v13";
import { config } from "../config"; import { config } from "../config.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { captureMessage } from "./messageCapture"; import { captureMessage } from "./messageCapture.js";
const logger = createChildLogger("backlog-sync"); const logger = createChildLogger("backlog-sync");
+2 -2
View File
@@ -1,12 +1,12 @@
import type { WebSocket } from "ws"; import type { WebSocket } from "ws";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import type { import type {
AnalysisQueueStatus, AnalysisQueueStatus,
AttachmentRecord, AttachmentRecord,
MediaState, MediaState,
MessageRecord, MessageRecord,
ModerationWsEvent, ModerationWsEvent,
} from "./types"; } from "./types.js";
export type BroadcasterClient = Pick<WebSocket, "readyState" | "send">; export type BroadcasterClient = Pick<WebSocket, "readyState" | "send">;
+1 -1
View File
@@ -1,4 +1,4 @@
import type { MessageRecord } from "./types"; import type { MessageRecord } from "./types.js";
export interface ConversationContextInput { export interface ConversationContextInput {
contextBefore: MessageRecord[]; contextBefore: MessageRecord[];
+20 -5
View File
@@ -1,8 +1,8 @@
import OpenAI from "openai"; import OpenAI from "openai";
import { config } from "../config.ts"; import { config } from "../config.js";
import { createChildLogger } from "../logger.ts"; import { createChildLogger } from "../logger.js";
import { retryWithBackoff } from "../retry.ts"; import { retryWithBackoff } from "../retry.js";
import type { AnalysisResult, AttachmentRecord, MessageRecord } from "./types"; import type { AnalysisResult, AttachmentRecord, MessageRecord } from "./types.js";
const log = createChildLogger("llmModerationClient"); const log = createChildLogger("llmModerationClient");
const openai = new OpenAI({ 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, { return new Response(normalizedBody, {
status: response.status ?? 200, 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 ? parseError.message
: String(parseError); : String(parseError);
lastInvalidContent = content; 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; throw parseError;
} }
}, },
+8 -8
View File
@@ -1,22 +1,22 @@
import type { Client, Message } from "discord.js-selfbot-v13"; import type { Client, Message } from "discord.js-selfbot-v13";
import { config } from "../config"; import { config } from "../config.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { getModerationBroadcaster } from "../ws/broadcastGlobals"; import { getModerationBroadcaster } from "../ws/broadcastGlobals.js";
import { queueMessageAnalysis } from "./aiAnalyzer"; import { queueMessageAnalysis } from "./aiAnalyzer.js";
import { processAttachmentUpload } from "./attachmentUploader"; import { processAttachmentUpload } from "./attachmentUploader.js";
import { import {
getDisplayContent, getDisplayContent,
getMessageLocation, getMessageLocation,
getMessageMetadata, getMessageMetadata,
} from "./messageMetadata"; } from "./messageMetadata.js";
import { import {
getMessageById, getMessageById,
insertAttachment, insertAttachment,
updateMessageAsDeleted, updateMessageAsDeleted,
updateMessageAsEdited, updateMessageAsEdited,
upsertMessageForCapture, upsertMessageForCapture,
} from "./messageStore"; } from "./messageStore.js";
import type { AttachmentRecord, MessageRecord } from "./types"; import type { AttachmentRecord, MessageRecord } from "./types.js";
const logger = createChildLogger("message-capture"); const logger = createChildLogger("message-capture");
+6 -6
View File
@@ -9,16 +9,16 @@ import {
type SQL, type SQL,
sql, sql,
} from "drizzle-orm"; } from "drizzle-orm";
import { getDatabase } from "../database/drizzle.ts"; import { getDatabase } from "../database/drizzle.js";
import { attachmentsTable, messagesTable } from "../database/schema.ts"; import { attachmentsTable, messagesTable } from "../database/schema.js";
import { createChildLogger } from "../logger.ts"; import { createChildLogger } from "../logger.js";
import { decodeCursor, encodeCursor } from "./pagination.ts"; import { decodeCursor, encodeCursor } from "./pagination.js";
import type { import type {
AttachmentRecord, AttachmentRecord,
MessageQuery, MessageQuery,
MessageRecord, MessageRecord,
PageResult, PageResult,
} from "./types"; } from "./types.js";
const logger = createChildLogger("message-store"); const logger = createChildLogger("message-store");
@@ -105,7 +105,7 @@ function pageMessages(
return { data, nextCursor }; return { data, nextCursor };
} }
export { decodeCursor, encodeCursor } from "./pagination.ts"; export { decodeCursor, encodeCursor } from "./pagination.js";
export async function insertMessage(message: MessageRecord): Promise<void> { export async function insertMessage(message: MessageRecord): Promise<void> {
try { try {
+1 -1
View File
@@ -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"; export type AIStatus = "pending" | "clean" | "warn" | "flagged" | "error";
+1 -1
View File
@@ -1,6 +1,6 @@
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess"; import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess.js";
const recordingsDir = process.env.RECORDINGS_DIR ?? "./recordings"; const recordingsDir = process.env.RECORDINGS_DIR ?? "./recordings";
+3 -3
View File
@@ -2,9 +2,9 @@ import { and, asc, eq, lt, sql } from "drizzle-orm";
import { import {
getDatabase as getDrizzleDatabase, getDatabase as getDrizzleDatabase,
initializeDatabase, initializeDatabase,
} from "./database/drizzle"; } from "./database/drizzle.js";
import { muxerJobsTable, uiStateTable } from "./database/schema"; import { muxerJobsTable, uiStateTable } from "./database/schema.js";
import { createChildLogger } from "./logger"; import { createChildLogger } from "./logger.js";
const logger = createChildLogger("muxer-queue"); const logger = createChildLogger("muxer-queue");
+1 -1
View File
@@ -1,6 +1,6 @@
import fs from "fs"; import fs from "fs";
import path from "path"; import path from "path";
import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess"; import { buildMuxFfmpegArgs, runFfmpeg } from "./audio/ffmpegProcess.js";
const recordingsDir = process.env.RECORDINGS_DIR ?? "./recordings"; const recordingsDir = process.env.RECORDINGS_DIR ?? "./recordings";
+1 -1
View File
@@ -11,7 +11,7 @@ import {
import type { import type {
DiscordPlayerOwner, DiscordPlayerOwner,
DiscordPlayOptions, DiscordPlayOptions,
} from "./media/mediaTypes"; } from "./media/mediaTypes.js";
export class DiscordPlayer { export class DiscordPlayer {
private player: AudioPlayer; private player: AudioPlayer;
+11 -11
View File
@@ -10,24 +10,24 @@ import {
VoiceConnectionStatus, VoiceConnectionStatus,
} from "@discordjs/voice"; } from "@discordjs/voice";
import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13";
import { config } from "./config"; import { config } from "./config.js";
import { createChildLogger } from "./logger"; import { createChildLogger } from "./logger.js";
import { PacketFilter } from "./packetFilter"; import { PacketFilter } from "./packetFilter.js";
import { subscribeToAudioStream } from "./recorder/audioStream"; import { subscribeToAudioStream } from "./recorder/audioStream.js";
import { OpusDecoder } from "./recorder/decoder"; import { OpusDecoder } from "./recorder/decoder.js";
import { import {
collectUserMetadata, collectUserMetadata,
createSegmentMetadata, createSegmentMetadata,
} from "./recorder/metadata"; } from "./recorder/metadata.js";
import { SegmentManager } from "./recorder/segment"; import { SegmentManager } from "./recorder/segment.js";
import { import {
createRecordingSession, createRecordingSession,
finalizeRecordingSession, finalizeRecordingSession,
type RecordingSession, type RecordingSession,
} from "./recorder/sessionRecording"; } from "./recorder/sessionRecording.js";
import { uploadRecordingSegment } from "./recorder/uploader"; import { uploadRecordingSegment } from "./recorder/uploader.js";
import { retryWithBackoff } from "./retry"; import { retryWithBackoff } from "./retry.js";
import type { PcmBroadcaster } from "./types"; import type { PcmBroadcaster } from "./types.js";
const logger = createChildLogger("recorder"); const logger = createChildLogger("recorder");
+1 -1
View File
@@ -1,5 +1,5 @@
import { EndBehaviorType, type VoiceReceiver } from "@discordjs/voice"; import { EndBehaviorType, type VoiceReceiver } from "@discordjs/voice";
import { config } from "../config"; import { config } from "../config.js";
export interface AudioStreamHandlers { export interface AudioStreamHandlers {
onPacket: (chunk: Buffer) => void; onPacket: (chunk: Buffer) => void;
+1 -1
View File
@@ -1,6 +1,6 @@
import { createRequire } from "node:module"; import { createRequire } from "node:module";
import * as prism from "prism-media"; import * as prism from "prism-media";
import { config } from "../config"; import { config } from "../config.js";
const require = createRequire(import.meta.url); const require = createRequire(import.meta.url);
+2 -2
View File
@@ -1,7 +1,7 @@
import path from "node:path"; import path from "node:path";
import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13";
import { config } from "../config"; import { config } from "../config.js";
import type { SegmentMetadata, SegmentState, UserMetadata } from "../types"; import type { SegmentMetadata, SegmentState, UserMetadata } from "../types.js";
export async function collectUserMetadata( export async function collectUserMetadata(
client: Client, client: Client,
+1 -1
View File
@@ -1,7 +1,7 @@
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";
import * as prism from "prism-media"; import * as prism from "prism-media";
import type { SegmentState } from "../types"; import type { SegmentState } from "../types.js";
export function buildSegmentPaths( export function buildSegmentPaths(
userDir: string, userDir: string,
+2 -2
View File
@@ -3,8 +3,8 @@ import path from "node:path";
import { import {
buildMuxFfmpegArgs, buildMuxFfmpegArgs,
runFfmpeg as defaultRunFfmpeg, runFfmpeg as defaultRunFfmpeg,
} from "../audio/ffmpegProcess"; } from "../audio/ffmpegProcess.js";
import type { UserMetadata } from "../types"; import type { UserMetadata } from "../types.js";
export type SessionRecordingStatus = export type SessionRecordingStatus =
| "pending" | "pending"
+4 -4
View File
@@ -1,13 +1,13 @@
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";
import { config } from "../config"; import { config } from "../config.js";
import { import {
insertVoiceRecording, insertVoiceRecording,
updateVoiceRecordingAsFailed, updateVoiceRecordingAsFailed,
updateVoiceRecordingAsUploaded, updateVoiceRecordingAsUploaded,
} from "../database/voiceRecordingRepo"; } from "../database/voiceRecordingRepo.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { uploadToTele } from "../uploader/teleUpload"; import { uploadToTele } from "../uploader/teleUpload.js";
const logger = createChildLogger("recording-uploader"); const logger = createChildLogger("recording-uploader");
+1 -1
View File
@@ -1,5 +1,5 @@
import pRetry from "p-retry"; import pRetry from "p-retry";
import type { CustomLogger } from "./logger.ts"; import type { CustomLogger } from "./logger.js";
export interface RetryOptions { export interface RetryOptions {
retries?: number; retries?: number;
+4 -4
View File
@@ -1,16 +1,16 @@
import type { Router } from "express"; import type { Router } from "express";
import express from "express"; import express from "express";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { import {
getAnalysisQueueStatus, getAnalysisQueueStatus,
queueMessageAnalysis, queueMessageAnalysis,
} from "../moderation/aiAnalyzer"; } from "../moderation/aiAnalyzer.js";
import { import {
getMessageById, getMessageById,
searchMessages, searchMessages,
updateMessageAIAnalysis, updateMessageAIAnalysis,
} from "../moderation/messageStore"; } from "../moderation/messageStore.js";
import type { MessageRecord } from "../moderation/types"; import type { MessageRecord } from "../moderation/types.js";
export function createAnalysisRoutes(): Router { export function createAnalysisRoutes(): Router {
const router = express.Router(); const router = express.Router();
+3 -3
View File
@@ -1,8 +1,8 @@
import type { NextFunction, Request, Response, Router } from "express"; import type { NextFunction, Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import type { MediaController } from "../media/mediaController"; import type { MediaController } from "../media/mediaController.js";
import type { MediaMode } from "../media/mediaTypes"; import type { MediaMode } from "../media/mediaTypes.js";
export type MediaRouteController = Pick< export type MediaRouteController = Pick<
MediaController, MediaController,
+3 -3
View File
@@ -1,14 +1,14 @@
import type { Router } from "express"; import type { Router } from "express";
import express from "express"; import express from "express";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { import {
getAttachmentsByChannel, getAttachmentsByChannel,
getMessageById, getMessageById,
getMessagesByChannel, getMessagesByChannel,
listMessages, listMessages,
listReviewMessages, listReviewMessages,
} from "../moderation/messageStore"; } from "../moderation/messageStore.js";
import type { AIStatus, MessageQuery } from "../moderation/types"; import type { AIStatus, MessageQuery } from "../moderation/types.js";
const aiStatuses = new Set<AIStatus>([ const aiStatuses = new Set<AIStatus>([
"pending", "pending",
+3 -3
View File
@@ -4,9 +4,9 @@ import {
type Response, type Response,
Router, Router,
} from "express"; } from "express";
import { listVoiceRecordings } from "../database/voiceRecordingRepo"; import { listVoiceRecordings } from "../database/voiceRecordingRepo.js";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
const logger = createChildLogger("recordings-routes"); const logger = createChildLogger("recordings-routes");
+3 -3
View File
@@ -1,9 +1,9 @@
import type { Client } from "discord.js-selfbot-v13"; import type { Client } from "discord.js-selfbot-v13";
import type { Router } from "express"; import type { Router } from "express";
import express from "express"; import express from "express";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { syncSelectedChannelBacklog } from "../moderation/backlogSync"; import { syncSelectedChannelBacklog } from "../moderation/backlogSync.js";
const logger = createChildLogger("sync-routes"); const logger = createChildLogger("sync-routes");
const BACKLOG_SYNC_COOLDOWN_MS = 5 * 60 * 1000; const BACKLOG_SYNC_COOLDOWN_MS = 5 * 60 * 1000;
+1 -1
View File
@@ -1,6 +1,6 @@
import type { Router } from "express"; import type { Router } from "express";
import express from "express"; import express from "express";
import type { SharedUIState, SharedUIStatePatch } from "../state/uiState"; import type { SharedUIState, SharedUIStatePatch } from "../state/uiState.js";
export { SharedUIState, SharedUIStatePatch }; export { SharedUIState, SharedUIStatePatch };
+5 -5
View File
@@ -1,10 +1,10 @@
import type { NextFunction, Request, Response, Router } from "express"; import type { NextFunction, Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { AppError } from "../errors"; import { AppError } from "../errors.js";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import type { ModerationBroadcaster } from "../moderation/broadcaster"; import type { ModerationBroadcaster } from "../moderation/broadcaster.js";
import type { VoiceController } from "../voiceController"; import type { VoiceController } from "../voiceController.js";
import type { SharedUIState } from "./uiStateRoutes"; import type { SharedUIState } from "./uiStateRoutes.js";
const logger = createChildLogger("voice-routes"); const logger = createChildLogger("voice-routes");
+1 -1
View File
@@ -1,4 +1,4 @@
import { getPersistedValue, setPersistedValue } from "../muxer-queue"; import { getPersistedValue, setPersistedValue } from "../muxer-queue.js";
export interface MediaSettings { export interface MediaSettings {
musicVolume: number; musicVolume: number;
+1 -1
View File
@@ -1,4 +1,4 @@
import { getPersistedValue, setPersistedValue } from "../muxer-queue"; import { getPersistedValue, setPersistedValue } from "../muxer-queue.js";
export type ActiveTab = export type ActiveTab =
| "voice" | "voice"
+3 -3
View File
@@ -1,9 +1,9 @@
import { ChildProcess, spawn } from "node:child_process"; import { ChildProcess, spawn } from "node:child_process";
import type { Readable } from "node:stream"; import type { Readable } from "node:stream";
import { PassThrough } from "node:stream"; import { PassThrough } from "node:stream";
import { createChildLogger } from "../logger"; import { createChildLogger } from "../logger.js";
import { transcoderRestartsCounter, transcoderRunningGauge } from "../metrics"; import { transcoderRestartsCounter, transcoderRunningGauge } from "../metrics.js";
import { retryWithBackoff } from "../retry"; import { retryWithBackoff } from "../retry.js";
const logger = createChildLogger("transcoder"); const logger = createChildLogger("transcoder");
+2 -2
View File
@@ -1,5 +1,5 @@
import type { CustomLogger } from "../logger"; import type { CustomLogger } from "../logger.js";
import { retryWithBackoff } from "../retry"; import { retryWithBackoff } from "../retry.js";
export interface TeleUploadResponse { export interface TeleUploadResponse {
download_url: string; download_url: string;
+4 -4
View File
@@ -1,9 +1,9 @@
import { getVoiceConnection, type VoiceConnection } from "@discordjs/voice"; import { getVoiceConnection, type VoiceConnection } from "@discordjs/voice";
import type { Client, Guild, VoiceChannel } from "discord.js-selfbot-v13"; import type { Client, Guild, VoiceChannel } from "discord.js-selfbot-v13";
import { AppError } from "./errors"; import { AppError } from "./errors.js";
import { createChildLogger } from "./logger"; import { createChildLogger } from "./logger.js";
import { discordPlayer } from "./player"; import { discordPlayer } from "./player.js";
import { startRecording, stopRecording } from "./recorder"; import { startRecording, stopRecording } from "./recorder.js";
const logger = createChildLogger("voice-controller"); const logger = createChildLogger("voice-controller");
+1 -1
View File
@@ -1 +1 @@
export { startWebserver } from "./http/server"; export { startWebserver } from "./http/server.js";
+2 -2
View File
@@ -1,8 +1,8 @@
import type { createChildLogger } from "../logger"; import type { createChildLogger } from "../logger.js";
import type { import type {
BroadcasterClient, BroadcasterClient,
ModerationBroadcaster, ModerationBroadcaster,
} from "../moderation/types"; } from "../moderation/types.js";
type Logger = ReturnType<typeof createChildLogger>; type Logger = ReturnType<typeof createChildLogger>;
+4 -4
View File
@@ -1,9 +1,9 @@
import type { Server as HttpServer } from "node:http"; import type { Server as HttpServer } from "node:http";
import { WebSocketServer } from "ws"; import { WebSocketServer } from "ws";
import type { createChildLogger } from "../logger"; import type { createChildLogger } from "../logger.js";
import type { MediaController } from "../media/mediaController"; import type { MediaController } from "../media/mediaController.js";
import type { ModerationBroadcaster } from "../moderation/types"; import type { ModerationBroadcaster } from "../moderation/types.js";
import { createVoiceAudioBridge } from "./voiceAudioBridge"; import { createVoiceAudioBridge } from "./voiceAudioBridge.js";
type Logger = ReturnType<typeof createChildLogger>; type Logger = ReturnType<typeof createChildLogger>;
+3 -3
View File
@@ -1,8 +1,8 @@
import { AudioPlayerStatus } from "@discordjs/voice"; import { AudioPlayerStatus } from "@discordjs/voice";
import * as prism from "prism-media"; import * as prism from "prism-media";
import { rmsDb, upsample24kMonoTo48kStereo } from "../audio/pcm"; import { rmsDb, upsample24kMonoTo48kStereo } from "../audio/pcm.js";
import type { createChildLogger } from "../logger"; import type { createChildLogger } from "../logger.js";
import { discordPlayer } from "../player"; import { discordPlayer } from "../player.js";
type Logger = ReturnType<typeof createChildLogger>; type Logger = ReturnType<typeof createChildLogger>;