import * as AWS from "aws-sdk"; import * as path from "path"; import { IS3UploadOptions, IUploadResult, IUploader } from "../interfaces/uploader"; import { mimeTypes } from "./mimeTypes"; const s3 = new AWS.S3(); export class S3Uploader implements IUploader { private bucket: string = "static-asset"; private acl: string = "public-read"; private cacheControl: string = "public, max-age=0, s-maxage=86400"; public async upload(options: IS3UploadOptions) { const ext = this.extension(options.key); return new Promise((resolve, reject) => { s3.putObject({ Bucket: options.bucket || this.bucket, Key: options.key, ACL: options.acl || this.acl, Body: options.body, ContentType: mimeTypes[ext], CacheControl: options.cacheControl || this.cacheControl, }, (err, result) => { if (err) { return reject(err); } return resolve({ key: options.key, etag: result.ETag, }); }); }); } public extension(key) { return path.extname(key).replace(/^./, ""); } }