Files
Tiber365/node_modules/unstorage/drivers/uploadthing.mjs
2025-07-24 18:46:24 +02:00

78 lines
2.3 KiB
JavaScript

import { defineDriver, normalizeKey } from "./utils/index.mjs";
import { UTApi } from "uploadthing/server";
const DRIVER_NAME = "uploadthing";
export default defineDriver((opts = {}) => {
let client;
const base = opts.base ? normalizeKey(opts.base) : "";
const r = (key) => base ? `${base}:${key}` : key;
const getClient = () => {
return client ??= new UTApi({
...opts,
defaultKeyType: "customId"
});
};
const getKeys = async (base2) => {
const client2 = getClient();
const { files } = await client2.listFiles({});
return files.map((file) => file.customId).filter((k) => k && k.startsWith(base2));
};
const toFile = (key, value) => {
return Object.assign(new Blob([value]), {
name: key,
customId: key
});
};
return {
name: DRIVER_NAME,
getInstance() {
return getClient();
},
getKeys(base2) {
return getKeys(r(base2));
},
async hasItem(key) {
const client2 = getClient();
const res = await client2.getFileUrls(r(key));
return res.data.length > 0;
},
async getItem(key) {
const client2 = getClient();
const url = await client2.getFileUrls(r(key)).then((res) => res.data[0]?.url);
if (!url) return null;
return fetch(url).then((res) => res.text());
},
async getItemRaw(key) {
const client2 = getClient();
const url = await client2.getFileUrls(r(key)).then((res) => res.data[0]?.url);
if (!url) return null;
return fetch(url).then((res) => res.arrayBuffer());
},
async setItem(key, value) {
const client2 = getClient();
await client2.uploadFiles(toFile(r(key), value));
},
async setItemRaw(key, value) {
const client2 = getClient();
await client2.uploadFiles(toFile(r(key), value));
},
async setItems(items) {
const client2 = getClient();
await client2.uploadFiles(
items.map((item) => toFile(r(item.key), item.value))
);
},
async removeItem(key) {
const client2 = getClient();
await client2.deleteFiles([r(key)]);
},
async clear(base2) {
const client2 = getClient();
const keys = await getKeys(r(base2));
await client2.deleteFiles(keys);
}
// getMeta(key, opts) {
// // TODO: We don't currently have an endpoint to fetch metadata, but it does exist
// },
};
});