mirror of
https://github.com/jambonz/jambonz-api-server.git
synced 2026-01-25 02:08:24 +00:00
* compatible credential test * support s3 compatible storages * fix typo * change logging * add missing option
135 lines
3.7 KiB
JavaScript
135 lines
3.7 KiB
JavaScript
const { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3');
|
|
const {Storage} = require('@google-cloud/storage');
|
|
const fs = require('fs');
|
|
const { BlobServiceClient } = require('@azure/storage-blob');
|
|
|
|
// Azure
|
|
|
|
async function testAzureStorage(logger, opts) {
|
|
const blobServiceClient = BlobServiceClient.fromConnectionString(opts.connection_string);
|
|
const containerClient = blobServiceClient.getContainerClient(opts.name);
|
|
const blockBlobClient = containerClient.getBlockBlobClient('jambonz-sample.text');
|
|
|
|
await blockBlobClient.uploadFile(`${__dirname}/jambonz-sample.text`);
|
|
}
|
|
|
|
async function getAzureStorageObject(logger, opts) {
|
|
const blobServiceClient = BlobServiceClient.fromConnectionString(opts.connection_string);
|
|
const containerClient = blobServiceClient.getContainerClient(opts.name);
|
|
const blockBlobClient = containerClient.getBlockBlobClient(opts.key);
|
|
const response = await blockBlobClient.download(0);
|
|
return response.readableStreamBody;
|
|
}
|
|
|
|
async function deleteAzureStorageObject(logger, opts) {
|
|
const blobServiceClient = BlobServiceClient.fromConnectionString(opts.connection_string);
|
|
const containerClient = blobServiceClient.getContainerClient(opts.name);
|
|
const blockBlobClient = containerClient.getBlockBlobClient(opts.key);
|
|
await blockBlobClient.delete();
|
|
}
|
|
|
|
// Google
|
|
|
|
function _initGoogleClient(opts) {
|
|
const serviceKey = JSON.parse(opts.service_key);
|
|
return new Storage({
|
|
projectId: serviceKey.project_id,
|
|
credentials: {
|
|
client_email: serviceKey.client_email,
|
|
private_key: serviceKey.private_key
|
|
},
|
|
});
|
|
}
|
|
|
|
async function testGoogleStorage(logger, opts) {
|
|
return new Promise((resolve, reject) => {
|
|
const storage = _initGoogleClient(opts);
|
|
|
|
const blob = storage.bucket(opts.name).file('jambonz-sample.text');
|
|
|
|
fs.createReadStream(`${__dirname}/jambonz-sample.text`)
|
|
.pipe(blob.createWriteStream())
|
|
.on('error', (err) => reject(err))
|
|
.on('finish', () => resolve());
|
|
});
|
|
}
|
|
|
|
async function getGoogleStorageObject(logger, opts) {
|
|
const storage = _initGoogleClient(opts);
|
|
|
|
const bucket = storage.bucket(opts.name);
|
|
const file = bucket.file(opts.key);
|
|
const [exists] = await file.exists();
|
|
if (exists) {
|
|
return file.createReadStream();
|
|
}
|
|
}
|
|
|
|
async function deleteGoogleStorageObject(logger, opts) {
|
|
const storage = _initGoogleClient(opts);
|
|
|
|
const bucket = storage.bucket(opts.name);
|
|
const file = bucket.file(opts.key);
|
|
|
|
await file.delete();
|
|
}
|
|
|
|
// S3
|
|
|
|
function _initS3Client(opts) {
|
|
return new S3Client({
|
|
credentials: {
|
|
accessKeyId: opts.access_key_id,
|
|
secretAccessKey: opts.secret_access_key,
|
|
},
|
|
region: opts.region || 'us-east-1',
|
|
...(opts.vendor === 's3_compatible' && { endpoint: opts.endpoint, forcePathStyle: true })
|
|
});
|
|
}
|
|
|
|
async function testS3Storage(logger, opts) {
|
|
const s3 = _initS3Client(opts);
|
|
const input = {
|
|
'Body': 'Hello From Jambonz',
|
|
'Bucket': opts.name,
|
|
'Key': 'jambonz-sample.text'
|
|
};
|
|
const command = new PutObjectCommand(input);
|
|
await s3.send(command);
|
|
}
|
|
|
|
async function getS3Object(logger, opts) {
|
|
const s3 = _initS3Client(opts);
|
|
const command = new GetObjectCommand(
|
|
{
|
|
Bucket: opts.name,
|
|
Key: opts.key
|
|
}
|
|
);
|
|
const res = await s3.send(command);
|
|
return res.Body;
|
|
}
|
|
|
|
async function deleteS3Object(logger, opts) {
|
|
const s3 = _initS3Client(opts);
|
|
const command = new DeleteObjectCommand(
|
|
{
|
|
Bucket: opts.name,
|
|
Key: opts.key
|
|
}
|
|
);
|
|
await s3.send(command);
|
|
}
|
|
|
|
module.exports = {
|
|
testS3Storage,
|
|
getS3Object,
|
|
deleteS3Object,
|
|
testGoogleStorage,
|
|
getGoogleStorageObject,
|
|
deleteGoogleStorageObject,
|
|
testAzureStorage,
|
|
getAzureStorageObject,
|
|
deleteAzureStorageObject
|
|
};
|