Node.js v17.0.0 (Current)

Bethany Nicolle Griggs

Notable Changes

Deprecations and Removals

  • [f182b9b29f] - (SEMVER-MAJOR) dns: runtime deprecate type coercion of dns.lookup options (Antoine du Hamel) #39793
  • [4b030d0573] - doc: deprecate (doc-only) http abort related (dr-js) #36670
  • [36e2ffe6dc] - (SEMVER-MAJOR) module: subpath folder mappings EOL (Guy Bedford) #40121
  • [64287e4d45] - (SEMVER-MAJOR) module: runtime deprecate trailing slash patterns (Guy Bedford) #40117

OpenSSL 3.0

Node.js now includes OpenSSL 3.0, specifically quictls/openssl which provides QUIC support. With OpenSSL 3.0 FIPS support is again available using the new FIPS module. For details about how to build Node.js with FIPS support please see BUILDING.md.

While OpenSSL 3.0 APIs should be mostly compatible with those provided by OpenSSL 1.1.1, we do anticipate some ecosystem impact due to tightened restrictions on the allowed algorithms and key sizes.

If you hit an ERR_OSSL_EVP_UNSUPPORTED error in your application with Node.js 17, it’s likely that your application or a module you’re using is attempting to use an algorithm or key size which is no longer allowed by default with OpenSSL 3.0. A command-line option, --openssl-legacy-provider, has been added to revert to the legacy provider as a temporary workaround for these tightened restrictions.

For details about all the features in OpenSSL 3.0 please see the OpenSSL 3.0 release blog.

Contributed in https://github.com/nodejs/node/pull/38512, https://github.com/nodejs/node/pull/40478

V8 9.5

The V8 JavaScript engine is updated to V8 9.5. This release comes with additional supported types for the Intl.DisplayNames API and Extended timeZoneName options in the Intl.DateTimeFormat API.

You can read more details in the V8 9.5 release post - https://v8.dev/blog/v8-release-95.

Contributed by Michaël Zasso - https://github.com/nodejs/node/pull/40178

Readline Promise API

The readline module provides an interface for reading data from a Readable stream (such as process.stdin) one line at a time.

The following simple example illustrates the basic use of the readline module:

