1
1
'use strict' ;
2
- var assert = require ( 'assert' ) ;
3
- var common = require ( '../common' ) ;
4
- var fork = require ( 'child_process' ) . fork ;
5
- var net = require ( 'net' ) ;
6
- var count = 12 ;
2
+ const assert = require ( 'assert' ) ;
3
+ const common = require ( '../common' ) ;
4
+ const fork = require ( 'child_process' ) . fork ;
5
+ const net = require ( 'net' ) ;
6
+ const count = 12 ;
7
7
8
8
if ( process . argv [ 2 ] === 'child' ) {
9
- var sockets = [ ] ;
10
- var id = process . argv [ 3 ] ;
9
+ let sockets = [ ] ;
11
10
12
11
process . on ( 'message' , function ( m , socket ) {
12
+ function sendClosed ( id ) {
13
+ process . send ( { id : id , status : 'closed' } ) ;
14
+ } ;
15
+
13
16
if ( m . cmd === 'new' ) {
14
17
assert ( socket ) ;
15
18
assert ( socket instanceof net . Socket , 'should be a net.Socket' ) ;
16
19
sockets . push ( socket ) ;
17
- socket . on ( 'end' , function ( ) {
18
- if ( ! this . closingOnPurpose )
19
- throw new Error ( '[c] closing by accident!' ) ;
20
- } ) ;
21
20
}
22
21
23
22
if ( m . cmd === 'close' ) {
24
23
assert . equal ( socket , undefined ) ;
25
- sockets [ m . id ] . once ( 'close' , function ( ) {
26
- process . send ( { id : m . id , status : 'closed' } ) ;
27
- } ) ;
28
- sockets [ m . id ] . destroy ( ) ;
24
+ if ( sockets [ m . id ] . destroyed ) {
25
+ // Workaround for https://github.com/nodejs/node/issues/2610
26
+ sendClosed ( m . id ) ;
27
+ // End of workaround. When bug is fixed, this code can be used instead:
28
+ // throw new Error('socket destroyed unexpectedly!');
29
+ } else {
30
+ sockets [ m . id ] . once ( 'close' , sendClosed . bind ( null , m . id ) ) ;
31
+ sockets [ m . id ] . destroy ( ) ;
32
+ }
29
33
}
30
34
} ) ;
31
35
32
36
} else {
33
- var child = fork ( process . argv [ 1 ] , [ 'child' ] ) ;
37
+ const child = fork ( process . argv [ 1 ] , [ 'child' ] ) ;
34
38
35
39
child . on ( 'exit' , function ( code , signal ) {
36
40
if ( ! childKilled )
37
41
throw new Error ( 'child died unexpectedly!' ) ;
38
42
} ) ;
39
43
40
- var server = net . createServer ( ) ;
41
- var sockets = [ ] ;
42
- var sent = 0 ;
44
+ const server = net . createServer ( ) ;
45
+ let sockets = [ ] ;
46
+ let sent = 0 ;
43
47
44
48
server . on ( 'connection' , function ( socket ) {
45
- child . send ( { cmd : 'new' } , socket , { track : false } ) ;
49
+ child . send ( { cmd : 'new' } , socket ) ;
46
50
sockets . push ( socket ) ;
47
51
48
52
if ( sockets . length === count ) {
49
53
closeSockets ( 0 ) ;
50
54
}
51
55
} ) ;
52
56
53
- var disconnected = 0 ;
54
- var clients = [ ] ;
57
+ let disconnected = 0 ;
55
58
server . on ( 'listening' , function ( ) {
56
- var j = count , client ;
59
+ let j = count , client ;
57
60
while ( j -- ) {
58
61
client = net . connect ( common . PORT , '127.0.0.1' ) ;
59
- client . id = j ;
60
62
client . on ( 'close' , function ( ) {
61
63
disconnected += 1 ;
62
64
} ) ;
63
- clients . push ( client ) ;
64
65
}
65
66
} ) ;
66
67
67
- var childKilled = false ;
68
+ let childKilled = false ;
68
69
function closeSockets ( i ) {
69
70
if ( i === count ) {
70
71
childKilled = true ;
@@ -73,17 +74,17 @@ if (process.argv[2] === 'child') {
73
74
return ;
74
75
}
75
76
76
- sent ++ ;
77
- child . send ( { id : i , cmd : 'close' } ) ;
78
77
child . once ( 'message' , function ( m ) {
79
78
assert ( m . status === 'closed' ) ;
80
79
server . getConnections ( function ( err , num ) {
81
80
closeSockets ( i + 1 ) ;
82
81
} ) ;
83
82
} ) ;
83
+ sent ++ ;
84
+ child . send ( { id : i , cmd : 'close' } ) ;
84
85
} ;
85
86
86
- var closeEmitted = false ;
87
+ let closeEmitted = false ;
87
88
server . on ( 'close' , function ( ) {
88
89
closeEmitted = true ;
89
90
} ) ;
0 commit comments