@appsemble/node-utils
Version:
NodeJS utilities used by Appsemble internally.
131 lines • 3.66 kB
JavaScript
import { streamToBuffer } from 'memfs/lib/node/util.js';
import { Client, S3Error } from 'minio';
import { logger } from './logger.js';
let s3Client;
export function initS3Client({ accessKey, endPoint, port = 9000, secretKey, useSSL = true, }) {
try {
s3Client = new Client({
endPoint,
port,
useSSL,
accessKey,
secretKey,
});
}
catch (error) {
logger.error(error);
throw error;
}
}
async function ensureBucket(name) {
try {
const bucketExists = await s3Client.bucketExists(name);
if (!bucketExists) {
try {
await s3Client.makeBucket(name);
}
catch (makeBucketError) {
if (makeBucketError instanceof S3Error &&
makeBucketError.code === 'BucketAlreadyOwnedByYou') {
logger.warn(makeBucketError);
logger.info('This was probably called in an asynchronous batch upload.');
}
else {
throw makeBucketError;
}
}
}
}
catch (error) {
logger.error(error);
throw error;
}
}
export async function uploadS3File(bucket, key, content, size) {
try {
await ensureBucket(bucket);
await s3Client.putObject(bucket, key, content, size);
}
catch (error) {
logger.error(error);
throw error;
}
}
export async function uploadS3FileFromPath(bucket, key, path) {
try {
await ensureBucket(bucket);
await s3Client.fPutObject(bucket, key, path);
}
catch (error) {
logger.error(error);
throw error;
}
}
export async function getS3File(bucket, key) {
try {
return await s3Client.getObject(bucket, key);
}
catch (error) {
logger.error(error);
// @ts-expect-error 2322 null is not assignable to type (strictNullChecks) - Severe
return null;
}
}
export async function getS3FileBuffer(bucket, key) {
try {
const stream = await getS3File(bucket, key);
// @ts-expect-error 2322 null is not assignable to type (strictNullChecks) - Severe
return stream ? streamToBuffer(stream) : null;
}
catch (error) {
logger.error(error);
// @ts-expect-error 2322 null is not assignable to type (strictNullChecks) - Severe
return null;
}
}
export async function getS3FileStats(bucket, key) {
try {
return await s3Client.statObject(bucket, key);
}
catch (error) {
logger.error(error);
throw error;
}
}
export async function deleteS3File(bucket, key) {
try {
await s3Client.removeObject(bucket, key);
}
catch (error) {
logger.error(error);
throw error;
}
}
export async function deleteS3Files(bucket, keys) {
try {
await s3Client.removeObjects(bucket, keys);
}
catch (error) {
logger.error(error);
throw error;
}
}
export async function clearAllS3Buckets() {
try {
const buckets = await s3Client.listBuckets();
for (const bucket of buckets) {
const objectsStream = s3Client.listObjectsV2(bucket.name, '', true);
const objects = [];
for await (const o of objectsStream) {
objects.push(o.name);
}
await s3Client.removeObjects(bucket.name, objects);
await s3Client.removeBucket(bucket.name);
}
}
catch (error) {
logger.error(error);
throw error;
}
}
//# sourceMappingURL=s3.js.map