import * as module "node:readline/promises"readline from 'node:readline/promises';
import { 
NodeJS.Process.stdin: NodeJS.ReadStream & {
    fd: 0;
}
The `process.stdin` property returns a stream connected to`stdin` (fd `0`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `0` refers to a file, in which case it is a `Readable` stream. For details of how to read from `stdin` see `readable.read()`. As a `Duplex` stream, `process.stdin` can also be used in "old" mode that is compatible with scripts written for Node.js prior to v0.10\. For more information see `Stream compatibility`. In "old" streams mode the `stdin` stream is paused by default, so one must call `process.stdin.resume()` to read from it. Note also that calling `process.stdin.resume()` itself would switch stream to "old" mode.
stdin
as
function (property) input: NodeJS.ReadStream & {
    fd: 0;
}
The `process.stdin` property returns a stream connected to`stdin` (fd `0`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `0` refers to a file, in which case it is a `Readable` stream. For details of how to read from `stdin` see `readable.read()`. As a `Duplex` stream, `process.stdin` can also be used in "old" mode that is compatible with scripts written for Node.js prior to v0.10\. For more information see `Stream compatibility`. In "old" streams mode the `stdin` stream is paused by default, so one must call `process.stdin.resume()` to read from it. Note also that calling `process.stdin.resume()` itself would switch stream to "old" mode.
input
,
NodeJS.Process.stdout: NodeJS.WriteStream & {
    fd: 1;
}
The `process.stdout` property returns a stream connected to`stdout` (fd `1`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `1` refers to a file, in which case it is a `Writable` stream. For example, to copy `process.stdin` to `process.stdout`: ```js import { stdin, stdout } from 'node:process'; stdin.pipe(stdout); ``` `process.stdout` differs from other Node.js streams in important ways. See `note on process I/O` for more information.
stdout
as
function (property) output: NodeJS.WriteStream & {
    fd: 1;
}
The `process.stdout` property returns a stream connected to`stdout` (fd `1`). It is a `net.Socket` (which is a `Duplex` stream) unless fd `1` refers to a file, in which case it is a `Writable` stream. For example, to copy `process.stdin` to `process.stdout`: ```js import { stdin, stdout } from 'node:process'; stdin.pipe(stdout); ``` `process.stdout` differs from other Node.js streams in important ways. See `note on process I/O` for more information.
output
} from 'process';
const const rl: readline.Interfacerl = module "node:readline/promises"readline.function createInterface(options: readline.ReadLineOptions): readline.Interface (+1 overload)
The `readlinePromises.createInterface()` method creates a new `readlinePromises.Interface` instance. ```js import readlinePromises from 'node:readline/promises'; const rl = readlinePromises.createInterface({ input: process.stdin, output: process.stdout, }); ``` Once the `readlinePromises.Interface` instance is created, the most common case is to listen for the `'line'` event: ```js rl.on('line', (line) => { console.log(`Received: ${line}`); }); ``` If `terminal` is `true` for this instance then the `output` stream will get the best compatibility if it defines an `output.columns` property and emits a `'resize'` event on the `output` if or when the columns ever change (`process.stdout` does this automatically when it is a TTY).
@sincev17.0.0
createInterface
({ input: NodeJS.ReadableStream
The [`Readable`](https://nodejs.org/docs/latest-v22.x/api/stream.html#readable-streams) stream to listen to
input
, output?: NodeJS.WritableStream | undefined
The [`Writable`](https://nodejs.org/docs/latest-v22.x/api/stream.html#writable-streams) stream to write readline data to.
output
});
const const answer: stringanswer = await const rl: readline.Interfacerl.Interface.question(query: string): Promise<string> (+1 overload)
The `rl.question()` method displays the `query` by writing it to the `output`, waits for user input to be provided on `input`, then invokes the `callback` function passing the provided input as the first argument. When called, `rl.question()` will resume the `input` stream if it has been paused. If the `Interface` was created with `output` set to `null` or `undefined` the `query` is not written. If the question is called after `rl.close()`, it returns a rejected promise. Example usage: ```js const answer = await rl.question('What is your favorite food? '); console.log(`Oh, so your favorite food is ${answer}`); ``` Using an `AbortSignal` to cancel a question. ```js const signal = AbortSignal.timeout(10_000); signal.addEventListener('abort', () => { console.log('The food question timed out'); }, { once: true }); const answer = await rl.question('What is your favorite food? ', { signal }); console.log(`Oh, so your favorite food is ${answer}`); ```
@sincev17.0.0@paramquery A statement or query to write to `output`, prepended to the prompt.@returnA promise that is fulfilled with the user's input in response to the `query`.
question
('What do you think of Node.js? ');
var console: Console
The `console` module provides a simple debugging console that is similar to the JavaScript console mechanism provided by web browsers. The module exports two specific components: * A `Console` class with methods such as `console.log()`, `console.error()` and `console.warn()` that can be used to write to any Node.js stream. * A global `console` instance configured to write to [`process.stdout`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstdout) and [`process.stderr`](https://nodejs.org/docs/latest-v22.x/api/process.html#processstderr). The global `console` can be used without importing the `node:console` module. _**Warning**_: The global console object's methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the [`note on process I/O`](https://nodejs.org/docs/latest-v22.x/api/process.html#a-note-on-process-io) for more information. Example using the global `console`: ```js console.log('hello world'); // Prints: hello world, to stdout console.log('hello %s', 'world'); // Prints: hello world, to stdout console.error(new Error('Whoops, something bad happened')); // Prints error message and stack trace to stderr: // Error: Whoops, something bad happened // at [eval]:5:15 // at Script.runInThisContext (node:vm:132:18) // at Object.runInThisContext (node:vm:309:38) // at node:internal/process/execution:77:19 // at [eval]-wrapper:6:22 // at evalScript (node:internal/process/execution:76:60) // at node:internal/main/eval_string:23:3 const name = 'Will Robinson'; console.warn(`Danger ${name}! Danger!`); // Prints: Danger Will Robinson! Danger!, to stderr ``` Example using the `Console` class: ```js const out = getStreamSomehow(); const err = getStreamSomehow(); const myConsole = new console.Console(out, err); myConsole.log('hello world'); // Prints: hello world, to out myConsole.log('hello %s', 'world'); // Prints: hello world, to out myConsole.error(new Error('Whoops, something bad happened')); // Prints: [Error: Whoops, something bad happened], to err const name = 'Will Robinson'; myConsole.warn(`Danger ${name}! Danger!`); // Prints: Danger Will Robinson! Danger!, to err ```
@see[source](https://github.com/nodejs/node/blob/v22.x/lib/console.js)
console
.Console.log(message?: any, ...optionalParams: any[]): void (+1 overload)
Prints to `stdout` with newline. Multiple arguments can be passed, with the first used as the primary message and all additional used as substitution values similar to [`printf(3)`](http://man7.org/linux/man-pages/man3/printf.3.html) (the arguments are all passed to [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args)). ```js const count = 5; console.log('count: %d', count); // Prints: count: 5, to stdout console.log('count:', count); // Prints: count: 5, to stdout ``` See [`util.format()`](https://nodejs.org/docs/latest-v22.x/api/util.html#utilformatformat-args) for more information.
@sincev0.1.100
log
(`Thank you for your valuable feedback: ${const answer: stringanswer}`);
const rl: readline.Interfacerl.Interface.close(): void
The `rl.close()` method closes the `Interface` instance and relinquishes control over the `input` and `output` streams. When called, the `'close'` event will be emitted. Calling `rl.close()` does not immediately stop other events (including `'line'`) from being emitted by the `Interface` instance.
@sincev0.1.98
close
();

Contributed by Antoine du Hamel - https://github.com/nodejs/node/pull/37947

Other Notable Changes

  • [1b2749ecbe] - (SEMVER-MAJOR) dns: default to verbatim=true in dns.lookup() (treysis) #39987
  • [59d3d542d6] - (SEMVER-MAJOR) errors: print Node.js version on fatal exceptions that cause exit (Divlo) #38332
  • [a35b7e0427] - deps: upgrade npm to 8.1.0 (npm team) #40463
  • [6cd12be347] - (SEMVER-MINOR) fs: add FileHandle.prototype.readableWebStream() (James M Snell) #39331
  • [d0a898681f] - (SEMVER-MAJOR) lib: add structuredClone() global (Ethan Arrowood) #39759
  • [e4b1fb5e64] - (SEMVER-MAJOR) lib: expose DOMException as global (Khaidi Chu) #39176
  • [0738a2b7bd] - (SEMVER-MAJOR) stream: finished should error on errored stream (Robert Nagy) #39235

Semver-Major Commits

  • [9dfa30bdd5] - (SEMVER-MAJOR) build: compile with C++17 (MSVC) (Richard Lau) #38807
  • [9f0bc602e4] - (SEMVER-MAJOR) build: compile with --gnu++17 (Richard Lau) #38807
  • [62719c5fd2] - (SEMVER-MAJOR) deps: update V8 to 9.5.172.19 (Michaël Zasso) #40178
  • [66da32c045] - (SEMVER-MAJOR) deps,test,src,doc,tools: update to OpenSSL 3.0 (Daniel Bevenius) #38512
  • [40c6e838df] - (SEMVER-MAJOR) dgram: tighten address validation in socket.send (Voltrex) #39190
  • [f182b9b29f] - (SEMVER-MAJOR) dns: runtime deprecate type coercion of dns.lookup options (Antoine du Hamel) #39793
  • [1b2749ecbe] - (SEMVER-MAJOR) dns: default to verbatim=true in dns.lookup() (treysis) #39987
  • [ae876d420c] - (SEMVER-MAJOR) doc: update minimum supported FreeBSD to 12.2 (Michaël Zasso) #40179
  • [59d3d542d6] - (SEMVER-MAJOR) errors: print Node.js version on fatal exceptions that cause exit (Divlo) #38332
  • [f9447b71a6] - (SEMVER-MAJOR) fs: fix rmsync error swallowing (Nitzan Uziely) #38684
  • [f27b7cf95c] - (SEMVER-MAJOR) fs: aggregate errors in fsPromises to avoid error swallowing (Nitzan Uziely) #38259
  • [d0a898681f] - (SEMVER-MAJOR) lib: add structuredClone() global (Ethan Arrowood) #39759
  • [e4b1fb5e64] - (SEMVER-MAJOR) lib: expose DOMException as global (Khaidi Chu) #39176
  • [36e2ffe6dc] - (SEMVER-MAJOR) module: subpath folder mappings EOL (Guy Bedford) #40121
  • [64287e4d45] - (SEMVER-MAJOR) module: runtime deprecate trailing slash patterns (Guy Bedford) #40117
  • [707dd77d86] - (SEMVER-MAJOR) readline: validate AbortSignals and remove unused event listeners (Antoine du Hamel) #37947
  • [8122d243ae] - (SEMVER-MAJOR) readline: introduce promise-based API (Antoine du Hamel) #37947
  • [592d1c3d44] - (SEMVER-MAJOR) readline: refactor Interface to ES2015 class (Antoine du Hamel) #37947
  • [3f619407fe] - (SEMVER-MAJOR) src: allow CAP_NET_BIND_SERVICE in SafeGetenv (Daniel Bevenius) #37727
  • [0a7f850123] - (SEMVER-MAJOR) src: return Maybe from a couple of functions (Darshan Sen) #39603
  • [bdaf51bae7] - (SEMVER-MAJOR) src: allow custom PageAllocator in NodePlatform (Shelley Vohr) #38362
  • [0c6f345cda] - (SEMVER-MAJOR) stream: fix highwatermark threshold and add the missing error (Rongjian Zhang) #38700
  • [0e841b45c2] - (SEMVER-MAJOR) stream: don't emit 'data' after 'error' or 'close' (Robert Nagy) #39639
  • [ef992f6de9] - (SEMVER-MAJOR) stream: do not emit end on readable error (Szymon Marczak) #39607
  • [efd40eadab] - (SEMVER-MAJOR) stream: forward errored to callback (Robert Nagy) #39364
  • [09d8c0c8d2] - (SEMVER-MAJOR) stream: destroy readable on read error (Robert Nagy) #39342
  • [a5dec3a470] - (SEMVER-MAJOR) stream: validate abort signal (Robert Nagy) #39346
  • [bb275ef2a4] - (SEMVER-MAJOR) stream: unify stream utils (Robert Nagy) #39294
  • [b2ae12d422] - (SEMVER-MAJOR) stream: throw on premature close in Readable[AsyncIterator] (Darshan Sen) #39117
  • [0738a2b7bd] - (SEMVER-MAJOR) stream: finished should error on errored stream (Robert Nagy) #39235
  • [954217adda] - (SEMVER-MAJOR) stream: error Duplex write/read if not writable/readable (Robert Nagy) #34385
  • [f4609bdf3f] - (SEMVER-MAJOR) stream: bypass legacy destroy for pipeline and async iteration (Robert Nagy) #38505
  • [e1e669b109] - (SEMVER-MAJOR) url: throw invalid this on detached accessors (James M Snell) #39752
  • [70157b9cb7] - (SEMVER-MAJOR) url: forbid certain confusable changes from being introduced by toASCII (Timothy Gu) #38631

Semver-Minor Commits

  • [6cd12be347] - (SEMVER-MINOR) fs: add FileHandle.prototype.readableWebStream() (James M Snell) #39331
  • [341312d78a] - (SEMVER-MINOR) readline: add autoCommit option (Antoine du Hamel) #37947
  • [1d2f37d970] - (SEMVER-MINOR) src: add --openssl-legacy-provider option (Daniel Bevenius) #40478
  • [3b72788afb] - (SEMVER-MINOR) src: add flags for controlling process behavior (Cheng Zhao) #40339
  • [8306051001] - (SEMVER-MINOR) stream: add readableDidRead (Robert Nagy) #36820
  • [08ffbd115e] - (SEMVER-MINOR) vm: add support for import assertions in dynamic imports (Antoine du Hamel) #40249

Semver-Patch Commits

Windows 32-bit Installer: https://nodejs.org/dist/v17.0.0/node-v17.0.0-x86.msi
Windows 64-bit Installer: https://nodejs.org/dist/v17.0.0/node-v17.0.0-x64.msi
Windows 32-bit Binary: https://nodejs.org/dist/v17.0.0/win-x86/node.exe
Windows 64-bit Binary: https://nodejs.org/dist/v17.0.0/win-x64/node.exe
macOS 64-bit Installer: https://nodejs.org/dist/v17.0.0/node-v17.0.0.pkg
macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-darwin-arm64.tar.gz
macOS Intel 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-darwin-x64.tar.gz
Linux 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-linux-x64.tar.xz
Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-linux-ppc64le.tar.xz
Linux s390x 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-linux-s390x.tar.xz
AIX 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-aix-ppc64.tar.gz
ARMv7 32-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-linux-armv7l.tar.xz
ARMv8 64-bit Binary: https://nodejs.org/dist/v17.0.0/node-v17.0.0-linux-arm64.tar.xz
Source Code: https://nodejs.org/dist/v17.0.0/node-v17.0.0.tar.gz
Other release files: https://nodejs.org/dist/v17.0.0/
Documentation: https://nodejs.org/docs/v17.0.0/api/

SHASUMS

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

ab2a9b508665f88d6516a6322971bbb988dddf311cd26edcaea374ff06ee8f14  node-v17.0.0-aix-ppc64.tar.gz
bba3a1d2638ee194f82a6173296bebabf1b28897a5cd41bbc146629ac05e0751  node-v17.0.0-darwin-arm64.tar.gz
ec178ba85607bde1ead414230c1fb5ad57768dcc224d7a100f13be6f8a0bec3e  node-v17.0.0-darwin-arm64.tar.xz
091f29119bfb2a9004171f4626e0e76021f7f8db07148bd45caa6a61eb2a4e3d  node-v17.0.0-darwin-x64.tar.gz
05a5308c28711ab5593cfbabadf5c62c5063a182bff413bd1336a824ce4c6f20  node-v17.0.0-darwin-x64.tar.xz
8021132e37f0b7dc85c00ad32fb5176d2933ec4a4056a96bd6c3cf632147ec2f  node-v17.0.0-headers.tar.gz
2573e4c4913d38a5d6631ade68fb41ee5ec1e4408024fa4dda3aa4453cefea62  node-v17.0.0-headers.tar.xz
d00e801d49b7419cbb07be4c8f026b43560c4e53579abce9d764edf7ebbc6554  node-v17.0.0-linux-arm64.tar.gz
6573675a97fa63870d5adf4969152e27fb49cdc9a6664bd6364dcc899659d559  node-v17.0.0-linux-arm64.tar.xz
90e0447f4867f624e416fb39373e94734860c7fb158976335673f94607182a43  node-v17.0.0-linux-armv7l.tar.gz
2f260508471f558fa8efa0e1f0be3e3c43c6c6f053db5bfcc8998bd338617fe9  node-v17.0.0-linux-armv7l.tar.xz
9e3f1c7fc59dadb0f9303a11c50247d62688be85c3e70e90c040655b49f93a54  node-v17.0.0-linux-ppc64le.tar.gz
ed5ee6161759cd8db351593a055d279bbf53f28ec45c58236cb275f2f7bc6433  node-v17.0.0-linux-ppc64le.tar.xz
6ae1826a06c974e059b8f6d37d97cce340bcdfc3c6746e1e73139f606de4d6a1  node-v17.0.0-linux-s390x.tar.gz
1b09ea0916cfcfba12b4912cb0671d5331e572b5e14f067433e599ee11ca267c  node-v17.0.0-linux-s390x.tar.xz
252505ade312c6c346c6b8d00e2be9e383446d81430ee4c1e5a04972e0817da4  node-v17.0.0-linux-x64.tar.gz
e3b8c76134a4f693607e679b407bc0783cec7b1fdcab9f13ca7df1ae6acee440  node-v17.0.0-linux-x64.tar.xz
481bf9e955f8d613e1513d10c853c7cc4cda4389929ce3a232024fdf093ed98e  node-v17.0.0.pkg
bcac24b990be48e6d1fead0726cd395b48b0dd05d030396ddac94b628aa03f2f  node-v17.0.0.tar.gz
c352ac4d8e8de429a3f940e202fdffc31dd6809d0e92a5b23ddca9a9a62e35ff  node-v17.0.0.tar.xz
053a6e7e34ae791b25a691fded34bcd3259adb519cea8873b74c93eb6f57c667  node-v17.0.0-win-x64.7z
34fdcaff4f930504b08bf9083f2d6e42f874e1bc93e453d592387f1cc5bb4a2b  node-v17.0.0-win-x64.zip
cf5ca9d60f2b39518f4503675a4f259b67f81a6148bb6307e04be60f91c5e071  node-v17.0.0-win-x86.7z
bf4d9cef6c5ec93b4c482cf5ff856cedcc8383b888a2e7fdcf2cf43c6e9ad5a2  node-v17.0.0-win-x86.zip
746042b936fbd3c67988fcce2b4bfaa0516765b26a02500376427e907ee929f2  node-v17.0.0-x64.msi
c0a3b338ed0519db2bb14890f27f443dcf620ab6d11ef3ce17b2242074bee5c6  node-v17.0.0-x86.msi
b9745ba9b54e7b9f0cc38d66d4783a7224212e4d8630eed0793430b4d0b756e4  win-x64/node.exe
95d44c197ebbc042dbed838ecde8f78c8902dc6d266605859f93c28d2051b3e0  win-x64/node.lib
b3add83b027a8ddfb92a42b7314f3b8b89bfec4c22c2105cff1ecc4a3e3c9c3c  win-x64/node_pdb.7z
da556d50d1a397698aa09b9f6204afd593bae42354384ddc7c6714336bec3152  win-x64/node_pdb.zip
59d4dc681b38776df9baf8b044111b50e29cefb7ec2238d2de8a2df40241f1b3  win-x86/node.exe
708622a96033ea289f09421906e51a32d0cbfde560fb82a78498f3f5a7617152  win-x86/node.lib
7b3108e0a6dd8e068156d009f7aec5b4ee058fd2ece5fd659f421ebda7477f78  win-x86/node_pdb.7z
b23e990313961f397066fb5c729bb4170f80f9dcf40dbac03c482352385a2db9  win-x86/node_pdb.zip
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEETtd49TnjY0x3nIfG1wYoSKGrAFwFAmFu5zoACgkQ1wYoSKGr
AFxaDggAlg1cJMRp5xWV6b3ysIVk685j/3Uf5o/qpdaG5EujLzeCZTr4mP2Xr9J4
rzXZIaafOli9ULGulicmbySKyN3OVOBlIutGDtmFPs3HXj7xjx4M/FWnL3BJ2615
iOYsFQzlaI+9uc83IKAk2Mg/SGNytJhjeikTU0pCaev+SPSXg15a8Z7jl4vLr52K
zPxbb6Oldpc5e0ang9kL0TuJIcVQq97a4jDfm6rEx6h3WCjspDZZPaWOGiCNB1Id
Vce1ptCJOeUzNdpqRhnz4P4mkcSwlDc9Cq6Lq7EeLSfG36djrINgkTGGe/og2YhG
GRHvPoEFIdf+mOxzaJSmJMbhhRWWdQ==
=D37b
-----END PGP SIGNATURE-----