78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
import {
|
|
PutObjectCommand,
|
|
S3Client,
|
|
S3ServiceException
|
|
} from "@aws-sdk/client-s3"; // @see https://www.backblaze.com/docs/cloud-storage-use-the-aws-sdk-for-javascript-v3-with-backblaze-b2
|
|
import { readFile } from 'fs/promises';
|
|
import { env } from '../config/env' // adjust this path based on your project structure
|
|
import logger from "./logger";
|
|
import { getNanoSpawn } from "./nanoSpawn";
|
|
|
|
let client: S3Client | null = null
|
|
|
|
|
|
export async function uploadFile(
|
|
s3Client: S3Client,
|
|
bucket: string,
|
|
key: string,
|
|
filePath: string,
|
|
mimetype: string
|
|
): Promise<string> {
|
|
if (!s3Client) throw new Error('uploadFile requires s3Client as first param');
|
|
if (!bucket) throw new Error('uploadFile requires bucket as second param');
|
|
if (!key) throw new Error('uploadFile requires key as third param');
|
|
if (!filePath) throw new Error('uploadFile requires filePath as fourth param');
|
|
if (!mimetype) throw new Error('uploadFile requires mimetype as fifth param');
|
|
logger.debug(`[uploadFile] filePath=${filePath} with key=${key} bucket=${bucket}`);
|
|
|
|
const spawn = await getNanoSpawn();
|
|
await spawn('b2', ['file', 'upload', bucket, filePath, key])
|
|
|
|
return key
|
|
|
|
// try {
|
|
// // Read file content from disk
|
|
// const fileBuffer = await readFile(filePath);
|
|
|
|
// // Upload to S3
|
|
// await s3Client.send(
|
|
// new PutObjectCommand({
|
|
// Bucket: bucket,
|
|
// Key: key,
|
|
// Body: fileBuffer,
|
|
// ContentType: mimetype, // or determine dynamically if needed
|
|
// }),
|
|
// );
|
|
|
|
// return key;
|
|
|
|
// } catch (caught) {
|
|
// if (caught instanceof S3ServiceException) {
|
|
// logger.error(
|
|
// `Error from S3 while uploading to ${bucket}. ${caught.name}: ${caught.message}`,
|
|
// );
|
|
// } else {
|
|
// logger.error(`Unexpected error during upload:`, caught);
|
|
// }
|
|
|
|
// throw new Error(`Failed to upload ${filePath} to s3://${bucket}/${key}`);
|
|
// }
|
|
}
|
|
|
|
|
|
export function getS3Client(): S3Client {
|
|
if (!client) {
|
|
client = new S3Client({
|
|
region: env.S3_REGION,
|
|
endpoint: env.S3_ENDPOINT,
|
|
credentials: {
|
|
accessKeyId: env.S3_KEY_ID,
|
|
secretAccessKey: env.S3_APPLICATION_KEY,
|
|
},
|
|
forcePathStyle: env.S3_FORCE_PATH_STYLE,
|
|
})
|
|
}
|
|
|
|
return client
|
|
}
|