@@ -9,13 +9,15 @@ let currentPageReloadId = 0;
9
9
10
10
class IOSLiveSyncService extends liveSyncServiceBaseLib . LiveSyncServiceBase < Mobile . IiOSDevice > implements IPlatformLiveSyncService {
11
11
private static BACKEND_PORT = 18181 ;
12
+ private socket : net . Socket ;
12
13
13
14
constructor ( _device : Mobile . IDevice ,
14
15
private $iOSSocketRequestExecutor : IiOSSocketRequestExecutor ,
15
16
private $iOSNotification : IiOSNotification ,
16
17
private $iOSEmulatorServices : Mobile . IiOSSimulatorService ,
17
18
private $injector : IInjector ,
18
- private $logger : ILogger ) {
19
+ private $logger : ILogger ,
20
+ private $options : IOptions ) {
19
21
super ( _device ) ;
20
22
}
21
23
@@ -34,36 +36,71 @@ class IOSLiveSyncService extends liveSyncServiceBaseLib.LiveSyncServiceBase<Mobi
34
36
return ( ( ) => {
35
37
let timeout = 9000 ;
36
38
if ( this . device . isEmulator ) {
37
- helpers . connectEventually ( ( ) => net . connect ( IOSLiveSyncService . BACKEND_PORT ) , ( socket : net . Socket ) => this . sendPageReloadMessage ( socket ) ) ;
39
+ if ( ! this . socket ) {
40
+ helpers . connectEventually ( ( ) => net . connect ( IOSLiveSyncService . BACKEND_PORT ) , ( socket : net . Socket ) => {
41
+ this . socket = socket ;
42
+ if ( this . $options . watch ) {
43
+ this . attachProcessExitHandlers ( ) ;
44
+ }
45
+ this . sendPageReloadMessage ( ) ;
46
+ } ) ;
47
+ } else {
48
+ this . sendPageReloadMessage ( ) ;
49
+ }
38
50
this . $iOSEmulatorServices . postDarwinNotification ( this . $iOSNotification . attachRequest ) . wait ( ) ;
39
51
} else {
40
52
this . $iOSSocketRequestExecutor . executeAttachRequest ( this . device , timeout ) . wait ( ) ;
41
- let socket = this . device . connectToPort ( IOSLiveSyncService . BACKEND_PORT ) ;
42
- this . sendPageReloadMessage ( socket ) ;
53
+ this . socket = this . device . connectToPort ( IOSLiveSyncService . BACKEND_PORT ) ;
54
+ this . sendPageReloadMessage ( ) ;
43
55
}
44
56
} ) . future < void > ( ) ( ) ;
45
57
}
46
58
47
- private sendPageReloadMessage ( socket : net . Socket ) : void {
59
+ private sendPageReloadMessage ( ) : void {
48
60
try {
49
- this . sendPageReloadMessageCore ( socket ) ;
50
- socket . once ( "data" , ( data : NodeBuffer | string ) => {
61
+ this . sendPageReloadMessageCore ( ) ;
62
+ this . socket . on ( "data" , ( data : NodeBuffer | string ) => {
51
63
this . $logger . trace ( `Socket sent data: ${ data . toString ( ) } ` ) ;
52
- socket . destroy ( ) ;
64
+ this . destroySocketIfNecessary ( ) ;
53
65
} ) ;
54
66
} catch ( err ) {
55
67
this . $logger . trace ( "Error while sending page reload:" , err ) ;
56
- socket . destroy ( ) ;
68
+ this . destroySocketIfNecessary ( ) ;
57
69
}
58
70
}
59
71
60
- private sendPageReloadMessageCore ( socket : net . Socket ) : void {
72
+ private sendPageReloadMessageCore ( ) : void {
61
73
let message = `{ "method":"Page.reload","params":{"ignoreCache":false},"id":${ ++ currentPageReloadId } }` ;
62
74
let length = Buffer . byteLength ( message , "utf16le" ) ;
63
75
let payload = new Buffer ( length + 4 ) ;
64
76
payload . writeInt32BE ( length , 0 ) ;
65
77
payload . write ( message , 4 , length , "utf16le" ) ;
66
- socket . write ( payload ) ;
78
+ this . socket . write ( payload ) ;
79
+ }
80
+
81
+ private attachProcessExitHandlers ( ) : void {
82
+ process . on ( "exit" , ( exitCode : number ) => {
83
+ this . destroySocket ( ) ;
84
+ } ) ;
85
+
86
+ process . on ( "SIGTERM" , ( ) => {
87
+ this . destroySocket ( ) ;
88
+ } ) ;
89
+
90
+ process . on ( "SIGINT" , ( ) => {
91
+ this . destroySocket ( ) ;
92
+ } ) ;
93
+ }
94
+
95
+ private destroySocketIfNecessary ( ) : void {
96
+ if ( ! this . $options . watch ) {
97
+ this . destroySocket ( ) ;
98
+ }
99
+ }
100
+
101
+ private destroySocket ( ) : void {
102
+ this . socket . destroy ( ) ;
103
+ this . socket = null ;
67
104
}
68
105
}
69
106
$injector . register ( "iosLiveSyncServiceLocator" , { factory : IOSLiveSyncService } ) ;
0 commit comments