UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

68 lines (60 loc) 1.73 kB
import { existsSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; /** * 安全存储临时文件工具类 */ export class TempFileManager { private readonly tempDir: string; private filePaths: Set<string> = new Set(); constructor(dirname: string) { // 创建唯一临时目录 (跨平台安全) this.tempDir = mkdtempSync(join(tmpdir(), dirname)); // 注册退出清理钩子 this.registerCleanupHook(); } /** * 将 Uint8Array 写入临时文件 */ async writeTempFile(data: Uint8Array, name: string): Promise<string> { const filePath = join(this.tempDir, name); try { writeFileSync(filePath, data); this.filePaths.add(filePath); return filePath; } catch (error) { this.cleanup(); // 写入失败时立即清理 throw new Error(`Failed to write temp file: ${(error as Error).message}`); } } /** * 安全清理临时资源 */ cleanup(): void { if (existsSync(this.tempDir)) { // 递归删除目录及内容 rmSync(this.tempDir, { force: true, recursive: true }); this.filePaths.clear(); } } /** * 注册进程退出/异常时的自动清理 */ private registerCleanupHook(): void { // 正常退出 process.on('exit', () => this.cleanup()); // 异常退出 process.on('uncaughtException', (err) => { console.error('Uncaught exception, cleaning temp files:', err); this.cleanup(); process.exit(1); }); // 信号终止 ['SIGINT', 'SIGTERM'].forEach((signal) => { process.on(signal, () => { this.cleanup(); process.exit(0); }); }); } }