-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimplified.ts
87 lines (78 loc) · 2.8 KB
/
simplified.ts
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
import { createReadStream } from "fs";
import { readFile } from "fs/promises";
import {
ChecksumAlgorithm,
CompletedPart,
CompleteMultipartUploadCommand,
CreateMultipartUploadCommand,
S3Client,
UploadPartCommand,
} from "@aws-sdk/client-s3";
import { randomUUID } from "crypto";
import { generateChecksum } from "./generate-checksum";
let partNumber = 1;
const bucket = "test";
const key = randomUUID();
const fileName = "upload-me.mp4";
const checksumAlgorithm = ChecksumAlgorithm.SHA256;
const client = new S3Client({
region: "eu",
credentials: { accessKeyId: "adminadmin", secretAccessKey: "adminadmin" },
endpoint: "http://localhost:9000",
forcePathStyle: true,
});
const parts: CompletedPart[] = [];
(async () => {
const bufferSizeInByte = 5 * 1024 * 1024; // 5MB (AWS minimum part size)
const stream = createReadStream(fileName, {
highWaterMark: bufferSizeInByte,
});
const fileContent = await readFile(fileName);
const checksum = generateChecksum(fileContent, checksumAlgorithm);
const createMultiPartUploadCommand = new CreateMultipartUploadCommand({
Bucket: bucket,
Key: key,
ChecksumAlgorithm: checksumAlgorithm,
// ChecksumType: "FULL_OBJECT", Does not change anything if I choose FULL_OBJECT or COMPOSITE!
ContentType: "video/mp4",
ContentDisposition: `attachment; filename="${fileName}"`,
});
const createMultiPartUploadResponse = await client.send(
createMultiPartUploadCommand
);
if (!createMultiPartUploadResponse.UploadId) {
throw "UploadId is missing";
}
const uploadId = createMultiPartUploadResponse.UploadId;
for await (const chunk of stream) {
// You can optionally compute the checksum in your code making sure that if something was altered in between AWS will fail that chunk upload.
// const chunkChecksum = generateChecksum(chunk, checksumAlgorithm);
const uploadPartCommand = new UploadPartCommand({
Bucket: bucket,
Key: key,
UploadId: uploadId,
ChecksumAlgorithm: checksumAlgorithm,
PartNumber: partNumber,
Body: chunk,
// ChecksumSHA256: chunkChecksum,
});
const response = await client.send(uploadPartCommand);
parts.push({
PartNumber: partNumber++,
ETag: response.ETag,
ChecksumSHA256: response.ChecksumSHA256,
});
}
const command = new CompleteMultipartUploadCommand({
Bucket: bucket,
Key: key,
UploadId: uploadId,
MultipartUpload: { Parts: parts },
// ChecksumType: "FULL_OBJECT", if I uncomment these two AWS S3 will throw an error at me!
// ChecksumCRC32: checksum, if I uncomment these two AWS S3 will throw an error at me!
});
const response = await client.send(command);
console.log("Parts: ", parts);
console.log("AWS ChecksumSHA256: " + response.ChecksumSHA256);
console.log("My checksum: " + checksum);
})();