diff --git a/doc/api/process.md b/doc/api/process.md index 1bad26bc6ca320..95b35897f9d568 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -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" diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index 0921f583183d71..134e99e2374722 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -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); } diff --git a/test/parallel/test-process-ref-unref.js b/test/parallel/test-process-ref-unref.js index e9db4d56eefc58..6bd508c1dbb9cb 100644 --- a/test/parallel/test-process-ref-unref.js +++ b/test/parallel/test-process-ref-unref.js @@ -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);