process: improve --redirect-warnings handling · nodejs/node@3439c95 (original) (raw)

`@@ -5,84 +5,50 @@ const { ERR_INVALID_ARG_TYPE } = require('internal/errors').codes;

`

5

5

``

6

6

`exports.setup = setupProcessWarnings;

`

7

7

``

8

``

`-

let options;

`

9

``

`-

function lazyOption(name) {

`

10

``

`-

if (!options) {

`

11

``

`-

options = require('internal/options');

`

``

8

`+

// Lazily loaded

`

``

9

`+

let fs;

`

``

10

`+

let fd;

`

``

11

`+

let warningFile;

`

``

12

+

``

13

`+

function lazyOption() {

`

``

14

`` +

// This will load warningFile only once. If the flag is not set,

``

``

15

`` +

// warningFile will be set to an empty string.

``

``

16

`+

if (warningFile === undefined) {

`

``

17

`+

warningFile = require('internal/options')

`

``

18

`+

.getOptionValue('--redirect-warnings');

`

12

19

`}

`

13

``

`-

return options.getOptionValue(name);

`

``

20

`+

return warningFile;

`

14

21

`}

`

15

22

``

16

``

`-

var cachedFd;

`

17

``

`-

var acquiringFd = false;

`

18

``

`-

function nop() {}

`

19

``

-

20

``

`-

// Lazily loaded

`

21

``

`-

var fs = null;

`

22

``

-

23

23

`function writeOut(message) {

`

24

24

`if (console && typeof console.error === 'function')

`

25

25

`return console.error(message);

`

26

26

`process._rawDebug(message);

`

27

27

`}

`

28

28

``

29

``

`-

function onClose(fd) {

`

30

``

`-

return () => {

`

31

``

`-

if (fs === null) fs = require('fs');

`

``

29

`+

function writeToFile(message) {

`

``

30

`+

if (fd === undefined) {

`

``

31

`+

fs = require('fs');

`

32

32

`try {

`

33

``

`-

fs.closeSync(fd);

`

34

``

`-

} catch {}

`

35

``

`-

};

`

36

``

`-

}

`

37

``

-

38

``

`-

function onOpen(cb) {

`

39

``

`-

return (err, fd) => {

`

40

``

`-

acquiringFd = false;

`

41

``

`-

if (fd !== undefined) {

`

42

``

`-

cachedFd = fd;

`

43

``

`-

process.on('exit', onClose(fd));

`

44

``

`-

}

`

45

``

`-

cb(err, fd);

`

46

``

`-

process.emit('_node_warning_fd_acquired', err, fd);

`

47

``

`-

};

`

48

``

`-

}

`

49

``

-

50

``

`-

function onAcquired(message) {

`

51

``

`-

// make a best effort attempt at writing the message

`

52

``

`-

// to the fd. Errors are ignored at this point.

`

53

``

`-

return (err, fd) => {

`

54

``

`-

if (err)

`

``

33

`+

fd = fs.openSync(warningFile, 'a');

`

``

34

`+

} catch {

`

55

35

`return writeOut(message);

`

56

``

`-

if (fs === null) fs = require('fs');

`

57

``

`` -

fs.appendFile(fd, ${message}\n, nop);

``

58

``

`-

};

`

59

``

`-

}

`

60

``

-

61

``

`-

function acquireFd(warningFile, cb) {

`

62

``

`-

if (cachedFd === undefined && !acquiringFd) {

`

63

``

`-

acquiringFd = true;

`

64

``

`-

if (fs === null) fs = require('fs');

`

65

``

`-

fs.open(warningFile, 'a', onOpen(cb));

`

66

``

`-

} else if (cachedFd !== undefined && !acquiringFd) {

`

67

``

`-

cb(null, cachedFd);

`

68

``

`-

} else {

`

69

``

`-

process.once('_node_warning_fd_acquired', cb);

`

70

``

`-

}

`

71

``

`-

}

`

72

``

-

73

``

`-

function output(message) {

`

74

``

`-

const warningFile = lazyOption('--redirect-warnings');

`

75

``

`-

if (warningFile) {

`

76

``

`-

acquireFd(warningFile, onAcquired(message));

`

77

``

`-

return;

`

``

36

`+

}

`

``

37

`+

process.on('exit', () => {

`

``

38

`+

try {

`

``

39

`+

fs.closeSync(fd);

`

``

40

`+

} catch {}

`

``

41

`+

});

`

78

42

`}

`

79

``

`-

writeOut(message);

`

``

43

`` +

fs.appendFile(fd, ${message}\n, (err) => {

``

``

44

`+

if (err) {

`

``

45

`+

writeOut(message);

`

``

46

`+

}

`

``

47

`+

});

`

80

48

`}

`

81

49

``

82

50

`function doEmitWarning(warning) {

`

83

``

`-

return () => {

`

84

``

`-

process.emit('warning', warning);

`

85

``

`-

};

`

``

51

`+

return () => process.emit('warning', warning);

`

86

52

`}

`

87

53

``

88

54

`function setupProcessWarnings() {

`

`@@ -107,7 +73,11 @@ function setupProcessWarnings() {

`

107

73

`if (typeof warning.detail === 'string') {

`

108

74

`` msg += \n${warning.detail};

``

109

75

`}

`

110

``

`-

output(msg);

`

``

76

`+

const warningFile = lazyOption();

`

``

77

`+

if (warningFile) {

`

``

78

`+

return writeToFile(msg);

`

``

79

`+

}

`

``

80

`+

writeOut(msg);

`

111

81

`});

`

112

82

`}

`

113

83

``