Skip to content

Commit

Permalink
process: fix symbol key and mark experimental new node:process methods
Browse files Browse the repository at this point in the history
  • Loading branch information
aduh95 committed Jan 8, 2025
1 parent ea493c1 commit 8a70467
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 6 deletions.
12 changes: 8 additions & 4 deletions doc/api/process.md
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down
6 changes: 4 additions & 2 deletions lib/internal/process/per_thread.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
17 changes: 17 additions & 0 deletions test/parallel/test-process-ref-unref.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')]() {
Expand All @@ -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);
Expand Down

0 comments on commit 8a70467

Please sign in to comment.