mirror of https://github.com/nodejs/node.git
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
parent
ba6800d1d6
commit
3946f16786
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue