Spaces:
Sleeping
Sleeping
Bot
feat: implement zero-config local filesystem storage driver for out-of-the-box file uploads on Hugging Face Spaces
a375c71 | import "server-only"; | |
| import { IS_DEV } from "lib/const"; | |
| import type { FileStorage } from "./file-storage.interface"; | |
| import { createS3FileStorage } from "./s3-file-storage"; | |
| import { createVercelBlobStorage } from "./vercel-blob-storage"; | |
| import { createLocalFileStorage } from "./local-file-storage"; | |
| import logger from "logger"; | |
| export type FileStorageDriver = "vercel-blob" | "s3" | "local"; | |
| const resolveDriver = (): FileStorageDriver => { | |
| const candidate = process.env.FILE_STORAGE_TYPE; | |
| const normalized = candidate?.trim().toLowerCase(); | |
| if (normalized === "vercel-blob" || normalized === "s3" || normalized === "local") { | |
| return normalized; | |
| } | |
| // If no env is configured, default to local filesystem storage | |
| return "local"; | |
| }; | |
| declare global { | |
| // eslint-disable-next-line no-var | |
| var __server__file_storage__: FileStorage | undefined; | |
| } | |
| const storageDriver = resolveDriver(); | |
| const createFileStorage = (): FileStorage => { | |
| logger.info(`Creating file storage: ${storageDriver}`); | |
| switch (storageDriver) { | |
| case "vercel-blob": | |
| return createVercelBlobStorage(); | |
| case "s3": | |
| return createS3FileStorage(); | |
| case "local": | |
| return createLocalFileStorage(); | |
| default: { | |
| const exhaustiveCheck: never = storageDriver; | |
| throw new Error(`Unsupported file storage driver: ${exhaustiveCheck}`); | |
| } | |
| } | |
| }; | |
| const serverFileStorage = | |
| globalThis.__server__file_storage__ || createFileStorage(); | |
| if (IS_DEV) { | |
| globalThis.__server__file_storage__ = serverFileStorage; | |
| } | |
| export { serverFileStorage, storageDriver }; | |