process: fix symbol key and mark experimental new `node:process` methods

PR-URL: https://github.com/nodejs/node/pull/56517
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
pull/56552/head
Antoine du Hamel 2025-01-10 15:40:28 +01:00 committed by GitHub
parent ba6800d1d6
commit 3946f16786
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 29 additions and 6 deletions

View File

@ -3248,11 +3248,13 @@ console.log(`The parent process is pid ${ppid}`);
added: v23.6.0
-->
> Stability: 1 - Experimental
* `maybeRefable` {any} An object that may be "refable".
An object is "refable" if it implements the Node.js "Refable protocol".
Specifically, this means that the object implements the `Symbol.for('node:ref')`
and `Symbol.for('node:unref')` methods. "Ref'd" objects will keep the Node.js
Specifically, this means that the object implements the `Symbol.for('nodejs.ref')`
and `Symbol.for('nodejs.unref')` methods. "Ref'd" objects will keep the Node.js
event loop alive, while "unref'd" objects will not. Historically, this was
implemented by using `ref()` and `unref()` methods directly on the objects.
This pattern, however, is being deprecated in favor of the "Refable protocol"
@ -4307,11 +4309,13 @@ In [`Worker`][] threads, `process.umask(mask)` will throw an exception.
added: v23.6.0
-->
> Stability: 1 - Experimental
* `maybeUnfefable` {any} An object that may be "unref'd".
An object is "unrefable" if it implements the Node.js "Refable protocol".
Specifically, this means that the object implements the `Symbol.for('node:ref')`
and `Symbol.for('node:unref')` methods. "Ref'd" objects will keep the Node.js
Specifically, this means that the object implements the `Symbol.for('nodejs.ref')`
and `Symbol.for('nodejs.unref')` methods. "Ref'd" objects will keep the Node.js
event loop alive, while "unref'd" objects will not. Historically, this was
implemented by using `ref()` and `unref()` methods directly on the objects.
This pattern, however, is being deprecated in favor of the "Refable protocol"

View File

@ -421,12 +421,14 @@ function toggleTraceCategoryState(asyncHooksEnabled) {
const { arch, platform, version } = process;
function ref(maybeRefable) {
const fn = maybeRefable?.[SymbolFor('node:ref')] || maybeRefable?.ref;
const fn = maybeRefable?.[SymbolFor('nodejs.ref')] || maybeRefable?.[SymbolFor('node:ref')] || maybeRefable?.ref;
if (typeof fn === 'function') FunctionPrototypeCall(fn, maybeRefable);
}
function unref(maybeRefable) {
const fn = maybeRefable?.[SymbolFor('node:unref')] || maybeRefable?.unref;
const fn = maybeRefable?.[SymbolFor('nodejs.unref')] ||
maybeRefable?.[SymbolFor('node:unref')] ||
maybeRefable?.unref;
if (typeof fn === 'function') FunctionPrototypeCall(fn, maybeRefable);
}

View File

@ -23,6 +23,18 @@ class Foo {
}
class Foo2 {
refCalled = 0;
unrefCalled = 0;
[Symbol.for('nodejs.ref')]() {
this.refCalled++;
}
[Symbol.for('nodejs.unref')]() {
this.unrefCalled++;
}
}
// TODO(aduh95): remove support for undocumented symbol
class Foo3 {
refCalled = 0;
unrefCalled = 0;
[Symbol.for('node:ref')]() {
@ -39,14 +51,19 @@ describe('process.ref/unref work as expected', () => {
// just work.
const foo1 = new Foo();
const foo2 = new Foo2();
const foo3 = new Foo3();
process.ref(foo1);
process.unref(foo1);
process.ref(foo2);
process.unref(foo2);
process.ref(foo3);
process.unref(foo3);
strictEqual(foo1.refCalled, 1);
strictEqual(foo1.unrefCalled, 1);
strictEqual(foo2.refCalled, 1);
strictEqual(foo2.unrefCalled, 1);
strictEqual(foo3.refCalled, 1);
strictEqual(foo3.unrefCalled, 1);
// Objects that implement the legacy API also just work.
const i = setInterval(() => {}, 1000);