@whatwg-node/node-fetch 0.8.0-alpha-20241212154840-0a0effe808a6614e0a3afd853126a38641485756 → 0.8.0-alpha-20250917012053-36c9ccdc3e94ee8d0961f17398a9053fa55df37b
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/cjs/AbortError.js +5 -3
- package/cjs/Blob.js +21 -19
- package/cjs/Body.js +146 -76
- package/cjs/FormData.js +54 -41
- package/cjs/Headers.js +54 -15
- package/cjs/ReadableStream.js +62 -26
- package/cjs/Request.js +9 -16
- package/cjs/Response.js +56 -10
- package/cjs/TextEncoderDecoder.js +6 -5
- package/cjs/TextEncoderDecoderStream.js +2 -6
- package/cjs/TransformStream.js +2 -1
- package/cjs/URL.js +10 -66
- package/cjs/URLSearchParams.js +1 -117
- package/cjs/WritableStream.js +35 -111
- package/cjs/fetch.js +37 -8
- package/cjs/fetchCurl.js +30 -61
- package/cjs/fetchNodeHttp.js +60 -64
- package/cjs/index.js +1 -7
- package/cjs/utils.js +76 -55
- package/esm/AbortError.js +5 -3
- package/esm/Blob.js +6 -4
- package/esm/Body.js +134 -63
- package/esm/FormData.js +54 -41
- package/esm/Headers.js +54 -15
- package/esm/ReadableStream.js +57 -21
- package/esm/Request.js +7 -14
- package/esm/Response.js +55 -9
- package/esm/TextEncoderDecoder.js +1 -0
- package/esm/TextEncoderDecoderStream.js +2 -6
- package/esm/TransformStream.js +2 -1
- package/esm/URL.js +9 -64
- package/esm/URLSearchParams.js +1 -115
- package/esm/WritableStream.js +33 -109
- package/esm/fetch.js +35 -6
- package/esm/fetchCurl.js +28 -59
- package/esm/fetchNodeHttp.js +55 -59
- package/esm/index.js +0 -3
- package/esm/utils.js +70 -53
- package/package.json +4 -5
- package/typings/AbortError.d.cts +1 -1
- package/typings/AbortError.d.ts +1 -1
- package/typings/Blob.d.cts +5 -4
- package/typings/Blob.d.ts +5 -4
- package/typings/Body.d.cts +11 -6
- package/typings/Body.d.ts +11 -6
- package/typings/Headers.d.cts +1 -1
- package/typings/Headers.d.ts +1 -1
- package/typings/ReadableStream.d.cts +8 -2
- package/typings/ReadableStream.d.ts +8 -2
- package/typings/Request.d.cts +9 -10
- package/typings/Request.d.ts +9 -10
- package/typings/Response.d.cts +6 -5
- package/typings/Response.d.ts +6 -5
- package/typings/TextEncoderDecoder.d.cts +2 -1
- package/typings/TextEncoderDecoder.d.ts +2 -1
- package/typings/URL.d.cts +12 -16
- package/typings/URL.d.ts +12 -16
- package/typings/URLSearchParams.d.cts +4 -21
- package/typings/URLSearchParams.d.ts +4 -21
- package/typings/WritableStream.d.cts +1 -1
- package/typings/WritableStream.d.ts +1 -1
- package/typings/index.d.cts +0 -3
- package/typings/index.d.ts +0 -3
- package/typings/utils.d.cts +13 -8
- package/typings/utils.d.ts +13 -8
- package/cjs/AbortController.js +0 -18
- package/cjs/AbortSignal.js +0 -85
- package/esm/AbortController.js +0 -14
- package/esm/AbortSignal.js +0 -81
- package/typings/AbortController.d.cts +0 -8
- package/typings/AbortController.d.ts +0 -8
- package/typings/AbortSignal.d.cts +0 -15
- package/typings/AbortSignal.d.ts +0 -15
package/cjs/TransformStream.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PonyfillTransformStream = void 0;
|
|
4
4
|
const node_stream_1 = require("node:stream");
|
|
5
5
|
const ReadableStream_js_1 = require("./ReadableStream.js");
|
|
6
|
+
const utils_js_1 = require("./utils.js");
|
|
6
7
|
const WritableStream_js_1 = require("./WritableStream.js");
|
|
7
8
|
class PonyfillTransformStream {
|
|
8
9
|
transform;
|
|
@@ -21,7 +22,7 @@ class PonyfillTransformStream {
|
|
|
21
22
|
transform.destroy(reason);
|
|
22
23
|
},
|
|
23
24
|
terminate() {
|
|
24
|
-
|
|
25
|
+
(0, utils_js_1.endStream)(transform);
|
|
25
26
|
},
|
|
26
27
|
get desiredSize() {
|
|
27
28
|
return transform.writableLength;
|
package/cjs/URL.js
CHANGED
|
@@ -2,83 +2,27 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PonyfillURL = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
fast_url_parser_1.default.queryString = fast_querystring_1.default;
|
|
11
|
-
const IPV6_REGEX = /^(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|::(?:[0-9A-Fa-f]{1,4}:){5}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}(?:0?0?[0-9]|0?[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)(?:\/(?:0?0?[0-9]|0?[1-9][0-9]|1[01][0-9]|12[0-8]))?)$/;
|
|
12
|
-
class PonyfillURL extends fast_url_parser_1.default {
|
|
13
|
-
constructor(url, base) {
|
|
14
|
-
super();
|
|
15
|
-
if (url.startsWith('data:')) {
|
|
16
|
-
this.protocol = 'data:';
|
|
17
|
-
this.pathname = url.slice('data:'.length);
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
this.parse(url, false);
|
|
21
|
-
// `fast-url-parser` cannot handle ipv6 hosts correctly
|
|
22
|
-
if ((url.startsWith('http://[') || url.startsWith('https://[')) &&
|
|
23
|
-
IPV6_REGEX.test(this.hostname)) {
|
|
24
|
-
this.hostname = `[${this.hostname}]`;
|
|
25
|
-
}
|
|
26
|
-
if (base) {
|
|
27
|
-
const baseParsed = typeof base === 'string' ? new PonyfillURL(base) : base;
|
|
28
|
-
this.protocol ||= baseParsed.protocol;
|
|
29
|
-
this.host ||= baseParsed.host;
|
|
30
|
-
this.pathname ||= baseParsed.pathname;
|
|
31
|
-
this.port ||= baseParsed.port;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
get origin() {
|
|
35
|
-
return `${this.protocol}//${this.host}${this.port ? `:${this.port}` : ''}`;
|
|
36
|
-
}
|
|
37
|
-
_searchParams;
|
|
38
|
-
get searchParams() {
|
|
39
|
-
if (!this._searchParams) {
|
|
40
|
-
this._searchParams = new URLSearchParams_js_1.PonyfillURLSearchParams(this.query);
|
|
41
|
-
}
|
|
42
|
-
return this._searchParams;
|
|
43
|
-
}
|
|
44
|
-
get username() {
|
|
45
|
-
return this.auth?.split(':')[0] || '';
|
|
46
|
-
}
|
|
47
|
-
set username(value) {
|
|
48
|
-
this.auth = `${value}:${this.password}`;
|
|
49
|
-
}
|
|
50
|
-
get password() {
|
|
51
|
-
return this.auth?.split(':')[1] || '';
|
|
52
|
-
}
|
|
53
|
-
set password(value) {
|
|
54
|
-
this.auth = `${this.username}:${value}`;
|
|
55
|
-
}
|
|
56
|
-
toString() {
|
|
57
|
-
if (this._searchParams) {
|
|
58
|
-
this.search = this._searchParams.toString();
|
|
59
|
-
}
|
|
60
|
-
return this.format();
|
|
61
|
-
}
|
|
62
|
-
toJSON() {
|
|
63
|
-
return this.toString();
|
|
64
|
-
}
|
|
5
|
+
const node_buffer_1 = tslib_1.__importDefault(require("node:buffer"));
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const NativeURL = globalThis.URL;
|
|
8
|
+
class URL extends NativeURL {
|
|
9
|
+
// This part is only needed to handle `PonyfillBlob` objects
|
|
65
10
|
static blobRegistry = new Map();
|
|
66
11
|
static createObjectURL(blob) {
|
|
67
|
-
const blobUrl = `blob:whatwgnode:${(0,
|
|
12
|
+
const blobUrl = `blob:whatwgnode:${(0, node_crypto_1.randomUUID)()}`;
|
|
68
13
|
this.blobRegistry.set(blobUrl, blob);
|
|
69
14
|
return blobUrl;
|
|
70
15
|
}
|
|
71
|
-
static
|
|
16
|
+
static revokeObjectURL(url) {
|
|
72
17
|
if (!this.blobRegistry.has(url)) {
|
|
73
|
-
|
|
18
|
+
NativeURL.revokeObjectURL(url);
|
|
74
19
|
}
|
|
75
20
|
else {
|
|
76
21
|
this.blobRegistry.delete(url);
|
|
77
22
|
}
|
|
78
23
|
}
|
|
79
24
|
static getBlobFromURL(url) {
|
|
80
|
-
return (this.blobRegistry.get(url) ||
|
|
25
|
+
return (this.blobRegistry.get(url) || node_buffer_1.default?.resolveObjectURL?.(url));
|
|
81
26
|
}
|
|
82
|
-
[Symbol.toStringTag] = 'URL';
|
|
83
27
|
}
|
|
84
|
-
exports.PonyfillURL =
|
|
28
|
+
exports.PonyfillURL = URL;
|
package/cjs/URLSearchParams.js
CHANGED
|
@@ -1,120 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PonyfillURLSearchParams = void 0;
|
|
4
|
-
|
|
5
|
-
const fast_querystring_1 = tslib_1.__importDefault(require("fast-querystring"));
|
|
6
|
-
const IteratorObject_js_1 = require("./IteratorObject.js");
|
|
7
|
-
function isURLSearchParams(value) {
|
|
8
|
-
return value?.entries != null;
|
|
9
|
-
}
|
|
10
|
-
class PonyfillURLSearchParams {
|
|
11
|
-
params;
|
|
12
|
-
constructor(init) {
|
|
13
|
-
if (init) {
|
|
14
|
-
if (typeof init === 'string') {
|
|
15
|
-
this.params = fast_querystring_1.default.parse(init);
|
|
16
|
-
}
|
|
17
|
-
else if (Array.isArray(init)) {
|
|
18
|
-
this.params = {};
|
|
19
|
-
for (const [key, value] of init) {
|
|
20
|
-
this.params[key] = value;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
else if (isURLSearchParams(init)) {
|
|
24
|
-
this.params = {};
|
|
25
|
-
for (const [key, value] of init.entries()) {
|
|
26
|
-
this.params[key] = value;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
this.params = init;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
this.params = {};
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
append(name, value) {
|
|
38
|
-
const existingValue = this.params[name];
|
|
39
|
-
const finalValue = existingValue ? `${existingValue},${value}` : value;
|
|
40
|
-
this.params[name] = finalValue;
|
|
41
|
-
}
|
|
42
|
-
delete(name) {
|
|
43
|
-
delete this.params[name];
|
|
44
|
-
}
|
|
45
|
-
get(name) {
|
|
46
|
-
const value = this.params[name];
|
|
47
|
-
if (Array.isArray(value)) {
|
|
48
|
-
return value[0] || null;
|
|
49
|
-
}
|
|
50
|
-
return value || null;
|
|
51
|
-
}
|
|
52
|
-
getAll(name) {
|
|
53
|
-
const value = this.params[name];
|
|
54
|
-
if (!Array.isArray(value)) {
|
|
55
|
-
return value ? [value] : [];
|
|
56
|
-
}
|
|
57
|
-
return value;
|
|
58
|
-
}
|
|
59
|
-
has(name) {
|
|
60
|
-
return name in this.params;
|
|
61
|
-
}
|
|
62
|
-
set(name, value) {
|
|
63
|
-
this.params[name] = value;
|
|
64
|
-
}
|
|
65
|
-
sort() {
|
|
66
|
-
const sortedKeys = Object.keys(this.params).sort();
|
|
67
|
-
const sortedParams = {};
|
|
68
|
-
for (const key of sortedKeys) {
|
|
69
|
-
sortedParams[key] = this.params[key];
|
|
70
|
-
}
|
|
71
|
-
this.params = sortedParams;
|
|
72
|
-
}
|
|
73
|
-
toString() {
|
|
74
|
-
return fast_querystring_1.default.stringify(this.params);
|
|
75
|
-
}
|
|
76
|
-
*_keys() {
|
|
77
|
-
for (const key in this.params) {
|
|
78
|
-
yield key;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
keys() {
|
|
82
|
-
return new IteratorObject_js_1.PonyfillIteratorObject(this._keys(), 'URLSearchParamsIterator');
|
|
83
|
-
}
|
|
84
|
-
*_entries() {
|
|
85
|
-
for (const key of this.keys()) {
|
|
86
|
-
const value = this.params[key];
|
|
87
|
-
if (Array.isArray(value)) {
|
|
88
|
-
for (const item of value) {
|
|
89
|
-
yield [key, item];
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
yield [key, value];
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
entries() {
|
|
98
|
-
return new IteratorObject_js_1.PonyfillIteratorObject(this._entries(), 'URLSearchParamsIterator');
|
|
99
|
-
}
|
|
100
|
-
*_values() {
|
|
101
|
-
for (const [, value] of this) {
|
|
102
|
-
yield value;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
values() {
|
|
106
|
-
return new IteratorObject_js_1.PonyfillIteratorObject(this._values(), 'URLSearchParamsIterator');
|
|
107
|
-
}
|
|
108
|
-
[Symbol.iterator]() {
|
|
109
|
-
return this.entries();
|
|
110
|
-
}
|
|
111
|
-
forEach(callback) {
|
|
112
|
-
for (const [key, value] of this) {
|
|
113
|
-
callback(value, key, this);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
get size() {
|
|
117
|
-
return Object.keys(this.params).length;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
exports.PonyfillURLSearchParams = PonyfillURLSearchParams;
|
|
4
|
+
exports.PonyfillURLSearchParams = globalThis.URLSearchParams;
|
package/cjs/WritableStream.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PonyfillWritableStream = void 0;
|
|
4
|
-
const
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
5
|
+
const node_stream_1 = require("node:stream");
|
|
6
|
+
const promise_helpers_1 = require("@whatwg-node/promise-helpers");
|
|
5
7
|
const utils_js_1 = require("./utils.js");
|
|
6
8
|
class PonyfillWritableStream {
|
|
7
9
|
writable;
|
|
8
10
|
constructor(underlyingSink) {
|
|
9
|
-
if (underlyingSink instanceof
|
|
11
|
+
if (underlyingSink instanceof node_stream_1.Writable) {
|
|
10
12
|
this.writable = underlyingSink;
|
|
11
13
|
}
|
|
12
14
|
else if (underlyingSink) {
|
|
13
|
-
const writable = new
|
|
15
|
+
const writable = new node_stream_1.Writable({
|
|
14
16
|
write(chunk, _encoding, callback) {
|
|
15
17
|
try {
|
|
16
18
|
const result = underlyingSink.write?.(chunk, controller);
|
|
@@ -44,147 +46,69 @@ class PonyfillWritableStream {
|
|
|
44
46
|
},
|
|
45
47
|
});
|
|
46
48
|
this.writable = writable;
|
|
47
|
-
|
|
48
|
-
let reason;
|
|
49
|
+
const abortCtrl = new AbortController();
|
|
49
50
|
const controller = {
|
|
50
|
-
signal:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
get reason() {
|
|
55
|
-
return reason;
|
|
56
|
-
},
|
|
57
|
-
get aborted() {
|
|
58
|
-
return writable.destroyed;
|
|
59
|
-
},
|
|
60
|
-
addEventListener: (_event, eventListener) => {
|
|
61
|
-
writable.once('error', eventListener);
|
|
62
|
-
writable.once('close', eventListener);
|
|
63
|
-
},
|
|
64
|
-
removeEventListener: (_event, eventListener) => {
|
|
65
|
-
writable.off('error', eventListener);
|
|
66
|
-
writable.off('close', eventListener);
|
|
67
|
-
},
|
|
68
|
-
dispatchEvent: (_event) => {
|
|
69
|
-
return false;
|
|
70
|
-
},
|
|
71
|
-
get onabort() {
|
|
72
|
-
return onabort;
|
|
73
|
-
},
|
|
74
|
-
set onabort(value) {
|
|
75
|
-
if (onabort) {
|
|
76
|
-
this.removeEventListener('abort', onabort);
|
|
77
|
-
}
|
|
78
|
-
onabort = value;
|
|
79
|
-
if (onabort) {
|
|
80
|
-
this.addEventListener('abort', onabort);
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
throwIfAborted() {
|
|
84
|
-
if (writable.destroyed) {
|
|
85
|
-
throw reason;
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
error: e => {
|
|
90
|
-
this.writable.destroy(e);
|
|
51
|
+
signal: abortCtrl.signal,
|
|
52
|
+
error(e) {
|
|
53
|
+
writable.destroy(e);
|
|
91
54
|
},
|
|
92
55
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
56
|
+
writable.once('error', err => abortCtrl.abort(err));
|
|
57
|
+
writable.once('close', () => abortCtrl.abort());
|
|
96
58
|
}
|
|
97
59
|
else {
|
|
98
|
-
this.writable = new
|
|
60
|
+
this.writable = new node_stream_1.Writable();
|
|
99
61
|
}
|
|
100
62
|
}
|
|
101
63
|
getWriter() {
|
|
102
64
|
const writable = this.writable;
|
|
103
65
|
return {
|
|
104
|
-
closed
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
108
|
-
}),
|
|
66
|
+
get closed() {
|
|
67
|
+
return (0, node_events_1.once)(writable, 'close');
|
|
68
|
+
},
|
|
109
69
|
get desiredSize() {
|
|
110
70
|
return writable.writableLength;
|
|
111
71
|
},
|
|
112
|
-
ready
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
116
|
-
}),
|
|
72
|
+
get ready() {
|
|
73
|
+
return (0, node_events_1.once)(writable, 'drain');
|
|
74
|
+
},
|
|
117
75
|
releaseLock() {
|
|
118
76
|
// no-op
|
|
119
77
|
},
|
|
120
78
|
write(chunk) {
|
|
79
|
+
const promise = (0, utils_js_1.fakePromise)();
|
|
121
80
|
if (chunk == null) {
|
|
122
|
-
return
|
|
81
|
+
return promise;
|
|
123
82
|
}
|
|
124
|
-
return
|
|
125
|
-
writable.write(chunk, (err) => {
|
|
126
|
-
if (err) {
|
|
127
|
-
reject(err);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
resolve();
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
});
|
|
83
|
+
return promise.then(() => (0, utils_js_1.safeWrite)(chunk, writable));
|
|
134
84
|
},
|
|
135
85
|
close() {
|
|
136
86
|
if (!writable.errored && writable.closed) {
|
|
137
|
-
return (0, utils_js_1.fakePromise)(
|
|
87
|
+
return (0, utils_js_1.fakePromise)();
|
|
138
88
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
else {
|
|
144
|
-
writable.end((err) => {
|
|
145
|
-
if (err) {
|
|
146
|
-
reject(err);
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
resolve();
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
});
|
|
89
|
+
if (writable.errored) {
|
|
90
|
+
return (0, promise_helpers_1.fakeRejectPromise)(writable.errored);
|
|
91
|
+
}
|
|
92
|
+
return (0, utils_js_1.fakePromise)().then(() => (0, utils_js_1.endStream)(writable));
|
|
154
93
|
},
|
|
155
94
|
abort(reason) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
writable.once('close', resolve);
|
|
159
|
-
});
|
|
95
|
+
writable.destroy(reason);
|
|
96
|
+
return (0, node_events_1.once)(writable, 'close');
|
|
160
97
|
},
|
|
161
98
|
};
|
|
162
99
|
}
|
|
163
100
|
close() {
|
|
164
101
|
if (!this.writable.errored && this.writable.closed) {
|
|
165
|
-
return (0, utils_js_1.fakePromise)(
|
|
102
|
+
return (0, utils_js_1.fakePromise)();
|
|
166
103
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
else {
|
|
172
|
-
this.writable.end((err) => {
|
|
173
|
-
if (err) {
|
|
174
|
-
reject(err);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
resolve();
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
});
|
|
104
|
+
if (this.writable.errored) {
|
|
105
|
+
return (0, promise_helpers_1.fakeRejectPromise)(this.writable.errored);
|
|
106
|
+
}
|
|
107
|
+
return (0, utils_js_1.fakePromise)().then(() => (0, utils_js_1.endStream)(this.writable));
|
|
182
108
|
}
|
|
183
109
|
abort(reason) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
this.writable.once('close', resolve);
|
|
187
|
-
});
|
|
110
|
+
this.writable.destroy(reason);
|
|
111
|
+
return (0, node_events_1.once)(this.writable, 'close');
|
|
188
112
|
}
|
|
189
113
|
locked = false;
|
|
190
114
|
}
|
package/cjs/fetch.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fetchPonyfill = fetchPonyfill;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const node_buffer_1 = require("node:buffer");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_url_1 = require("node:url");
|
|
6
7
|
const fetchCurl_js_1 = require("./fetchCurl.js");
|
|
7
8
|
const fetchNodeHttp_js_1 = require("./fetchNodeHttp.js");
|
|
8
9
|
const Request_js_1 = require("./Request.js");
|
|
@@ -10,16 +11,44 @@ const Response_js_1 = require("./Response.js");
|
|
|
10
11
|
const URL_js_1 = require("./URL.js");
|
|
11
12
|
const utils_js_1 = require("./utils.js");
|
|
12
13
|
const BASE64_SUFFIX = ';base64';
|
|
13
|
-
function getResponseForFile(url) {
|
|
14
|
-
const path = (0,
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
async function getResponseForFile(url) {
|
|
15
|
+
const path = (0, node_url_1.fileURLToPath)(url);
|
|
16
|
+
try {
|
|
17
|
+
await node_fs_1.promises.access(path, node_fs_1.promises.constants.R_OK);
|
|
18
|
+
const stats = await node_fs_1.promises.stat(path, {
|
|
19
|
+
bigint: true,
|
|
20
|
+
});
|
|
21
|
+
const readable = (0, node_fs_1.createReadStream)(path);
|
|
22
|
+
return new Response_js_1.PonyfillResponse(readable, {
|
|
23
|
+
status: 200,
|
|
24
|
+
statusText: 'OK',
|
|
25
|
+
headers: {
|
|
26
|
+
'content-type': 'application/octet-stream',
|
|
27
|
+
'last-modified': stats.mtime.toUTCString(),
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (err.code === 'ENOENT') {
|
|
33
|
+
return new Response_js_1.PonyfillResponse(null, {
|
|
34
|
+
status: 404,
|
|
35
|
+
statusText: 'Not Found',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else if (err.code === 'EACCES') {
|
|
39
|
+
return new Response_js_1.PonyfillResponse(null, {
|
|
40
|
+
status: 403,
|
|
41
|
+
statusText: 'Forbidden',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
17
46
|
}
|
|
18
47
|
function getResponseForDataUri(url) {
|
|
19
48
|
const [mimeType = 'text/plain', ...datas] = url.substring(5).split(',');
|
|
20
49
|
const data = decodeURIComponent(datas.join(','));
|
|
21
50
|
if (mimeType.endsWith(BASE64_SUFFIX)) {
|
|
22
|
-
const buffer = Buffer.from(data, 'base64url');
|
|
51
|
+
const buffer = node_buffer_1.Buffer.from(data, 'base64url');
|
|
23
52
|
const realMimeType = mimeType.slice(0, -BASE64_SUFFIX.length);
|
|
24
53
|
return new Response_js_1.PonyfillResponse(buffer, {
|
|
25
54
|
status: 200,
|
|
@@ -65,7 +94,7 @@ function fetchPonyfill(info, init) {
|
|
|
65
94
|
}
|
|
66
95
|
if (fetchRequest.url.startsWith('file:')) {
|
|
67
96
|
const response = getResponseForFile(fetchRequest.url);
|
|
68
|
-
return
|
|
97
|
+
return response;
|
|
69
98
|
}
|
|
70
99
|
if (fetchRequest.url.startsWith('blob:')) {
|
|
71
100
|
const response = getResponseForBlob(fetchRequest.url);
|
package/cjs/fetchCurl.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fetchCurl = fetchCurl;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const node_stream_1 = require("node:stream");
|
|
5
|
+
const node_tls_1 = require("node:tls");
|
|
6
|
+
const promise_helpers_1 = require("@whatwg-node/promise-helpers");
|
|
6
7
|
const Response_js_1 = require("./Response.js");
|
|
7
8
|
const utils_js_1 = require("./utils.js");
|
|
8
9
|
function fetchCurl(fetchRequest) {
|
|
@@ -17,15 +18,18 @@ function fetchCurl(fetchRequest) {
|
|
|
17
18
|
curlHandle.setOpt('CAINFO', process.env.NODE_EXTRA_CA_CERTS);
|
|
18
19
|
}
|
|
19
20
|
else {
|
|
20
|
-
curlHandle.setOpt('CAINFO_BLOB',
|
|
21
|
+
curlHandle.setOpt('CAINFO_BLOB', node_tls_1.rootCertificates.join('\n'));
|
|
21
22
|
}
|
|
22
23
|
curlHandle.enable(CurlFeature.StreamResponse);
|
|
24
|
+
let signal;
|
|
25
|
+
if (fetchRequest._signal === null) {
|
|
26
|
+
signal = undefined;
|
|
27
|
+
}
|
|
28
|
+
else if (fetchRequest._signal) {
|
|
29
|
+
signal = fetchRequest._signal;
|
|
30
|
+
}
|
|
23
31
|
curlHandle.setStreamProgressCallback(function () {
|
|
24
|
-
return
|
|
25
|
-
? process.env.DEBUG
|
|
26
|
-
? CurlProgressFunc.Continue
|
|
27
|
-
: 1
|
|
28
|
-
: 0;
|
|
32
|
+
return signal?.aborted ? (process.env.DEBUG ? CurlProgressFunc.Continue : 1) : 0;
|
|
29
33
|
});
|
|
30
34
|
if (fetchRequest['bodyType'] === 'String') {
|
|
31
35
|
curlHandle.setOpt('POSTFIELDS', fetchRequest['bodyInit']);
|
|
@@ -34,7 +38,7 @@ function fetchCurl(fetchRequest) {
|
|
|
34
38
|
const nodeReadable = (fetchRequest.body != null
|
|
35
39
|
? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
|
|
36
40
|
? fetchRequest.body
|
|
37
|
-
:
|
|
41
|
+
: node_stream_1.Readable.from(fetchRequest.body)
|
|
38
42
|
: null);
|
|
39
43
|
if (nodeReadable) {
|
|
40
44
|
curlHandle.setOpt('UPLOAD', true);
|
|
@@ -60,20 +64,19 @@ function fetchCurl(fetchRequest) {
|
|
|
60
64
|
}
|
|
61
65
|
curlHandle.setOpt('HTTPHEADER', curlHeaders);
|
|
62
66
|
curlHandle.enable(CurlFeature.NoHeaderParsing);
|
|
63
|
-
const deferredPromise = (0,
|
|
67
|
+
const deferredPromise = (0, promise_helpers_1.createDeferredPromise)();
|
|
64
68
|
let streamResolved;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
deferredPromise.reject(e);
|
|
73
|
-
}
|
|
69
|
+
function onAbort() {
|
|
70
|
+
if (curlHandle.isOpen) {
|
|
71
|
+
try {
|
|
72
|
+
curlHandle.pause(CurlPause.Recv);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
deferredPromise.reject(e);
|
|
74
76
|
}
|
|
75
|
-
}
|
|
77
|
+
}
|
|
76
78
|
}
|
|
79
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
77
80
|
curlHandle.once('end', function endListener() {
|
|
78
81
|
try {
|
|
79
82
|
curlHandle.close();
|
|
@@ -81,6 +84,7 @@ function fetchCurl(fetchRequest) {
|
|
|
81
84
|
catch (e) {
|
|
82
85
|
deferredPromise.reject(e);
|
|
83
86
|
}
|
|
87
|
+
signal?.removeEventListener('abort', onAbort);
|
|
84
88
|
});
|
|
85
89
|
curlHandle.once('error', function errorListener(error) {
|
|
86
90
|
if (streamResolved && !streamResolved.closed && !streamResolved.destroyed) {
|
|
@@ -100,42 +104,17 @@ function fetchCurl(fetchRequest) {
|
|
|
100
104
|
}
|
|
101
105
|
});
|
|
102
106
|
curlHandle.once('stream', function streamListener(stream, status, headersBuf) {
|
|
103
|
-
const outputStream = new
|
|
104
|
-
stream_1.promises
|
|
105
|
-
.pipeline(stream, outputStream, {
|
|
107
|
+
const outputStream = stream.pipe(new node_stream_1.PassThrough(), {
|
|
106
108
|
end: true,
|
|
107
|
-
|
|
108
|
-
})
|
|
109
|
-
.then(() => {
|
|
110
|
-
if (!stream.destroyed) {
|
|
111
|
-
stream.resume();
|
|
112
|
-
}
|
|
113
|
-
})
|
|
114
|
-
.catch(deferredPromise.reject);
|
|
115
|
-
if (fetchRequest['_signal']) {
|
|
116
|
-
outputStream.once('error', () => {
|
|
117
|
-
if (!fetchRequest['_signal']?.aborted) {
|
|
118
|
-
fetchRequest['_signal']?.sendAbort?.();
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
outputStream.once('close', () => {
|
|
122
|
-
if (!fetchRequest['_signal']?.aborted) {
|
|
123
|
-
fetchRequest['_signal']?.sendAbort?.();
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
outputStream.once('destroy', () => {
|
|
127
|
-
if (!fetchRequest['_signal']?.aborted) {
|
|
128
|
-
fetchRequest['_signal']?.sendAbort?.();
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}
|
|
109
|
+
});
|
|
132
110
|
const headersFlat = headersBuf
|
|
133
111
|
.toString('utf8')
|
|
134
112
|
.split(/\r?\n|\r/g)
|
|
135
113
|
.filter(headerFilter => {
|
|
136
114
|
if (headerFilter && !headerFilter.startsWith('HTTP/')) {
|
|
137
115
|
if (fetchRequest.redirect === 'error' &&
|
|
138
|
-
|
|
116
|
+
headerFilter.toLowerCase().includes('location') &&
|
|
117
|
+
(0, utils_js_1.shouldRedirect)(status)) {
|
|
139
118
|
if (!stream.destroyed) {
|
|
140
119
|
stream.resume();
|
|
141
120
|
}
|
|
@@ -156,18 +135,8 @@ function fetchCurl(fetchRequest) {
|
|
|
156
135
|
deferredPromise.resolve(ponyfillResponse);
|
|
157
136
|
streamResolved = outputStream;
|
|
158
137
|
});
|
|
159
|
-
|
|
160
|
-
try {
|
|
161
|
-
count = Curl.getCount();
|
|
162
|
-
}
|
|
163
|
-
catch { }
|
|
164
|
-
if (count > 0) {
|
|
165
|
-
setImmediate(() => {
|
|
166
|
-
curlHandle.perform();
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
138
|
+
setImmediate(() => {
|
|
170
139
|
curlHandle.perform();
|
|
171
|
-
}
|
|
140
|
+
});
|
|
172
141
|
return deferredPromise.promise;
|
|
173
142
|
}
|