Skip to content

Commit 08a6d9e

Browse files
eladkishontargos
authored andcommitted
util: add getSystemErrorMap() impl
PR-URL: #38101 Fixes: #37951 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Darshan Sen <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Juan José Arboleda <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent e6c599b commit 08a6d9e

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

doc/api/util.md

+19
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,25 @@ fs.access('file/that/does/not/exist', (err) => {
376376
});
377377
```
378378

379+
## `util.getSystemErrorMap()`
380+
<!-- YAML
381+
added: REPLACEME
382+
-->
383+
384+
* Returns: {Map}
385+
386+
Returns a Map of all system error codes available from the Node.js API.
387+
The mapping between error codes and error names is platform-dependent.
388+
See [Common System Errors][] for the names of common errors.
389+
390+
```js
391+
fs.access('file/that/does/not/exist', (err) => {
392+
const errorMap = util.getSystemErrorMap();
393+
const name = errorMap.get(err.errno);
394+
console.error(name); // ENOENT
395+
});
396+
```
397+
379398
## `util.inherits(constructor, superConstructor)`
380399
<!-- YAML
381400
added: v0.3.0

lib/internal/util.js

+12
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ const experimentalWarnings = new Set();
4444

4545
const colorRegExp = /\u001b\[\d\d?m/g; // eslint-disable-line no-control-regex
4646

47+
let uvBinding;
48+
49+
function lazyUv() {
50+
uvBinding = uvBinding ?? internalBinding('uv');
51+
return uvBinding;
52+
}
53+
4754
function removeColors(str) {
4855
return str.replace(colorRegExp, '');
4956
}
@@ -271,6 +278,10 @@ function getSystemErrorName(err) {
271278
return entry ? entry[0] : `Unknown system error ${err}`;
272279
}
273280

281+
function getSystemErrorMap() {
282+
return lazyUv().getErrorMap();
283+
}
284+
274285
const kCustomPromisifiedSymbol = SymbolFor('nodejs.util.promisify.custom');
275286
const kCustomPromisifyArgsSymbol = Symbol('customPromisifyArgs');
276287

@@ -414,6 +425,7 @@ module.exports = {
414425
emitExperimentalWarning,
415426
filterDuplicateStrings,
416427
getConstructorOf,
428+
getSystemErrorMap,
417429
getSystemErrorName,
418430
isError,
419431
isInsideNodeModules,

lib/util.js

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const types = require('internal/util/types');
5757

5858
const {
5959
deprecate,
60+
getSystemErrorMap,
6061
getSystemErrorName: internalErrorName,
6162
promisify
6263
} = require('internal/util');
@@ -244,6 +245,7 @@ module.exports = {
244245
deprecate,
245246
format,
246247
formatWithOptions,
248+
getSystemErrorMap,
247249
getSystemErrorName,
248250
inherits,
249251
inspect,

test/parallel/test-uv-errmap.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Flags: --expose-internals
2+
'use strict';
3+
4+
require('../common');
5+
const assert = require('assert');
6+
const {
7+
getSystemErrorMap,
8+
_errnoException
9+
} = require('util');
10+
11+
const { internalBinding } = require('internal/test/binding');
12+
const uv = internalBinding('uv');
13+
const uvKeys = Object.keys(uv);
14+
15+
const errMap = getSystemErrorMap();
16+
17+
uvKeys.forEach((key) => {
18+
if (!key.startsWith('UV_'))
19+
return;
20+
21+
const err = _errnoException(uv[key]);
22+
const name = uv.errname(uv[key]);
23+
assert.strictEqual(errMap.get(err.errno)[0], name);
24+
});

0 commit comments

Comments
 (0)