1
+ import * as common from '../common/index.mjs' ;
2
+ import * as inspector from 'node:inspector' ;
3
+ import assert from 'node:assert' ;
4
+ import net from 'node:net' ;
5
+ import url from 'node:url' ;
6
+ import { fork } from 'node:child_process' ;
7
+
8
+ common . skipIfInspectorDisabled ( ) ;
9
+ if ( process . env . BE_CHILD ) {
10
+ console . log ( process . argv )
11
+ beChild ( ) ;
12
+ } else {
13
+ let firstPort ;
14
+
15
+ const filename = url . fileURLToPath ( import . meta. url ) ;
16
+ const child = fork ( filename , { env : { ...process . env , BE_CHILD : 1 } } ) ;
17
+
18
+ child . once ( 'message' , common . mustCall ( ( msg ) => {
19
+ assert . strictEqual ( msg . cmd , 'started' ) ;
20
+
21
+ child . send ( { cmd : 'open' , args : [ ] } ) ;
22
+ child . once ( 'message' , common . mustCall ( wasOpenedHandler ) ) ;
23
+ } ) ) ;
24
+
25
+ function wasOpenedHandler ( msg ) {
26
+ assert . strictEqual ( msg . cmd , 'url' ) ;
27
+ const port = url . parse ( msg . url ) . port ;
28
+ ping ( port , common . mustSucceed ( ( ) => {
29
+ // Inspector is already open, and won't be reopened, so args don't matter.
30
+ child . send ( { cmd : 'dispose' } ) ;
31
+ child . once ( 'message' , common . mustCall ( wasDisposedWhenOpenHandler ) ) ;
32
+ firstPort = port ;
33
+ } ) ) ;
34
+ }
35
+
36
+ function wasDisposedWhenOpenHandler ( msg ) {
37
+ assert . strictEqual ( msg . cmd , 'url' ) ;
38
+ assert . strictEqual ( msg . url , undefined ) ;
39
+ ping ( firstPort , ( err ) => {
40
+ assert ( err ) ;
41
+ child . send ( { cmd : 'dispose' } ) ;
42
+ child . once ( 'message' , common . mustCall ( wasReDisposedHandler ) ) ;
43
+ } ) ;
44
+ }
45
+
46
+ function wasReDisposedHandler ( msg ) {
47
+ assert . strictEqual ( msg . cmd , 'url' ) ;
48
+ assert . strictEqual ( msg . url , undefined ) ;
49
+ process . exit ( ) ;
50
+ }
51
+ }
52
+
53
+ function ping ( port , callback ) {
54
+ net . connect ( { port, family : 4 } )
55
+ . on ( 'connect' , function ( ) { close ( this ) ; } )
56
+ . on ( 'error' , function ( err ) { close ( this , err ) ; } ) ;
57
+
58
+ function close ( self , err ) {
59
+ self . end ( ) ;
60
+ self . on ( 'close' , ( ) => callback ( err ) ) ;
61
+ }
62
+ }
63
+ function beChild ( ) {
64
+ let inspectorDisposer ;
65
+ process . send ( { cmd : 'started' } ) ;
66
+
67
+ process . on ( 'message' , ( msg ) => {
68
+ if ( msg . cmd === 'open' ) {
69
+ inspectorDisposer = inspector . open ( 0 , false , undefined ) ;
70
+ }
71
+ if ( msg . cmd === 'dispose' ) {
72
+ inspectorDisposer [ Symbol . dispose ] ( ) ;
73
+ }
74
+ process . send ( { cmd : 'url' , url : inspector . url ( ) } ) ;
75
+ } ) ;
76
+ }
0 commit comments