Skip to content

Commit 9f9fe77

Browse files
authored
fix(middleware-flexible-checksum): remove stream collection code (#6846)
1 parent 65c6ae9 commit 9f9fe77

7 files changed

+104
-63
lines changed

packages/middleware-flexible-checksums/package.json

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,20 @@
1010
"build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4",
1111
"clean": "rimraf ./dist-* && rimraf *.tsbuildinfo",
1212
"test": "yarn g:vitest run",
13-
"test:integration": "yarn g:vitest run -c vitest.config.integ.ts",
1413
"test:watch": "yarn g:vitest watch",
15-
"test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.ts"
14+
"test:integration": "yarn g:vitest run -c vitest.config.integ.ts",
15+
"test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.ts",
16+
"test:e2e": "yarn g:vitest run -c vitest.config.e2e.ts",
17+
"test:e2e:watch": "yarn g:vitest watch -c vitest.config.e2e.ts"
1618
},
1719
"main": "./dist-cjs/index.js",
1820
"module": "./dist-es/index.js",
1921
"browser": {
20-
"./dist-es/getCrc32ChecksumAlgorithmFunction": "./dist-es/getCrc32ChecksumAlgorithmFunction.browser",
21-
"./dist-es/streams/create-read-stream-on-buffer": "./dist-es/streams/create-read-stream-on-buffer.browser"
22+
"./dist-es/getCrc32ChecksumAlgorithmFunction": "./dist-es/getCrc32ChecksumAlgorithmFunction.browser"
2223
},
2324
"react-native": {
2425
"./dist-es/getCrc32ChecksumAlgorithmFunction": "./dist-es/getCrc32ChecksumAlgorithmFunction.browser",
25-
"./dist-es/streams/create-read-stream-on-buffer": "./dist-es/streams/create-read-stream-on-buffer.browser",
26-
"./dist-cjs/getCrc32ChecksumAlgorithmFunction": "./dist-cjs/getCrc32ChecksumAlgorithmFunction.browser",
27-
"./dist-cjs/streams/create-read-stream-on-buffer": "./dist-cjs/streams/create-read-stream-on-buffer.browser"
26+
"./dist-cjs/getCrc32ChecksumAlgorithmFunction": "./dist-cjs/getCrc32ChecksumAlgorithmFunction.browser"
2827
},
2928
"types": "./dist-types/index.d.ts",
3029
"author": {

packages/middleware-flexible-checksums/src/flexibleChecksumsResponseMiddleware.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import { ChecksumAlgorithm } from "./constants";
1414
import { getChecksumAlgorithmListForResponse } from "./getChecksumAlgorithmListForResponse";
1515
import { getChecksumLocationName } from "./getChecksumLocationName";
1616
import { isChecksumWithPartNumber } from "./isChecksumWithPartNumber";
17-
import { isStreaming } from "./isStreaming";
18-
import { createReadStreamOnBuffer } from "./streams/create-read-stream-on-buffer";
1917
import { validateChecksumFromResponse } from "./validateChecksumFromResponse";
2018

2119
export interface FlexibleChecksumsResponseMiddlewareConfig {
@@ -66,7 +64,6 @@ export const flexibleChecksumsResponseMiddleware =
6664
const result = await next(args);
6765

6866
const response = result.response as HttpResponse;
69-
let collectedStream: Uint8Array | undefined = undefined;
7067

7168
const { requestValidationModeMember, responseAlgorithms } = middlewareConfig;
7269
// @ts-ignore Element implicitly has an 'any' type for input[requestValidationModeMember]
@@ -84,22 +81,11 @@ export const flexibleChecksumsResponseMiddleware =
8481
return result;
8582
}
8683

87-
const isStreamingBody = isStreaming(response.body);
88-
89-
if (isStreamingBody) {
90-
collectedStream = await config.streamCollector(response.body);
91-
response.body = createReadStreamOnBuffer(collectedStream);
92-
}
93-
94-
await validateChecksumFromResponse(result.response as HttpResponse, {
84+
await validateChecksumFromResponse(response as HttpResponse, {
9585
config,
9686
responseAlgorithms,
9787
logger: context.logger,
9888
});
99-
100-
if (isStreamingBody && collectedStream) {
101-
response.body = createReadStreamOnBuffer(collectedStream);
102-
}
10389
}
10490

10591
return result;
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import { S3 } from "@aws-sdk/client-s3";
2+
import type { HttpRequest, HttpResponse } from "@smithy/types";
3+
import { headStream } from "@smithy/util-stream";
4+
import { Readable } from "node:stream";
5+
import { beforeAll, describe, expect, test as it } from "vitest";
6+
7+
import { getIntegTestResources } from "../../../tests/e2e/get-integ-test-resources";
8+
9+
describe("S3 checksums", () => {
10+
let s3: S3;
11+
let s3_noChecksum: S3;
12+
let Bucket: string;
13+
let Key: string;
14+
let region: string;
15+
const expected = new Uint8Array([97, 98, 99, 100]);
16+
17+
beforeAll(async () => {
18+
const integTestResourcesEnv = await getIntegTestResources();
19+
Object.assign(process.env, integTestResourcesEnv);
20+
21+
region = process?.env?.AWS_SMOKE_TEST_REGION as string;
22+
Bucket = process?.env?.AWS_SMOKE_TEST_BUCKET as string;
23+
24+
s3 = new S3({ region });
25+
s3_noChecksum = new S3({
26+
region,
27+
requestChecksumCalculation: "WHEN_REQUIRED",
28+
responseChecksumValidation: "WHEN_REQUIRED",
29+
});
30+
Key = "middleware-flexible-checksum.txt";
31+
32+
s3.middlewareStack.add(
33+
(next) => async (args) => {
34+
const r = await next(args);
35+
const reqHeader = (args.request as HttpRequest).headers["x-amz-sdk-checksum-algorithm"];
36+
const resHeader = (r.response as HttpResponse).headers["x-amz-checksum-crc32"];
37+
if (reqHeader) {
38+
expect(reqHeader).toEqual("CRC32");
39+
}
40+
if (resHeader) {
41+
expect(resHeader).toEqual("7YLNEQ==");
42+
}
43+
return r;
44+
},
45+
{
46+
step: "build",
47+
override: true,
48+
name: "assert",
49+
}
50+
);
51+
52+
await s3.putObject({ Bucket, Key, Body: "abcd" });
53+
});
54+
55+
it("an object should have checksum by default", async () => {
56+
await s3.getObject({ Bucket, Key });
57+
});
58+
59+
describe("the stream returned by S3::getObject should function interchangeably between ChecksumStream and default streams", () => {
60+
it("when collecting the stream", async () => {
61+
const defaultStream = (await s3_noChecksum.getObject({ Bucket, Key })).Body as Readable;
62+
const checksumStream = (await s3.getObject({ Bucket, Key })).Body as Readable;
63+
64+
expect(defaultStream.constructor.name).not.toEqual("ChecksumStream");
65+
expect(checksumStream.constructor.name).toEqual("ChecksumStream");
66+
67+
const defaultStreamContents = await headStream(defaultStream, Infinity);
68+
const checksumStreamContents = await headStream(checksumStream, Infinity);
69+
70+
expect(defaultStreamContents).toEqual(expected);
71+
expect(defaultStream.closed).toBe(true);
72+
expect(checksumStreamContents).toEqual(expected);
73+
expect(checksumStream.closed).toBe(true);
74+
});
75+
76+
it("when piping the stream to web stream api", async () => {
77+
const defaultStream = Readable.toWeb((await s3_noChecksum.getObject({ Bucket, Key })).Body as Readable);
78+
const checksumStream = Readable.toWeb((await s3.getObject({ Bucket, Key })).Body as Readable);
79+
80+
const defaultStreamContents = await headStream(defaultStream as ReadableStream<any>, Infinity);
81+
const checksumStreamContents = await headStream(checksumStream as ReadableStream<any>, Infinity);
82+
83+
expect(defaultStreamContents).toEqual(expected);
84+
await expect(defaultStream.getReader().closed).resolves.toBe(undefined);
85+
expect(checksumStreamContents).toEqual(expected);
86+
await expect(checksumStream.getReader().closed).resolves.toBe(undefined);
87+
});
88+
});
89+
});

packages/middleware-flexible-checksums/src/streams/create-read-stream-on-buffer.browser.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/middleware-flexible-checksums/src/streams/create-read-stream-on-buffer.spec.ts

Lines changed: 0 additions & 24 deletions
This file was deleted.

packages/middleware-flexible-checksums/src/streams/create-read-stream-on-buffer.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from "vitest/config";
2+
3+
export default defineConfig({
4+
test: {
5+
include: ["**/*.e2e.spec.ts"],
6+
environment: "node",
7+
},
8+
});

0 commit comments

Comments
 (0)