@whatwg-node/node-fetch 0.7.25-alpha-20250730131423-ec6ed6af785e1ac685b1ff9a330040eb56db0870 → 0.7.25-alpha-20250730140253-899e500946f54513ea71cd1804e5d068bcf55c57

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/Response.js CHANGED
@@ -48,60 +48,15 @@ class PonyfillResponse extends Body_js_1.PonyfillBody {
48
48
  status,
49
49
  });
50
50
  }
51
- static json(data, init) {
52
- const bodyInit = JSON.stringify(data);
53
- if (!init) {
54
- init = {
55
- headers: {
56
- 'content-type': JSON_CONTENT_TYPE,
57
- 'content-length': Buffer.byteLength(bodyInit).toString(),
58
- },
59
- };
60
- }
61
- else if (!init.headers) {
62
- init.headers = {
63
- 'content-type': JSON_CONTENT_TYPE,
64
- 'content-length': Buffer.byteLength(bodyInit).toString(),
65
- };
66
- }
67
- else if ((0, Headers_js_1.isHeadersLike)(init.headers)) {
68
- if (!init.headers.has('content-type')) {
69
- init.headers.set('content-type', JSON_CONTENT_TYPE);
70
- }
71
- if (!init.headers.has('content-length')) {
72
- init.headers.set('content-length', Buffer.byteLength(bodyInit).toString());
73
- }
74
- }
75
- else if (Array.isArray(init.headers)) {
76
- let contentTypeExists = false;
77
- let contentLengthExists = false;
78
- for (const [key] of init.headers) {
79
- if (contentLengthExists && contentTypeExists) {
80
- break;
81
- }
82
- if (!contentTypeExists && key.toLowerCase() === 'content-type') {
83
- contentTypeExists = true;
84
- }
85
- else if (!contentLengthExists && key.toLowerCase() === 'content-length') {
86
- contentLengthExists = true;
87
- }
88
- }
89
- if (!contentTypeExists) {
90
- init.headers.push(['content-type', JSON_CONTENT_TYPE]);
91
- }
92
- if (!contentLengthExists) {
93
- init.headers.push(['content-length', Buffer.byteLength(bodyInit).toString()]);
94
- }
95
- }
96
- else if (typeof init.headers === 'object') {
97
- if (init.headers?.['content-type'] == null) {
98
- init.headers['content-type'] = JSON_CONTENT_TYPE;
99
- }
100
- if (init.headers?.['content-length'] == null) {
101
- init.headers['content-length'] = Buffer.byteLength(bodyInit).toString();
102
- }
51
+ static json(data, init = {}) {
52
+ init.headers =
53
+ init?.headers && (0, Headers_js_1.isHeadersLike)(init.headers)
54
+ ? init.headers
55
+ : new Headers_js_1.PonyfillHeaders(init?.headers);
56
+ if (!init.headers.has('content-type')) {
57
+ init.headers.set('content-type', JSON_CONTENT_TYPE);
103
58
  }
104
- return new PonyfillResponse(bodyInit, init);
59
+ return new PonyfillResponse(JSON.stringify(data), init);
105
60
  }
106
61
  [Symbol.toStringTag] = 'Response';
107
62
  }
@@ -20,83 +20,79 @@ function getRequestFnForProtocol(url) {
20
20
  throw new Error(`Unsupported protocol: ${url.split(':')[0] || url}`);
21
21
  }
22
22
  function fetchNodeHttp(fetchRequest) {
23
- const deferred = (0, promise_helpers_1.createDeferredPromise)();
24
- try {
25
- const requestFn = getRequestFnForProtocol(fetchRequest.parsedUrl?.protocol || fetchRequest.url);
26
- const headersSerializer = fetchRequest.headersSerializer || utils_js_1.getHeadersObj;
27
- const nodeHeaders = headersSerializer(fetchRequest.headers);
28
- if (nodeHeaders['accept-encoding'] == null) {
29
- nodeHeaders['accept-encoding'] = 'gzip, deflate, br';
30
- }
31
- let signal;
32
- if (fetchRequest._signal == null) {
33
- signal = undefined;
34
- }
35
- else if (fetchRequest._signal) {
36
- signal = fetchRequest._signal;
37
- }
38
- let nodeRequest;
39
- // If it is our ponyfilled Request, it should have `parsedUrl` which is a `URL` object
40
- if (fetchRequest.parsedUrl) {
41
- nodeRequest = requestFn(fetchRequest.parsedUrl, {
42
- method: fetchRequest.method,
43
- headers: nodeHeaders,
44
- signal,
45
- agent: fetchRequest.agent,
46
- });
47
- }
48
- else {
49
- nodeRequest = requestFn(fetchRequest.url, {
50
- method: fetchRequest.method,
51
- headers: nodeHeaders,
52
- signal,
53
- agent: fetchRequest.agent,
54
- });
55
- }
56
- nodeRequest.once('error', e => deferred.reject(e));
57
- nodeRequest.once('response', nodeResponse => {
58
- let outputStream;
59
- const contentEncoding = nodeResponse.headers['content-encoding'];
60
- switch (contentEncoding) {
61
- case 'x-gzip':
62
- case 'gzip':
63
- outputStream = (0, node_zlib_1.createGunzip)();
64
- break;
65
- case 'x-deflate':
66
- case 'deflate':
67
- outputStream = (0, node_zlib_1.createInflate)();
68
- break;
69
- case 'x-deflate-raw':
70
- case 'deflate-raw':
71
- outputStream = (0, node_zlib_1.createInflateRaw)();
72
- break;
73
- case 'br':
74
- outputStream = (0, node_zlib_1.createBrotliDecompress)();
75
- break;
23
+ return new Promise((resolve, reject) => {
24
+ try {
25
+ const requestFn = getRequestFnForProtocol(fetchRequest.parsedUrl?.protocol || fetchRequest.url);
26
+ const headersSerializer = fetchRequest.headersSerializer || utils_js_1.getHeadersObj;
27
+ const nodeHeaders = headersSerializer(fetchRequest.headers);
28
+ if (nodeHeaders['accept-encoding'] == null) {
29
+ nodeHeaders['accept-encoding'] = 'gzip, deflate, br';
30
+ }
31
+ let signal;
32
+ if (fetchRequest._signal == null) {
33
+ signal = undefined;
34
+ }
35
+ else if (fetchRequest._signal) {
36
+ signal = fetchRequest._signal;
37
+ }
38
+ let nodeRequest;
39
+ // If it is our ponyfilled Request, it should have `parsedUrl` which is a `URL` object
40
+ if (fetchRequest.parsedUrl) {
41
+ nodeRequest = requestFn(fetchRequest.parsedUrl, {
42
+ method: fetchRequest.method,
43
+ headers: nodeHeaders,
44
+ signal,
45
+ agent: fetchRequest.agent,
46
+ });
47
+ }
48
+ else {
49
+ nodeRequest = requestFn(fetchRequest.url, {
50
+ method: fetchRequest.method,
51
+ headers: nodeHeaders,
52
+ signal,
53
+ agent: fetchRequest.agent,
54
+ });
76
55
  }
77
- if (nodeResponse.headers.location && (0, utils_js_1.shouldRedirect)(nodeResponse.statusCode)) {
78
- if (fetchRequest.redirect === 'error') {
79
- const redirectError = new Error('Redirects are not allowed');
80
- deferred.reject(redirectError);
81
- nodeResponse.resume();
82
- return;
56
+ nodeRequest.once('error', reject);
57
+ nodeRequest.once('response', nodeResponse => {
58
+ let outputStream;
59
+ const contentEncoding = nodeResponse.headers['content-encoding'];
60
+ switch (contentEncoding) {
61
+ case 'x-gzip':
62
+ case 'gzip':
63
+ outputStream = (0, node_zlib_1.createGunzip)();
64
+ break;
65
+ case 'x-deflate':
66
+ case 'deflate':
67
+ outputStream = (0, node_zlib_1.createInflate)();
68
+ break;
69
+ case 'x-deflate-raw':
70
+ case 'deflate-raw':
71
+ outputStream = (0, node_zlib_1.createInflateRaw)();
72
+ break;
73
+ case 'br':
74
+ outputStream = (0, node_zlib_1.createBrotliDecompress)();
75
+ break;
83
76
  }
84
- if (fetchRequest.redirect === 'follow') {
85
- const redirectedUrl = new URL_js_1.PonyfillURL(nodeResponse.headers.location, fetchRequest.parsedUrl || fetchRequest.url);
86
- const redirectResponse$ = fetchNodeHttp(new Request_js_1.PonyfillRequest(redirectedUrl, fetchRequest));
87
- redirectResponse$
88
- .then(redirectResponse => {
89
- redirectResponse.redirected = true;
90
- deferred.resolve(redirectResponse);
91
- })
92
- .catch(e => {
93
- deferred.reject(e);
94
- });
95
- nodeResponse.resume();
96
- return;
77
+ if (nodeResponse.headers.location && (0, utils_js_1.shouldRedirect)(nodeResponse.statusCode)) {
78
+ if (fetchRequest.redirect === 'error') {
79
+ const redirectError = new Error('Redirects are not allowed');
80
+ reject(redirectError);
81
+ nodeResponse.resume();
82
+ return;
83
+ }
84
+ if (fetchRequest.redirect === 'follow') {
85
+ const redirectedUrl = new URL_js_1.PonyfillURL(nodeResponse.headers.location, fetchRequest.parsedUrl || fetchRequest.url);
86
+ const redirectResponse$ = fetchNodeHttp(new Request_js_1.PonyfillRequest(redirectedUrl, fetchRequest));
87
+ resolve(redirectResponse$.then(redirectResponse => {
88
+ redirectResponse.redirected = true;
89
+ return redirectResponse;
90
+ }));
91
+ nodeResponse.resume();
92
+ return;
93
+ }
97
94
  }
98
- }
99
- if (outputStream) {
95
+ outputStream ||= new node_stream_1.PassThrough();
100
96
  (0, utils_js_1.pipeThrough)({
101
97
  src: nodeResponse,
102
98
  dest: outputStream,
@@ -108,43 +104,42 @@ function fetchNodeHttp(fetchRequest) {
108
104
  if (!outputStream.destroyed) {
109
105
  outputStream.destroy(e);
110
106
  }
111
- deferred.reject(e);
107
+ reject(e);
112
108
  },
113
109
  });
114
- }
115
- const statusCode = nodeResponse.statusCode || 200;
116
- let statusText = nodeResponse.statusMessage || node_http_1.STATUS_CODES[statusCode];
117
- if (statusText == null) {
118
- statusText = '';
119
- }
120
- const ponyfillResponse = new Response_js_1.PonyfillResponse(outputStream || nodeResponse, {
121
- status: statusCode,
122
- statusText,
123
- headers: nodeResponse.headers,
124
- url: fetchRequest.url,
125
- signal,
110
+ const statusCode = nodeResponse.statusCode || 200;
111
+ let statusText = nodeResponse.statusMessage || node_http_1.STATUS_CODES[statusCode];
112
+ if (statusText == null) {
113
+ statusText = '';
114
+ }
115
+ const ponyfillResponse = new Response_js_1.PonyfillResponse(outputStream || nodeResponse, {
116
+ status: statusCode,
117
+ statusText,
118
+ headers: nodeResponse.headers,
119
+ url: fetchRequest.url,
120
+ signal,
121
+ });
122
+ resolve(ponyfillResponse);
126
123
  });
127
- deferred.resolve(ponyfillResponse);
128
- });
129
- if (fetchRequest['_buffer'] != null) {
130
- (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.safeWrite)(fetchRequest['_buffer'], nodeRequest), () => (0, utils_js_1.endStream)(nodeRequest), e => deferred.reject(e));
131
- }
132
- else {
133
- const nodeReadable = (fetchRequest.body != null
134
- ? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
135
- ? fetchRequest.body
136
- : node_stream_1.Readable.from(fetchRequest.body)
137
- : null);
138
- if (nodeReadable) {
139
- nodeReadable.pipe(nodeRequest);
124
+ if (fetchRequest['_buffer'] != null) {
125
+ (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.safeWrite)(fetchRequest['_buffer'], nodeRequest), () => (0, utils_js_1.endStream)(nodeRequest), reject);
140
126
  }
141
127
  else {
142
- (0, utils_js_1.endStream)(nodeRequest);
128
+ const nodeReadable = (fetchRequest.body != null
129
+ ? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
130
+ ? fetchRequest.body
131
+ : node_stream_1.Readable.from(fetchRequest.body)
132
+ : null);
133
+ if (nodeReadable) {
134
+ nodeReadable.pipe(nodeRequest);
135
+ }
136
+ else {
137
+ (0, utils_js_1.endStream)(nodeRequest);
138
+ }
143
139
  }
144
140
  }
145
- }
146
- catch (e) {
147
- deferred.reject(e);
148
- }
149
- return deferred.promise;
141
+ catch (e) {
142
+ reject(e);
143
+ }
144
+ });
150
145
  }
package/cjs/utils.js CHANGED
@@ -10,6 +10,7 @@ exports.shouldRedirect = shouldRedirect;
10
10
  exports.pipeThrough = pipeThrough;
11
11
  exports.endStream = endStream;
12
12
  exports.safeWrite = safeWrite;
13
+ const node_events_1 = require("node:events");
13
14
  function isHeadersInstance(obj) {
14
15
  return obj?.forEach != null;
15
16
  }
@@ -98,9 +99,7 @@ function endStream(stream) {
98
99
  function safeWrite(chunk, stream) {
99
100
  const result = stream.write(chunk);
100
101
  if (!result) {
101
- return new Promise(resolve => {
102
- stream.once('drain', resolve);
103
- });
102
+ return (0, node_events_1.once)(stream, 'drain');
104
103
  }
105
104
  }
106
105
  // https://github.com/nodejs/node/blob/f692878dec6354c0a82241f224906981861bc840/lib/internal/errors.js#L961-L973
package/esm/Response.js CHANGED
@@ -45,60 +45,15 @@ export class PonyfillResponse extends PonyfillBody {
45
45
  status,
46
46
  });
47
47
  }
48
- static json(data, init) {
49
- const bodyInit = JSON.stringify(data);
50
- if (!init) {
51
- init = {
52
- headers: {
53
- 'content-type': JSON_CONTENT_TYPE,
54
- 'content-length': Buffer.byteLength(bodyInit).toString(),
55
- },
56
- };
57
- }
58
- else if (!init.headers) {
59
- init.headers = {
60
- 'content-type': JSON_CONTENT_TYPE,
61
- 'content-length': Buffer.byteLength(bodyInit).toString(),
62
- };
63
- }
64
- else if (isHeadersLike(init.headers)) {
65
- if (!init.headers.has('content-type')) {
66
- init.headers.set('content-type', JSON_CONTENT_TYPE);
67
- }
68
- if (!init.headers.has('content-length')) {
69
- init.headers.set('content-length', Buffer.byteLength(bodyInit).toString());
70
- }
71
- }
72
- else if (Array.isArray(init.headers)) {
73
- let contentTypeExists = false;
74
- let contentLengthExists = false;
75
- for (const [key] of init.headers) {
76
- if (contentLengthExists && contentTypeExists) {
77
- break;
78
- }
79
- if (!contentTypeExists && key.toLowerCase() === 'content-type') {
80
- contentTypeExists = true;
81
- }
82
- else if (!contentLengthExists && key.toLowerCase() === 'content-length') {
83
- contentLengthExists = true;
84
- }
85
- }
86
- if (!contentTypeExists) {
87
- init.headers.push(['content-type', JSON_CONTENT_TYPE]);
88
- }
89
- if (!contentLengthExists) {
90
- init.headers.push(['content-length', Buffer.byteLength(bodyInit).toString()]);
91
- }
92
- }
93
- else if (typeof init.headers === 'object') {
94
- if (init.headers?.['content-type'] == null) {
95
- init.headers['content-type'] = JSON_CONTENT_TYPE;
96
- }
97
- if (init.headers?.['content-length'] == null) {
98
- init.headers['content-length'] = Buffer.byteLength(bodyInit).toString();
99
- }
48
+ static json(data, init = {}) {
49
+ init.headers =
50
+ init?.headers && isHeadersLike(init.headers)
51
+ ? init.headers
52
+ : new PonyfillHeaders(init?.headers);
53
+ if (!init.headers.has('content-type')) {
54
+ init.headers.set('content-type', JSON_CONTENT_TYPE);
100
55
  }
101
- return new PonyfillResponse(bodyInit, init);
56
+ return new PonyfillResponse(JSON.stringify(data), init);
102
57
  }
103
58
  [Symbol.toStringTag] = 'Response';
104
59
  }
@@ -1,8 +1,8 @@
1
1
  import { request as httpRequest, STATUS_CODES } from 'node:http';
2
2
  import { request as httpsRequest } from 'node:https';
3
- import { Readable } from 'node:stream';
3
+ import { PassThrough, Readable } from 'node:stream';
4
4
  import { createBrotliDecompress, createGunzip, createInflate, createInflateRaw } from 'node:zlib';
5
- import { createDeferredPromise, handleMaybePromise } from '@whatwg-node/promise-helpers';
5
+ import { handleMaybePromise } from '@whatwg-node/promise-helpers';
6
6
  import { PonyfillRequest } from './Request.js';
7
7
  import { PonyfillResponse } from './Response.js';
8
8
  import { PonyfillURL } from './URL.js';
@@ -17,83 +17,79 @@ function getRequestFnForProtocol(url) {
17
17
  throw new Error(`Unsupported protocol: ${url.split(':')[0] || url}`);
18
18
  }
19
19
  export function fetchNodeHttp(fetchRequest) {
20
- const deferred = createDeferredPromise();
21
- try {
22
- const requestFn = getRequestFnForProtocol(fetchRequest.parsedUrl?.protocol || fetchRequest.url);
23
- const headersSerializer = fetchRequest.headersSerializer || getHeadersObj;
24
- const nodeHeaders = headersSerializer(fetchRequest.headers);
25
- if (nodeHeaders['accept-encoding'] == null) {
26
- nodeHeaders['accept-encoding'] = 'gzip, deflate, br';
27
- }
28
- let signal;
29
- if (fetchRequest._signal == null) {
30
- signal = undefined;
31
- }
32
- else if (fetchRequest._signal) {
33
- signal = fetchRequest._signal;
34
- }
35
- let nodeRequest;
36
- // If it is our ponyfilled Request, it should have `parsedUrl` which is a `URL` object
37
- if (fetchRequest.parsedUrl) {
38
- nodeRequest = requestFn(fetchRequest.parsedUrl, {
39
- method: fetchRequest.method,
40
- headers: nodeHeaders,
41
- signal,
42
- agent: fetchRequest.agent,
43
- });
44
- }
45
- else {
46
- nodeRequest = requestFn(fetchRequest.url, {
47
- method: fetchRequest.method,
48
- headers: nodeHeaders,
49
- signal,
50
- agent: fetchRequest.agent,
51
- });
52
- }
53
- nodeRequest.once('error', e => deferred.reject(e));
54
- nodeRequest.once('response', nodeResponse => {
55
- let outputStream;
56
- const contentEncoding = nodeResponse.headers['content-encoding'];
57
- switch (contentEncoding) {
58
- case 'x-gzip':
59
- case 'gzip':
60
- outputStream = createGunzip();
61
- break;
62
- case 'x-deflate':
63
- case 'deflate':
64
- outputStream = createInflate();
65
- break;
66
- case 'x-deflate-raw':
67
- case 'deflate-raw':
68
- outputStream = createInflateRaw();
69
- break;
70
- case 'br':
71
- outputStream = createBrotliDecompress();
72
- break;
20
+ return new Promise((resolve, reject) => {
21
+ try {
22
+ const requestFn = getRequestFnForProtocol(fetchRequest.parsedUrl?.protocol || fetchRequest.url);
23
+ const headersSerializer = fetchRequest.headersSerializer || getHeadersObj;
24
+ const nodeHeaders = headersSerializer(fetchRequest.headers);
25
+ if (nodeHeaders['accept-encoding'] == null) {
26
+ nodeHeaders['accept-encoding'] = 'gzip, deflate, br';
27
+ }
28
+ let signal;
29
+ if (fetchRequest._signal == null) {
30
+ signal = undefined;
31
+ }
32
+ else if (fetchRequest._signal) {
33
+ signal = fetchRequest._signal;
34
+ }
35
+ let nodeRequest;
36
+ // If it is our ponyfilled Request, it should have `parsedUrl` which is a `URL` object
37
+ if (fetchRequest.parsedUrl) {
38
+ nodeRequest = requestFn(fetchRequest.parsedUrl, {
39
+ method: fetchRequest.method,
40
+ headers: nodeHeaders,
41
+ signal,
42
+ agent: fetchRequest.agent,
43
+ });
44
+ }
45
+ else {
46
+ nodeRequest = requestFn(fetchRequest.url, {
47
+ method: fetchRequest.method,
48
+ headers: nodeHeaders,
49
+ signal,
50
+ agent: fetchRequest.agent,
51
+ });
73
52
  }
74
- if (nodeResponse.headers.location && shouldRedirect(nodeResponse.statusCode)) {
75
- if (fetchRequest.redirect === 'error') {
76
- const redirectError = new Error('Redirects are not allowed');
77
- deferred.reject(redirectError);
78
- nodeResponse.resume();
79
- return;
53
+ nodeRequest.once('error', reject);
54
+ nodeRequest.once('response', nodeResponse => {
55
+ let outputStream;
56
+ const contentEncoding = nodeResponse.headers['content-encoding'];
57
+ switch (contentEncoding) {
58
+ case 'x-gzip':
59
+ case 'gzip':
60
+ outputStream = createGunzip();
61
+ break;
62
+ case 'x-deflate':
63
+ case 'deflate':
64
+ outputStream = createInflate();
65
+ break;
66
+ case 'x-deflate-raw':
67
+ case 'deflate-raw':
68
+ outputStream = createInflateRaw();
69
+ break;
70
+ case 'br':
71
+ outputStream = createBrotliDecompress();
72
+ break;
80
73
  }
81
- if (fetchRequest.redirect === 'follow') {
82
- const redirectedUrl = new PonyfillURL(nodeResponse.headers.location, fetchRequest.parsedUrl || fetchRequest.url);
83
- const redirectResponse$ = fetchNodeHttp(new PonyfillRequest(redirectedUrl, fetchRequest));
84
- redirectResponse$
85
- .then(redirectResponse => {
86
- redirectResponse.redirected = true;
87
- deferred.resolve(redirectResponse);
88
- })
89
- .catch(e => {
90
- deferred.reject(e);
91
- });
92
- nodeResponse.resume();
93
- return;
74
+ if (nodeResponse.headers.location && shouldRedirect(nodeResponse.statusCode)) {
75
+ if (fetchRequest.redirect === 'error') {
76
+ const redirectError = new Error('Redirects are not allowed');
77
+ reject(redirectError);
78
+ nodeResponse.resume();
79
+ return;
80
+ }
81
+ if (fetchRequest.redirect === 'follow') {
82
+ const redirectedUrl = new PonyfillURL(nodeResponse.headers.location, fetchRequest.parsedUrl || fetchRequest.url);
83
+ const redirectResponse$ = fetchNodeHttp(new PonyfillRequest(redirectedUrl, fetchRequest));
84
+ resolve(redirectResponse$.then(redirectResponse => {
85
+ redirectResponse.redirected = true;
86
+ return redirectResponse;
87
+ }));
88
+ nodeResponse.resume();
89
+ return;
90
+ }
94
91
  }
95
- }
96
- if (outputStream) {
92
+ outputStream ||= new PassThrough();
97
93
  pipeThrough({
98
94
  src: nodeResponse,
99
95
  dest: outputStream,
@@ -105,43 +101,42 @@ export function fetchNodeHttp(fetchRequest) {
105
101
  if (!outputStream.destroyed) {
106
102
  outputStream.destroy(e);
107
103
  }
108
- deferred.reject(e);
104
+ reject(e);
109
105
  },
110
106
  });
111
- }
112
- const statusCode = nodeResponse.statusCode || 200;
113
- let statusText = nodeResponse.statusMessage || STATUS_CODES[statusCode];
114
- if (statusText == null) {
115
- statusText = '';
116
- }
117
- const ponyfillResponse = new PonyfillResponse(outputStream || nodeResponse, {
118
- status: statusCode,
119
- statusText,
120
- headers: nodeResponse.headers,
121
- url: fetchRequest.url,
122
- signal,
107
+ const statusCode = nodeResponse.statusCode || 200;
108
+ let statusText = nodeResponse.statusMessage || STATUS_CODES[statusCode];
109
+ if (statusText == null) {
110
+ statusText = '';
111
+ }
112
+ const ponyfillResponse = new PonyfillResponse(outputStream || nodeResponse, {
113
+ status: statusCode,
114
+ statusText,
115
+ headers: nodeResponse.headers,
116
+ url: fetchRequest.url,
117
+ signal,
118
+ });
119
+ resolve(ponyfillResponse);
123
120
  });
124
- deferred.resolve(ponyfillResponse);
125
- });
126
- if (fetchRequest['_buffer'] != null) {
127
- handleMaybePromise(() => safeWrite(fetchRequest['_buffer'], nodeRequest), () => endStream(nodeRequest), e => deferred.reject(e));
128
- }
129
- else {
130
- const nodeReadable = (fetchRequest.body != null
131
- ? isNodeReadable(fetchRequest.body)
132
- ? fetchRequest.body
133
- : Readable.from(fetchRequest.body)
134
- : null);
135
- if (nodeReadable) {
136
- nodeReadable.pipe(nodeRequest);
121
+ if (fetchRequest['_buffer'] != null) {
122
+ handleMaybePromise(() => safeWrite(fetchRequest['_buffer'], nodeRequest), () => endStream(nodeRequest), reject);
137
123
  }
138
124
  else {
139
- endStream(nodeRequest);
125
+ const nodeReadable = (fetchRequest.body != null
126
+ ? isNodeReadable(fetchRequest.body)
127
+ ? fetchRequest.body
128
+ : Readable.from(fetchRequest.body)
129
+ : null);
130
+ if (nodeReadable) {
131
+ nodeReadable.pipe(nodeRequest);
132
+ }
133
+ else {
134
+ endStream(nodeRequest);
135
+ }
140
136
  }
141
137
  }
142
- }
143
- catch (e) {
144
- deferred.reject(e);
145
- }
146
- return deferred.promise;
138
+ catch (e) {
139
+ reject(e);
140
+ }
141
+ });
147
142
  }
package/esm/utils.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { once } from 'node:events';
1
2
  function isHeadersInstance(obj) {
2
3
  return obj?.forEach != null;
3
4
  }
@@ -85,9 +86,7 @@ export function endStream(stream) {
85
86
  export function safeWrite(chunk, stream) {
86
87
  const result = stream.write(chunk);
87
88
  if (!result) {
88
- return new Promise(resolve => {
89
- stream.once('drain', resolve);
90
- });
89
+ return once(stream, 'drain');
91
90
  }
92
91
  }
93
92
  // https://github.com/nodejs/node/blob/f692878dec6354c0a82241f224906981861bc840/lib/internal/errors.js#L961-L973
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/node-fetch",
3
- "version": "0.7.25-alpha-20250730131423-ec6ed6af785e1ac685b1ff9a330040eb56db0870",
3
+ "version": "0.7.25-alpha-20250730140253-899e500946f54513ea71cd1804e5d068bcf55c57",
4
4
  "description": "Fetch API implementation for Node",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -18,6 +18,6 @@ export declare class PonyfillResponse<TJSON = any> extends PonyfillBody<TJSON> i
18
18
  clone(): this;
19
19
  static error(): PonyfillResponse<any>;
20
20
  static redirect(url: string, status?: number): PonyfillResponse<any>;
21
- static json<T = any>(data: T, init?: ResponsePonyfilInit): PonyfillResponse<T>;
21
+ static json<T>(data: T, init?: ResponsePonyfilInit): PonyfillResponse<any>;
22
22
  [Symbol.toStringTag]: string;
23
23
  }
@@ -18,6 +18,6 @@ export declare class PonyfillResponse<TJSON = any> extends PonyfillBody<TJSON> i
18
18
  clone(): this;
19
19
  static error(): PonyfillResponse<any>;
20
20
  static redirect(url: string, status?: number): PonyfillResponse<any>;
21
- static json<T = any>(data: T, init?: ResponsePonyfilInit): PonyfillResponse<T>;
21
+ static json<T>(data: T, init?: ResponsePonyfilInit): PonyfillResponse<any>;
22
22
  [Symbol.toStringTag]: string;
23
23
  }
@@ -15,4 +15,4 @@ export declare function pipeThrough({ src, dest, signal, onError, }: {
15
15
  export declare function endStream(stream: {
16
16
  end: () => void;
17
17
  }): void;
18
- export declare function safeWrite(chunk: any, stream: Writable): Promise<void> | undefined;
18
+ export declare function safeWrite(chunk: any, stream: Writable): Promise<any[]> | undefined;
@@ -15,4 +15,4 @@ export declare function pipeThrough({ src, dest, signal, onError, }: {
15
15
  export declare function endStream(stream: {
16
16
  end: () => void;
17
17
  }): void;
18
- export declare function safeWrite(chunk: any, stream: Writable): Promise<void> | undefined;
18
+ export declare function safeWrite(chunk: any, stream: Writable): Promise<any[]> | undefined;