@aws-sdk/xhr-http-handler 3.183.0 → 3.186.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.
- package/CHANGELOG.md +8 -0
- package/dist-es/request-timeout.js +12 -9
- package/dist-es/xhr-http-handler.js +158 -122
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.186.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.185.0...v3.186.0) (2022-10-06)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @aws-sdk/xhr-http-handler
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
# [3.183.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.182.0...v3.183.0) (2022-10-03)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @aws-sdk/xhr-http-handler
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
export
|
|
2
|
-
if (timeoutInMs) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
1
|
+
export var requestTimeout = function (timeoutInMs) {
|
|
2
|
+
if (timeoutInMs === void 0) { timeoutInMs = 0; }
|
|
3
|
+
return new Promise(function (resolve, reject) {
|
|
4
|
+
if (timeoutInMs) {
|
|
5
|
+
setTimeout(function () {
|
|
6
|
+
var timeoutError = new Error("Request did not complete within ".concat(timeoutInMs, " ms"));
|
|
7
|
+
timeoutError.name = "TimeoutError";
|
|
8
|
+
reject(timeoutError);
|
|
9
|
+
}, timeoutInMs);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { __awaiter, __extends, __generator, __read, __values } from "tslib";
|
|
1
2
|
import { HttpResponse } from "@aws-sdk/protocol-http";
|
|
2
3
|
import { buildQueryString } from "@aws-sdk/querystring-builder";
|
|
3
4
|
import { EventEmitter } from "events";
|
|
4
5
|
import { requestTimeout } from "./request-timeout";
|
|
5
|
-
|
|
6
|
+
var EVENTS = {
|
|
6
7
|
get PROGRESS() {
|
|
7
8
|
return "xhr.progress";
|
|
8
9
|
},
|
|
@@ -16,144 +17,179 @@ const EVENTS = {
|
|
|
16
17
|
return "before.xhr.send";
|
|
17
18
|
},
|
|
18
19
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
var XhrHttpHandler = (function (_super) {
|
|
21
|
+
__extends(XhrHttpHandler, _super);
|
|
22
|
+
function XhrHttpHandler(options) {
|
|
23
|
+
var _this = _super.call(this) || this;
|
|
22
24
|
if (typeof options === "function") {
|
|
23
|
-
|
|
25
|
+
_this.configProvider = options();
|
|
24
26
|
}
|
|
25
27
|
else {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
_this.config = options !== null && options !== void 0 ? options : {};
|
|
29
|
+
_this.configProvider = Promise.resolve(_this.config);
|
|
28
30
|
}
|
|
31
|
+
return _this;
|
|
29
32
|
}
|
|
30
|
-
destroy() {
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
let writer;
|
|
59
|
-
xhr.upload.addEventListener("progress", (event) => {
|
|
60
|
-
this.emit(XhrHttpHandler.EVENTS.UPLOAD_PROGRESS, event, request);
|
|
61
|
-
});
|
|
62
|
-
xhr.addEventListener("progress", (event) => {
|
|
63
|
-
this.emit(XhrHttpHandler.EVENTS.PROGRESS, event, request);
|
|
64
|
-
});
|
|
65
|
-
xhr.addEventListener("error", reject);
|
|
66
|
-
xhr.addEventListener("timeout", () => {
|
|
67
|
-
reject(new Error("XMLHttpRequest timed out."));
|
|
68
|
-
});
|
|
69
|
-
xhr.addEventListener("readystatechange", () => {
|
|
70
|
-
const isArrayBuffer = xhr.responseType === "arraybuffer" && xhr.response;
|
|
71
|
-
const isText = !isArrayBuffer && typeof xhr.responseText === "string";
|
|
72
|
-
if (isText && !stream) {
|
|
73
|
-
({ stream, writer } = this.initializeTransformStream());
|
|
74
|
-
}
|
|
75
|
-
switch (xhr.readyState) {
|
|
76
|
-
case XMLHttpRequest.LOADING:
|
|
77
|
-
if (isText) {
|
|
78
|
-
writer.write(streamCursor > 0 ? xhr.responseText.slice(streamCursor) : xhr.responseText);
|
|
79
|
-
streamCursor = xhr.responseText.length;
|
|
33
|
+
XhrHttpHandler.prototype.destroy = function () {
|
|
34
|
+
};
|
|
35
|
+
XhrHttpHandler.prototype.handle = function (request, _a) {
|
|
36
|
+
var _b = _a === void 0 ? {} : _a, abortSignal = _b.abortSignal;
|
|
37
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
38
|
+
var _c, requestTimeoutInMs, abortError, path, queryString, port, method, url, body, xhr, raceOfPromises;
|
|
39
|
+
var _this = this;
|
|
40
|
+
return __generator(this, function (_d) {
|
|
41
|
+
switch (_d.label) {
|
|
42
|
+
case 0:
|
|
43
|
+
if (!!this.config) return [3, 2];
|
|
44
|
+
_c = this;
|
|
45
|
+
return [4, this.configProvider];
|
|
46
|
+
case 1:
|
|
47
|
+
_c.config = _d.sent();
|
|
48
|
+
_d.label = 2;
|
|
49
|
+
case 2:
|
|
50
|
+
requestTimeoutInMs = Number(this.config.requestTimeout) | 0;
|
|
51
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
52
|
+
abortError = new Error("Request aborted");
|
|
53
|
+
abortError.name = "AbortError";
|
|
54
|
+
throw abortError;
|
|
55
|
+
}
|
|
56
|
+
path = request.path;
|
|
57
|
+
if (request.query) {
|
|
58
|
+
queryString = buildQueryString(request.query);
|
|
59
|
+
if (queryString) {
|
|
60
|
+
path += "?".concat(queryString);
|
|
80
61
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
62
|
+
}
|
|
63
|
+
port = request.port, method = request.method;
|
|
64
|
+
url = "".concat(request.protocol, "//").concat(request.hostname).concat(port ? ":".concat(port) : "").concat(path);
|
|
65
|
+
body = method === "GET" || method === "HEAD" ? undefined : request.body;
|
|
66
|
+
xhr = new XMLHttpRequest();
|
|
67
|
+
this.emit(EVENTS.XHR_INSTANTIATED, xhr);
|
|
68
|
+
raceOfPromises = [
|
|
69
|
+
new Promise(function (resolve, reject) {
|
|
70
|
+
var e_1, _a;
|
|
71
|
+
var streamCursor = 0;
|
|
72
|
+
var stream;
|
|
73
|
+
var writer;
|
|
74
|
+
xhr.upload.addEventListener("progress", function (event) {
|
|
75
|
+
_this.emit(XhrHttpHandler.EVENTS.UPLOAD_PROGRESS, event, request);
|
|
76
|
+
});
|
|
77
|
+
xhr.addEventListener("progress", function (event) {
|
|
78
|
+
_this.emit(XhrHttpHandler.EVENTS.PROGRESS, event, request);
|
|
79
|
+
});
|
|
80
|
+
xhr.addEventListener("error", reject);
|
|
81
|
+
xhr.addEventListener("timeout", function () {
|
|
82
|
+
reject(new Error("XMLHttpRequest timed out."));
|
|
83
|
+
});
|
|
84
|
+
xhr.addEventListener("readystatechange", function () {
|
|
85
|
+
var _a;
|
|
86
|
+
var isArrayBuffer = xhr.responseType === "arraybuffer" && xhr.response;
|
|
87
|
+
var isText = !isArrayBuffer && typeof xhr.responseText === "string";
|
|
88
|
+
if (isText && !stream) {
|
|
89
|
+
(_a = _this.initializeTransformStream(), stream = _a.stream, writer = _a.writer);
|
|
90
|
+
}
|
|
91
|
+
switch (xhr.readyState) {
|
|
92
|
+
case XMLHttpRequest.LOADING:
|
|
93
|
+
if (isText) {
|
|
94
|
+
writer.write(streamCursor > 0 ? xhr.responseText.slice(streamCursor) : xhr.responseText);
|
|
95
|
+
streamCursor = xhr.responseText.length;
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
case XMLHttpRequest.DONE:
|
|
99
|
+
var body_1 = (function () {
|
|
100
|
+
if (isArrayBuffer) {
|
|
101
|
+
return new Blob([xhr.response]);
|
|
102
|
+
}
|
|
103
|
+
if (isText) {
|
|
104
|
+
writer.releaseLock();
|
|
105
|
+
stream.writable.close();
|
|
106
|
+
return stream.readable;
|
|
107
|
+
}
|
|
108
|
+
reject(new Error("Unexpected XHR response type ".concat(xhr.responseType, ". Expected string or arraybuffer.")));
|
|
109
|
+
})();
|
|
110
|
+
resolve({
|
|
111
|
+
response: new HttpResponse({
|
|
112
|
+
headers: _this.responseHeaders(xhr.getAllResponseHeaders()),
|
|
113
|
+
statusCode: xhr.status,
|
|
114
|
+
body: body_1,
|
|
115
|
+
}),
|
|
116
|
+
});
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
xhr.open(method, url);
|
|
121
|
+
try {
|
|
122
|
+
for (var _b = __values(Object.entries(request.headers)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
123
|
+
var _d = __read(_c.value, 2), header = _d[0], value = _d[1];
|
|
124
|
+
if (!isForbiddenRequestHeader(header)) {
|
|
125
|
+
xhr.setRequestHeader(header, value);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
86
128
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
129
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
130
|
+
finally {
|
|
131
|
+
try {
|
|
132
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
133
|
+
}
|
|
134
|
+
finally { if (e_1) throw e_1.error; }
|
|
91
135
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
136
|
+
_this.emit(EVENTS.BEFORE_XHR_SEND, xhr);
|
|
137
|
+
xhr.send(body);
|
|
138
|
+
}),
|
|
139
|
+
requestTimeout(requestTimeoutInMs),
|
|
140
|
+
];
|
|
141
|
+
if (abortSignal) {
|
|
142
|
+
raceOfPromises.push(new Promise(function (resolve, reject) {
|
|
143
|
+
abortSignal.onabort = function () {
|
|
144
|
+
xhr.abort();
|
|
145
|
+
var abortError = new Error("Request aborted");
|
|
146
|
+
abortError.name = "AbortError";
|
|
147
|
+
reject(abortError);
|
|
148
|
+
};
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
return [2, Promise.race(raceOfPromises)];
|
|
109
152
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
];
|
|
115
|
-
if (abortSignal) {
|
|
116
|
-
raceOfPromises.push(new Promise((resolve, reject) => {
|
|
117
|
-
abortSignal.onabort = () => {
|
|
118
|
-
xhr.abort();
|
|
119
|
-
const abortError = new Error("Request aborted");
|
|
120
|
-
abortError.name = "AbortError";
|
|
121
|
-
reject(abortError);
|
|
122
|
-
};
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
return Promise.race(raceOfPromises);
|
|
126
|
-
}
|
|
127
|
-
responseHeaders(xhrHeaders) {
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
XhrHttpHandler.prototype.responseHeaders = function (xhrHeaders) {
|
|
128
157
|
if (!xhrHeaders) {
|
|
129
158
|
return {};
|
|
130
159
|
}
|
|
131
|
-
return xhrHeaders.split("\r\n").reduce((headerMap, line)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
160
|
+
return xhrHeaders.split("\r\n").reduce(function (headerMap, line) {
|
|
161
|
+
var parts = line.split(": ");
|
|
162
|
+
var header = parts.shift();
|
|
163
|
+
var value = parts.join(": ");
|
|
135
164
|
headerMap[header] = value;
|
|
136
165
|
return headerMap;
|
|
137
166
|
}, {});
|
|
138
|
-
}
|
|
139
|
-
initializeTransformStream() {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
start() { },
|
|
143
|
-
|
|
144
|
-
|
|
167
|
+
};
|
|
168
|
+
XhrHttpHandler.prototype.initializeTransformStream = function () {
|
|
169
|
+
var textEncoder = new TextEncoder();
|
|
170
|
+
var stream = new TransformStream({
|
|
171
|
+
start: function () { },
|
|
172
|
+
transform: function (chunk, controller) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
174
|
+
return __generator(this, function (_a) {
|
|
175
|
+
controller.enqueue(textEncoder.encode(String(chunk)));
|
|
176
|
+
return [2];
|
|
177
|
+
});
|
|
178
|
+
});
|
|
145
179
|
},
|
|
146
|
-
flush() { },
|
|
180
|
+
flush: function () { },
|
|
147
181
|
});
|
|
148
|
-
|
|
182
|
+
var writer = stream.writable.getWriter();
|
|
149
183
|
return {
|
|
150
|
-
stream,
|
|
151
|
-
writer,
|
|
184
|
+
stream: stream,
|
|
185
|
+
writer: writer,
|
|
152
186
|
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
XhrHttpHandler
|
|
156
|
-
|
|
187
|
+
};
|
|
188
|
+
XhrHttpHandler.EVENTS = EVENTS;
|
|
189
|
+
return XhrHttpHandler;
|
|
190
|
+
}(EventEmitter));
|
|
191
|
+
export { XhrHttpHandler };
|
|
192
|
+
var isForbiddenRequestHeader = function (header) {
|
|
157
193
|
header = header.toLowerCase();
|
|
158
194
|
if (header.startsWith("proxy-")) {
|
|
159
195
|
return true;
|
|
@@ -163,7 +199,7 @@ const isForbiddenRequestHeader = (header) => {
|
|
|
163
199
|
}
|
|
164
200
|
return forbiddenHeaders.includes(header);
|
|
165
201
|
};
|
|
166
|
-
|
|
202
|
+
var forbiddenHeaders = [
|
|
167
203
|
"Accept-Charset",
|
|
168
204
|
"Accept-Encoding",
|
|
169
205
|
"Access-Control-Request-Headers",
|
|
@@ -184,4 +220,4 @@ const forbiddenHeaders = [
|
|
|
184
220
|
"Transfer-Encoding",
|
|
185
221
|
"Upgrade",
|
|
186
222
|
"Via",
|
|
187
|
-
].map((_)
|
|
223
|
+
].map(function (_) { return _.toLowerCase(); });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/xhr-http-handler",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.186.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'",
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
"module": "./dist-es/index.js",
|
|
19
19
|
"types": "./dist-types/index.d.ts",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@aws-sdk/protocol-http": "3.
|
|
22
|
-
"@aws-sdk/querystring-builder": "3.
|
|
23
|
-
"@aws-sdk/types": "3.
|
|
24
|
-
"@aws-sdk/util-base64-browser": "3.
|
|
21
|
+
"@aws-sdk/protocol-http": "3.186.0",
|
|
22
|
+
"@aws-sdk/querystring-builder": "3.186.0",
|
|
23
|
+
"@aws-sdk/types": "3.186.0",
|
|
24
|
+
"@aws-sdk/util-base64-browser": "3.186.0",
|
|
25
25
|
"events": "3.3.0",
|
|
26
26
|
"tslib": "^2.3.1"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@aws-sdk/abort-controller": "3.
|
|
29
|
+
"@aws-sdk/abort-controller": "3.186.0",
|
|
30
30
|
"@tsconfig/recommended": "1.0.1",
|
|
31
31
|
"concurrently": "7.0.0",
|
|
32
32
|
"downlevel-dts": "0.10.1",
|