@jackdbd/r2-media-store
Version:
Store Micropub media in a Cloudflare R2 bucket.
43 lines • 2.07 kB
JavaScript
import { PutObjectCommand } from '@aws-sdk/client-s3';
import mime from 'mime';
import { nanoid } from 'nanoid';
import { defaultLog } from './log.js';
const defaults = {
log: defaultLog
};
export const defUpload = (options) => {
const config = Object.assign({}, defaults, options);
const { bucket_name, bucket_prefix, ignore_filename, log, public_base_url, s3 } = config;
const upload = async (cfg) => {
const { body: Body, contentType: ContentType } = cfg;
// TODO: extract this to a separate function, so it can be easily tested
const filename = ignore_filename
? `${nanoid()}.${mime.getExtension(ContentType)}`
: cfg.filename;
const bucket_path = `${bucket_prefix}${filename}`;
const public_url = `${public_base_url}${bucket_prefix}${filename}`;
const params = {
Bucket: bucket_name,
Key: bucket_path,
Body,
ContentType
};
log.debug(`uploading ${filename} (ContentType: ${ContentType}) to bucket ${bucket_name} at ${bucket_path}`);
// TODO: how do we know if the operation succeeded? From output.$metadata?
const output = await s3.send(new PutObjectCommand(params));
console.log('=== s3.send PutObjectCommand return value ===', output);
const { ETag: etag, VersionId: version_id, $metadata: meta } = output;
console.log('=== s3.send output metadata ===', meta);
// const status_code = meta.httpStatusCode || 200;
// const status_text = status_code === 201 ? "Created" : "Success";
const summary = `File ${filename} is now hosted at ${public_url}.`;
const details = [
`File ${ContentType} uploaded to Cloudflare R2 bucket ${bucket_name} at ${bucket_path} and publicly available at ${public_url} (ETag: ${etag}, Version ID: ${version_id})`
];
log.debug(summary);
details.forEach(log.debug);
return { url: public_url, summary, details };
};
return upload;
};
//# sourceMappingURL=upload.js.map