78 lines
2.3 KiB
JavaScript
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
|
|
// },
|
|
};
|
|
});
|