-
Notifications
You must be signed in to change notification settings - Fork 0
/
s3.js
107 lines (97 loc) · 2.77 KB
/
s3.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Core
import path from 'node:path';
import os from 'node:os';
// Packages
import {
S3,
PutObjectCommand,
GetObjectCommand,
DeleteObjectCommand,
ListObjectsCommand,
} from '@aws-sdk/client-s3';
import mime from 'mime-types';
import dotenv from 'dotenv-safe';
// Inject .env variables from config file
dotenv.config();
// Constants
export const DEFAULT_KEY = 'index.html';
// Initialize S3
const s3Client = new S3();
/**
* Gets S3 object with key name from bucket. Note that with the new SDK,
* getObjectCommand returns an instance of IncomingMessage while we need a
* Buffer. This is mitigated by transforming the Readable stream
* (=IncomingMessage) into a Buffer.
*
* @see https://transang.me/modern-fetch-and-how-to-get-buffer-output-from-aws-sdk-v3-getobjectcommand/
* @param {String} key
* @param {String} bucket
* @return {Promise<Buffer>}
*/
export async function getFile(key = DEFAULT_KEY, bucket = process.env.AWS_BUCKET_DEFAULT) {
const response = await s3Client.send(new GetObjectCommand({
Bucket: bucket,
Key: key,
}));
const stream = response.Body;
return new Promise((resolve, reject) => {
const chunks = [];
stream.on('data', chunk => chunks.push(chunk));
stream.once('end', () => resolve(Buffer.concat(chunks)));
stream.once('error', reject);
});
}
/**
* Convenience wrapper for putFile for non-binaries
*/
export function putTextFile(body, key = DEFAULT_KEY, bucket = process.env.AWS_BUCKET_DEFAULT) {
return putFile(body, key, bucket, false);
}
/**
* Convenience wrapper for putFile for binaries
*/
export function putBinaryFile(body, key, bucket = process.env.AWS_BUCKET_DEFAULT) {
return putFile(body, key, bucket, true);
}
/**
* Puts an S3 object with key name into bucket, using body as the key’s contents
*
* @param {String} body
* @param {String} key
* @param {String} bucket
* @return {Promise}
*/
function putFile(body, key, bucket, isBinary) {
const options = {
Bucket: bucket,
Key: key,
ContentType: mime.contentType(key) || 'application/octet-stream',
Body: body,
ContentEncoding: isBinary ? undefined : 'gzip',
}
return s3Client.send(new PutObjectCommand(options))
}
/**
* Deletes an object from S3 storage
*
* @param {String} key
* @param {String} bucket
* @return {Promise}
*/
export function destroyFile(key, bucket = process.env.AWS_BUCKET_DEFAULT) {
return s3Client.send(new DeleteObjectCommand({
Bucket: bucket,
Key: key,
}));
}
/**
* Gets list of objects from a bucket
*
* @param {String} bucket
* @return {Promise}
*/
export function getFilesList(bucket = process.env.AWS_BUCKET_DEFAULT) {
return s3Client.send(new ListObjectsCommand({
Bucket: bucket
}));
}