| import type { Client } from ".."; | |
| import { BROKEN_CONNECTION_MSG, UPLOAD_URL } from "../constants"; | |
| import type { UploadResponse } from "../types"; | |
| export async function upload_files( | |
| this: Client, | |
| root_url: string, | |
| files: (Blob | File)[], | |
| upload_id?: string | |
| ): Promise<UploadResponse> { | |
| const headers: { | |
| Authorization?: string; | |
| } = {}; | |
| if (this?.options?.hf_token) { | |
| headers.Authorization = `Bearer ${this.options.hf_token}`; | |
| } | |
| const chunkSize = 1000; | |
| const uploadResponses = []; | |
| let response: Response; | |
| for (let i = 0; i < files.length; i += chunkSize) { | |
| const chunk = files.slice(i, i + chunkSize); | |
| const formData = new FormData(); | |
| chunk.forEach((file) => { | |
| formData.append("files", file); | |
| }); | |
| try { | |
| const upload_url = upload_id | |
| ? `${root_url}/${UPLOAD_URL}?upload_id=${upload_id}` | |
| : `${root_url}/${UPLOAD_URL}`; | |
| response = await this.fetch(upload_url, { | |
| method: "POST", | |
| body: formData, | |
| headers, | |
| credentials: "include" | |
| }); | |
| } catch (e) { | |
| throw new Error(BROKEN_CONNECTION_MSG + (e as Error).message); | |
| } | |
| if (!response.ok) { | |
| const error_text = await response.text(); | |
| return { error: `HTTP ${response.status}: ${error_text}` }; | |
| } | |
| const output: UploadResponse["files"] = await response.json(); | |
| if (output) { | |
| uploadResponses.push(...output); | |
| } | |
| } | |
| return { files: uploadResponses }; | |
| } | |