94 lines
2.6 KiB
JavaScript
94 lines
2.6 KiB
JavaScript
import { defineDriver, joinKeys } from "./utils/index.mjs";
|
|
import { getR2Binding } from "./utils/cloudflare.mjs";
|
|
const DRIVER_NAME = "cloudflare-r2-binding";
|
|
export default defineDriver((opts = {}) => {
|
|
const r = (key = "") => opts.base ? joinKeys(opts.base, key) : key;
|
|
const getKeys = async (base) => {
|
|
const binding = getR2Binding(opts.binding);
|
|
const kvList = await binding.list(
|
|
base || opts.base ? { prefix: r(base) } : void 0
|
|
);
|
|
return kvList.objects.map((obj) => obj.key);
|
|
};
|
|
return {
|
|
name: DRIVER_NAME,
|
|
options: opts,
|
|
getInstance: () => getR2Binding(opts.binding),
|
|
async hasItem(key) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
return await binding.head(key) !== null;
|
|
},
|
|
async getMeta(key) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
const obj = await binding.head(key);
|
|
if (!obj) return null;
|
|
return {
|
|
mtime: obj.uploaded,
|
|
atime: obj.uploaded,
|
|
...obj
|
|
};
|
|
},
|
|
getItem(key, topts) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
return binding.get(key, topts).then((r2) => r2?.text() ?? null);
|
|
},
|
|
async getItemRaw(key, topts) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
const object = await binding.get(key, topts);
|
|
return object ? getObjBody(object, topts?.type) : null;
|
|
},
|
|
async setItem(key, value, topts) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
await binding.put(key, value, topts);
|
|
},
|
|
async setItemRaw(key, value, topts) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
await binding.put(key, value, topts);
|
|
},
|
|
async removeItem(key) {
|
|
key = r(key);
|
|
const binding = getR2Binding(opts.binding);
|
|
await binding.delete(key);
|
|
},
|
|
getKeys(base) {
|
|
return getKeys(base).then(
|
|
(keys) => opts.base ? keys.map((key) => key.slice(opts.base.length)) : keys
|
|
);
|
|
},
|
|
async clear(base) {
|
|
const binding = getR2Binding(opts.binding);
|
|
const keys = await getKeys(base);
|
|
await binding.delete(keys);
|
|
}
|
|
};
|
|
});
|
|
function getObjBody(object, type) {
|
|
switch (type) {
|
|
case "object": {
|
|
return object;
|
|
}
|
|
case "stream": {
|
|
return object.body;
|
|
}
|
|
case "blob": {
|
|
return object.blob();
|
|
}
|
|
case "arrayBuffer": {
|
|
return object.arrayBuffer();
|
|
}
|
|
case "bytes": {
|
|
return object.arrayBuffer().then((buffer) => new Uint8Array(buffer));
|
|
}
|
|
// TODO: Default to bytes in v2
|
|
default: {
|
|
return object.arrayBuffer();
|
|
}
|
|
}
|
|
}
|