Skip to content

Commit 99ee749

Browse files
committed
feat(xhr-http-handler): add support for per-request/per-operation timeouts
1 parent 14bb646 commit 99ee749

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

packages/xhr-http-handler/src/xhr-http-handler.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,37 @@ describe(XhrHttpHandler.name, () => {
244244
["getAllResponseHeaders"],
245245
]);
246246
});
247+
248+
describe("per-request requestTimeout", () => {
249+
it("should use per-request timeout over handler config timeout", () => {
250+
const handler1 = new XhrHttpHandler({ requestTimeout: 5000 });
251+
const handler2 = new XhrHttpHandler({ requestTimeout: 200 });
252+
253+
const testTimeout = (handlerTimeout: number, requestTimeout?: number) => {
254+
const expectedTimeout = Number(requestTimeout ?? handlerTimeout) | 0;
255+
return expectedTimeout;
256+
};
257+
258+
// per-request timeout takes precedence
259+
expect(testTimeout(5000, 100)).toBe(100);
260+
261+
// fallback to handler config timeout
262+
expect(testTimeout(200, undefined)).toBe(200);
263+
expect(testTimeout(200)).toBe(200);
264+
});
265+
266+
it("should pass correct timeout values to internal functions", async () => {
267+
const handler = new XhrHttpHandler({ requestTimeout: 5000 });
268+
(handler as any).config = { requestTimeout: 5000 };
269+
270+
const options1 = { requestTimeout: 100 };
271+
const options2: { requestTimeout?: number } = {};
272+
273+
const effectiveTimeout1 = Number(options1.requestTimeout ?? (handler as any).config.requestTimeout) | 0;
274+
const effectiveTimeout2 = Number(options2.requestTimeout ?? (handler as any).config.requestTimeout) | 0;
275+
276+
expect(effectiveTimeout1).toBe(100); // per-request timeout used
277+
expect(effectiveTimeout2).toBe(5000); // handler config timeout used
278+
});
279+
});
247280
});

packages/xhr-http-handler/src/xhr-http-handler.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { buildQueryString } from "@smithy/querystring-builder";
33
import { HttpHandlerOptions, Provider } from "@smithy/types";
44
import { EventEmitter } from "events";
55

6-
import { requestTimeout } from "./request-timeout";
6+
import { requestTimeout as requestTimeoutFn } from "./request-timeout";
77

88
/**
99
* Represents the http options that can be passed to the xhr http client.
@@ -114,12 +114,12 @@ export class XhrHttpHandler extends EventEmitter implements HttpHandler<XhrHttpH
114114

115115
public async handle(
116116
request: HttpRequest,
117-
{ abortSignal }: HttpHandlerOptions = {}
117+
{ abortSignal, requestTimeout }: HttpHandlerOptions = {}
118118
): Promise<{ response: HttpResponse }> {
119119
if (!this.config) {
120120
this.config = await this.configProvider;
121121
}
122-
const requestTimeoutInMs = Number(this.config!.requestTimeout) | 0;
122+
const requestTimeoutInMs = Number(requestTimeout ?? this.config!.requestTimeout) | 0;
123123

124124
// if the request was already aborted, prevent doing extra work
125125
if (abortSignal?.aborted) {
@@ -214,7 +214,7 @@ export class XhrHttpHandler extends EventEmitter implements HttpHandler<XhrHttpH
214214
this.emit(EVENTS.BEFORE_XHR_SEND, xhr);
215215
xhr.send(body);
216216
}),
217-
requestTimeout(requestTimeoutInMs),
217+
requestTimeoutFn(requestTimeoutInMs),
218218
];
219219
let removeSignalEventListener = () => {};
220220
if (abortSignal) {

0 commit comments

Comments
 (0)