62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
import { Client } from "minio";
|
|
|
|
const minio = new Client({
|
|
endPoint: process.env.MINIO_HOST ?? "localhost",
|
|
port: process.env.MINIO_PORT ? +process.env.MINIO_PORT : undefined,
|
|
useSSL: /true/.test(process.env.MINIO_SSL || "false"),
|
|
accessKey: process.env.MINIO_ACCESS_KEY ?? "",
|
|
secretKey: process.env.MINIO_SECRET_KEY ?? "",
|
|
});
|
|
|
|
export default minio;
|
|
|
|
// minio typescript does not support include version
|
|
type BucketItemWithVersion = {
|
|
name: string;
|
|
lastModified: string;
|
|
etag: string;
|
|
size: number;
|
|
versionId: string;
|
|
isLatest: boolean;
|
|
isDeleteMarker: boolean;
|
|
};
|
|
|
|
export async function listObjectVersion(bucket: string, obj: string) {
|
|
return await new Promise<BucketItemWithVersion[]>((resolve, reject) => {
|
|
const data: BucketItemWithVersion[] = [];
|
|
// @ts-ignore
|
|
let stream = minio.listObjects(bucket, obj, true, {
|
|
IncludeVersion: true, // type error (ts not support) - expected 3 args but got 4
|
|
});
|
|
stream.on("data", (obj) => data.push(obj as unknown as BucketItemWithVersion));
|
|
stream.on("error", (err) => reject(err));
|
|
stream.on("end", () => resolve(data));
|
|
});
|
|
}
|
|
|
|
export async function deleteObjectAllVersion(bucket: string, obj: string) {
|
|
const item = await listObjectVersion(bucket, obj);
|
|
|
|
return await new Promise(async (resolve, reject) => {
|
|
await minio
|
|
.removeObjects(
|
|
bucket,
|
|
item.map(({ name, versionId }) => ({ name, versionId })),
|
|
)
|
|
.catch((e) => reject(e));
|
|
|
|
resolve(true);
|
|
});
|
|
}
|
|
|
|
export async function presignedGetObjectIfExist(bucket: string, obj: string, exp?: number) {
|
|
if (
|
|
await minio.statObject(bucket, obj).catch((e) => {
|
|
if (e.code === "NotFound") return false;
|
|
throw new Error("Object storage error.");
|
|
})
|
|
) {
|
|
return await minio.presignedGetObject(bucket, obj, exp);
|
|
}
|
|
return null;
|
|
}
|