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((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; }