Skip to content

Commit 741bb99

Browse files
authored
fix(s3-request-presigner): not to throw when get signed urls concurrently (#1884)
1 parent 22a11a7 commit 741bb99

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

Diff for: packages/s3-request-presigner/src/getSignedUrl.spec.ts

+12
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,16 @@ describe("getSignedUrl", () => {
9999
expect(mockPresign).toBeCalled();
100100
expect(mockPresign.mock.calls[0][1]).toMatchObject(options);
101101
});
102+
103+
it("should not throw if it's called concurrently", async () => {
104+
const mockPresigned = "a presigned url";
105+
mockPresign.mockReturnValue(mockPresigned);
106+
const client = new S3Client(clientParams);
107+
const command = new GetObjectCommand({
108+
Bucket: "Bucket",
109+
Key: "Key",
110+
});
111+
const commands = [command, command];
112+
return expect(Promise.all(commands.map((command) => getSignedUrl(client, command)))).resolves.toBeInstanceOf(Array);
113+
});
102114
});

Diff for: packages/s3-request-presigner/src/getSignedUrl.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,28 @@ export const getSignedUrl = async <
4040
},
4141
} as any;
4242
};
43-
client.middlewareStack.addRelativeTo(presignInterceptMiddleware, {
44-
name: "presignInterceptMiddleware",
45-
relation: "before",
46-
toMiddleware: "awsAuthMiddleware",
47-
});
43+
const middlewareName = "presignInterceptMiddleware";
44+
try {
45+
client.middlewareStack.addRelativeTo(presignInterceptMiddleware, {
46+
name: middlewareName,
47+
relation: "before",
48+
toMiddleware: "awsAuthMiddleware",
49+
});
50+
} catch (e) {
51+
if (e.message!.includes(`Duplicated middleware name '${middlewareName}'`)) {
52+
// Swallow if the interceptor is already added. See https://github.com/aws/aws-sdk-js-v3/issues/1857
53+
} else {
54+
throw e;
55+
}
56+
}
4857

4958
let presigned: HttpRequest;
5059
try {
5160
const output = await client.send(command);
5261
//@ts-ignore the output is faked, so it's not actually OutputType
5362
presigned = output.presigned;
5463
} finally {
55-
client.middlewareStack.remove("presignInterceptMiddleware");
64+
client.middlewareStack.remove(middlewareName);
5665
}
5766

5867
return formatUrl(presigned);

0 commit comments

Comments
 (0)