@grucloud/core
Version:
GruCloud core, generate infrastructure code
85 lines (79 loc) • 2.43 kB
JavaScript
const assert = require("assert");
const { pipe, tap, map, tryCatch, gt, assign, get } = require("rubico");
const { when, size, defaultsDeep } = require("rubico/x");
const Path = require("path");
const fs = require("fs").promises;
const mime = require("mime-types");
const { walkDir } = require("./walkDir");
const { PutObjectCommand, S3Client } = require("@aws-sdk/client-s3");
const createS3Client = (env) =>
pipe([
tap((params) => {
assert(env);
}),
() => ({ region: env.S3_AWS_REGION }),
when(
() => env.S3_AWSAccessKeyId,
defaultsDeep({
credentials: {
accessKeyId: env.S3_AWSAccessKeyId,
secretAccessKey: env.S3_AWSSecretKey,
},
})
),
(params) => new S3Client(params),
])();
const logger = require("../logger")({ prefix: "uploadDirToS3" });
const uploadFileToS3 =
({ s3Bucket, s3Key, s3LocalDir }) =>
(filename) =>
tryCatch(
pipe([
tap((params) => {
assert(s3Bucket);
assert(s3LocalDir);
assert(s3Key);
}),
() => Path.resolve(s3LocalDir, filename),
(path) => fs.readFile(path),
(Body) => ({
Body,
Bucket: s3Bucket,
Key: Path.join(s3Key, filename),
}),
assign({ ContentType: () => mime.lookup(filename) || "text/plain" }),
tap(({ Key, ContentType }) => {
logger.debug(`uploadFileToS3 ${s3Bucket} ${Key}, ${ContentType}`);
}),
(input) => new PutObjectCommand(input),
(command) => createS3Client(process.env).send(command),
]),
(error) => {
logger.error(`uploadFileToS3 ${error}`);
return { error };
}
)();
exports.uploadDirToS3 = ({ s3Bucket, s3Key, s3LocalDir = "artifacts" }) =>
when(
() => s3Bucket && s3Key,
pipe([
tap(() => {
logger.debug(`uploadDirToS3 ${s3Bucket} ${s3Key}, from ${s3LocalDir}`);
assert(s3Bucket);
assert(s3Key);
}),
() => "",
walkDir({ baseDir: s3LocalDir }),
tap((files) => {
assert(files);
logger.debug(`uploadDirToS3 #files ${files.length}`);
}),
tap.if(gt(size, 10), () => {
throw Error("Trying to upload too many files");
}),
map.pool(10, uploadFileToS3({ s3LocalDir, s3Bucket, s3Key })),
tap((params) => {
logger.debug(`uploadDirToS3 done`);
}),
])
)();