1'use strict'; 2const { 3 ERR_SYNTHETIC, 4} = require('internal/errors').codes; 5const { 6 validateBoolean, 7 validateObject, 8 validateSignalName, 9 validateString, 10} = require('internal/validators'); 11const nr = internalBinding('report'); 12const { 13 JSONParse, 14} = primordials; 15const report = { 16 writeReport(file, err) { 17 if (typeof file === 'object' && file !== null) { 18 err = file; 19 file = undefined; 20 } else if (file !== undefined) { 21 validateString(file, 'file'); 22 } 23 24 if (err === undefined) { 25 err = new ERR_SYNTHETIC(); 26 } else { 27 validateObject(err, 'err'); 28 } 29 30 return nr.writeReport('JavaScript API', 'API', file, err); 31 }, 32 getReport(err) { 33 if (err === undefined) 34 err = new ERR_SYNTHETIC(); 35 else 36 validateObject(err, 'err'); 37 38 return JSONParse(nr.getReport(err)); 39 }, 40 get directory() { 41 return nr.getDirectory(); 42 }, 43 set directory(dir) { 44 validateString(dir, 'directory'); 45 nr.setDirectory(dir); 46 }, 47 get filename() { 48 return nr.getFilename(); 49 }, 50 set filename(name) { 51 validateString(name, 'filename'); 52 nr.setFilename(name); 53 }, 54 get compact() { 55 return nr.getCompact(); 56 }, 57 set compact(b) { 58 validateBoolean(b, 'compact'); 59 nr.setCompact(b); 60 }, 61 get signal() { 62 return nr.getSignal(); 63 }, 64 set signal(sig) { 65 validateSignalName(sig, 'signal'); 66 removeSignalHandler(); 67 addSignalHandler(sig); 68 nr.setSignal(sig); 69 }, 70 get reportOnFatalError() { 71 return nr.shouldReportOnFatalError(); 72 }, 73 set reportOnFatalError(trigger) { 74 validateBoolean(trigger, 'trigger'); 75 76 nr.setReportOnFatalError(trigger); 77 }, 78 get reportOnSignal() { 79 return nr.shouldReportOnSignal(); 80 }, 81 set reportOnSignal(trigger) { 82 validateBoolean(trigger, 'trigger'); 83 84 nr.setReportOnSignal(trigger); 85 removeSignalHandler(); 86 addSignalHandler(); 87 }, 88 get reportOnUncaughtException() { 89 return nr.shouldReportOnUncaughtException(); 90 }, 91 set reportOnUncaughtException(trigger) { 92 validateBoolean(trigger, 'trigger'); 93 94 nr.setReportOnUncaughtException(trigger); 95 }, 96}; 97 98function addSignalHandler(sig) { 99 if (nr.shouldReportOnSignal()) { 100 if (typeof sig !== 'string') 101 sig = nr.getSignal(); 102 103 process.on(sig, signalHandler); 104 } 105} 106 107function removeSignalHandler() { 108 const sig = nr.getSignal(); 109 110 if (sig) 111 process.removeListener(sig, signalHandler); 112} 113 114function signalHandler(sig) { 115 nr.writeReport(sig, 'Signal', null, ''); 116} 117 118module.exports = { 119 addSignalHandler, 120 report, 121}; 122