@aws-sdk/xhr-http-handler 3.901.0 → 3.910.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist-cjs/index.js +217 -265
  2. package/package.json +6 -6
package/dist-cjs/index.js CHANGED
@@ -1,282 +1,234 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
-
21
- // src/index.ts
22
- var index_exports = {};
23
- __export(index_exports, {
24
- XhrHttpHandler: () => XhrHttpHandler
25
- });
26
- module.exports = __toCommonJS(index_exports);
1
+ 'use strict';
27
2
 
28
- // src/xhr-http-handler.ts
29
- var import_protocol_http = require("@smithy/protocol-http");
30
- var import_querystring_builder = require("@smithy/querystring-builder");
31
- var import_events = require("events");
3
+ var protocolHttp = require('@smithy/protocol-http');
4
+ var querystringBuilder = require('@smithy/querystring-builder');
5
+ var events = require('events');
32
6
 
33
- // src/request-timeout.ts
34
- var requestTimeout = /* @__PURE__ */ __name((timeoutInMs = 0) => new Promise((resolve, reject) => {
35
- if (timeoutInMs) {
36
- setTimeout(() => {
37
- const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`);
38
- timeoutError.name = "TimeoutError";
39
- reject(timeoutError);
40
- }, timeoutInMs);
41
- }
42
- }), "requestTimeout");
7
+ const requestTimeout = (timeoutInMs = 0) => new Promise((resolve, reject) => {
8
+ if (timeoutInMs) {
9
+ setTimeout(() => {
10
+ const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`);
11
+ timeoutError.name = "TimeoutError";
12
+ reject(timeoutError);
13
+ }, timeoutInMs);
14
+ }
15
+ });
43
16
 
