@smithy/fetch-http-handler 5.2.0 → 5.3.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/dist-cjs/index.js
CHANGED
|
@@ -1,264 +1,216 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
FetchHttpHandler: () => FetchHttpHandler,
|
|
24
|
-
keepAliveSupport: () => keepAliveSupport,
|
|
25
|
-
streamCollector: () => streamCollector
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(index_exports);
|
|
1
|
+
'use strict';
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
var
|
|
31
|
-
var
|
|
3
|
+
var protocolHttp = require('@smithy/protocol-http');
|
|
4
|
+
var querystringBuilder = require('@smithy/querystring-builder');
|
|
5
|
+
var utilBase64 = require('@smithy/util-base64');
|
|
32
6
|
|
|
33
|
-
// src/create-request.ts
|
|
34
7
|
function createRequest(url, requestOptions) {
|
|
35
|
-
|
|
8
|
+
return new Request(url, requestOptions);
|
|
36
9
|
}
|
|
37
|
-
__name(createRequest, "createRequest");
|
|
38
10
|
|
|
39
|
-
// src/request-timeout.ts
|
|
40
11
|
function requestTimeout(timeoutInMs = 0) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
if (timeoutInMs) {
|
|
14
|
+
setTimeout(() => {
|
|
15
|
+
const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`);
|
|
16
|
+
timeoutError.name = "TimeoutError";
|
|
17
|
+
reject(timeoutError);
|
|
18
|
+
}, timeoutInMs);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
50
21
|
}
|
|
51
|
-
__name(requestTimeout, "requestTimeout");
|
|
52
22
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
supported: void 0
|
|
23
|
+
const keepAliveSupport = {
|
|
24
|
+
supported: undefined,
|
|
56
25
|
};
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
static create(instanceOrOptions) {
|
|
66
|
-
if (typeof instanceOrOptions?.handle === "function") {
|
|
67
|
-
return instanceOrOptions;
|
|
68
|
-
}
|
|
69
|
-
return new _FetchHttpHandler(instanceOrOptions);
|
|
70
|
-
}
|
|
71
|
-
constructor(options) {
|
|
72
|
-
if (typeof options === "function") {
|
|
73
|
-
this.configProvider = options().then((opts) => opts || {});
|
|
74
|
-
} else {
|
|
75
|
-
this.config = options ?? {};
|
|
76
|
-
this.configProvider = Promise.resolve(this.config);
|
|
77
|
-
}
|
|
78
|
-
if (keepAliveSupport.supported === void 0) {
|
|
79
|
-
keepAliveSupport.supported = Boolean(
|
|
80
|
-
typeof Request !== "undefined" && "keepalive" in createRequest("https://[::1]")
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
destroy() {
|
|
85
|
-
}
|
|
86
|
-
async handle(request, { abortSignal, requestTimeout: requestTimeout2 } = {}) {
|
|
87
|
-
if (!this.config) {
|
|
88
|
-
this.config = await this.configProvider;
|
|
89
|
-
}
|
|
90
|
-
const requestTimeoutInMs = requestTimeout2 ?? this.config.requestTimeout;
|
|
91
|
-
const keepAlive = this.config.keepAlive === true;
|
|
92
|
-
const credentials = this.config.credentials;
|
|
93
|
-
if (abortSignal?.aborted) {
|
|
94
|
-
const abortError = new Error("Request aborted");
|
|
95
|
-
abortError.name = "AbortError";
|
|
96
|
-
return Promise.reject(abortError);
|
|
97
|
-
}
|
|
98
|
-
let path = request.path;
|
|
99
|
-
const queryString = (0, import_querystring_builder.buildQueryString)(request.query || {});
|
|
100
|
-
if (queryString) {
|
|
101
|
-
path += `?${queryString}`;
|
|
102
|
-
}
|
|
103
|
-
if (request.fragment) {
|
|
104
|
-
path += `#${request.fragment}`;
|
|
105
|
-
}
|
|
106
|
-
let auth = "";
|
|
107
|
-
if (request.username != null || request.password != null) {
|
|
108
|
-
const username = request.username ?? "";
|
|
109
|
-
const password = request.password ?? "";
|
|
110
|
-
auth = `${username}:${password}@`;
|
|
111
|
-
}
|
|
112
|
-
const { port, method } = request;
|
|
113
|
-
const url = `${request.protocol}//${auth}${request.hostname}${port ? `:${port}` : ""}${path}`;
|
|
114
|
-
const body = method === "GET" || method === "HEAD" ? void 0 : request.body;
|
|
115
|
-
const requestOptions = {
|
|
116
|
-
body,
|
|
117
|
-
headers: new Headers(request.headers),
|
|
118
|
-
method,
|
|
119
|
-
credentials
|
|
120
|
-
};
|
|
121
|
-
if (this.config?.cache) {
|
|
122
|
-
requestOptions.cache = this.config.cache;
|
|
123
|
-
}
|
|
124
|
-
if (body) {
|
|
125
|
-
requestOptions.duplex = "half";
|
|
126
|
-
}
|
|
127
|
-
if (typeof AbortController !== "undefined") {
|
|
128
|
-
requestOptions.signal = abortSignal;
|
|
26
|
+
class FetchHttpHandler {
|
|
27
|
+
config;
|
|
28
|
+
configProvider;
|
|
29
|
+
static create(instanceOrOptions) {
|
|
30
|
+
if (typeof instanceOrOptions?.handle === "function") {
|
|
31
|
+
return instanceOrOptions;
|
|
32
|
+
}
|
|
33
|
+
return new FetchHttpHandler(instanceOrOptions);
|
|
129
34
|
}
|
|
130
|
-
|
|
131
|
-
|
|
35
|
+
constructor(options) {
|
|
36
|
+
if (typeof options === "function") {
|
|
37
|
+
this.configProvider = options().then((opts) => opts || {});
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.config = options ?? {};
|
|
41
|
+
this.configProvider = Promise.resolve(this.config);
|
|
42
|
+
}
|
|
43
|
+
if (keepAliveSupport.supported === undefined) {
|
|
44
|
+
keepAliveSupport.supported = Boolean(typeof Request !== "undefined" && "keepalive" in createRequest("https://[::1]"));
|
|
45
|
+
}
|
|
132
46
|
}
|
|
133
|
-
|
|
134
|
-
Object.assign(requestOptions, this.config.requestInit(request));
|
|
47
|
+
destroy() {
|
|
135
48
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const raceOfPromises = [
|
|
140
|
-
fetch(fetchRequest).then((response) => {
|
|
141
|
-
const fetchHeaders = response.headers;
|
|
142
|
-
const transformedHeaders = {};
|
|
143
|
-
for (const pair of fetchHeaders.entries()) {
|
|
144
|
-
transformedHeaders[pair[0]] = pair[1];
|
|
145
|
-
}
|
|
146
|
-
const hasReadableStream = response.body != void 0;
|
|
147
|
-
if (!hasReadableStream) {
|
|
148
|
-
return response.blob().then((body2) => ({
|
|
149
|
-
response: new import_protocol_http.HttpResponse({
|
|
150
|
-
headers: transformedHeaders,
|
|
151
|
-
reason: response.statusText,
|
|
152
|
-
statusCode: response.status,
|
|
153
|
-
body: body2
|
|
154
|
-
})
|
|
155
|
-
}));
|
|
49
|
+
async handle(request, { abortSignal, requestTimeout: requestTimeout$1 } = {}) {
|
|
50
|
+
if (!this.config) {
|
|
51
|
+
this.config = await this.configProvider;
|
|
156
52
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
statusCode: response.status,
|
|
162
|
-
body: response.body
|
|
163
|
-
})
|
|
164
|
-
};
|
|
165
|
-
}),
|
|
166
|
-
requestTimeout(requestTimeoutInMs)
|
|
167
|
-
];
|
|
168
|
-
if (abortSignal) {
|
|
169
|
-
raceOfPromises.push(
|
|
170
|
-
new Promise((resolve, reject) => {
|
|
171
|
-
const onAbort = /* @__PURE__ */ __name(() => {
|
|
53
|
+
const requestTimeoutInMs = requestTimeout$1 ?? this.config.requestTimeout;
|
|
54
|
+
const keepAlive = this.config.keepAlive === true;
|
|
55
|
+
const credentials = this.config.credentials;
|
|
56
|
+
if (abortSignal?.aborted) {
|
|
172
57
|
const abortError = new Error("Request aborted");
|
|
173
58
|
abortError.name = "AbortError";
|
|
174
|
-
reject(abortError);
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
|
|
59
|
+
return Promise.reject(abortError);
|
|
60
|
+
}
|
|
61
|
+
let path = request.path;
|
|
62
|
+
const queryString = querystringBuilder.buildQueryString(request.query || {});
|
|
63
|
+
if (queryString) {
|
|
64
|
+
path += `?${queryString}`;
|
|
65
|
+
}
|
|
66
|
+
if (request.fragment) {
|
|
67
|
+
path += `#${request.fragment}`;
|
|
68
|
+
}
|
|
69
|
+
let auth = "";
|
|
70
|
+
if (request.username != null || request.password != null) {
|
|
71
|
+
const username = request.username ?? "";
|
|
72
|
+
const password = request.password ?? "";
|
|
73
|
+
auth = `${username}:${password}@`;
|
|
74
|
+
}
|
|
75
|
+
const { port, method } = request;
|
|
76
|
+
const url = `${request.protocol}//${auth}${request.hostname}${port ? `:${port}` : ""}${path}`;
|
|
77
|
+
const body = method === "GET" || method === "HEAD" ? undefined : request.body;
|
|
78
|
+
const requestOptions = {
|
|
79
|
+
body,
|
|
80
|
+
headers: new Headers(request.headers),
|
|
81
|
+
method: method,
|
|
82
|
+
credentials,
|
|
83
|
+
};
|
|
84
|
+
if (this.config?.cache) {
|
|
85
|
+
requestOptions.cache = this.config.cache;
|
|
86
|
+
}
|
|
87
|
+
if (body) {
|
|
88
|
+
requestOptions.duplex = "half";
|
|
89
|
+
}
|
|
90
|
+
if (typeof AbortController !== "undefined") {
|
|
91
|
+
requestOptions.signal = abortSignal;
|
|
92
|
+
}
|
|
93
|
+
if (keepAliveSupport.supported) {
|
|
94
|
+
requestOptions.keepalive = keepAlive;
|
|
95
|
+
}
|
|
96
|
+
if (typeof this.config.requestInit === "function") {
|
|
97
|
+
Object.assign(requestOptions, this.config.requestInit(request));
|
|
98
|
+
}
|
|
99
|
+
let removeSignalEventListener = () => { };
|
|
100
|
+
const fetchRequest = createRequest(url, requestOptions);
|
|
101
|
+
const raceOfPromises = [
|
|
102
|
+
fetch(fetchRequest).then((response) => {
|
|
103
|
+
const fetchHeaders = response.headers;
|
|
104
|
+
const transformedHeaders = {};
|
|
105
|
+
for (const pair of fetchHeaders.entries()) {
|
|
106
|
+
transformedHeaders[pair[0]] = pair[1];
|
|
107
|
+
}
|
|
108
|
+
const hasReadableStream = response.body != undefined;
|
|
109
|
+
if (!hasReadableStream) {
|
|
110
|
+
return response.blob().then((body) => ({
|
|
111
|
+
response: new protocolHttp.HttpResponse({
|
|
112
|
+
headers: transformedHeaders,
|
|
113
|
+
reason: response.statusText,
|
|
114
|
+
statusCode: response.status,
|
|
115
|
+
body,
|
|
116
|
+
}),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
response: new protocolHttp.HttpResponse({
|
|
121
|
+
headers: transformedHeaders,
|
|
122
|
+
reason: response.statusText,
|
|
123
|
+
statusCode: response.status,
|
|
124
|
+
body: response.body,
|
|
125
|
+
}),
|
|
126
|
+
};
|
|
127
|
+
}),
|
|
128
|
+
requestTimeout(requestTimeoutInMs),
|
|
129
|
+
];
|
|
130
|
+
if (abortSignal) {
|
|
131
|
+
raceOfPromises.push(new Promise((resolve, reject) => {
|
|
132
|
+
const onAbort = () => {
|
|
133
|
+
const abortError = new Error("Request aborted");
|
|
134
|
+
abortError.name = "AbortError";
|
|
135
|
+
reject(abortError);
|
|
136
|
+
};
|
|
137
|
+
if (typeof abortSignal.addEventListener === "function") {
|
|
138
|
+
const signal = abortSignal;
|
|
139
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
140
|
+
removeSignalEventListener = () => signal.removeEventListener("abort", onAbort);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
abortSignal.onabort = onAbort;
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
return Promise.race(raceOfPromises).finally(removeSignalEventListener);
|
|
185
148
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
};
|
|
149
|
+
updateHttpClientConfig(key, value) {
|
|
150
|
+
this.config = undefined;
|
|
151
|
+
this.configProvider = this.configProvider.then((config) => {
|
|
152
|
+
config[key] = value;
|
|
153
|
+
return config;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
httpHandlerConfigs() {
|
|
157
|
+
return this.config ?? {};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
199
160
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
161
|
+
const streamCollector = async (stream) => {
|
|
162
|
+
if ((typeof Blob === "function" && stream instanceof Blob) || stream.constructor?.name === "Blob") {
|
|
163
|
+
if (Blob.prototype.arrayBuffer !== undefined) {
|
|
164
|
+
return new Uint8Array(await stream.arrayBuffer());
|
|
165
|
+
}
|
|
166
|
+
return collectBlob(stream);
|
|
206
167
|
}
|
|
207
|
-
return
|
|
208
|
-
|
|
209
|
-
return collectStream(stream);
|
|
210
|
-
}, "streamCollector");
|
|
168
|
+
return collectStream(stream);
|
|
169
|
+
};
|
|
211
170
|
async function collectBlob(blob) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
171
|
+
const base64 = await readToBase64(blob);
|
|
172
|
+
const arrayBuffer = utilBase64.fromBase64(base64);
|
|
173
|
+
return new Uint8Array(arrayBuffer);
|
|
215
174
|
}
|
|
216
|
-
__name(collectBlob, "collectBlob");
|
|
217
175
|
async function collectStream(stream) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
176
|
+
const chunks = [];
|
|
177
|
+
const reader = stream.getReader();
|
|
178
|
+
let isDone = false;
|
|
179
|
+
let length = 0;
|
|
180
|
+
while (!isDone) {
|
|
181
|
+
const { done, value } = await reader.read();
|
|
182
|
+
if (value) {
|
|
183
|
+
chunks.push(value);
|
|
184
|
+
length += value.length;
|
|
185
|
+
}
|
|
186
|
+
isDone = done;
|
|
187
|
+
}
|
|
188
|
+
const collected = new Uint8Array(length);
|
|
189
|
+
let offset = 0;
|
|
190
|
+
for (const chunk of chunks) {
|
|
191
|
+
collected.set(chunk, offset);
|
|
192
|
+
offset += chunk.length;
|
|
227
193
|
}
|
|
228
|
-
|
|
229
|
-
}
|
|
230
|
-
const collected = new Uint8Array(length);
|
|
231
|
-
let offset = 0;
|
|
232
|
-
for (const chunk of chunks) {
|
|
233
|
-
collected.set(chunk, offset);
|
|
234
|
-
offset += chunk.length;
|
|
235
|
-
}
|
|
236
|
-
return collected;
|
|
194
|
+
return collected;
|
|
237
195
|
}
|
|
238
|
-
__name(collectStream, "collectStream");
|
|
239
196
|
function readToBase64(blob) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
197
|
+
return new Promise((resolve, reject) => {
|
|
198
|
+
const reader = new FileReader();
|
|
199
|
+
reader.onloadend = () => {
|
|
200
|
+
if (reader.readyState !== 2) {
|
|
201
|
+
return reject(new Error("Reader aborted too early"));
|
|
202
|
+
}
|
|
203
|
+
const result = (reader.result ?? "");
|
|
204
|
+
const commaIndex = result.indexOf(",");
|
|
205
|
+
const dataOffset = commaIndex > -1 ? commaIndex + 1 : result.length;
|
|
206
|
+
resolve(result.substring(dataOffset));
|
|
207
|
+
};
|
|
208
|
+
reader.onabort = () => reject(new Error("Read aborted"));
|
|
209
|
+
reader.onerror = () => reject(reader.error);
|
|
210
|
+
reader.readAsDataURL(blob);
|
|
211
|
+
});
|
|
255
212
|
}
|
|
256
|
-
__name(readToBase64, "readToBase64");
|
|
257
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
258
|
-
|
|
259
|
-
0 && (module.exports = {
|
|
260
|
-
keepAliveSupport,
|
|
261
|
-
FetchHttpHandler,
|
|
262
|
-
streamCollector
|
|
263
|
-
});
|
|
264
213
|
|
|
214
|
+
exports.FetchHttpHandler = FetchHttpHandler;
|
|
215
|
+
exports.keepAliveSupport = keepAliveSupport;
|
|
216
|
+
exports.streamCollector = streamCollector;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smithy/fetch-http-handler",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.0",
|
|
4
4
|
"description": "Provides a way to make requests",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"module": "./dist-es/index.js",
|
|
29
29
|
"types": "./dist-types/index.d.ts",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@smithy/protocol-http": "^5.
|
|
32
|
-
"@smithy/querystring-builder": "^4.
|
|
33
|
-
"@smithy/types": "^4.
|
|
34
|
-
"@smithy/util-base64": "^4.
|
|
31
|
+
"@smithy/protocol-http": "^5.3.0",
|
|
32
|
+
"@smithy/querystring-builder": "^4.2.0",
|
|
33
|
+
"@smithy/types": "^4.6.0",
|
|
34
|
+
"@smithy/util-base64": "^4.2.0",
|
|
35
35
|
"tslib": "^2.6.2"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@smithy/abort-controller": "^4.
|
|
38
|
+
"@smithy/abort-controller": "^4.2.0",
|
|
39
39
|
"concurrently": "7.0.0",
|
|
40
40
|
"downlevel-dts": "0.10.1",
|
|
41
41
|
"rimraf": "3.0.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require("./index.js");
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require("./index.js");
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require("./index.js");
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require("./index.js");
|