/
inspector.ts
56 lines (45 loc) · 1.81 KB
/
inspector.ts
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
import { createRequire } from 'node:module'
import type { ContextRPC } from '../types'
const __require = createRequire(import.meta.url)
let inspector: typeof import('node:inspector')
let session: InstanceType<typeof inspector.Session>
/**
* Enables debugging inside `worker_threads` and `child_process`.
* Should be called as early as possible when worker/process has been set up.
*/
export function setupInspect(ctx: ContextRPC) {
const config = ctx.config
const isEnabled = config.inspect || config.inspectBrk
if (isEnabled) {
inspector = __require('node:inspector')
// Inspector may be open already if "isolate: false" is used
const isOpen = inspector.url() !== undefined
if (!isOpen) {
inspector.open()
if (config.inspectBrk) {
inspector.waitForDebugger()
const firstTestFile = ctx.files[0]
// Stop at first test file
if (firstTestFile) {
session = new inspector.Session()
session.connect()
session.post('Debugger.enable')
session.post('Debugger.setBreakpointByUrl', {
lineNumber: 0,
url: new URL(firstTestFile, import.meta.url).href,
})
}
}
}
}
// In watch mode the inspector can persist re-runs if isolation is disabled and a single worker is used
const isIsolatedSingleThread = config.pool === 'threads' && config.poolOptions?.threads?.isolate === false && config.poolOptions?.threads?.singleThread
const isIsolatedSingleFork = config.pool === 'forks' && config.poolOptions?.forks?.isolate === false && config.poolOptions?.forks?.singleFork
const keepOpen = config.watch && (isIsolatedSingleFork || isIsolatedSingleThread)
return function cleanup() {
if (isEnabled && !keepOpen && inspector) {
inspector.close()
session?.disconnect()
}
}
}