@whatwg-node/node-fetch 0.8.0-alpha-20241212160430-140b66f028923f44368e67598b6b66f47f690454 → 0.8.0-alpha-20250917053118-2dc604e028627df01a83e41a3dd6dd3f89ca0b40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/cjs/AbortError.js +10 -3
  2. package/cjs/Blob.js +21 -19
  3. package/cjs/Body.js +146 -76
  4. package/cjs/FormData.js +54 -41
  5. package/cjs/Headers.js +54 -15
  6. package/cjs/ReadableStream.js +62 -26
  7. package/cjs/Request.js +9 -16
  8. package/cjs/Response.js +56 -10
  9. package/cjs/TextEncoderDecoder.js +6 -5
  10. package/cjs/TextEncoderDecoderStream.js +2 -6
  11. package/cjs/TransformStream.js +2 -1
  12. package/cjs/URL.js +10 -66
  13. package/cjs/URLSearchParams.js +1 -117
  14. package/cjs/WritableStream.js +35 -111
  15. package/cjs/fetch.js +37 -8
  16. package/cjs/fetchCurl.js +30 -61
  17. package/cjs/fetchNodeHttp.js +60 -64
  18. package/cjs/index.js +1 -7
  19. package/cjs/utils.js +76 -55
  20. package/esm/AbortError.js +10 -3
  21. package/esm/Blob.js +6 -4
  22. package/esm/Body.js +134 -63
  23. package/esm/FormData.js +54 -41
  24. package/esm/Headers.js +54 -15
  25. package/esm/ReadableStream.js +57 -21
  26. package/esm/Request.js +7 -14
  27. package/esm/Response.js +55 -9
  28. package/esm/TextEncoderDecoder.js +1 -0
  29. package/esm/TextEncoderDecoderStream.js +2 -6
  30. package/esm/TransformStream.js +2 -1
  31. package/esm/URL.js +9 -64
  32. package/esm/URLSearchParams.js +1 -115
  33. package/esm/WritableStream.js +33 -109
  34. package/esm/fetch.js +35 -6
  35. package/esm/fetchCurl.js +28 -59
  36. package/esm/fetchNodeHttp.js +55 -59
  37. package/esm/index.js +0 -3
  38. package/esm/utils.js +70 -53
  39. package/package.json +4 -5
  40. package/typings/AbortError.d.cts +2 -2
  41. package/typings/AbortError.d.ts +2 -2
  42. package/typings/Blob.d.cts +5 -4
  43. package/typings/Blob.d.ts +5 -4
  44. package/typings/Body.d.cts +11 -6
  45. package/typings/Body.d.ts +11 -6
  46. package/typings/Headers.d.cts +1 -1
  47. package/typings/Headers.d.ts +1 -1
  48. package/typings/ReadableStream.d.cts +8 -2
  49. package/typings/ReadableStream.d.ts +8 -2
  50. package/typings/Request.d.cts +9 -10
  51. package/typings/Request.d.ts +9 -10
  52. package/typings/Response.d.cts +6 -5
  53. package/typings/Response.d.ts +6 -5
  54. package/typings/TextEncoderDecoder.d.cts +2 -1
  55. package/typings/TextEncoderDecoder.d.ts +2 -1
  56. package/typings/URL.d.cts +12 -16
  57. package/typings/URL.d.ts +12 -16
  58. package/typings/URLSearchParams.d.cts +4 -21
  59. package/typings/URLSearchParams.d.ts +4 -21
  60. package/typings/WritableStream.d.cts +1 -1
  61. package/typings/WritableStream.d.ts +1 -1
  62. package/typings/index.d.cts +0 -3
  63. package/typings/index.d.ts +0 -3
  64. package/typings/utils.d.cts +13 -8
  65. package/typings/utils.d.ts +13 -8
  66. package/cjs/AbortController.js +0 -18
  67. package/cjs/AbortSignal.js +0 -92
  68. package/esm/AbortController.js +0 -14
  69. package/esm/AbortSignal.js +0 -88
  70. package/typings/AbortController.d.cts +0 -8
  71. package/typings/AbortController.d.ts +0 -8
  72. package/typings/AbortSignal.d.cts +0 -15
  73. package/typings/AbortSignal.d.ts +0 -15
