fetch-nodeshim 0.1.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 +5 -0
- package/LICENSE.md +24 -0
- package/README.md +14 -0
- package/dist/minifetch.d.ts +3 -0
- package/dist/minifetch.js +382 -0
- package/dist/minifetch.js.map +1 -0
- package/dist/minifetch.mjs +349 -0
- package/dist/minifetch.mjs.map +1 -0
- package/package.json +68 -0
package/CHANGELOG.md
ADDED
package/LICENSE.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Phil Pluckthun,
|
|
4
|
+
Copyright (c) 2016 - 2020 Node Fetch Team,
|
|
5
|
+
Copyright (c) Remix Software Inc. 2020-2021,
|
|
6
|
+
Copyright (c) Shopify Inc. 2022-2024
|
|
7
|
+
|
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
in the Software without restriction, including without limitation the rights
|
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
furnished to do so, subject to the following conditions:
|
|
14
|
+
|
|
15
|
+
The above copyright notice and this permission notice shall be included in all
|
|
16
|
+
copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# fetch-nodeshim
|
|
2
|
+
|
|
3
|
+
A looser implementation of `fetch` that bypasses Node.js' built-in `fetch`.
|
|
4
|
+
Some implementations (specifically ones that provide undici-based shims)
|
|
5
|
+
or some versions of Node.js may ship with a built-in version of `undici`
|
|
6
|
+
that's older and/or missing patches.
|
|
7
|
+
|
|
8
|
+
This implementation of `fetch` uses built-ins as much as possible,
|
|
9
|
+
using global `Request`, `Response`, and `Headers`, whether they're provided
|
|
10
|
+
by a polyfill or by Node.js itself.
|
|
11
|
+
However, it's a looser and more permissive implementation that calls
|
|
12
|
+
into `node:http` and `node:https` instead.
|
|
13
|
+
|
|
14
|
+
Think of it as `@remix-run/web-fetch`, but lighter.
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", {
|
|
2
|
+
value: !0
|
|
3
|
+
});
|
|
4
|
+
|
|
5
|
+
var e = require("node:stream");
|
|
6
|
+
|
|
7
|
+
var t = require("node:https");
|
|
8
|
+
|
|
9
|
+
var r = require("node:http");
|
|
10
|
+
|
|
11
|
+
var n = require("node:url");
|
|
12
|
+
|
|
13
|
+
var o = require("node:util/types");
|
|
14
|
+
|
|
15
|
+
var a = require("node:crypto");
|
|
16
|
+
|
|
17
|
+
var s = require("node:zlib");
|
|
18
|
+
|
|
19
|
+
function _interopNamespaceDefault(e) {
|
|
20
|
+
var t = Object.create(null);
|
|
21
|
+
if (e) {
|
|
22
|
+
Object.keys(e).forEach((function(r) {
|
|
23
|
+
if ("default" !== r) {
|
|
24
|
+
var n = Object.getOwnPropertyDescriptor(e, r);
|
|
25
|
+
Object.defineProperty(t, r, n.get ? n : {
|
|
26
|
+
enumerable: !0,
|
|
27
|
+
get: function() {
|
|
28
|
+
return e[r];
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
t.default = e;
|
|
35
|
+
return t;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
var i = _interopNamespaceDefault(t);
|
|
39
|
+
|
|
40
|
+
var f = _interopNamespaceDefault(r);
|
|
41
|
+
|
|
42
|
+
var l = _interopNamespaceDefault(n);
|
|
43
|
+
|
|
44
|
+
var u = _interopNamespaceDefault(s);
|
|
45
|
+
|
|
46
|
+
var c = "\r\n";
|
|
47
|
+
|
|
48
|
+
var d = "-".repeat(2);
|
|
49
|
+
|
|
50
|
+
var isBlob = e => {
|
|
51
|
+
if ("object" == typeof e && "function" == typeof e.arrayBuffer && "string" == typeof e.type && "function" == typeof e.stream && "function" == typeof e.constructor) {
|
|
52
|
+
var t = e[Symbol.toStringTag];
|
|
53
|
+
return t.startsWith("Blob") || t.startsWith("File");
|
|
54
|
+
} else {
|
|
55
|
+
return !1;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
var getFormHeader = (e, t, r) => {
|
|
60
|
+
var n = `${d}${e}${c}`;
|
|
61
|
+
n += `Content-Disposition: form-data; name="${t}"`;
|
|
62
|
+
if (isBlob(r)) {
|
|
63
|
+
n += `; filename="${r.name ?? "blob"}"${c}`;
|
|
64
|
+
n += `Content-Type: ${r.type || "application/octet-stream"}`;
|
|
65
|
+
}
|
|
66
|
+
return `${n}${c}${c}`;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
var getFormFooter = e => `${d}${e}${d}${c}${c}`;
|
|
70
|
+
|
|
71
|
+
var p = new TextEncoder;
|
|
72
|
+
|
|
73
|
+
var extractBody = t => {
|
|
74
|
+
var r = null;
|
|
75
|
+
var n;
|
|
76
|
+
var s = null;
|
|
77
|
+
if (null == t) {
|
|
78
|
+
n = null;
|
|
79
|
+
s = 0;
|
|
80
|
+
} else if ("string" == typeof t) {
|
|
81
|
+
var i = p.encode(`${t}`);
|
|
82
|
+
r = "text/plain;charset=UTF-8";
|
|
83
|
+
s = i.byteLength;
|
|
84
|
+
n = i;
|
|
85
|
+
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.delete && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.has && "function" == typeof e.set && "function" == typeof e.sort && "URLSearchParams" === e[Symbol.toStringTag])(t)) {
|
|
86
|
+
var f = p.encode(t.toString());
|
|
87
|
+
n = f;
|
|
88
|
+
s = f.byteLength;
|
|
89
|
+
r = "application/x-www-form-urlencoded;charset=UTF-8";
|
|
90
|
+
} else if (isBlob(t)) {
|
|
91
|
+
s = t.size;
|
|
92
|
+
r = t.type || null;
|
|
93
|
+
n = t.stream();
|
|
94
|
+
} else if (t instanceof Uint8Array) {
|
|
95
|
+
n = t;
|
|
96
|
+
s = t.byteLength;
|
|
97
|
+
} else if (o.isAnyArrayBuffer(t)) {
|
|
98
|
+
var l = new Uint8Array(t);
|
|
99
|
+
n = l;
|
|
100
|
+
s = l.byteLength;
|
|
101
|
+
} else if (ArrayBuffer.isView(t)) {
|
|
102
|
+
var u = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
|
|
103
|
+
n = u;
|
|
104
|
+
s = u.byteLength;
|
|
105
|
+
} else if ((e => "object" == typeof e && "function" == typeof e.getReader && "function" == typeof e.cancel && "function" == typeof e.tee)(t)) {
|
|
106
|
+
n = t;
|
|
107
|
+
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.set && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.delete && "function" == typeof e.keys && "function" == typeof e.values && "function" == typeof e.entries && "function" == typeof e.constructor && "FormData" === e[Symbol.toStringTag])(t)) {
|
|
108
|
+
var d = `formdata-${a.randomBytes(8).toString("hex")}`;
|
|
109
|
+
r = `multipart/form-data; boundary=${d}`;
|
|
110
|
+
s = ((e, t) => {
|
|
111
|
+
var r = Buffer.byteLength(getFormFooter(t));
|
|
112
|
+
for (var [n, o] of e) {
|
|
113
|
+
r += Buffer.byteLength(getFormHeader(t, n, o)) + (isBlob(o) ? o.size : Buffer.byteLength(`${o}`)) + 2;
|
|
114
|
+
}
|
|
115
|
+
return r;
|
|
116
|
+
})(t, d);
|
|
117
|
+
n = e.Readable.from(async function* generatorOfFormData(e, t) {
|
|
118
|
+
var r = new TextEncoder;
|
|
119
|
+
for (var [n, o] of e) {
|
|
120
|
+
if (isBlob(o)) {
|
|
121
|
+
yield r.encode(getFormHeader(t, n, o));
|
|
122
|
+
yield* o.stream();
|
|
123
|
+
yield r.encode(c);
|
|
124
|
+
} else {
|
|
125
|
+
yield r.encode(getFormHeader(t, n, o) + o + c);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
yield r.encode(getFormFooter(t));
|
|
129
|
+
}(t, d));
|
|
130
|
+
} else if ((t => "function" == typeof t.getBoundary && "function" == typeof t.hasKnownLength && "function" == typeof t.getLengthSync && e.Readable.isReadable(t))(t)) {
|
|
131
|
+
r = `multipart/form-data; boundary=${t.getBoundary()}`;
|
|
132
|
+
s = t.hasKnownLength() ? t.getLengthSync() : null;
|
|
133
|
+
n = t;
|
|
134
|
+
} else if ((t => e.Readable.isReadable(t))(t)) {
|
|
135
|
+
n = t;
|
|
136
|
+
} else if ((e => "function" == typeof e[Symbol.asyncIterator] || "function" == typeof e[Symbol.iterator])(t)) {
|
|
137
|
+
n = e.Readable.from(t);
|
|
138
|
+
} else {
|
|
139
|
+
var y = p.encode(`${t}`);
|
|
140
|
+
r = "text/plain;charset=UTF-8";
|
|
141
|
+
n = y;
|
|
142
|
+
s = y.byteLength;
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
contentLength: s,
|
|
146
|
+
contentType: r,
|
|
147
|
+
body: n
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
class InflateStream extends e.Transform {
|
|
152
|
+
constructor(e) {
|
|
153
|
+
super();
|
|
154
|
+
this._opts = e;
|
|
155
|
+
}
|
|
156
|
+
_transform(e, t, r) {
|
|
157
|
+
if (!this._inflate) {
|
|
158
|
+
if (0 === e.length) {
|
|
159
|
+
r();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
this._inflate = 8 == (15 & e[0]) ? u.createInflate(this._opts) : u.createInflateRaw(this._opts);
|
|
163
|
+
this._inflate.on("data", this.push.bind(this));
|
|
164
|
+
this._inflate.on("end", (() => this.push(null)));
|
|
165
|
+
this._inflate.on("error", (e => this.destroy(e)));
|
|
166
|
+
}
|
|
167
|
+
this._inflate.write(e, t, r);
|
|
168
|
+
}
|
|
169
|
+
_final(e) {
|
|
170
|
+
if (this._inflate) {
|
|
171
|
+
this._inflate.end();
|
|
172
|
+
this._inflate = void 0;
|
|
173
|
+
}
|
|
174
|
+
e();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
var headersOfRawHeaders = e => {
|
|
179
|
+
var t = new Headers;
|
|
180
|
+
for (var r = 0; r < e.length; r += 2) {
|
|
181
|
+
t.set(e[r], e[r + 1]);
|
|
182
|
+
}
|
|
183
|
+
return t;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
var methodToHttpOption = e => {
|
|
187
|
+
switch (e) {
|
|
188
|
+
case "CONNECT":
|
|
189
|
+
case "TRACE":
|
|
190
|
+
case "TRACK":
|
|
191
|
+
throw new TypeError(`Failed to construct 'Request': '${e}' HTTP method is unsupported.`);
|
|
192
|
+
|
|
193
|
+
default:
|
|
194
|
+
return e ? e.toUpperCase() : "GET";
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
var urlToHttpOptions = e => {
|
|
199
|
+
var t = new URL(e);
|
|
200
|
+
switch (t.protocol) {
|
|
201
|
+
case "http:":
|
|
202
|
+
case "https:":
|
|
203
|
+
return l.urlToHttpOptions(t);
|
|
204
|
+
|
|
205
|
+
default:
|
|
206
|
+
throw new TypeError(`URL scheme "${t.protocol}" is not supported.`);
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
async function fetch(t, r) {
|
|
211
|
+
var n = (e => null != e && "object" == typeof e && "body" in e)(t);
|
|
212
|
+
var o = n ? t.url : t;
|
|
213
|
+
var a = n ? t.body : r?.body || null;
|
|
214
|
+
var s = n ? t.signal : r?.signal || void 0;
|
|
215
|
+
var l = (e => {
|
|
216
|
+
switch (e) {
|
|
217
|
+
case "follow":
|
|
218
|
+
case "manual":
|
|
219
|
+
case "error":
|
|
220
|
+
return e;
|
|
221
|
+
|
|
222
|
+
case void 0:
|
|
223
|
+
return "follow";
|
|
224
|
+
|
|
225
|
+
default:
|
|
226
|
+
throw new TypeError(`Request constructor: ${e} is not an accepted type. Expected one of follow, manual, error.`);
|
|
227
|
+
}
|
|
228
|
+
})(n ? t.redirect : r?.redirect);
|
|
229
|
+
var c = new URL(o);
|
|
230
|
+
var d = extractBody(a);
|
|
231
|
+
var p = 0;
|
|
232
|
+
var y = new Headers(r?.headers || (n ? t.headers : void 0));
|
|
233
|
+
var h = {
|
|
234
|
+
...urlToHttpOptions(c),
|
|
235
|
+
method: methodToHttpOption(n ? t.method : r?.method),
|
|
236
|
+
signal: s
|
|
237
|
+
};
|
|
238
|
+
return await new Promise((function _fetch(t, r) {
|
|
239
|
+
var n = h.method;
|
|
240
|
+
var o = ("https:" === h.protocol ? i : f).request(h);
|
|
241
|
+
o.on("response", (o => {
|
|
242
|
+
o.setTimeout(0);
|
|
243
|
+
var i = {
|
|
244
|
+
status: o.statusCode,
|
|
245
|
+
statusText: o.statusMessage,
|
|
246
|
+
headers: headersOfRawHeaders(o.rawHeaders)
|
|
247
|
+
};
|
|
248
|
+
if (301 === (b = i.status) || 302 === b || 303 === b || 307 === b || 308 === b) {
|
|
249
|
+
var f = i.headers.get("Location");
|
|
250
|
+
var v = null != f ? new URL(f, c) : null;
|
|
251
|
+
if ("error" === l) {
|
|
252
|
+
r(new Error("URI requested responds with a redirect, redirect mode is set to error"));
|
|
253
|
+
return;
|
|
254
|
+
} else if ("manual" === l && null !== v) {
|
|
255
|
+
i.headers.set("Location", v.toString());
|
|
256
|
+
} else if ("follow" === l && null !== v) {
|
|
257
|
+
if (++p > 20) {
|
|
258
|
+
r(new Error(`maximum redirect reached at: ${c}`));
|
|
259
|
+
return;
|
|
260
|
+
} else if ("http:" !== v.protocol && "https:" !== v.protocol) {
|
|
261
|
+
r(new Error("URL scheme must be a HTTP(S) scheme"));
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (303 === i.status || (301 === i.status || 302 === i.status) && "POST" === n) {
|
|
265
|
+
d = extractBody(null);
|
|
266
|
+
h.method = "GET";
|
|
267
|
+
y.delete("Content-Length");
|
|
268
|
+
} else if (null != d.body && null == d.contentLength) {
|
|
269
|
+
r(new Error("Cannot follow redirect with a streamed body"));
|
|
270
|
+
return;
|
|
271
|
+
} else {
|
|
272
|
+
d = extractBody(a);
|
|
273
|
+
}
|
|
274
|
+
Object.assign(h, urlToHttpOptions(c = v));
|
|
275
|
+
return _fetch(t, r);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
var b;
|
|
279
|
+
var destroy = e => {
|
|
280
|
+
s?.removeEventListener("abort", destroy);
|
|
281
|
+
if (e) {
|
|
282
|
+
o.destroy(s?.aborted ? s.reason : e);
|
|
283
|
+
r(s?.aborted ? s.reason : e);
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
s?.addEventListener("abort", destroy);
|
|
287
|
+
var g = o;
|
|
288
|
+
var m = i.headers.get("Content-Encoding")?.toLowerCase();
|
|
289
|
+
if ("HEAD" === n || 204 === i.status || 304 === i.status) {
|
|
290
|
+
g = null;
|
|
291
|
+
} else if (null != m) {
|
|
292
|
+
i.headers.set("Content-Encoding", m);
|
|
293
|
+
g = e.pipeline(g, (t => {
|
|
294
|
+
switch (t) {
|
|
295
|
+
case "br":
|
|
296
|
+
return u.createBrotliDecompress({
|
|
297
|
+
flush: u.constants.BROTLI_OPERATION_FLUSH,
|
|
298
|
+
finishFlush: u.constants.BROTLI_OPERATION_FLUSH
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
case "gzip":
|
|
302
|
+
case "x-gzip":
|
|
303
|
+
return u.createGunzip({
|
|
304
|
+
flush: u.constants.Z_SYNC_FLUSH,
|
|
305
|
+
finishFlush: u.constants.Z_SYNC_FLUSH
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
case "deflate":
|
|
309
|
+
case "x-deflate":
|
|
310
|
+
return new InflateStream({
|
|
311
|
+
flush: u.constants.Z_SYNC_FLUSH,
|
|
312
|
+
finishFlush: u.constants.Z_SYNC_FLUSH
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
default:
|
|
316
|
+
return new e.PassThrough;
|
|
317
|
+
}
|
|
318
|
+
})(m), destroy);
|
|
319
|
+
}
|
|
320
|
+
t(function createResponse(e, t, r) {
|
|
321
|
+
var n = new Response(e, t);
|
|
322
|
+
Object.defineProperty(n, "url", {
|
|
323
|
+
value: r.url
|
|
324
|
+
});
|
|
325
|
+
if ("default" !== r.type) {
|
|
326
|
+
Object.defineProperty(n, "type", {
|
|
327
|
+
value: r.type
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
if (r.redirected) {
|
|
331
|
+
Object.defineProperty(n, "redirected", {
|
|
332
|
+
value: r.redirected
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return n;
|
|
336
|
+
}(g, i, {
|
|
337
|
+
type: "default",
|
|
338
|
+
url: c.toString(),
|
|
339
|
+
redirected: p > 0
|
|
340
|
+
}));
|
|
341
|
+
}));
|
|
342
|
+
o.on("error", r);
|
|
343
|
+
if (!y.has("Accept")) {
|
|
344
|
+
y.set("Accept", "*/*");
|
|
345
|
+
}
|
|
346
|
+
if (d.contentType) {
|
|
347
|
+
y.set("Content-Type", d.contentType);
|
|
348
|
+
}
|
|
349
|
+
if (null == d.body && ("POST" === n || "PUT" === n)) {
|
|
350
|
+
y.set("Content-Length", "0");
|
|
351
|
+
} else if (null != d.body && null != d.contentLength) {
|
|
352
|
+
y.set("Content-Length", `${d.contentLength}`);
|
|
353
|
+
}
|
|
354
|
+
((e, t) => {
|
|
355
|
+
if ("function" == typeof e.setHeaders) {
|
|
356
|
+
e.setHeaders(t);
|
|
357
|
+
} else {
|
|
358
|
+
for (var [r, n] of t) {
|
|
359
|
+
e.setHeader(r, n);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
})(o, y);
|
|
363
|
+
if (null == d.body) {
|
|
364
|
+
o.end();
|
|
365
|
+
} else if (d.body instanceof Uint8Array) {
|
|
366
|
+
o.write(d.body);
|
|
367
|
+
o.end();
|
|
368
|
+
} else {
|
|
369
|
+
var v = d.body instanceof e.Stream ? d.body : e.Readable.fromWeb(d.body);
|
|
370
|
+
e.pipeline(v, o, (e => {
|
|
371
|
+
if (e) {
|
|
372
|
+
r(e);
|
|
373
|
+
}
|
|
374
|
+
}));
|
|
375
|
+
}
|
|
376
|
+
}));
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
exports.default = fetch;
|
|
380
|
+
|
|
381
|
+
exports.fetch = fetch;
|
|
382
|
+
//# sourceMappingURL=minifetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minifetch.js","sources":["../src/body.ts","../src/encoding.ts","../src/fetch.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { isAnyArrayBuffer } from 'node:util/types';\nimport { randomBytes } from 'node:crypto';\n\nexport type BodyInit =\n | Exclude<RequestInit['body'], undefined | null>\n | FormDataPolyfill\n | Readable;\n\nexport interface BodyState {\n contentLength: number | null;\n contentType: string | null;\n body: Readable | ReadableStream | Uint8Array | null;\n}\n\ninterface FormDataPolyfill extends Readable {\n getBoundary(): string;\n getLengthSync(): number;\n hasKnownLength(): number;\n}\n\nconst CRLF = '\\r\\n';\nconst CRLF_LENGTH = 2;\nconst BOUNDARY = '-'.repeat(2);\n\nconst isReadable = (object: any): object is Readable =>\n Readable.isReadable(object);\n\nconst isIterable = (\n object: any\n): object is AsyncIterable<any> | Iterable<any> =>\n typeof object[Symbol.asyncIterator] === 'function' ||\n typeof object[Symbol.iterator] === 'function';\n\nconst isMultipartFormDataStream = (object: any): object is FormDataPolyfill =>\n typeof object.getBoundary === 'function' &&\n typeof object.hasKnownLength === 'function' &&\n typeof object.getLengthSync === 'function' &&\n Readable.isReadable(object);\n\nconst isFormData = (object: any): object is FormData =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.set === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.keys === 'function' &&\n typeof object.values === 'function' &&\n typeof object.entries === 'function' &&\n typeof object.constructor === 'function' &&\n object[Symbol.toStringTag] === 'FormData';\n\nconst isURLSearchParameters = (object: any): object is URLSearchParams =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n typeof object.sort === 'function' &&\n object[Symbol.toStringTag] === 'URLSearchParams';\n\nconst isReadableStream = (object: any): object is ReadableStream =>\n typeof object === 'object' &&\n typeof object.getReader === 'function' &&\n typeof object.cancel === 'function' &&\n typeof object.tee === 'function';\n\nconst isBlob = (object: any): object is Blob => {\n if (\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function'\n ) {\n const tag = object[Symbol.toStringTag];\n return tag.startsWith('Blob') || tag.startsWith('File');\n } else {\n return false;\n }\n};\n\nconst makeFormBoundary = (): string =>\n `formdata-${randomBytes(8).toString('hex')}`;\n\nconst getFormHeader = (\n boundary: string,\n name: string,\n field: File | Blob | string\n): string => {\n let header = `${BOUNDARY}${boundary}${CRLF}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n if (isBlob(field)) {\n header += `; filename=\"${(field as File).name ?? 'blob'}\"${CRLF}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n return `${header}${CRLF}${CRLF}`;\n};\n\nconst getFormFooter = (boundary: string) =>\n `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`;\n\nexport const getFormDataLength = (form: FormData, boundary: string) => {\n let length = Buffer.byteLength(getFormFooter(boundary));\n for (const [name, value] of form)\n length +=\n Buffer.byteLength(getFormHeader(boundary, name, value)) +\n (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) +\n CRLF_LENGTH;\n return length;\n};\n\nasync function* generatorOfFormData(\n form: FormData,\n boundary: string\n): AsyncGenerator<ArrayBufferLike> {\n const encoder = new TextEncoder();\n for (const [name, value] of form) {\n if (isBlob(value)) {\n yield encoder.encode(getFormHeader(boundary, name, value));\n yield* value.stream();\n yield encoder.encode(CRLF);\n } else {\n yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF);\n }\n }\n yield encoder.encode(getFormFooter(boundary));\n}\n\nconst encoder = new TextEncoder();\n\nexport const extractBody = (object: BodyInit | null): BodyState => {\n let type: string | null = null;\n let body: Readable | ReadableStream | Uint8Array | null;\n let size: number | null = null;\n if (object == null) {\n body = null;\n size = 0;\n } else if (typeof object === 'string') {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n size = bytes.byteLength;\n body = bytes;\n } else if (isURLSearchParameters(object)) {\n const bytes = encoder.encode(object.toString());\n body = bytes;\n size = bytes.byteLength;\n type = 'application/x-www-form-urlencoded;charset=UTF-8';\n } else if (isBlob(object)) {\n size = object.size;\n type = object.type || null;\n body = object.stream();\n } else if (object instanceof Uint8Array) {\n body = object;\n size = object.byteLength;\n } else if (isAnyArrayBuffer(object)) {\n const bytes = new Uint8Array(object);\n body = bytes;\n size = bytes.byteLength;\n } else if (ArrayBuffer.isView(object)) {\n const bytes = new Uint8Array(\n object.buffer,\n object.byteOffset,\n object.byteLength\n );\n body = bytes;\n size = bytes.byteLength;\n } else if (isReadableStream(object)) {\n body = object;\n } else if (isFormData(object)) {\n const boundary = makeFormBoundary();\n type = `multipart/form-data; boundary=${boundary}`;\n size = getFormDataLength(object, boundary);\n body = Readable.from(generatorOfFormData(object, boundary));\n } else if (isMultipartFormDataStream(object)) {\n type = `multipart/form-data; boundary=${object.getBoundary()}`;\n size = object.hasKnownLength() ? object.getLengthSync() : null;\n body = object as Readable;\n } else if (isReadable(object)) {\n body = object as Readable;\n } else if (isIterable(object)) {\n body = Readable.from(object);\n } else {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n body = bytes;\n size = bytes.byteLength;\n }\n return {\n contentLength: size,\n contentType: type,\n body,\n };\n};\n","import { PassThrough, Transform, TransformCallback } from 'node:stream';\nimport * as zlib from 'node:zlib';\n\n/** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */\ntype Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {};\n\n/** @see https://github.com/nodejs/undici/pull/2650 */\nclass InflateStream extends Transform {\n _opts?: zlib.ZlibOptions;\n _inflate?: Transform;\n\n constructor(opts?: zlib.ZlibOptions) {\n super();\n this._opts = opts;\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this._inflate) {\n if (chunk.length === 0) {\n callback();\n return;\n }\n this._inflate =\n (chunk[0] & 0x0f) === 0x08\n ? zlib.createInflate(this._opts)\n : zlib.createInflateRaw(this._opts);\n this._inflate.on('data', this.push.bind(this));\n this._inflate.on('end', () => this.push(null));\n this._inflate.on('error', err => this.destroy(err));\n }\n this._inflate.write(chunk, encoding, callback);\n }\n\n _final(callback: TransformCallback) {\n if (this._inflate) {\n this._inflate.end();\n this._inflate = undefined;\n }\n callback();\n }\n}\n\nexport const createContentDecoder = (encoding: Encoding | {}) => {\n // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160\n switch (encoding) {\n case 'br':\n return zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n case 'gzip':\n case 'x-gzip':\n return zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n case 'deflate':\n case 'x-deflate':\n return new InflateStream({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n default:\n return new PassThrough();\n }\n};\n","import { Stream, Readable, pipeline } from 'node:stream';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\n\nimport { extractBody } from './body';\nimport { createContentDecoder } from './encoding';\n\n/** Maximum allowed redirects (matching Chromium's limit) */\nconst MAX_REDIRECTS = 20;\n\n/** Convert Node.js raw headers array to Headers */\nconst headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2)\n headers.set(rawHeaders[i], rawHeaders[i + 1]);\n return headers;\n};\n\n/** Assign Headers to a Node.js OutgoingMessage (request) */\nconst assignOutgoingMessageHeaders = (\n outgoing: http.OutgoingMessage,\n headers: Headers\n) => {\n if (typeof outgoing.setHeaders === 'function') {\n outgoing.setHeaders(headers);\n } else {\n for (const [key, value] of headers) outgoing.setHeader(key, value);\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst toRedirectOption = (\n redirect: string | undefined\n): 'follow' | 'manual' | 'error' => {\n switch (redirect) {\n case 'follow':\n case 'manual':\n case 'error':\n return redirect;\n case undefined:\n return 'follow';\n default:\n throw new TypeError(\n `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.`\n );\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst methodToHttpOption = (method: string | undefined): string => {\n switch (method) {\n case 'CONNECT':\n case 'TRACE':\n case 'TRACK':\n throw new TypeError(\n `Failed to construct 'Request': '${method}' HTTP method is unsupported.`\n );\n default:\n return method ? method.toUpperCase() : 'GET';\n }\n};\n\n/** Convert URL to Node.js HTTP request options and disallow unsupported protocols */\nconst urlToHttpOptions = (input: URL) => {\n const _url = new URL(input);\n switch (_url.protocol) {\n // TODO: 'file:' and 'data:' support\n case 'http:':\n case 'https:':\n return url.urlToHttpOptions(_url);\n default:\n throw new TypeError(`URL scheme \"${_url.protocol}\" is not supported.`);\n }\n};\n\n/** Returns if `input` is a Request object */\nconst isRequest = (input: any): input is Request =>\n input != null && typeof input === 'object' && 'body' in input;\n\n/** Returns if status `code` is a redirect code */\nconst isRedirectCode = (\n code: number | undefined\n): code is 301 | 302 | 303 | 307 | 308 =>\n code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n\nfunction createResponse(\n body: ConstructorParameters<typeof Response>[0] | null,\n init: ResponseInit,\n params: {\n url: string;\n redirected: boolean;\n type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';\n }\n) {\n const response = new Response(body, init);\n Object.defineProperty(response, 'url', { value: params.url });\n if (params.type !== 'default')\n Object.defineProperty(response, 'type', { value: params.type });\n if (params.redirected)\n Object.defineProperty(response, 'redirected', { value: params.redirected });\n return response;\n}\n\nexport async function fetch(\n input: string | URL | Request,\n requestInit?: RequestInit\n): Promise<Response> {\n const initFromRequest = isRequest(input);\n const initUrl = initFromRequest ? input.url : input;\n const initBody = initFromRequest ? input.body : requestInit?.body || null;\n const signal = initFromRequest\n ? input.signal\n : requestInit?.signal || undefined;\n const redirect = toRedirectOption(\n initFromRequest ? input.redirect : requestInit?.redirect\n );\n\n let requestUrl = new URL(initUrl);\n let requestBody = extractBody(initBody);\n let redirects = 0;\n\n const requestHeaders = new Headers(\n requestInit?.headers || (initFromRequest ? input.headers : undefined)\n );\n const requestOptions = {\n ...urlToHttpOptions(requestUrl),\n method: methodToHttpOption(\n initFromRequest ? input.method : requestInit?.method\n ),\n signal,\n } satisfies http.RequestOptions;\n\n function _fetch(\n resolve: (response: Response | Promise<Response>) => void,\n reject: (reason?: any) => void\n ) {\n const method = requestOptions.method;\n const protocol = requestOptions.protocol === 'https:' ? https : http;\n const outgoing = protocol.request(requestOptions);\n\n outgoing.on('response', incoming => {\n incoming.setTimeout(0); // Forcefully disable timeout\n\n const init = {\n status: incoming.statusCode,\n statusText: incoming.statusMessage,\n headers: headersOfRawHeaders(incoming.rawHeaders),\n } satisfies ResponseInit;\n\n if (isRedirectCode(init.status)) {\n const location = init.headers.get('Location');\n const locationURL =\n location != null ? new URL(location, requestUrl) : null;\n if (redirect === 'error') {\n // TODO: do we need a special Error instance here?\n reject(\n new Error(\n 'URI requested responds with a redirect, redirect mode is set to error'\n )\n );\n return;\n } else if (redirect === 'manual' && locationURL !== null) {\n init.headers.set('Location', locationURL.toString());\n } else if (redirect === 'follow' && locationURL !== null) {\n if (++redirects > MAX_REDIRECTS) {\n reject(new Error(`maximum redirect reached at: ${requestUrl}`));\n return;\n } else if (\n locationURL.protocol !== 'http:' &&\n locationURL.protocol !== 'https:'\n ) {\n // TODO: do we need a special Error instance here?\n reject(new Error('URL scheme must be a HTTP(S) scheme'));\n return;\n }\n\n if (\n init.status === 303 ||\n ((init.status === 301 || init.status === 302) && method === 'POST')\n ) {\n requestBody = extractBody(null);\n requestOptions.method = 'GET';\n requestHeaders.delete('Content-Length');\n } else if (\n requestBody.body != null &&\n requestBody.contentLength == null\n ) {\n reject(new Error('Cannot follow redirect with a streamed body'));\n return;\n } else {\n requestBody = extractBody(initBody);\n }\n\n Object.assign(\n requestOptions,\n urlToHttpOptions((requestUrl = locationURL))\n );\n return _fetch(resolve, reject);\n }\n }\n\n const destroy = (reason?: any) => {\n signal?.removeEventListener('abort', destroy);\n if (reason) {\n incoming.destroy(signal?.aborted ? signal.reason : reason);\n reject(signal?.aborted ? signal.reason : reason);\n }\n };\n\n signal?.addEventListener('abort', destroy);\n\n let body: Readable | null = incoming;\n const encoding = init.headers.get('Content-Encoding')?.toLowerCase();\n if (method === 'HEAD' || init.status === 204 || init.status === 304) {\n body = null;\n } else if (encoding != null) {\n init.headers.set('Content-Encoding', encoding);\n body = pipeline(body, createContentDecoder(encoding), destroy);\n }\n\n resolve(\n createResponse(body, init, {\n type: 'default',\n url: requestUrl.toString(),\n redirected: redirects > 0,\n })\n );\n });\n\n outgoing.on('error', reject);\n\n if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*');\n if (requestBody.contentType)\n requestHeaders.set('Content-Type', requestBody.contentType);\n\n if (requestBody.body == null && (method === 'POST' || method === 'PUT')) {\n requestHeaders.set('Content-Length', '0');\n } else if (requestBody.body != null && requestBody.contentLength != null) {\n requestHeaders.set('Content-Length', `${requestBody.contentLength}`);\n }\n\n assignOutgoingMessageHeaders(outgoing, requestHeaders);\n\n if (requestBody.body == null) {\n outgoing.end();\n } else if (requestBody.body instanceof Uint8Array) {\n outgoing.write(requestBody.body);\n outgoing.end();\n } else {\n const body =\n requestBody.body instanceof Stream\n ? requestBody.body\n : Readable.fromWeb(requestBody.body);\n pipeline(body, outgoing, error => {\n if (error) reject(error);\n });\n }\n }\n\n return await new Promise(_fetch);\n}\n"],"names":["CRLF","BOUNDARY","repeat","isBlob","object","arrayBuffer","type","stream","constructor","tag","Symbol","toStringTag","startsWith","getFormHeader","boundary","name","field","header","getFormFooter","encoder","TextEncoder","extractBody","body","size","bytes","encode","byteLength","append","delete","get","getAll","has","set","sort","isURLSearchParameters","toString","Uint8Array","isAnyArrayBuffer","ArrayBuffer","isView","buffer","byteOffset","getReader","cancel","tee","isReadableStream","keys","values","entries","isFormData","randomBytes","getFormDataLength","form","length","Buffer","value","Readable","from","async","generatorOfFormData","getBoundary","hasKnownLength","getLengthSync","isReadable","isMultipartFormDataStream","asyncIterator","iterator","isIterable","contentLength","contentType","InflateStream","Transform","opts","super","this","_opts","_transform","chunk","encoding","callback","_inflate","zlib","createInflate","createInflateRaw","on","push","bind","err","destroy","write","_final","end","undefined","headersOfRawHeaders","rawHeaders","headers","Headers","i","methodToHttpOption","method","TypeError","toUpperCase","urlToHttpOptions","input","_url","URL","protocol","url","fetch","requestInit","initFromRequest","isRequest","initUrl","initBody","signal","redirect","toRedirectOption","requestUrl","requestBody","redirects","requestHeaders","requestOptions","Promise","_fetch","resolve","reject","outgoing","https","http","request","incoming","setTimeout","init","status","statusCode","statusText","statusMessage","code","location","locationURL","Error","Object","assign","reason","removeEventListener","aborted","addEventListener","toLowerCase","pipeline","createBrotliDecompress","flush","constants","BROTLI_OPERATION_FLUSH","finishFlush","createGunzip","Z_SYNC_FLUSH","PassThrough","createContentDecoder","createResponse","params","response","Response","defineProperty","redirected","assignOutgoingMessageHeaders","setHeaders","key","setHeader","Stream","fromWeb","error"],"mappings":"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"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { Readable as e, PassThrough as t, Transform as n, pipeline as r, Stream as o } from "node:stream";
|
|
2
|
+
|
|
3
|
+
import * as a from "node:https";
|
|
4
|
+
|
|
5
|
+
import * as s from "node:http";
|
|
6
|
+
|
|
7
|
+
import * as i from "node:url";
|
|
8
|
+
|
|
9
|
+
import { isAnyArrayBuffer as f } from "node:util/types";
|
|
10
|
+
|
|
11
|
+
import { randomBytes as l } from "node:crypto";
|
|
12
|
+
|
|
13
|
+
import * as c from "node:zlib";
|
|
14
|
+
|
|
15
|
+
var u = "\r\n";
|
|
16
|
+
|
|
17
|
+
var d = "-".repeat(2);
|
|
18
|
+
|
|
19
|
+
var isBlob = e => {
|
|
20
|
+
if ("object" == typeof e && "function" == typeof e.arrayBuffer && "string" == typeof e.type && "function" == typeof e.stream && "function" == typeof e.constructor) {
|
|
21
|
+
var t = e[Symbol.toStringTag];
|
|
22
|
+
return t.startsWith("Blob") || t.startsWith("File");
|
|
23
|
+
} else {
|
|
24
|
+
return !1;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
var getFormHeader = (e, t, n) => {
|
|
29
|
+
var r = `${d}${e}${u}`;
|
|
30
|
+
r += `Content-Disposition: form-data; name="${t}"`;
|
|
31
|
+
if (isBlob(n)) {
|
|
32
|
+
r += `; filename="${n.name ?? "blob"}"${u}`;
|
|
33
|
+
r += `Content-Type: ${n.type || "application/octet-stream"}`;
|
|
34
|
+
}
|
|
35
|
+
return `${r}${u}${u}`;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
var getFormFooter = e => `${d}${e}${d}${u}${u}`;
|
|
39
|
+
|
|
40
|
+
var p = new TextEncoder;
|
|
41
|
+
|
|
42
|
+
var extractBody = t => {
|
|
43
|
+
var n = null;
|
|
44
|
+
var r;
|
|
45
|
+
var o = null;
|
|
46
|
+
if (null == t) {
|
|
47
|
+
r = null;
|
|
48
|
+
o = 0;
|
|
49
|
+
} else if ("string" == typeof t) {
|
|
50
|
+
var a = p.encode(`${t}`);
|
|
51
|
+
n = "text/plain;charset=UTF-8";
|
|
52
|
+
o = a.byteLength;
|
|
53
|
+
r = a;
|
|
54
|
+
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.delete && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.has && "function" == typeof e.set && "function" == typeof e.sort && "URLSearchParams" === e[Symbol.toStringTag])(t)) {
|
|
55
|
+
var s = p.encode(t.toString());
|
|
56
|
+
r = s;
|
|
57
|
+
o = s.byteLength;
|
|
58
|
+
n = "application/x-www-form-urlencoded;charset=UTF-8";
|
|
59
|
+
} else if (isBlob(t)) {
|
|
60
|
+
o = t.size;
|
|
61
|
+
n = t.type || null;
|
|
62
|
+
r = t.stream();
|
|
63
|
+
} else if (t instanceof Uint8Array) {
|
|
64
|
+
r = t;
|
|
65
|
+
o = t.byteLength;
|
|
66
|
+
} else if (f(t)) {
|
|
67
|
+
var i = new Uint8Array(t);
|
|
68
|
+
r = i;
|
|
69
|
+
o = i.byteLength;
|
|
70
|
+
} else if (ArrayBuffer.isView(t)) {
|
|
71
|
+
var c = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
|
|
72
|
+
r = c;
|
|
73
|
+
o = c.byteLength;
|
|
74
|
+
} else if ((e => "object" == typeof e && "function" == typeof e.getReader && "function" == typeof e.cancel && "function" == typeof e.tee)(t)) {
|
|
75
|
+
r = t;
|
|
76
|
+
} else if ((e => "object" == typeof e && "function" == typeof e.append && "function" == typeof e.set && "function" == typeof e.get && "function" == typeof e.getAll && "function" == typeof e.delete && "function" == typeof e.keys && "function" == typeof e.values && "function" == typeof e.entries && "function" == typeof e.constructor && "FormData" === e[Symbol.toStringTag])(t)) {
|
|
77
|
+
var d = `formdata-${l(8).toString("hex")}`;
|
|
78
|
+
n = `multipart/form-data; boundary=${d}`;
|
|
79
|
+
o = ((e, t) => {
|
|
80
|
+
var n = Buffer.byteLength(getFormFooter(t));
|
|
81
|
+
for (var [r, o] of e) {
|
|
82
|
+
n += Buffer.byteLength(getFormHeader(t, r, o)) + (isBlob(o) ? o.size : Buffer.byteLength(`${o}`)) + 2;
|
|
83
|
+
}
|
|
84
|
+
return n;
|
|
85
|
+
})(t, d);
|
|
86
|
+
r = e.from(async function* generatorOfFormData(e, t) {
|
|
87
|
+
var n = new TextEncoder;
|
|
88
|
+
for (var [r, o] of e) {
|
|
89
|
+
if (isBlob(o)) {
|
|
90
|
+
yield n.encode(getFormHeader(t, r, o));
|
|
91
|
+
yield* o.stream();
|
|
92
|
+
yield n.encode(u);
|
|
93
|
+
} else {
|
|
94
|
+
yield n.encode(getFormHeader(t, r, o) + o + u);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
yield n.encode(getFormFooter(t));
|
|
98
|
+
}(t, d));
|
|
99
|
+
} else if ((t => "function" == typeof t.getBoundary && "function" == typeof t.hasKnownLength && "function" == typeof t.getLengthSync && e.isReadable(t))(t)) {
|
|
100
|
+
n = `multipart/form-data; boundary=${t.getBoundary()}`;
|
|
101
|
+
o = t.hasKnownLength() ? t.getLengthSync() : null;
|
|
102
|
+
r = t;
|
|
103
|
+
} else if ((t => e.isReadable(t))(t)) {
|
|
104
|
+
r = t;
|
|
105
|
+
} else if ((e => "function" == typeof e[Symbol.asyncIterator] || "function" == typeof e[Symbol.iterator])(t)) {
|
|
106
|
+
r = e.from(t);
|
|
107
|
+
} else {
|
|
108
|
+
var y = p.encode(`${t}`);
|
|
109
|
+
n = "text/plain;charset=UTF-8";
|
|
110
|
+
r = y;
|
|
111
|
+
o = y.byteLength;
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
contentLength: o,
|
|
115
|
+
contentType: n,
|
|
116
|
+
body: r
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
class InflateStream extends n {
|
|
121
|
+
constructor(e) {
|
|
122
|
+
super();
|
|
123
|
+
this._opts = e;
|
|
124
|
+
}
|
|
125
|
+
_transform(e, t, n) {
|
|
126
|
+
if (!this._inflate) {
|
|
127
|
+
if (0 === e.length) {
|
|
128
|
+
n();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this._inflate = 8 == (15 & e[0]) ? c.createInflate(this._opts) : c.createInflateRaw(this._opts);
|
|
132
|
+
this._inflate.on("data", this.push.bind(this));
|
|
133
|
+
this._inflate.on("end", (() => this.push(null)));
|
|
134
|
+
this._inflate.on("error", (e => this.destroy(e)));
|
|
135
|
+
}
|
|
136
|
+
this._inflate.write(e, t, n);
|
|
137
|
+
}
|
|
138
|
+
_final(e) {
|
|
139
|
+
if (this._inflate) {
|
|
140
|
+
this._inflate.end();
|
|
141
|
+
this._inflate = void 0;
|
|
142
|
+
}
|
|
143
|
+
e();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
var headersOfRawHeaders = e => {
|
|
148
|
+
var t = new Headers;
|
|
149
|
+
for (var n = 0; n < e.length; n += 2) {
|
|
150
|
+
t.set(e[n], e[n + 1]);
|
|
151
|
+
}
|
|
152
|
+
return t;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
var methodToHttpOption = e => {
|
|
156
|
+
switch (e) {
|
|
157
|
+
case "CONNECT":
|
|
158
|
+
case "TRACE":
|
|
159
|
+
case "TRACK":
|
|
160
|
+
throw new TypeError(`Failed to construct 'Request': '${e}' HTTP method is unsupported.`);
|
|
161
|
+
|
|
162
|
+
default:
|
|
163
|
+
return e ? e.toUpperCase() : "GET";
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
var urlToHttpOptions = e => {
|
|
168
|
+
var t = new URL(e);
|
|
169
|
+
switch (t.protocol) {
|
|
170
|
+
case "http:":
|
|
171
|
+
case "https:":
|
|
172
|
+
return i.urlToHttpOptions(t);
|
|
173
|
+
|
|
174
|
+
default:
|
|
175
|
+
throw new TypeError(`URL scheme "${t.protocol}" is not supported.`);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
async function fetch(n, i) {
|
|
180
|
+
var f = (e => null != e && "object" == typeof e && "body" in e)(n);
|
|
181
|
+
var l = f ? n.url : n;
|
|
182
|
+
var u = f ? n.body : i?.body || null;
|
|
183
|
+
var d = f ? n.signal : i?.signal || void 0;
|
|
184
|
+
var p = (e => {
|
|
185
|
+
switch (e) {
|
|
186
|
+
case "follow":
|
|
187
|
+
case "manual":
|
|
188
|
+
case "error":
|
|
189
|
+
return e;
|
|
190
|
+
|
|
191
|
+
case void 0:
|
|
192
|
+
return "follow";
|
|
193
|
+
|
|
194
|
+
default:
|
|
195
|
+
throw new TypeError(`Request constructor: ${e} is not an accepted type. Expected one of follow, manual, error.`);
|
|
196
|
+
}
|
|
197
|
+
})(f ? n.redirect : i?.redirect);
|
|
198
|
+
var y = new URL(l);
|
|
199
|
+
var h = extractBody(u);
|
|
200
|
+
var m = 0;
|
|
201
|
+
var v = new Headers(i?.headers || (f ? n.headers : void 0));
|
|
202
|
+
var b = {
|
|
203
|
+
...urlToHttpOptions(y),
|
|
204
|
+
method: methodToHttpOption(f ? n.method : i?.method),
|
|
205
|
+
signal: d
|
|
206
|
+
};
|
|
207
|
+
return await new Promise((function _fetch(n, i) {
|
|
208
|
+
var f = b.method;
|
|
209
|
+
var l = ("https:" === b.protocol ? a : s).request(b);
|
|
210
|
+
l.on("response", (e => {
|
|
211
|
+
e.setTimeout(0);
|
|
212
|
+
var o = {
|
|
213
|
+
status: e.statusCode,
|
|
214
|
+
statusText: e.statusMessage,
|
|
215
|
+
headers: headersOfRawHeaders(e.rawHeaders)
|
|
216
|
+
};
|
|
217
|
+
if (301 === (l = o.status) || 302 === l || 303 === l || 307 === l || 308 === l) {
|
|
218
|
+
var a = o.headers.get("Location");
|
|
219
|
+
var s = null != a ? new URL(a, y) : null;
|
|
220
|
+
if ("error" === p) {
|
|
221
|
+
i(new Error("URI requested responds with a redirect, redirect mode is set to error"));
|
|
222
|
+
return;
|
|
223
|
+
} else if ("manual" === p && null !== s) {
|
|
224
|
+
o.headers.set("Location", s.toString());
|
|
225
|
+
} else if ("follow" === p && null !== s) {
|
|
226
|
+
if (++m > 20) {
|
|
227
|
+
i(new Error(`maximum redirect reached at: ${y}`));
|
|
228
|
+
return;
|
|
229
|
+
} else if ("http:" !== s.protocol && "https:" !== s.protocol) {
|
|
230
|
+
i(new Error("URL scheme must be a HTTP(S) scheme"));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (303 === o.status || (301 === o.status || 302 === o.status) && "POST" === f) {
|
|
234
|
+
h = extractBody(null);
|
|
235
|
+
b.method = "GET";
|
|
236
|
+
v.delete("Content-Length");
|
|
237
|
+
} else if (null != h.body && null == h.contentLength) {
|
|
238
|
+
i(new Error("Cannot follow redirect with a streamed body"));
|
|
239
|
+
return;
|
|
240
|
+
} else {
|
|
241
|
+
h = extractBody(u);
|
|
242
|
+
}
|
|
243
|
+
Object.assign(b, urlToHttpOptions(y = s));
|
|
244
|
+
return _fetch(n, i);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
var l;
|
|
248
|
+
var destroy = t => {
|
|
249
|
+
d?.removeEventListener("abort", destroy);
|
|
250
|
+
if (t) {
|
|
251
|
+
e.destroy(d?.aborted ? d.reason : t);
|
|
252
|
+
i(d?.aborted ? d.reason : t);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
d?.addEventListener("abort", destroy);
|
|
256
|
+
var g = e;
|
|
257
|
+
var w = o.headers.get("Content-Encoding")?.toLowerCase();
|
|
258
|
+
if ("HEAD" === f || 204 === o.status || 304 === o.status) {
|
|
259
|
+
g = null;
|
|
260
|
+
} else if (null != w) {
|
|
261
|
+
o.headers.set("Content-Encoding", w);
|
|
262
|
+
g = r(g, (e => {
|
|
263
|
+
switch (e) {
|
|
264
|
+
case "br":
|
|
265
|
+
return c.createBrotliDecompress({
|
|
266
|
+
flush: c.constants.BROTLI_OPERATION_FLUSH,
|
|
267
|
+
finishFlush: c.constants.BROTLI_OPERATION_FLUSH
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
case "gzip":
|
|
271
|
+
case "x-gzip":
|
|
272
|
+
return c.createGunzip({
|
|
273
|
+
flush: c.constants.Z_SYNC_FLUSH,
|
|
274
|
+
finishFlush: c.constants.Z_SYNC_FLUSH
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
case "deflate":
|
|
278
|
+
case "x-deflate":
|
|
279
|
+
return new InflateStream({
|
|
280
|
+
flush: c.constants.Z_SYNC_FLUSH,
|
|
281
|
+
finishFlush: c.constants.Z_SYNC_FLUSH
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
default:
|
|
285
|
+
return new t;
|
|
286
|
+
}
|
|
287
|
+
})(w), destroy);
|
|
288
|
+
}
|
|
289
|
+
n(function createResponse(e, t, n) {
|
|
290
|
+
var r = new Response(e, t);
|
|
291
|
+
Object.defineProperty(r, "url", {
|
|
292
|
+
value: n.url
|
|
293
|
+
});
|
|
294
|
+
if ("default" !== n.type) {
|
|
295
|
+
Object.defineProperty(r, "type", {
|
|
296
|
+
value: n.type
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
if (n.redirected) {
|
|
300
|
+
Object.defineProperty(r, "redirected", {
|
|
301
|
+
value: n.redirected
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
return r;
|
|
305
|
+
}(g, o, {
|
|
306
|
+
type: "default",
|
|
307
|
+
url: y.toString(),
|
|
308
|
+
redirected: m > 0
|
|
309
|
+
}));
|
|
310
|
+
}));
|
|
311
|
+
l.on("error", i);
|
|
312
|
+
if (!v.has("Accept")) {
|
|
313
|
+
v.set("Accept", "*/*");
|
|
314
|
+
}
|
|
315
|
+
if (h.contentType) {
|
|
316
|
+
v.set("Content-Type", h.contentType);
|
|
317
|
+
}
|
|
318
|
+
if (null == h.body && ("POST" === f || "PUT" === f)) {
|
|
319
|
+
v.set("Content-Length", "0");
|
|
320
|
+
} else if (null != h.body && null != h.contentLength) {
|
|
321
|
+
v.set("Content-Length", `${h.contentLength}`);
|
|
322
|
+
}
|
|
323
|
+
((e, t) => {
|
|
324
|
+
if ("function" == typeof e.setHeaders) {
|
|
325
|
+
e.setHeaders(t);
|
|
326
|
+
} else {
|
|
327
|
+
for (var [n, r] of t) {
|
|
328
|
+
e.setHeader(n, r);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
})(l, v);
|
|
332
|
+
if (null == h.body) {
|
|
333
|
+
l.end();
|
|
334
|
+
} else if (h.body instanceof Uint8Array) {
|
|
335
|
+
l.write(h.body);
|
|
336
|
+
l.end();
|
|
337
|
+
} else {
|
|
338
|
+
var g = h.body instanceof o ? h.body : e.fromWeb(h.body);
|
|
339
|
+
r(g, l, (e => {
|
|
340
|
+
if (e) {
|
|
341
|
+
i(e);
|
|
342
|
+
}
|
|
343
|
+
}));
|
|
344
|
+
}
|
|
345
|
+
}));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export { fetch as default, fetch };
|
|
349
|
+
//# sourceMappingURL=minifetch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minifetch.mjs","sources":["../src/body.ts","../src/encoding.ts","../src/fetch.ts"],"sourcesContent":["import { Readable } from 'node:stream';\nimport { isAnyArrayBuffer } from 'node:util/types';\nimport { randomBytes } from 'node:crypto';\n\nexport type BodyInit =\n | Exclude<RequestInit['body'], undefined | null>\n | FormDataPolyfill\n | Readable;\n\nexport interface BodyState {\n contentLength: number | null;\n contentType: string | null;\n body: Readable | ReadableStream | Uint8Array | null;\n}\n\ninterface FormDataPolyfill extends Readable {\n getBoundary(): string;\n getLengthSync(): number;\n hasKnownLength(): number;\n}\n\nconst CRLF = '\\r\\n';\nconst CRLF_LENGTH = 2;\nconst BOUNDARY = '-'.repeat(2);\n\nconst isReadable = (object: any): object is Readable =>\n Readable.isReadable(object);\n\nconst isIterable = (\n object: any\n): object is AsyncIterable<any> | Iterable<any> =>\n typeof object[Symbol.asyncIterator] === 'function' ||\n typeof object[Symbol.iterator] === 'function';\n\nconst isMultipartFormDataStream = (object: any): object is FormDataPolyfill =>\n typeof object.getBoundary === 'function' &&\n typeof object.hasKnownLength === 'function' &&\n typeof object.getLengthSync === 'function' &&\n Readable.isReadable(object);\n\nconst isFormData = (object: any): object is FormData =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.set === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.keys === 'function' &&\n typeof object.values === 'function' &&\n typeof object.entries === 'function' &&\n typeof object.constructor === 'function' &&\n object[Symbol.toStringTag] === 'FormData';\n\nconst isURLSearchParameters = (object: any): object is URLSearchParams =>\n typeof object === 'object' &&\n typeof object.append === 'function' &&\n typeof object.delete === 'function' &&\n typeof object.get === 'function' &&\n typeof object.getAll === 'function' &&\n typeof object.has === 'function' &&\n typeof object.set === 'function' &&\n typeof object.sort === 'function' &&\n object[Symbol.toStringTag] === 'URLSearchParams';\n\nconst isReadableStream = (object: any): object is ReadableStream =>\n typeof object === 'object' &&\n typeof object.getReader === 'function' &&\n typeof object.cancel === 'function' &&\n typeof object.tee === 'function';\n\nconst isBlob = (object: any): object is Blob => {\n if (\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function'\n ) {\n const tag = object[Symbol.toStringTag];\n return tag.startsWith('Blob') || tag.startsWith('File');\n } else {\n return false;\n }\n};\n\nconst makeFormBoundary = (): string =>\n `formdata-${randomBytes(8).toString('hex')}`;\n\nconst getFormHeader = (\n boundary: string,\n name: string,\n field: File | Blob | string\n): string => {\n let header = `${BOUNDARY}${boundary}${CRLF}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n if (isBlob(field)) {\n header += `; filename=\"${(field as File).name ?? 'blob'}\"${CRLF}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n return `${header}${CRLF}${CRLF}`;\n};\n\nconst getFormFooter = (boundary: string) =>\n `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`;\n\nexport const getFormDataLength = (form: FormData, boundary: string) => {\n let length = Buffer.byteLength(getFormFooter(boundary));\n for (const [name, value] of form)\n length +=\n Buffer.byteLength(getFormHeader(boundary, name, value)) +\n (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) +\n CRLF_LENGTH;\n return length;\n};\n\nasync function* generatorOfFormData(\n form: FormData,\n boundary: string\n): AsyncGenerator<ArrayBufferLike> {\n const encoder = new TextEncoder();\n for (const [name, value] of form) {\n if (isBlob(value)) {\n yield encoder.encode(getFormHeader(boundary, name, value));\n yield* value.stream();\n yield encoder.encode(CRLF);\n } else {\n yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF);\n }\n }\n yield encoder.encode(getFormFooter(boundary));\n}\n\nconst encoder = new TextEncoder();\n\nexport const extractBody = (object: BodyInit | null): BodyState => {\n let type: string | null = null;\n let body: Readable | ReadableStream | Uint8Array | null;\n let size: number | null = null;\n if (object == null) {\n body = null;\n size = 0;\n } else if (typeof object === 'string') {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n size = bytes.byteLength;\n body = bytes;\n } else if (isURLSearchParameters(object)) {\n const bytes = encoder.encode(object.toString());\n body = bytes;\n size = bytes.byteLength;\n type = 'application/x-www-form-urlencoded;charset=UTF-8';\n } else if (isBlob(object)) {\n size = object.size;\n type = object.type || null;\n body = object.stream();\n } else if (object instanceof Uint8Array) {\n body = object;\n size = object.byteLength;\n } else if (isAnyArrayBuffer(object)) {\n const bytes = new Uint8Array(object);\n body = bytes;\n size = bytes.byteLength;\n } else if (ArrayBuffer.isView(object)) {\n const bytes = new Uint8Array(\n object.buffer,\n object.byteOffset,\n object.byteLength\n );\n body = bytes;\n size = bytes.byteLength;\n } else if (isReadableStream(object)) {\n body = object;\n } else if (isFormData(object)) {\n const boundary = makeFormBoundary();\n type = `multipart/form-data; boundary=${boundary}`;\n size = getFormDataLength(object, boundary);\n body = Readable.from(generatorOfFormData(object, boundary));\n } else if (isMultipartFormDataStream(object)) {\n type = `multipart/form-data; boundary=${object.getBoundary()}`;\n size = object.hasKnownLength() ? object.getLengthSync() : null;\n body = object as Readable;\n } else if (isReadable(object)) {\n body = object as Readable;\n } else if (isIterable(object)) {\n body = Readable.from(object);\n } else {\n const bytes = encoder.encode(`${object}`);\n type = 'text/plain;charset=UTF-8';\n body = bytes;\n size = bytes.byteLength;\n }\n return {\n contentLength: size,\n contentType: type,\n body,\n };\n};\n","import { PassThrough, Transform, TransformCallback } from 'node:stream';\nimport * as zlib from 'node:zlib';\n\n/** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */\ntype Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {};\n\n/** @see https://github.com/nodejs/undici/pull/2650 */\nclass InflateStream extends Transform {\n _opts?: zlib.ZlibOptions;\n _inflate?: Transform;\n\n constructor(opts?: zlib.ZlibOptions) {\n super();\n this._opts = opts;\n }\n\n _transform(\n chunk: Buffer,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this._inflate) {\n if (chunk.length === 0) {\n callback();\n return;\n }\n this._inflate =\n (chunk[0] & 0x0f) === 0x08\n ? zlib.createInflate(this._opts)\n : zlib.createInflateRaw(this._opts);\n this._inflate.on('data', this.push.bind(this));\n this._inflate.on('end', () => this.push(null));\n this._inflate.on('error', err => this.destroy(err));\n }\n this._inflate.write(chunk, encoding, callback);\n }\n\n _final(callback: TransformCallback) {\n if (this._inflate) {\n this._inflate.end();\n this._inflate = undefined;\n }\n callback();\n }\n}\n\nexport const createContentDecoder = (encoding: Encoding | {}) => {\n // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160\n switch (encoding) {\n case 'br':\n return zlib.createBrotliDecompress({\n flush: zlib.constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,\n });\n case 'gzip':\n case 'x-gzip':\n return zlib.createGunzip({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n case 'deflate':\n case 'x-deflate':\n return new InflateStream({\n flush: zlib.constants.Z_SYNC_FLUSH,\n finishFlush: zlib.constants.Z_SYNC_FLUSH,\n });\n default:\n return new PassThrough();\n }\n};\n","import { Stream, Readable, pipeline } from 'node:stream';\nimport * as https from 'node:https';\nimport * as http from 'node:http';\nimport * as url from 'node:url';\n\nimport { extractBody } from './body';\nimport { createContentDecoder } from './encoding';\n\n/** Maximum allowed redirects (matching Chromium's limit) */\nconst MAX_REDIRECTS = 20;\n\n/** Convert Node.js raw headers array to Headers */\nconst headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => {\n const headers = new Headers();\n for (let i = 0; i < rawHeaders.length; i += 2)\n headers.set(rawHeaders[i], rawHeaders[i + 1]);\n return headers;\n};\n\n/** Assign Headers to a Node.js OutgoingMessage (request) */\nconst assignOutgoingMessageHeaders = (\n outgoing: http.OutgoingMessage,\n headers: Headers\n) => {\n if (typeof outgoing.setHeaders === 'function') {\n outgoing.setHeaders(headers);\n } else {\n for (const [key, value] of headers) outgoing.setHeader(key, value);\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst toRedirectOption = (\n redirect: string | undefined\n): 'follow' | 'manual' | 'error' => {\n switch (redirect) {\n case 'follow':\n case 'manual':\n case 'error':\n return redirect;\n case undefined:\n return 'follow';\n default:\n throw new TypeError(\n `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.`\n );\n }\n};\n\n/** Normalize methods and disallow special methods */\nconst methodToHttpOption = (method: string | undefined): string => {\n switch (method) {\n case 'CONNECT':\n case 'TRACE':\n case 'TRACK':\n throw new TypeError(\n `Failed to construct 'Request': '${method}' HTTP method is unsupported.`\n );\n default:\n return method ? method.toUpperCase() : 'GET';\n }\n};\n\n/** Convert URL to Node.js HTTP request options and disallow unsupported protocols */\nconst urlToHttpOptions = (input: URL) => {\n const _url = new URL(input);\n switch (_url.protocol) {\n // TODO: 'file:' and 'data:' support\n case 'http:':\n case 'https:':\n return url.urlToHttpOptions(_url);\n default:\n throw new TypeError(`URL scheme \"${_url.protocol}\" is not supported.`);\n }\n};\n\n/** Returns if `input` is a Request object */\nconst isRequest = (input: any): input is Request =>\n input != null && typeof input === 'object' && 'body' in input;\n\n/** Returns if status `code` is a redirect code */\nconst isRedirectCode = (\n code: number | undefined\n): code is 301 | 302 | 303 | 307 | 308 =>\n code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n\nfunction createResponse(\n body: ConstructorParameters<typeof Response>[0] | null,\n init: ResponseInit,\n params: {\n url: string;\n redirected: boolean;\n type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect';\n }\n) {\n const response = new Response(body, init);\n Object.defineProperty(response, 'url', { value: params.url });\n if (params.type !== 'default')\n Object.defineProperty(response, 'type', { value: params.type });\n if (params.redirected)\n Object.defineProperty(response, 'redirected', { value: params.redirected });\n return response;\n}\n\nexport async function fetch(\n input: string | URL | Request,\n requestInit?: RequestInit\n): Promise<Response> {\n const initFromRequest = isRequest(input);\n const initUrl = initFromRequest ? input.url : input;\n const initBody = initFromRequest ? input.body : requestInit?.body || null;\n const signal = initFromRequest\n ? input.signal\n : requestInit?.signal || undefined;\n const redirect = toRedirectOption(\n initFromRequest ? input.redirect : requestInit?.redirect\n );\n\n let requestUrl = new URL(initUrl);\n let requestBody = extractBody(initBody);\n let redirects = 0;\n\n const requestHeaders = new Headers(\n requestInit?.headers || (initFromRequest ? input.headers : undefined)\n );\n const requestOptions = {\n ...urlToHttpOptions(requestUrl),\n method: methodToHttpOption(\n initFromRequest ? input.method : requestInit?.method\n ),\n signal,\n } satisfies http.RequestOptions;\n\n function _fetch(\n resolve: (response: Response | Promise<Response>) => void,\n reject: (reason?: any) => void\n ) {\n const method = requestOptions.method;\n const protocol = requestOptions.protocol === 'https:' ? https : http;\n const outgoing = protocol.request(requestOptions);\n\n outgoing.on('response', incoming => {\n incoming.setTimeout(0); // Forcefully disable timeout\n\n const init = {\n status: incoming.statusCode,\n statusText: incoming.statusMessage,\n headers: headersOfRawHeaders(incoming.rawHeaders),\n } satisfies ResponseInit;\n\n if (isRedirectCode(init.status)) {\n const location = init.headers.get('Location');\n const locationURL =\n location != null ? new URL(location, requestUrl) : null;\n if (redirect === 'error') {\n // TODO: do we need a special Error instance here?\n reject(\n new Error(\n 'URI requested responds with a redirect, redirect mode is set to error'\n )\n );\n return;\n } else if (redirect === 'manual' && locationURL !== null) {\n init.headers.set('Location', locationURL.toString());\n } else if (redirect === 'follow' && locationURL !== null) {\n if (++redirects > MAX_REDIRECTS) {\n reject(new Error(`maximum redirect reached at: ${requestUrl}`));\n return;\n } else if (\n locationURL.protocol !== 'http:' &&\n locationURL.protocol !== 'https:'\n ) {\n // TODO: do we need a special Error instance here?\n reject(new Error('URL scheme must be a HTTP(S) scheme'));\n return;\n }\n\n if (\n init.status === 303 ||\n ((init.status === 301 || init.status === 302) && method === 'POST')\n ) {\n requestBody = extractBody(null);\n requestOptions.method = 'GET';\n requestHeaders.delete('Content-Length');\n } else if (\n requestBody.body != null &&\n requestBody.contentLength == null\n ) {\n reject(new Error('Cannot follow redirect with a streamed body'));\n return;\n } else {\n requestBody = extractBody(initBody);\n }\n\n Object.assign(\n requestOptions,\n urlToHttpOptions((requestUrl = locationURL))\n );\n return _fetch(resolve, reject);\n }\n }\n\n const destroy = (reason?: any) => {\n signal?.removeEventListener('abort', destroy);\n if (reason) {\n incoming.destroy(signal?.aborted ? signal.reason : reason);\n reject(signal?.aborted ? signal.reason : reason);\n }\n };\n\n signal?.addEventListener('abort', destroy);\n\n let body: Readable | null = incoming;\n const encoding = init.headers.get('Content-Encoding')?.toLowerCase();\n if (method === 'HEAD' || init.status === 204 || init.status === 304) {\n body = null;\n } else if (encoding != null) {\n init.headers.set('Content-Encoding', encoding);\n body = pipeline(body, createContentDecoder(encoding), destroy);\n }\n\n resolve(\n createResponse(body, init, {\n type: 'default',\n url: requestUrl.toString(),\n redirected: redirects > 0,\n })\n );\n });\n\n outgoing.on('error', reject);\n\n if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*');\n if (requestBody.contentType)\n requestHeaders.set('Content-Type', requestBody.contentType);\n\n if (requestBody.body == null && (method === 'POST' || method === 'PUT')) {\n requestHeaders.set('Content-Length', '0');\n } else if (requestBody.body != null && requestBody.contentLength != null) {\n requestHeaders.set('Content-Length', `${requestBody.contentLength}`);\n }\n\n assignOutgoingMessageHeaders(outgoing, requestHeaders);\n\n if (requestBody.body == null) {\n outgoing.end();\n } else if (requestBody.body instanceof Uint8Array) {\n outgoing.write(requestBody.body);\n outgoing.end();\n } else {\n const body =\n requestBody.body instanceof Stream\n ? requestBody.body\n : Readable.fromWeb(requestBody.body);\n pipeline(body, outgoing, error => {\n if (error) reject(error);\n });\n }\n }\n\n return await new Promise(_fetch);\n}\n"],"names":["CRLF","BOUNDARY","repeat","isBlob","object","arrayBuffer","type","stream","constructor","tag","Symbol","toStringTag","startsWith","getFormHeader","boundary","name","field","header","getFormFooter","encoder","TextEncoder","extractBody","body","size","bytes","encode","byteLength","append","delete","get","getAll","has","set","sort","isURLSearchParameters","toString","Uint8Array","isAnyArrayBuffer","ArrayBuffer","isView","buffer","byteOffset","getReader","cancel","tee","isReadableStream","keys","values","entries","isFormData","randomBytes","getFormDataLength","form","length","Buffer","value","Readable","from","async","generatorOfFormData","getBoundary","hasKnownLength","getLengthSync","isReadable","isMultipartFormDataStream","asyncIterator","iterator","isIterable","contentLength","contentType","InflateStream","Transform","opts","super","this","_opts","_transform","chunk","encoding","callback","_inflate","zlib","createInflate","createInflateRaw","on","push","bind","err","destroy","write","_final","end","undefined","headersOfRawHeaders","rawHeaders","headers","Headers","i","methodToHttpOption","method","TypeError","toUpperCase","urlToHttpOptions","input","_url","URL","protocol","url","fetch","requestInit","initFromRequest","isRequest","initUrl","initBody","signal","redirect","toRedirectOption","requestUrl","requestBody","redirects","requestHeaders","requestOptions","Promise","_fetch","resolve","reject","outgoing","https","http","request","incoming","setTimeout","init","status","statusCode","statusText","statusMessage","code","location","locationURL","Error","Object","assign","reason","removeEventListener","aborted","addEventListener","toLowerCase","pipeline","createBrotliDecompress","flush","constants","BROTLI_OPERATION_FLUSH","finishFlush","createGunzip","Z_SYNC_FLUSH","PassThrough","createContentDecoder","createResponse","params","response","Response","defineProperty","redirected","assignOutgoingMessageHeaders","setHeaders","key","setHeader","Stream","fromWeb","error"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fetch-nodeshim",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A Node.js fetch shim using built-in Request, Response, and Headers (but without native fetch)",
|
|
5
|
+
"author": "Phil Pluckthun <phil@kitten.sh>",
|
|
6
|
+
"source": "./src/index.ts",
|
|
7
|
+
"main": "./dist/minifetch",
|
|
8
|
+
"module": "./dist/minifetch.mjs",
|
|
9
|
+
"types": "./dist/minifetch.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"LICENSE.md",
|
|
12
|
+
"README.md",
|
|
13
|
+
"CHANGELOG.md",
|
|
14
|
+
"dist/"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/minifetch.d.ts",
|
|
19
|
+
"import": "./dist/minifetch.mjs",
|
|
20
|
+
"require": "./dist/minifetch.js",
|
|
21
|
+
"source": "./src/index.ts"
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"prettier": {
|
|
26
|
+
"singleQuote": true,
|
|
27
|
+
"arrowParens": "avoid",
|
|
28
|
+
"trailingComma": "es5"
|
|
29
|
+
},
|
|
30
|
+
"lint-staged": {
|
|
31
|
+
"*.{js,ts,json,md}": "prettier --write"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [],
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@babel/plugin-transform-block-scoping": "^7.25.9",
|
|
37
|
+
"@babel/plugin-transform-typescript": "^7.26.7",
|
|
38
|
+
"@changesets/cli": "^2.27.1",
|
|
39
|
+
"@changesets/get-github-info": "^0.6.0",
|
|
40
|
+
"@rollup/plugin-babel": "^6.0.4",
|
|
41
|
+
"@rollup/plugin-commonjs": "^28.0.2",
|
|
42
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
43
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
44
|
+
"@types/node": "^22.12.0",
|
|
45
|
+
"busboy": "^0.3.1",
|
|
46
|
+
"dotenv": "^16.4.7",
|
|
47
|
+
"form-data": "^4.0.1",
|
|
48
|
+
"lint-staged": "^15.4.3",
|
|
49
|
+
"npm-run-all": "^4.1.5",
|
|
50
|
+
"prettier": "^3.4.2",
|
|
51
|
+
"rimraf": "^6.0.1",
|
|
52
|
+
"rollup": "^4.32.1",
|
|
53
|
+
"rollup-plugin-cjs-check": "^1.0.3",
|
|
54
|
+
"rollup-plugin-dts": "^6.1.1",
|
|
55
|
+
"typescript": "^5.7.3",
|
|
56
|
+
"undici-types": "^7.3.0",
|
|
57
|
+
"vitest": "^3.0.4"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"test": "vitest test",
|
|
61
|
+
"test:run": "vitest test --run",
|
|
62
|
+
"check": "tsc --noEmit",
|
|
63
|
+
"build": "rollup -c ./scripts/rollup.config.mjs",
|
|
64
|
+
"clean": "rimraf dist node_modules/.cache",
|
|
65
|
+
"changeset:version": "changeset version && pnpm install --lockfile-only",
|
|
66
|
+
"changeset:publish": "changeset publish"
|
|
67
|
+
}
|
|
68
|
+
}
|