-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathintercept.ts
More file actions
67 lines (63 loc) · 2.05 KB
/
intercept.ts
File metadata and controls
67 lines (63 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* @file Process-method interceptors — `processEmit` replaces `process.emit` and
* `processReallyExit` replaces `process.reallyExit` while `load()` is active.
* Both forward to the originals captured in `_internal` and broadcast `exit`
* / `afterexit` through the signal-exit emitter.
*/
import { ErrorCtor } from '../../primordials/error'
import { ReflectApply } from '../../primordials/reflect'
import {
emit,
globalProcess,
originalProcessEmit,
originalProcessReallyExit,
} from './_internal'
/* c8 ignore start - processEmit + processReallyExit interceptors
only fire on real process exit/emit; can't be triggered in-test. */
export function processEmit(
this: NodeJS.Process,
eventName: string,
exitCode?: number | undefined,
...args: unknown[]
): boolean {
if (eventName === 'exit') {
let actualExitCode = exitCode
if (actualExitCode === undefined) {
const processExitCode = globalProcess?.exitCode
actualExitCode =
typeof processExitCode === 'number' ? processExitCode : undefined
} else if (globalProcess) {
globalProcess.exitCode = actualExitCode
}
const result = ReflectApply(
originalProcessEmit as (...args: unknown[]) => boolean,
this,
[eventName, actualExitCode, ...args],
) as boolean
const numExitCode =
typeof actualExitCode === 'number' ? actualExitCode : undefined
emit('exit', numExitCode, undefined)
emit('afterexit', numExitCode, undefined)
return result
}
return ReflectApply(
originalProcessEmit as (...args: unknown[]) => boolean,
this,
[eventName, exitCode, ...args],
) as boolean
}
export function processReallyExit(code?: number | undefined): never {
const exitCode = code || 0
if (globalProcess) {
globalProcess.exitCode = exitCode
}
emit('exit', exitCode, undefined)
emit('afterexit', exitCode, undefined)
ReflectApply(
originalProcessReallyExit as (code?: number) => never,
globalProcess,
[exitCode],
)
throw new ErrorCtor('processReallyExit should never return')
}
/* c8 ignore stop */