44
- // src/xhr-http-handler.ts
45
- var EVENTS = {
46
- get PROGRESS() {
47
- return "xhr.progress";
48
- },
49
- get UPLOAD_PROGRESS() {
50
- return "xhr.upload.progress";
51
- },
52
- get XHR_INSTANTIATED() {
53
- return "after.xhr.new";
54
- },
55
- get BEFORE_XHR_SEND() {
56
- return "before.xhr.send";
57
- }
17
+ const EVENTS = {
18
+ get PROGRESS() {
19
+ return "xhr.progress";
20
+ },
21
+ get UPLOAD_PROGRESS() {
22
+ return "xhr.upload.progress";
23
+ },
24
+ get XHR_INSTANTIATED() {
25
+ return "after.xhr.new";
26
+ },
27
+ get BEFORE_XHR_SEND() {
28
+ return "before.xhr.send";
29
+ },
58
30
  };
59
- var XhrHttpHandler = class _XhrHttpHandler extends import_events.EventEmitter {
60
- static {
61
- __name(this, "XhrHttpHandler");
62
- }
63
- static EVENTS = EVENTS;
64
- static ERROR_IDENTIFIER = "XHR_HTTP_HANDLER_ERROR";
65
- config;
66
- configProvider;
67
- /**
68
- * @returns the input if it is an HttpHandler of any class,
69
- * or instantiates a new instance of this handler.
70
- */
71
- static create(instanceOrOptions) {
72
- if (typeof instanceOrOptions?.handle === "function") {
73
- return instanceOrOptions;
31
+ class XhrHttpHandler extends events.EventEmitter {
32
+ static EVENTS = EVENTS;
33
+ static ERROR_IDENTIFIER = "XHR_HTTP_HANDLER_ERROR";
34
+ config;
35
+ configProvider;
36
+ static create(instanceOrOptions) {
37
+ if (typeof instanceOrOptions?.handle === "function") {
38
+ return instanceOrOptions;
39
+ }
40
+ return new XhrHttpHandler(instanceOrOptions);
74
41
  }
75
- return new _XhrHttpHandler(instanceOrOptions);
76
- }
77
- constructor(options) {
78
- super();
79
- if (typeof options === "function") {
80
- this.configProvider = options();
81
- } else {
82
- this.config = options ?? {};
83
- this.configProvider = Promise.resolve(this.config);
42
+ constructor(options) {
43
+ super();
44
+ if (typeof options === "function") {
45
+ this.configProvider = options();
46
+ }
47
+ else {
48
+ this.config = options ?? {};
49
+ this.configProvider = Promise.resolve(this.config);
50
+ }
84
51
  }
85
- }
86
- updateHttpClientConfig(key, value) {
87
- this.config = void 0;
88
- this.configProvider = this.configProvider.then((config) => {
89
- config[key] = value;
90
- return config;
91
- });
92
- }
93
- httpHandlerConfigs() {
94
- return this.config ?? {};
95
- }
96
- destroy() {
97
- }
98
- async handle(request, { abortSignal, requestTimeout: requestTimeout2 } = {}) {
99
- if (!this.config) {
100
- this.config = await this.configProvider;
52
+ updateHttpClientConfig(key, value) {
53
+ this.config = undefined;
54
+ this.configProvider = this.configProvider.then((config) => {
55
+ config[key] = value;
56
+ return config;
57
+ });
101
58
  }
102
- const requestTimeoutInMs = Number(requestTimeout2 ?? this.config.requestTimeout) | 0;
103
- if (abortSignal?.aborted) {
104
- const abortError = new Error("Request aborted");
105
- abortError.name = "AbortError";
106
- throw abortError;
59
+ httpHandlerConfigs() {
60
+ return this.config ?? {};
107
61
  }
108
- let path = request.path;
109
- if (request.query) {
110
- const queryString = (0, import_querystring_builder.buildQueryString)(request.query);
111
- if (queryString) {
112
- path += `?${queryString}`;
113
- }
62
+ destroy() {
114
63
  }
115
- const { port, method } = request;
116
- const url = `${request.protocol}//${request.hostname}${port ? `:${port}` : ""}${path}`;
117
- const body = method === "GET" || method === "HEAD" ? void 0 : request.body;
118
- const xhr = new XMLHttpRequest();
119
- this.emit(EVENTS.XHR_INSTANTIATED, xhr);
120
- const raceOfPromises = [
121
- new Promise((resolve, reject) => {
122
- let streamCursor = 0;
123
- let stream;
124
- let writer;
125
- xhr.upload.addEventListener("progress", (event) => {
126
- this.emit(_XhrHttpHandler.EVENTS.UPLOAD_PROGRESS, event, request);
127
- });
128
- xhr.addEventListener("progress", (event) => {
129
- this.emit(_XhrHttpHandler.EVENTS.PROGRESS, event, request);
130
- });
131
- xhr.addEventListener("error", (err) => {
132
- const error = new Error(_XhrHttpHandler.ERROR_IDENTIFIER + ": " + err);
133
- reject(error);
134
- });
135
- xhr.addEventListener("timeout", () => {
136
- reject(new Error("XMLHttpRequest timed out."));
137
- });
138
- xhr.addEventListener("readystatechange", () => {
139
- const isArrayBuffer = xhr.responseType === "arraybuffer" && xhr.response;
140
- const isText = !isArrayBuffer && typeof xhr.responseText === "string";
141
- if (isText && !stream) {
142
- ({ stream, writer } = this.initializeTransformStream());
143
- }
144
- switch (xhr.readyState) {
145
- case XMLHttpRequest.LOADING:
146
- if (isText) {
147
- writer.write(streamCursor > 0 ? xhr.responseText.slice(streamCursor) : xhr.responseText);
148
- streamCursor = xhr.responseText.length;
149
- }
150
- break;
151
- case XMLHttpRequest.DONE:
152
- const body2 = (() => {
153
- if (isArrayBuffer) {
154
- return new Blob([xhr.response]);
155
- }
156
- if (isText) {
157
- streamCursor !== xhr.responseText.length && writer.write?.(streamCursor > 0 ? xhr.responseText.slice(streamCursor) : xhr.responseText);
158
- writer.releaseLock();
159
- stream.writable.close();
160
- return stream.readable;
161
- }
162
- reject(new Error(`Unexpected XHR response type ${xhr.responseType}. Expected string or arraybuffer.`));
163
- })();
164
- resolve({
165
- response: new import_protocol_http.HttpResponse({
166
- headers: this.responseHeaders(xhr.getAllResponseHeaders()),
167
- statusCode: xhr.status,
168
- body: body2
169
- })
170
- });
171
- break;
172
- }
173
- });
174
- xhr.open(method, url);
175
- for (const [header, value] of Object.entries(request.headers)) {
176
- if (!isForbiddenRequestHeader(header)) {
177
- xhr.setRequestHeader(header, value);
178
- }
64
+ async handle(request, { abortSignal, requestTimeout: requestTimeout$1 } = {}) {
65
+ if (!this.config) {
66
+ this.config = await this.configProvider;
179
67
  }
180
- this.emit(EVENTS.BEFORE_XHR_SEND, xhr);
181
- xhr.send(body);
182
- }),
183
- requestTimeout(requestTimeoutInMs)
184
- ];
185
- let removeSignalEventListener = /* @__PURE__ */ __name(() => {
186
- }, "removeSignalEventListener");
187
- if (abortSignal) {
188
- raceOfPromises.push(
189
- new Promise((resolve, reject) => {
190
- const onAbort = /* @__PURE__ */ __name(() => {
191
- xhr.abort();
68
+ const requestTimeoutInMs = Number(requestTimeout$1 ?? this.config.requestTimeout) | 0;
69
+ if (abortSignal?.aborted) {
192
70
  const abortError = new Error("Request aborted");
193
71
  abortError.name = "AbortError";
194
- reject(abortError);
195
- }, "onAbort");
196
- if (typeof abortSignal.addEventListener === "function") {
197
- const signal = abortSignal;
198
- signal.addEventListener("abort", onAbort, { once: true });
199
- removeSignalEventListener = /* @__PURE__ */ __name(() => signal.removeEventListener("abort", onAbort), "removeSignalEventListener");
200
- } else {
201
- abortSignal.onabort = onAbort;
202
- }
203
- })
204
- );
72
+ throw abortError;
73
+ }
74
+ let path = request.path;
75
+ if (request.query) {
76
+ const queryString = querystringBuilder.buildQueryString(request.query);
77
+ if (queryString) {
78
+ path += `?${queryString}`;
79
+ }
80
+ }
81
+ const { port, method } = request;
82
+ const url = `${request.protocol}//${request.hostname}${port ? `:${port}` : ""}${path}`;
83
+ const body = method === "GET" || method === "HEAD" ? undefined : request.body;
84
+ const xhr = new XMLHttpRequest();
85
+ this.emit(EVENTS.XHR_INSTANTIATED, xhr);
86
+ const raceOfPromises = [
87
+ new Promise((resolve, reject) => {
88
+ let streamCursor = 0;
89
+ let stream;
90
+ let writer;
91
+ xhr.upload.addEventListener("progress", (event) => {
92
+ this.emit(XhrHttpHandler.EVENTS.UPLOAD_PROGRESS, event, request);
93
+ });
94
+ xhr.addEventListener("progress", (event) => {
95
+ this.emit(XhrHttpHandler.EVENTS.PROGRESS, event, request);
96
+ });
97
+ xhr.addEventListener("error", (err) => {
98
+ const error = new Error(XhrHttpHandler.ERROR_IDENTIFIER + ": " + err);
99
+ reject(error);
100
+ });
101
+ xhr.addEventListener("timeout", () => {
102
+ reject(new Error("XMLHttpRequest timed out."));
103
+ });
104
+ xhr.addEventListener("readystatechange", () => {
105
+ const isArrayBuffer = xhr.responseType === "arraybuffer" && xhr.response;
106
+ const isText = !isArrayBuffer && typeof xhr.responseText === "string";
107
+ if (isText && !stream) {
108
+ ({ stream, writer } = this.initializeTransformStream());
109
+ }
110
+ switch (xhr.readyState) {
111
+ case XMLHttpRequest.LOADING:
112
+ if (isText) {
113
+ writer.write(streamCursor > 0 ? xhr.responseText.slice(streamCursor) : xhr.responseText);
114
+ streamCursor = xhr.responseText.length;
115
+ }
116
+ break;
117
+ case XMLHttpRequest.DONE:
118
+ const body = (() => {
119
+ if (isArrayBuffer) {
120
+ return new Blob([xhr.response]);
121
+ }
122
+ if (isText) {
123
+ streamCursor !== xhr.responseText.length &&
124
+ writer.write?.(streamCursor > 0 ? xhr.responseText.slice(streamCursor) : xhr.responseText);
125
+ writer.releaseLock();
126
+ stream.writable.close();
127
+ return stream.readable;
128
+ }
129
+ reject(new Error(`Unexpected XHR response type ${xhr.responseType}. Expected string or arraybuffer.`));
130
+ })();
131
+ resolve({
132
+ response: new protocolHttp.HttpResponse({
133
+ headers: this.responseHeaders(xhr.getAllResponseHeaders()),
134
+ statusCode: xhr.status,
135
+ body,
136
+ }),
137
+ });
138
+ break;
139
+ }
140
+ });
141
+ xhr.open(method, url);
142
+ for (const [header, value] of Object.entries(request.headers)) {
143
+ if (!isForbiddenRequestHeader(header)) {
144
+ xhr.setRequestHeader(header, value);
145
+ }
146
+ }
147
+ this.emit(EVENTS.BEFORE_XHR_SEND, xhr);
148
+ xhr.send(body);
149
+ }),
150
+ requestTimeout(requestTimeoutInMs),
151
+ ];
152
+ let removeSignalEventListener = () => { };
153
+ if (abortSignal) {
154
+ raceOfPromises.push(new Promise((resolve, reject) => {
155
+ const onAbort = () => {
156
+ xhr.abort();
157
+ const abortError = new Error("Request aborted");
158
+ abortError.name = "AbortError";
159
+ reject(abortError);
160
+ };
161
+ if (typeof abortSignal.addEventListener === "function") {
162
+ const signal = abortSignal;
163
+ signal.addEventListener("abort", onAbort, { once: true });
164
+ removeSignalEventListener = () => signal.removeEventListener("abort", onAbort);
165
+ }
166
+ else {
167
+ abortSignal.onabort = onAbort;
168
+ }
169
+ }));
170
+ }
171
+ return Promise.race(raceOfPromises).finally(removeSignalEventListener);
205
172
  }
206
- return Promise.race(raceOfPromises).finally(removeSignalEventListener);
207
- }
208
- /**
209
- * Converts XHR response headers to a map.
210
- * @param xhrHeaders - string to be parsed.
211
- */
212
- responseHeaders(xhrHeaders) {
213
- if (!xhrHeaders) {
214
- return {};
173
+ responseHeaders(xhrHeaders) {
174
+ if (!xhrHeaders) {
175
+ return {};
176
+ }
177
+ return xhrHeaders.split("\r\n").reduce((headerMap, line) => {
178
+ const parts = line.split(": ");
179
+ const header = parts.shift();
180
+ const value = parts.join(": ");
181
+ headerMap[header] = value;
182
+ return headerMap;
183
+ }, {});
184
+ }
185
+ initializeTransformStream() {
186
+ const textEncoder = new TextEncoder();
187
+ const stream = new TransformStream({
188
+ start() { },
189
+ async transform(chunk, controller) {
190
+ controller.enqueue(textEncoder.encode(String(chunk)));
191
+ },
192
+ flush() { },
193
+ });
194
+ const writer = stream.writable.getWriter();
195
+ return {
196
+ stream,
197
+ writer,
198
+ };
199
+ }
200
+ }
201
+ const isForbiddenRequestHeader = (header) => {
202
+ header = header.toLowerCase();
203
+ if (header.startsWith("proxy-")) {
204
+ return true;
215
205
  }
216
- return xhrHeaders.split("\r\n").reduce((headerMap, line) => {
217
- const parts = line.split(": ");
218
- const header = parts.shift();
219
- const value = parts.join(": ");
220
- headerMap[header] = value;
221
- return headerMap;
222
- }, {});
223
- }
224
- /**
225
- * @returns a stream and its default writer to be used to map the xhr response text to a readable stream.
226
- */
227
- initializeTransformStream() {
228
- const textEncoder = new TextEncoder();
229
- const stream = new TransformStream({
230
- start() {
231
- },
232
- async transform(chunk, controller) {
233
- controller.enqueue(textEncoder.encode(String(chunk)));
234
- },
235
- flush() {
236
- }
237
- });
238
- const writer = stream.writable.getWriter();
239
- return {
240
- stream,
241
- writer
242
- };
243
- }
206
+ if (header.startsWith("sec-")) {
207
+ return true;
208
+ }
209
+ return forbiddenHeaders.includes(header);
244
210
  };
245
- var isForbiddenRequestHeader = /* @__PURE__ */ __name((header) => {
246
- header = header.toLowerCase();
247
- if (header.startsWith("proxy-")) {
248
- return true;
249
- }
250
- if (header.startsWith("sec-")) {
251
- return true;
252
- }
253
- return forbiddenHeaders.includes(header);
254
- }, "isForbiddenRequestHeader");
255
- var forbiddenHeaders = [
256
- "Accept-Charset",
257
- "Accept-Encoding",
258
- "Access-Control-Request-Headers",
259
- "Access-Control-Request-Method",
260
- "Connection",
261
- "Content-Length",
262
- "Cookie",
263
- "Date",
264
- "DNT",
265
- "Expect",
266
- "Feature-Policy",
267
- "Host",
268
- "Keep-Alive",
269
- "Origin",
270
- "Referer",
271
- "TE",
272
- "Trailer",
273
- "Transfer-Encoding",
274
- "Upgrade",
275
- "Via"
211
+ const forbiddenHeaders = [
212
+ "Accept-Charset",
213
+ "Accept-Encoding",
214
+ "Access-Control-Request-Headers",
215
+ "Access-Control-Request-Method",
216
+ "Connection",
217
+ "Content-Length",
218
+ "Cookie",
219
+ "Date",
220
+ "DNT",
221
+ "Expect",
222
+ "Feature-Policy",
223
+ "Host",
224
+ "Keep-Alive",
225
+ "Origin",
226
+ "Referer",
227
+ "TE",
228
+ "Trailer",
229
+ "Transfer-Encoding",
230
+ "Upgrade",
231
+ "Via",
276
232
  ].map((_) => _.toLowerCase());
277
- // Annotate the CommonJS export names for ESM import in node:
278
-
279
- 0 && (module.exports = {
280
- XhrHttpHandler
281
- });
282
233
 
234
+ exports.XhrHttpHandler = XhrHttpHandler;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/xhr-http-handler",
3
- "version": "3.901.0",
3
+ "version": "3.910.0",
4
4
  "description": "Provides a way to make requests using XMLHttpRequest",
5
5
  "scripts": {
6
6
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'",
@@ -21,15 +21,15 @@
21
21
  "module": "./dist-es/index.js",
22
22
  "types": "./dist-types/index.d.ts",
23
23
  "dependencies": {
24
- "@aws-sdk/types": "3.901.0",
25
- "@smithy/protocol-http": "^5.3.0",
26
- "@smithy/querystring-builder": "^4.2.0",
27
- "@smithy/types": "^4.6.0",
24
+ "@aws-sdk/types": "3.910.0",
25
+ "@smithy/protocol-http": "^5.3.2",
26
+ "@smithy/querystring-builder": "^4.2.2",
27
+ "@smithy/types": "^4.7.1",
28
28
  "events": "3.3.0",
29
29
  "tslib": "^2.6.2"
30
30
  },
31
31
  "devDependencies": {
32
- "@smithy/abort-controller": "^4.2.0",
32
+ "@smithy/abort-controller": "^4.2.2",
33
33
  "@tsconfig/recommended": "1.0.1",
34
34
  "concurrently": "7.0.0",
35
35
  "downlevel-dts": "0.10.1",