Skip to content

Commit 44f78bd

Browse files
kuhetrivikr
andauthored
fix: warn streaming requests are not retryable (#1092)
* fix: warn streaming requests are not retryable * format packages/middleware-retry/src/isStreamingPayload/isStreamingPayload.browser.ts Co-authored-by: Trivikram Kamat <[email protected]> * format packages/middleware-retry/src/isStreamingPayload/isStreamingPayload.ts Co-authored-by: Trivikram Kamat <[email protected]> * formatting --------- Co-authored-by: Trivikram Kamat <[email protected]>
1 parent 340634a commit 44f78bd

File tree

7 files changed

+44
-3
lines changed

7 files changed

+44
-3
lines changed

.changeset/selfish-ants-care.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smithy/middleware-retry": patch
3+
---
4+
5+
prevent retries of streaming requests

packages/middleware-retry/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
"main": "./dist-cjs/index.js",
1919
"module": "./dist-es/index.js",
2020
"types": "./dist-types/index.d.ts",
21+
"browser": {
22+
"./dist-es/isStreamingPayload/isStreamingPayload": "./dist-es/isStreamingPayload/isStreamingPayload.browser"
23+
},
24+
"react-native": {
25+
"./dist-cjs/isStreamingPayload/isStreamingPayload": "./dist-cjs/isStreamingPayload/isStreamingPayload.browser",
26+
"./dist-es/isStreamingPayload/isStreamingPayload": "./dist-es/isStreamingPayload/isStreamingPayload.browser"
27+
},
2128
"author": {
2229
"name": "AWS SDK for JavaScript Team",
2330
"url": "https://aws.amazon.com/javascript/"
@@ -27,6 +34,7 @@
2734
"@smithy/node-config-provider": "workspace:^",
2835
"@smithy/protocol-http": "workspace:^",
2936
"@smithy/service-error-classification": "workspace:^",
37+
"@smithy/smithy-client": "workspace:^",
3038
"@smithy/types": "workspace:^",
3139
"@smithy/util-middleware": "workspace:^",
3240
"@smithy/util-retry": "workspace:^",
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { HttpRequest } from "@smithy/protocol-http";
2+
3+
/**
4+
* @internal
5+
*/
6+
export const isStreamingPayload = (request: HttpRequest): boolean => request?.body instanceof ReadableStream;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { HttpRequest } from "@smithy/protocol-http";
2+
import { Readable } from "stream";
3+
4+
/**
5+
* @internal
6+
*/
7+
export const isStreamingPayload = (request: HttpRequest): boolean =>
8+
request?.body instanceof Readable ||
9+
(typeof ReadableStream !== "undefined" && request?.body instanceof ReadableStream);

packages/middleware-retry/src/retryMiddleware.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { HttpRequest, HttpResponse } from "@smithy/protocol-http";
22
import { isServerError, isThrottlingError, isTransientError } from "@smithy/service-error-classification";
3+
import { NoOpLogger } from "@smithy/smithy-client";
34
import {
45
AbsoluteLocation,
56
FinalizeHandler,
@@ -20,6 +21,7 @@ import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "@smithy/util-retry";
2021
import { v4 } from "uuid";
2122

2223
import { RetryResolvedConfig } from "./configurations";
24+
import { isStreamingPayload } from "./isStreamingPayload/isStreamingPayload";
2325
import { asSdkError } from "./util";
2426

2527
export const retryMiddleware = (options: RetryResolvedConfig) => <Output extends MetadataBearer = MetadataBearer>(
@@ -38,12 +40,14 @@ export const retryMiddleware = (options: RetryResolvedConfig) => <Output extends
3840
let attempts = 0;
3941
let totalRetryDelay = 0;
4042
const { request } = args;
41-
if (HttpRequest.isInstance(request)) {
43+
const isRequest = HttpRequest.isInstance(request);
44+
45+
if (isRequest) {
4246
request.headers[INVOCATION_ID_HEADER] = v4();
4347
}
4448
while (true) {
4549
try {
46-
if (HttpRequest.isInstance(request)) {
50+
if (isRequest) {
4751
request.headers[REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`;
4852
}
4953
const { response, output } = await next(args);
@@ -54,6 +58,14 @@ export const retryMiddleware = (options: RetryResolvedConfig) => <Output extends
5458
} catch (e) {
5559
const retryErrorInfo = getRetryErrorInfo(e);
5660
lastError = asSdkError(e);
61+
62+
if (isRequest && isStreamingPayload(request)) {
63+
(context.logger instanceof NoOpLogger ? console : context.logger)?.warn(
64+
"An error was encountered in a non-retryable streaming request."
65+
);
66+
throw lastError;
67+
}
68+
5769
try {
5870
retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo);
5971
} catch (refreshError) {

turbo.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"pipeline": {
55
"build": {
66
"dependsOn": ["^build"],
7-
"inputs": ["src", "package.json"],
7+
"inputs": ["src/**/*", "package.json"],
88
"outputs": ["dist-types", "dist-cjs", "dist-es"]
99
},
1010
"test": {

yarn.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2117,6 +2117,7 @@ __metadata:
21172117
"@smithy/node-config-provider": "workspace:^"
21182118
"@smithy/protocol-http": "workspace:^"
21192119
"@smithy/service-error-classification": "workspace:^"
2120+
"@smithy/smithy-client": "workspace:^"
21202121
"@smithy/types": "workspace:^"
21212122
"@smithy/util-middleware": "workspace:^"
21222123
"@smithy/util-retry": "workspace:^"

0 commit comments

Comments
 (0)