jws-backend/src/services/minio.ts
2024-07-01 11:19:12 +07:00

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