node/lib/internal/process/report.js
Michaël Zasso 0646eda4fc
lib: flatten access to primordials
Store all primordials as properties of the primordials object.
Static functions are prefixed by the constructor's name and prototype
methods are prefixed by the constructor's name followed by "Prototype".
For example: primordials.Object.keys becomes primordials.ObjectKeys.

PR-URL: https://github.com/nodejs/node/pull/30610
Refs: https://github.com/nodejs/node/issues/29766
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
2019-11-25 10:28:15 +01:00

112 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 {
JSONParse,
} = 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 JSONParse(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
};