@whatwg-node/node-fetch 0.7.19-alpha-20250507123452-fcbe4f1b230a420fdf82832fcaba10f27b872611 → 0.7.19-alpha-20250507124759-2064db741ae2df80463bbf73d9c5aa71c15ffd42

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.
@@ -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;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PonyfillWritableStream = void 0;
4
4
  const node_stream_1 = require("node:stream");
5
+ const promise_helpers_1 = require("@whatwg-node/promise-helpers");
5
6
  const utils_js_1 = require("./utils.js");
6
7
  class PonyfillWritableStream {
7
8
  writable;
@@ -78,39 +79,20 @@ class PonyfillWritableStream {
78
79
  // no-op
79
80
  },
80
81
  write(chunk) {
82
+ const promise = (0, utils_js_1.fakePromise)();
81
83
  if (chunk == null) {
82
- return (0, utils_js_1.fakePromise)();
84
+ return promise;
83
85
  }
84
- return new Promise((resolve, reject) => {
85
- writable.write(chunk, (err) => {
86
- if (err) {
87
- reject(err);
88
- }
89
- else {
90
- resolve();
91
- }
92
- });
93
- });
86
+ return promise.then(() => (0, utils_js_1.safeWrite)(chunk, writable));
94
87
  },
95
88
  close() {
96
89
  if (!writable.errored && writable.closed) {
97
90
  return (0, utils_js_1.fakePromise)();
98
91
  }
99
- return new Promise((resolve, reject) => {
100
- if (writable.errored) {
101
- reject(writable.errored);
102
- }
103
- else {
104
- writable.end((err) => {
105
- if (err) {
106
- reject(err);
107
- }
108
- else {
109
- resolve();
110
- }
111
- });
112
- }
113
- });
92
+ if (writable.errored) {
93
+ return (0, promise_helpers_1.fakeRejectPromise)(writable.errored);
94
+ }
95
+ return (0, utils_js_1.fakePromise)().then(() => (0, utils_js_1.endStream)(writable));
114
96
  },
115
97
  abort(reason) {
116
98
  return new Promise(resolve => {
@@ -124,21 +106,10 @@ class PonyfillWritableStream {
124
106
  if (!this.writable.errored && this.writable.closed) {
125
107
  return (0, utils_js_1.fakePromise)();
126
108
  }
127
- return new Promise((resolve, reject) => {
128
- if (this.writable.errored) {
129
- reject(this.writable.errored);
130
- }
131
- else {
132
- this.writable.end((err) => {
133
- if (err) {
134
- reject(err);
135
- }
136
- else {
137
- resolve();
138
- }
139
- });
140
- }
141
- });
109
+ if (this.writable.errored) {
110
+ return (0, promise_helpers_1.fakeRejectPromise)(this.writable.errored);
111
+ }
112
+ return (0, utils_js_1.fakePromise)().then(() => (0, utils_js_1.endStream)(this.writable));
142
113
  }
143
114
  abort(reason) {
144
115
  return new Promise(resolve => {
@@ -5,6 +5,7 @@ const node_http_1 = require("node:http");
5
5
  const node_https_1 = require("node:https");
6
6
  const node_stream_1 = require("node:stream");
7
7
  const node_zlib_1 = require("node:zlib");
8
+ const promise_helpers_1 = require("@whatwg-node/promise-helpers");
8
9
  const Request_js_1 = require("./Request.js");
9
10
  const Response_js_1 = require("./Response.js");
10
11
  const URL_js_1 = require("./URL.js");
@@ -45,6 +46,7 @@ function fetchNodeHttp(fetchRequest) {
45
46
  agent: fetchRequest.agent,
46
47
  });
47
48
  }
49
+ nodeRequest.once('error', reject);
48
50
  nodeRequest.once('response', nodeResponse => {
49
51
  let outputStream;
50
52
  const contentEncoding = nodeResponse.headers['content-encoding'];
@@ -105,11 +107,8 @@ function fetchNodeHttp(fetchRequest) {
105
107
  });
106
108
  resolve(ponyfillResponse);
107
109
  });
108
- nodeRequest.once('error', reject);
109
110
  if (fetchRequest['_buffer'] != null) {
110
- nodeRequest.write(fetchRequest['_buffer']);
111
- // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
112
- nodeRequest.end(null, null, null);
111
+ (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.safeWrite)(fetchRequest['_buffer'], nodeRequest), () => (0, utils_js_1.endStream)(nodeRequest), reject);
113
112
  }
114
113
  else {
115
114
  const nodeReadable = (fetchRequest.body != null
@@ -121,8 +120,7 @@ function fetchNodeHttp(fetchRequest) {
121
120
  nodeReadable.pipe(nodeRequest);
122
121
  }
123
122
  else {
124
- // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
125
- nodeRequest.end(null, null, null);
123
+ (0, utils_js_1.endStream)(nodeRequest);
126
124
  }
127
125
  }
128
126
  }
package/cjs/utils.js CHANGED
@@ -8,6 +8,8 @@ exports.isNodeReadable = isNodeReadable;
8
8
  exports.isIterable = isIterable;
9
9
  exports.shouldRedirect = shouldRedirect;
10
10
  exports.wrapIncomingMessageWithPassthrough = wrapIncomingMessageWithPassthrough;
11
+ exports.endStream = endStream;
12
+ exports.safeWrite = safeWrite;
11
13
  const node_stream_1 = require("node:stream");
12
14
  const promises_1 = require("node:stream/promises");
13
15
  function isHeadersInstance(obj) {
@@ -58,3 +60,13 @@ function wrapIncomingMessageWithPassthrough({ incomingMessage, signal, passThrou
58
60
  .catch(onError);
59
61
  return passThrough;
60
62
  }
63
+ function endStream(stream) {
64
+ // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
65
+ return stream.end(null, null, null);
66
+ }
67
+ function safeWrite(chunk, stream) {
68
+ const result = stream.write(chunk);
69
+ if (!result) {
70
+ return new Promise(resolve => stream.once('drain', resolve));
71
+ }
72
+ }
@@ -1,5 +1,6 @@
1
1
  import { Transform } from 'node:stream';
2
2
  import { PonyfillReadableStream } from './ReadableStream.js';
3
+ import { endStream } from './utils.js';
3
4
  import { PonyfillWritableStream } from './WritableStream.js';
4
5
  export class PonyfillTransformStream {
5
6
  transform;
@@ -18,7 +19,7 @@ export class PonyfillTransformStream {
18
19
  transform.destroy(reason);
19
20
  },
20
21
  terminate() {
21
- transform.end();
22
+ endStream(transform);
22
23
  },
23
24
  get desiredSize() {
24
25
  return transform.writableLength;
@@ -1,5 +1,6 @@
1
1
  import { Writable } from 'node:stream';
2
- import { fakePromise } from './utils.js';
2
+ import { fakeRejectPromise } from '@whatwg-node/promise-helpers';
3
+ import { endStream, fakePromise, safeWrite } from './utils.js';
3
4
  export class PonyfillWritableStream {
4
5
  writable;
5
6
  constructor(underlyingSink) {
@@ -75,39 +76,20 @@ export class PonyfillWritableStream {
75
76
  // no-op
76
77
  },
77
78
  write(chunk) {
79
+ const promise = fakePromise();
78
80
  if (chunk == null) {
79
- return fakePromise();
81
+ return promise;
80
82
  }
81
- return new Promise((resolve, reject) => {
82
- writable.write(chunk, (err) => {
83
- if (err) {
84
- reject(err);
85
- }
86
- else {
87
- resolve();
88
- }
89
- });
90
- });
83
+ return promise.then(() => safeWrite(chunk, writable));
91
84
  },
92
85
  close() {
93
86
  if (!writable.errored && writable.closed) {
94
87
  return fakePromise();
95
88
  }
96
- return new Promise((resolve, reject) => {
97
- if (writable.errored) {
98
- reject(writable.errored);
99
- }
100
- else {
101
- writable.end((err) => {
102
- if (err) {
103
- reject(err);
104
- }
105
- else {
106
- resolve();
107
- }
108
- });
109
- }
110
- });
89
+ if (writable.errored) {
90
+ return fakeRejectPromise(writable.errored);
91
+ }
92
+ return fakePromise().then(() => endStream(writable));
111
93
  },
112
94
  abort(reason) {
113
95
  return new Promise(resolve => {
@@ -121,21 +103,10 @@ export class PonyfillWritableStream {
121
103
  if (!this.writable.errored && this.writable.closed) {
122
104
  return fakePromise();
123
105
  }
124
- return new Promise((resolve, reject) => {
125
- if (this.writable.errored) {
126
- reject(this.writable.errored);
127
- }
128
- else {
129
- this.writable.end((err) => {
130
- if (err) {
131
- reject(err);
132
- }
133
- else {
134
- resolve();
135
- }
136
- });
137
- }
138
- });
106
+ if (this.writable.errored) {
107
+ return fakeRejectPromise(this.writable.errored);
108
+ }
109
+ return fakePromise().then(() => endStream(this.writable));
139
110
  }
140
111
  abort(reason) {
141
112
  return new Promise(resolve => {
@@ -2,10 +2,11 @@ import { request as httpRequest, STATUS_CODES } from 'node:http';
2
2
  import { request as httpsRequest } from 'node:https';
3
3
  import { Readable } from 'node:stream';
4
4
  import { createBrotliDecompress, createGunzip, createInflate, createInflateRaw } from 'node:zlib';
5
+ import { handleMaybePromise } from '@whatwg-node/promise-helpers';
5
6
  import { PonyfillRequest } from './Request.js';
6
7
  import { PonyfillResponse } from './Response.js';
7
8
  import { PonyfillURL } from './URL.js';
8
- import { getHeadersObj, isNodeReadable, shouldRedirect, wrapIncomingMessageWithPassthrough, } from './utils.js';
9
+ import { endStream, getHeadersObj, isNodeReadable, safeWrite, shouldRedirect, wrapIncomingMessageWithPassthrough, } from './utils.js';
9
10
  function getRequestFnForProtocol(url) {
10
11
  if (url.startsWith('http:')) {
11
12
  return httpRequest;
@@ -42,6 +43,7 @@ export function fetchNodeHttp(fetchRequest) {
42
43
  agent: fetchRequest.agent,
43
44
  });
44
45
  }
46
+ nodeRequest.once('error', reject);
45
47
  nodeRequest.once('response', nodeResponse => {
46
48
  let outputStream;
47
49
  const contentEncoding = nodeResponse.headers['content-encoding'];
@@ -102,11 +104,8 @@ export function fetchNodeHttp(fetchRequest) {
102
104
  });
103
105
  resolve(ponyfillResponse);
104
106
  });
105
- nodeRequest.once('error', reject);
106
107
  if (fetchRequest['_buffer'] != null) {
107
- nodeRequest.write(fetchRequest['_buffer']);
108
- // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
109
- nodeRequest.end(null, null, null);
108
+ handleMaybePromise(() => safeWrite(fetchRequest['_buffer'], nodeRequest), () => endStream(nodeRequest), reject);
110
109
  }
111
110
  else {
112
111
  const nodeReadable = (fetchRequest.body != null
@@ -118,8 +117,7 @@ export function fetchNodeHttp(fetchRequest) {
118
117
  nodeReadable.pipe(nodeRequest);
119
118
  }
120
119
  else {
121
- // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
122
- nodeRequest.end(null, null, null);
120
+ endStream(nodeRequest);
123
121
  }
124
122
  }
125
123
  }
package/esm/utils.js CHANGED
@@ -47,3 +47,13 @@ export function wrapIncomingMessageWithPassthrough({ incomingMessage, signal, pa
47
47
  .catch(onError);
48
48
  return passThrough;
49
49
  }
50
+ export function endStream(stream) {
51
+ // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
52
+ return stream.end(null, null, null);
53
+ }
54
+ export function safeWrite(chunk, stream) {
55
+ const result = stream.write(chunk);
56
+ if (!result) {
57
+ return new Promise(resolve => stream.once('drain', resolve));
58
+ }
59
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/node-fetch",
3
- "version": "0.7.19-alpha-20250507123452-fcbe4f1b230a420fdf82832fcaba10f27b872611",
3
+ "version": "0.7.19-alpha-20250507124759-2064db741ae2df80463bbf73d9c5aa71c15ffd42",
4
4
  "description": "Fetch API implementation for Node",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -13,3 +13,10 @@ export declare function wrapIncomingMessageWithPassthrough({ incomingMessage, si
13
13
  signal?: AbortSignal | undefined;
14
14
  onError?: (e: Error) => void;
15
15
  }): PassThrough;
16
+ export declare function endStream(stream: {
17
+ end: () => void;
18
+ }): void;
19
+ export declare function safeWrite(chunk: any, stream: {
20
+ write: (chunk: any) => boolean;
21
+ once: (event: string, listener: () => void) => void;
22
+ }): Promise<void> | undefined;
@@ -13,3 +13,10 @@ export declare function wrapIncomingMessageWithPassthrough({ incomingMessage, si
13
13
  signal?: AbortSignal | undefined;
14
14
  onError?: (e: Error) => void;
15
15
  }): PassThrough;
16
+ export declare function endStream(stream: {
17
+ end: () => void;
18
+ }): void;
19
+ export declare function safeWrite(chunk: any, stream: {
20
+ write: (chunk: any) => boolean;
21
+ once: (event: string, listener: () => void) => void;
22
+ }): Promise<void> | undefined;