util: use a global symbol for util.promisify.custom

Define `util.promisify.custom`
as `Symbol.for("nodejs.util.inspect.custom")`, rather than
as `Symbol("util.inspect.custom")`.

This allows custom `promisify` wrappers to easily/safely be defined
in non‑Node.js environments.

Fixes: https://github.com/nodejs/node/issues/31647

PR-URL: https://github.com/nodejs/node/pull/31672
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
ExE Boss 2020-02-07 11:40:00 +01:00 committed by Anna Henningsen
parent 7f44d2ced6
commit ba684805b6
No known key found for this signature in database
GPG Key ID: A94130F0BFC8EBE9
3 changed files with 37 additions and 1 deletions

View File

@ -995,11 +995,32 @@ throw an error.
### `util.promisify.custom`
<!-- YAML
added: v8.0.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/31672
description: This is now defined as a shared symbol.
-->
* {symbol} that can be used to declare custom promisified variants of functions,
see [Custom promisified functions][].
In addition to being accessible through `util.promisify.custom`, this
symbol is [registered globally][global symbol registry] and can be
accessed in any environment as `Symbol.for('nodejs.util.promisify.custom')`.
For example, with a function that takes in
`(foo, onSuccessCallback, onErrorCallback)`:
```js
const kCustomPromisifiedSymbol = Symbol.for('nodejs.util.promisify.custom');
doSomething[kCustomPromisifiedSymbol] = (foo) => {
return new Promise((resolve, reject) => {
doSomething(foo, resolve, reject);
});
};
```
## Class: `util.TextDecoder`
<!-- YAML
added: v8.3.0

View File

@ -271,7 +271,7 @@ function getSystemErrorName(err) {
return entry ? entry[0] : `Unknown system error ${err}`;
}
const kCustomPromisifiedSymbol = Symbol('util.promisify.custom');
const kCustomPromisifiedSymbol = SymbolFor('nodejs.util.promisify.custom');
const kCustomPromisifyArgsSymbol = Symbol('customPromisifyArgs');
function promisify(original) {

View File

@ -33,6 +33,21 @@ const stat = promisify(fs.stat);
assert.strictEqual(promisify(promisify(fn)), promisifedFn);
}
{
function fn() {}
function promisifiedFn() {}
// util.promisify.custom is a shared symbol which can be accessed
// as `Symbol.for("nodejs.util.promisify.custom")`.
const kCustomPromisifiedSymbol = Symbol.for('nodejs.util.promisify.custom');
fn[kCustomPromisifiedSymbol] = promisifiedFn;
assert.strictEqual(kCustomPromisifiedSymbol, promisify.custom);
assert.strictEqual(promisify(fn), promisifiedFn);
assert.strictEqual(promisify(promisify(fn)), promisifiedFn);
}
{
function fn() {}
fn[promisify.custom] = 42;