@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.
81 lines (66 loc) • 2.16 kB
text/typescript
import { FileModel } from '@/database/_deprecated/models/file';
import { clientS3Storage } from '@/services/file/ClientS3';
import { FileItem, UploadFileParams } from '@/types/files';
import { IFileService } from './type';
export class ClientService implements IFileService {
async createFile(file: UploadFileParams) {
// save to local storage
// we may want to save to a remote server later
const res = await FileModel.create({
createdAt: Date.now(),
data: undefined,
fileHash: file.hash,
fileType: file.fileType,
metadata: file.metadata,
name: file.name,
saveMode: 'url',
size: file.size,
url: file.url,
} as any);
// get file to base64 url
const base64 = await this.getBase64ByFileHash(file.hash!);
return {
id: res.id,
url: `data:${file.fileType};base64,${base64}`,
};
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async checkFileHash(_hash: string) {
return { isExist: false, metadata: {} };
}
async getFile(id: string): Promise<FileItem> {
const item = await FileModel.findById(id);
if (!item) {
throw new Error('file not found');
}
// arrayBuffer to blob or base64 to blob
const blob = !!item.data
? new Blob([item.data!], { type: item.fileType })
: // @ts-ignore
new Blob([Buffer.from(item.base64!, 'base64')], { type: item.fileType });
const url = URL.createObjectURL(blob);
return {
createdAt: new Date(item.createdAt),
id,
name: item.name,
size: item.size,
type: item.fileType,
updatedAt: new Date(item.updatedAt),
url,
};
}
async removeFile(id: string) {
return FileModel.delete(id);
}
async removeFiles(ids: string[]) {
await Promise.all(ids.map((id) => FileModel.delete(id)));
}
async removeAllFiles() {
return FileModel.clear();
}
private async getBase64ByFileHash(hash: string) {
const fileItem = await clientS3Storage.getObject(hash);
if (!fileItem) throw new Error('file not found');
return Buffer.from(await fileItem.arrayBuffer()).toString('base64');
}
}