• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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