-
Notifications
You must be signed in to change notification settings - Fork 96
/
Copy pathgetAwsChunkedEncodingStream.browser.ts
40 lines (36 loc) · 1.48 KB
/
getAwsChunkedEncodingStream.browser.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
import { GetAwsChunkedEncodingStream, GetAwsChunkedEncodingStreamOptions } from "@smithy/types";
/**
* @internal
*/
export const getAwsChunkedEncodingStream: GetAwsChunkedEncodingStream<ReadableStream> = (
readableStream: ReadableStream,
options: GetAwsChunkedEncodingStreamOptions
) => {
const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options;
const checksumRequired =
base64Encoder !== undefined &&
bodyLengthChecker !== undefined &&
checksumAlgorithmFn !== undefined &&
checksumLocationName !== undefined &&
streamHasher !== undefined;
const digest = checksumRequired ? streamHasher!(checksumAlgorithmFn!, readableStream) : undefined;
// ToDo: Validate the ReadableStream and getReader() is accessable before calling.
// ReactNative doesn't support ReadableStream. They might not be available in older browsers, or some polyfills.
const reader = readableStream.getReader();
return new ReadableStream({
async pull(controller) {
const { value, done } = await reader.read();
if (done) {
controller.enqueue(`0\r\n`);
if (checksumRequired) {
const checksum = base64Encoder!(await digest!);
controller.enqueue(`${checksumLocationName}:${checksum}\r\n`);
controller.enqueue(`\r\n`);
}
controller.close();
} else {
controller.enqueue(`${(bodyLengthChecker(value) || 0).toString(16)}\r\n${value}\r\n`);
}
},
});
};