@@ -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
- transform.end();
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 buffer_1 = require("buffer");
6
- const crypto_1 = require("crypto");
7
- const fast_querystring_1 = tslib_1.__importDefault(require("fast-querystring"));
8
- const fast_url_parser_1 = tslib_1.__importDefault(require("@kamilkisiela/fast-url-parser"));
9
- const URLSearchParams_js_1 = require("./URLSearchParams.js");
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, crypto_1.randomUUID)()}`;
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 resolveObjectURL(url) {
16
+ static revokeObjectURL(url) {
72
17
  if (!this.blobRegistry.has(url)) {
73
- URL.revokeObjectURL(url);
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) || (0, buffer_1.resolveObjectURL)(url));
25
+ return (this.blobRegistry.get(url) || node_buffer_1.default?.resolveObjectURL?.(url));
81
26
  }
82
- [Symbol.toStringTag] = 'URL';
83
27
  }
84
- exports.PonyfillURL = PonyfillURL;
28
+ exports.PonyfillURL = URL;
@@ -1,120 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PonyfillURLSearchParams = void 0;
4
- const tslib_1 = require("tslib");
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;
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PonyfillWritableStream = void 0;
4
- const stream_1 = require("stream");
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 stream_1.Writable) {
11
+ if (underlyingSink instanceof node_stream_1.Writable) {
10
12
  this.writable = underlyingSink;
11
13
  }
12
14
  else if (underlyingSink) {
13
- const writable = new stream_1.Writable({
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
- let onabort;
48
- let reason;
49
+ const abortCtrl = new AbortController();
49
50
  const controller = {
50
- signal: {
51
- any(signals) {
52
- return AbortSignal.any([...signals]);
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, { once: true });
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
- this.writable.once('error', err => {
94
- reason = err;
95
- });
56
+ writable.once('error', err => abortCtrl.abort(err));
57
+ writable.once('close', () => abortCtrl.abort());
96
58
  }
97
59
  else {
98
- this.writable = new stream_1.Writable();
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: new Promise(resolve => {
105
- writable.once('close', () => {
106
- resolve(undefined);
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: new Promise(resolve => {
113
- writable.once('drain', () => {
114
- resolve(undefined);
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 (0, utils_js_1.fakePromise)(undefined);
81
+ return promise;
123
82
  }
124
- return new Promise((resolve, reject) => {
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)(undefined);
87
+ return (0, utils_js_1.fakePromise)();
138
88
  }
139
- return new Promise((resolve, reject) => {
140
- if (writable.errored) {
141
- reject(writable.errored);
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
- return new Promise(resolve => {
157
- writable.destroy(reason);
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)(undefined);
102
+ return (0, utils_js_1.fakePromise)();
166
103
  }
167
- return new Promise((resolve, reject) => {
168
- if (this.writable.errored) {
169
- reject(this.writable.errored);
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
- return new Promise(resolve => {
185
- this.writable.destroy(reason);
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 fs_1 = require("fs");
5
- const url_1 = require("url");
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, url_1.fileURLToPath)(url);
15
- const readable = (0, fs_1.createReadStream)(path);
16
- return new Response_js_1.PonyfillResponse(readable);
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 (0, utils_js_1.fakePromise)(response);
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 stream_1 = require("stream");
5
- const tls_1 = require("tls");
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', tls_1.rootCertificates.join('\n'));
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 fetchRequest['_signal']?.aborted
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
- : stream_1.Readable.from(fetchRequest.body)
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, utils_js_1.createDeferredPromise)();
67
+ const deferredPromise = (0, promise_helpers_1.createDeferredPromise)();
64
68
  let streamResolved;
65
- if (fetchRequest['_signal']) {
66
- fetchRequest['_signal'].onabort = () => {
67
- if (curlHandle.isOpen) {
68
- try {
69
- curlHandle.pause(CurlPause.Recv);
70
- }
71
- catch (e) {
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 stream_1.PassThrough();
104
- stream_1.promises
105
- .pipeline(stream, outputStream, {
107
+ const outputStream = stream.pipe(new node_stream_1.PassThrough(), {
106
108
  end: true,
107
- signal: fetchRequest['_signal'] ?? undefined,
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
- (headerFilter.includes('location') || headerFilter.includes('Location'))) {
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
- let count = 0;
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
  }