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 { 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}${this.api_prefix}/${UPLOAD_URL}?upload_id=${upload_id}` : `${root_url}${this.api_prefix}/${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 }; }