mirror of
https://github.com/nodejs/node.git
synced 2025-05-05 15:32:15 +00:00

It's likely that anyone using `process.report.getReport()` will be processing the return value thereafter (e.g., filtering fields or redacting secrets). This change eliminates boilerplate by calling `JSON.parse()` on the return value. Also modified the `validateContent()` and `validate()` test helpers in `test/common/report.js` to be somewhat more obvious and helpful. Of note, a report failing validation will now be easier (though still not _easy_) to read when prepended to the stack trace. - Refs: https://github.com/nodejs/diagnostics/issues/315 PR-URL: https://github.com/nodejs/node/pull/28630 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Rich Trott <rtrott@gmail.com>
110 lines
2.7 KiB
JavaScript
110 lines
2.7 KiB
JavaScript
'use strict';
|
|
const {
|
|
ERR_INVALID_ARG_TYPE,
|
|
ERR_SYNTHETIC
|
|
} = require('internal/errors').codes;
|
|
const { validateSignalName, validateString } = require('internal/validators');
|
|
const nr = internalBinding('report');
|
|
const { JSON } = primordials;
|
|
const report = {
|
|
writeReport(file, err) {
|
|
if (typeof file === 'object' && file !== null) {
|
|
err = file;
|
|
file = undefined;
|
|
} else if (file !== undefined && typeof file !== 'string') {
|
|
throw new ERR_INVALID_ARG_TYPE('file', 'String', file);
|
|
} else if (err === undefined) {
|
|
err = new ERR_SYNTHETIC();
|
|
} else if (err === null || typeof err !== 'object') {
|
|
throw new ERR_INVALID_ARG_TYPE('err', 'Object', err);
|
|
}
|
|
|
|
return nr.writeReport('JavaScript API', 'API', file, err.stack);
|
|
},
|
|
getReport(err) {
|
|
if (err === undefined)
|
|
err = new ERR_SYNTHETIC();
|
|
else if (err === null || typeof err !== 'object')
|
|
throw new ERR_INVALID_ARG_TYPE('err', 'Object', err);
|
|
|
|
return JSON.parse(nr.getReport(err.stack));
|
|
},
|
|
get directory() {
|
|
return nr.getDirectory();
|
|
},
|
|
set directory(dir) {
|
|
validateString(dir, 'directory');
|
|
nr.setDirectory(dir);
|
|
},
|
|
get filename() {
|
|
return nr.getFilename();
|
|
},
|
|
set filename(name) {
|
|
validateString(name, 'filename');
|
|
nr.setFilename(name);
|
|
},
|
|
get signal() {
|
|
return nr.getSignal();
|
|
},
|
|
set signal(sig) {
|
|
validateSignalName(sig, 'signal');
|
|
removeSignalHandler();
|
|
addSignalHandler(sig);
|
|
nr.setSignal(sig);
|
|
},
|
|
get reportOnFatalError() {
|
|
return nr.shouldReportOnFatalError();
|
|
},
|
|
set reportOnFatalError(trigger) {
|
|
if (typeof trigger !== 'boolean')
|
|
throw new ERR_INVALID_ARG_TYPE('trigger', 'boolean', trigger);
|
|
|
|
nr.setReportOnFatalError(trigger);
|
|
},
|
|
get reportOnSignal() {
|
|
return nr.shouldReportOnSignal();
|
|
},
|
|
set reportOnSignal(trigger) {
|
|
if (typeof trigger !== 'boolean')
|
|
throw new ERR_INVALID_ARG_TYPE('trigger', 'boolean', trigger);
|
|
|
|
nr.setReportOnSignal(trigger);
|
|
removeSignalHandler();
|
|
addSignalHandler();
|
|
},
|
|
get reportOnUncaughtException() {
|
|
return nr.shouldReportOnUncaughtException();
|
|
},
|
|
set reportOnUncaughtException(trigger) {
|
|
if (typeof trigger !== 'boolean')
|
|
throw new ERR_INVALID_ARG_TYPE('trigger', 'boolean', trigger);
|
|
|
|
nr.setReportOnUncaughtException(trigger);
|
|
}
|
|
};
|
|
|
|
function addSignalHandler(sig) {
|
|
if (nr.shouldReportOnSignal()) {
|
|
if (typeof sig !== 'string')
|
|
sig = nr.getSignal();
|
|
|
|
process.on(sig, signalHandler);
|
|
}
|
|
}
|
|
|
|
function removeSignalHandler() {
|
|
const sig = nr.getSignal();
|
|
|
|
if (sig)
|
|
process.removeListener(sig, signalHandler);
|
|
}
|
|
|
|
function signalHandler(sig) {
|
|
nr.writeReport(sig, 'Signal', null, '');
|
|
}
|
|
|
|
module.exports = {
|
|
addSignalHandler,
|
|
report
|
|
};
|