94 lines
2.0 KiB
JavaScript

import {
S3Client,
GetObjectCommand,
DeleteObjectCommand,
ListObjectsV2Command,
HeadObjectCommand,
} from "@aws-sdk/client-s3";
// S3 configuration
const S3_ENDPOINT = process.env.S3_ENDPOINT || "http://localhost:9000";
const S3_ACCESS_KEY = process.env.S3_ACCESS_KEY || "minioadmin";
const S3_SECRET_KEY = process.env.S3_SECRET_KEY || "minioadmin";
const AWS_REGION = process.env.AWS_REGION || "us-east-1";
const S3_BUCKET = process.env.S3_BUCKET || "openvidu-appdata";
export class S3Service {
static instance;
constructor() {
if (S3Service.instance) {
return S3Service.instance;
}
this.s3Client = new S3Client({
endpoint: S3_ENDPOINT,
credentials: {
accessKeyId: S3_ACCESS_KEY,
secretAccessKey: S3_SECRET_KEY,
},
region: AWS_REGION,
forcePathStyle: true,
});
S3Service.instance = this;
return this;
}
async exists(key) {
try {
await this.headObject(key);
return true;
} catch (error) {
return false;
}
}
async headObject(key) {
const params = {
Bucket: S3_BUCKET,
Key: key,
};
const command = new HeadObjectCommand(params);
return this.run(command);
}
async getObjectSize(key) {
const { ContentLength: size } = await this.headObject(key);
return size;
}
async getObject(key, range) {
const params = {
Bucket: S3_BUCKET,
Key: key,
Range: range ? `bytes=${range.start}-${range.end}` : undefined,
};
const command = new GetObjectCommand(params);
const { Body: body } = await this.run(command);
return body;
}
async listObjects(prefix) {
const params = {
Bucket: S3_BUCKET,
Prefix: prefix,
};
const command = new ListObjectsV2Command(params);
return await this.run(command);
}
async deleteObject(key) {
const params = {
Bucket: S3_BUCKET,
Key: key,
};
const command = new DeleteObjectCommand(params);
return this.run(command);
}
async run(command) {
return this.s3Client.send(command);
}
}