import * as Minio from "minio@7";
type S3 = {
endPoint: string;
port: number;
useSSL: boolean;
pathStyle: boolean;
bucket: string;
accessKey: string;
secretKey: string;
region: string;
};
export async function main(
s3: S3,
prefix?: string,
bucketName?: string,
maxResults?: number,
pageSize?: number,
) {
const s3client = new Minio.Client(s3);
const options = removeObjectEmptyFields({
prefix,
bucketName,
maxResults,
pageSize,
});
const stream = s3client.listObjects(
options.bucketName || s3.bucket,
options.prefix ?? "",
true,
);
const result: any[] = [];
await new Promise<void>((resolve, reject) => {
stream.on("data", (obj: any) => {
if (
options.maxResults !== undefined &&
result.length >= options.maxResults
) {
stream.destroy();
resolve();
return;
}
result.push(obj);
});
stream.on("end", () => resolve());
stream.on("close", () => resolve());
stream.on("error", (err: any) => reject(err));
});
return result;
}
function removeObjectEmptyFields(
object?: Record<string, any>,
removeEmptyArraysAndObjects = true,
createNewObject = true,
) {
if (!object || typeof object !== "object") return {}
const obj = createNewObject ? { ...object } : object
const emptyValues = [undefined, null, ""]
for (const key in obj) {
const value = obj[key]
if (emptyValues.includes(value)) {
delete obj[key]
} else if (typeof value === "object") {
if (Object.keys(value).length) {
obj[key] = removeObjectEmptyFields(value, removeEmptyArraysAndObjects, false)
}
if (!Object.keys(value).length && removeEmptyArraysAndObjects) {
delete obj[key]
}
}
}
return obj
}
Submitted by hugo989 6 days ago