Skip to content

Commit eef4a6e

Browse files
KhafraDevcrysmags
authored andcommitted
version cleanup (nodejs#2483)
* remove require('stream/web') * remove node <= 16 version checks * remove DOMException, structuredClone, WeakRef, FinalizationRegistry workarounds
1 parent 54d263c commit eef4a6e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+63
-425
lines changed

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,6 @@ Implements [fetch](https://fetch.spec.whatwg.org/#fetch-method).
180180
* https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
181181
* https://fetch.spec.whatwg.org/#fetch-method
182182

183-
Only supported on Node 16.8+.
184-
185183
Basic usage example:
186184

187185
```js

benchmarks/benchmark-http2.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const path = require('path')
77
const { readFileSync } = require('fs')
88
const { table } = require('table')
99
const { Writable } = require('stream')
10-
const { WritableStream } = require('stream/web')
1110
const { isMainThread } = require('worker_threads')
1211

1312
const { Pool, Client, fetch, Agent, setGlobalDispatcher } = require('..')

benchmarks/benchmark-https.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const path = require('path')
66
const { readFileSync } = require('fs')
77
const { table } = require('table')
88
const { Writable } = require('stream')
9-
const { WritableStream } = require('stream/web')
109
const { isMainThread } = require('worker_threads')
1110

1211
const { Pool, Client, fetch, Agent, setGlobalDispatcher } = require('..')

benchmarks/benchmark.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ const os = require('os')
55
const path = require('path')
66
const { table } = require('table')
77
const { Writable } = require('stream')
8-
const { WritableStream } = require('stream/web')
98
const { isMainThread } = require('worker_threads')
109

1110
const { Pool, Client, fetch, Agent, setGlobalDispatcher } = require('..')

lib/compat/dispatcher-weakref.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
'use strict'
22

3-
/* istanbul ignore file: only for Node 12 */
4-
53
const { kConnected, kSize } = require('../core/symbols')
64

75
class CompatWeakRef {
@@ -41,8 +39,5 @@ module.exports = function () {
4139
FinalizationRegistry: CompatFinalizer
4240
}
4341
}
44-
return {
45-
WeakRef: global.WeakRef || CompatWeakRef,
46-
FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer
47-
}
42+
return { WeakRef, FinalizationRegistry }
4843
}

lib/core/util.js

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -359,22 +359,9 @@ function getSocketInfo (socket) {
359359
}
360360
}
361361

362-
async function * convertIterableToBuffer (iterable) {
363-
for await (const chunk of iterable) {
364-
yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)
365-
}
366-
}
367-
368362
/** @type {globalThis['ReadableStream']} */
369-
let ReadableStream
370363
function ReadableStreamFrom (iterable) {
371-
if (!ReadableStream) {
372-
ReadableStream = require('stream/web').ReadableStream
373-
}
374-
375-
if (ReadableStream.from) {
376-
return ReadableStream.from(convertIterableToBuffer(iterable))
377-
}
364+
// We cannot use ReadableStream.from here because it does not return a byte stream.
378365

379366
let iterator
380367
return new ReadableStream(
@@ -387,10 +374,13 @@ function ReadableStreamFrom (iterable) {
387374
if (done) {
388375
queueMicrotask(() => {
389376
controller.close()
377+
controller.byobRequest?.respond(0)
390378
})
391379
} else {
392380
const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)
393-
controller.enqueue(new Uint8Array(buf))
381+
if (buf.byteLength) {
382+
controller.enqueue(new Uint8Array(buf))
383+
}
394384
}
395385
return controller.desiredSize > 0
396386
},

lib/fetch/body.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const {
1313
const { FormData } = require('./formdata')
1414
const { kState } = require('./symbols')
1515
const { webidl } = require('./webidl')
16-
const { DOMException, structuredClone } = require('./constants')
1716
const { Blob, File: NativeFile } = require('buffer')
1817
const { kBodyUsed } = require('../core/symbols')
1918
const assert = require('assert')
@@ -22,19 +21,13 @@ const { isUint8Array, isArrayBuffer } = require('util/types')
2221
const { File: UndiciFile } = require('./file')
2322
const { parseMIMEType, serializeAMimeType } = require('./dataURL')
2423

25-
let ReadableStream = globalThis.ReadableStream
26-
2724
/** @type {globalThis['File']} */
2825
const File = NativeFile ?? UndiciFile
2926
const textEncoder = new TextEncoder()
3027
const textDecoder = new TextDecoder()
3128

3229
// https://fetch.spec.whatwg.org/#concept-bodyinit-extract
3330
function extractBody (object, keepalive = false) {
34-
if (!ReadableStream) {
35-
ReadableStream = require('stream/web').ReadableStream
36-
}
37-
3831
// 1. Let stream be null.
3932
let stream = null
4033

@@ -258,11 +251,6 @@ function extractBody (object, keepalive = false) {
258251

259252
// https://fetch.spec.whatwg.org/#bodyinit-safely-extract
260253
function safelyExtractBody (object, keepalive = false) {
261-
if (!ReadableStream) {
262-
// istanbul ignore next
263-
ReadableStream = require('stream/web').ReadableStream
264-
}
265-
266254
// To safely extract a body and a `Content-Type` value from
267255
// a byte sequence or BodyInit object object, run these steps:
268256

lib/fetch/constants.js

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
'use strict'
22

3-
const { MessageChannel, receiveMessageOnPort } = require('worker_threads')
4-
53
const corsSafeListedMethods = ['GET', 'HEAD', 'POST']
64
const corsSafeListedMethodsSet = new Set(corsSafeListedMethods)
75

@@ -92,41 +90,7 @@ const subresource = [
9290
]
9391
const subresourceSet = new Set(subresource)
9492

95-
/** @type {globalThis['DOMException']} */
96-
const DOMException = globalThis.DOMException ?? (() => {
97-
// DOMException was only made a global in Node v17.0.0,
98-
// but fetch supports >= v16.8.
99-
try {
100-
atob('~')
101-
} catch (err) {
102-
return Object.getPrototypeOf(err).constructor
103-
}
104-
})()
105-
106-
let channel
107-
108-
/** @type {globalThis['structuredClone']} */
109-
const structuredClone =
110-
globalThis.structuredClone ??
111-
// https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js
112-
// structuredClone was added in v17.0.0, but fetch supports v16.8
113-
function structuredClone (value, options = undefined) {
114-
if (arguments.length === 0) {
115-
throw new TypeError('missing argument')
116-
}
117-
118-
if (!channel) {
119-
channel = new MessageChannel()
120-
}
121-
channel.port1.unref()
122-
channel.port2.unref()
123-
channel.port1.postMessage(value, options?.transfer)
124-
return receiveMessageOnPort(channel.port2).message
125-
}
126-
12793
module.exports = {
128-
DOMException,
129-
structuredClone,
13094
subresource,
13195
forbiddenMethods,
13296
requestBodyHeader,

lib/fetch/index.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,20 @@ const {
5252
nullBodyStatus,
5353
safeMethodsSet,
5454
requestBodyHeader,
55-
subresourceSet,
56-
DOMException
55+
subresourceSet
5756
} = require('./constants')
5857
const { kHeadersList } = require('../core/symbols')
5958
const EE = require('events')
6059
const { Readable, pipeline } = require('stream')
6160
const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require('../core/util')
6261
const { dataURLProcessor, serializeAMimeType, parseMIMEType } = require('./dataURL')
63-
const { TransformStream } = require('stream/web')
6462
const { getGlobalDispatcher } = require('../global')
6563
const { webidl } = require('./webidl')
6664
const { STATUS_CODES } = require('http')
6765
const GET_OR_HEAD = ['GET', 'HEAD']
6866

6967
/** @type {import('buffer').resolveObjectURL} */
7068
let resolveObjectURL
71-
let ReadableStream = globalThis.ReadableStream
7269

7370
class Fetch extends EE {
7471
constructor (dispatcher) {
@@ -1934,10 +1931,6 @@ async function httpNetworkFetch (
19341931
// 15. Let stream be a new ReadableStream.
19351932
// 16. Set up stream with byte reading support with pullAlgorithm set to pullAlgorithm,
19361933
// cancelAlgorithm set to cancelAlgorithm.
1937-
if (!ReadableStream) {
1938-
ReadableStream = require('stream/web').ReadableStream
1939-
}
1940-
19411934
const stream = new ReadableStream(
19421935
{
19431936
async start (controller) {

lib/fetch/request.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ const { kHeadersList, kConstruct } = require('../core/symbols')
3232
const assert = require('assert')
3333
const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require('events')
3434

35-
let TransformStream = globalThis.TransformStream
36-
3735
const kAbortController = Symbol('abortController')
3836

3937
const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
@@ -516,10 +514,6 @@ class Request {
516514
}
517515

518516
// 2. Set finalBody to the result of creating a proxy for inputBody.
519-
if (!TransformStream) {
520-
TransformStream = require('stream/web').TransformStream
521-
}
522-
523517
// https://streams.spec.whatwg.org/#readablestream-create-a-proxy
524518
const identityTransform = new TransformStream()
525519
inputBody.stream.pipeThrough(identityTransform)

lib/fetch/response.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ const {
1515
} = require('./util')
1616
const {
1717
redirectStatusSet,
18-
nullBodyStatus,
19-
DOMException
18+
nullBodyStatus
2019
} = require('./constants')
2120
const { kState, kHeaders, kGuard, kRealm } = require('./symbols')
2221
const { webidl } = require('./webidl')
@@ -27,7 +26,6 @@ const { kHeadersList, kConstruct } = require('../core/symbols')
2726
const assert = require('assert')
2827
const { types } = require('util')
2928

30-
const ReadableStream = globalThis.ReadableStream || require('stream/web').ReadableStream
3129
const textEncoder = new TextEncoder('utf-8')
3230

3331
// https://fetch.spec.whatwg.org/#response-class

lib/fetch/util.js

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -890,14 +890,7 @@ async function fullyReadBody (body, processBody, processBodyError) {
890890
}
891891
}
892892

893-
/** @type {ReadableStream} */
894-
let ReadableStream = globalThis.ReadableStream
895-
896893
function isReadableStreamLike (stream) {
897-
if (!ReadableStream) {
898-
ReadableStream = require('stream/web').ReadableStream
899-
}
900-
901894
return stream instanceof ReadableStream || (
902895
stream[Symbol.toStringTag] === 'ReadableStream' &&
903896
typeof stream.tee === 'function'
@@ -1186,11 +1179,6 @@ function buildContentRange (rangeStart, rangeEnd, fullLength) {
11861179
return contentRange
11871180
}
11881181

1189-
/**
1190-
* Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0.
1191-
*/
1192-
const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key))
1193-
11941182
module.exports = {
11951183
isAborted,
11961184
isCancelled,
@@ -1223,7 +1211,6 @@ module.exports = {
12231211
makeIterator,
12241212
isValidHeaderName,
12251213
isValidHeaderValue,
1226-
hasOwn,
12271214
isErrorLike,
12281215
fullyReadBody,
12291216
bytesMatch,

lib/fetch/webidl.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict'
22

33
const { types } = require('util')
4-
const { hasOwn, toUSVString } = require('./util')
4+
const { toUSVString } = require('./util')
55

66
/** @type {import('../../types/webidl').Webidl} */
77
const webidl = {}
@@ -346,7 +346,7 @@ webidl.dictionaryConverter = function (converters) {
346346
const { key, defaultValue, required, converter } = options
347347

348348
if (required === true) {
349-
if (!hasOwn(dictionary, key)) {
349+
if (!Object.hasOwn(dictionary, key)) {
350350
throw webidl.errors.exception({
351351
header: 'Dictionary',
352352
message: `Missing required key "${key}".`
@@ -355,7 +355,7 @@ webidl.dictionaryConverter = function (converters) {
355355
}
356356

357357
let value = dictionary[key]
358-
const hasDefault = hasOwn(options, 'defaultValue')
358+
const hasDefault = Object.hasOwn(options, 'defaultValue')
359359

360360
// Only use defaultValue if value is undefined and
361361
// a defaultValue options was provided.

lib/fileapi/util.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ const {
99
} = require('./symbols')
1010
const { ProgressEvent } = require('./progressevent')
1111
const { getEncoding } = require('./encoding')
12-
const { DOMException } = require('../fetch/constants')
1312
const { serializeAMimeType, parseMIMEType } = require('../fetch/dataURL')
1413
const { types } = require('util')
1514
const { StringDecoder } = require('string_decoder')

lib/websocket/websocket.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict'
22

33
const { webidl } = require('../fetch/webidl')
4-
const { DOMException } = require('../fetch/constants')
54
const { URLSerializer } = require('../fetch/dataURL')
65
const { getGlobalOrigin } = require('../fetch/global')
76
const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require('./constants')

test/client-pipeline.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ const {
1111
Writable,
1212
PassThrough
1313
} = require('stream')
14-
const { nodeMajor } = require('../lib/core/util')
1514

1615
test('pipeline get', (t) => {
1716
t.plan(17)
@@ -535,12 +534,7 @@ test('pipeline abort piped res', (t) => {
535534
return pipeline(body, pt, () => {})
536535
})
537536
.on('error', (err) => {
538-
// Node < 13 doesn't always detect premature close.
539-
if (nodeMajor < 13) {
540-
t.ok(err)
541-
} else {
542-
t.equal(err.code, 'UND_ERR_ABORTED')
543-
}
537+
t.equal(err.code, 'UND_ERR_ABORTED')
544538
})
545539
.end()
546540
})

0 commit comments

Comments
 (0)