@@ -13,20 +13,25 @@ public class API {
1313 }
1414 }
1515
16- public static func start( name: String , logPath: String ? = nil , terminationHandler: ( ( Process ) -> Void ) ? = nil ) {
17- release = Release ( name: name, logPath: logPath, terminationHandler: terminationHandler)
16+ public static func start(
17+ name: String ,
18+ logPath: String ? = nil ,
19+ readyHandler: @escaping ( ) -> Void ,
20+ terminationHandler: ( ( Process ) -> Void ) ? = nil ) {
21+
22+ release = Release ( name: name, logPath: logPath, readyHandler: readyHandler, terminationHandler: terminationHandler)
1823 }
1924
2025 public static func publish( _ name: String , _ data: String ) {
21- release? . publish ( name, data)
26+ release! . publish ( name, data)
2227 }
2328
2429 public static func stop( ) {
25- release? . stop ( ) ;
30+ release! . stop ( ) ;
2631 }
2732
2833 public static func waitUntilExit( ) {
29- release? . waitUntilExit ( ) ;
34+ release! . waitUntilExit ( ) ;
3035 }
3136
3237 public static func addObserver( queue: OperationQueue ? , using: @escaping ( ( ( String , String ) ) -> Void ) ) {
@@ -42,6 +47,7 @@ private class Release {
4247 let logger : Logger
4348 let listener : NWListener
4449 var connection : Connection ?
50+ let readyHandler : ( ) -> Void
4551 let semaphore = DispatchSemaphore ( value: 0 )
4652
4753 var isRunning : Bool {
@@ -50,7 +56,13 @@ private class Release {
5056 }
5157 }
5258
53- init ( name: String , logPath: String ? = nil , terminationHandler: ( ( Process ) -> Void ) ? = nil ) {
59+ init (
60+ name: String ,
61+ logPath: String ? = nil ,
62+ readyHandler: @escaping ( ) -> Void ,
63+ terminationHandler: ( ( Process ) -> Void ) ? = nil ) {
64+
65+ self . readyHandler = readyHandler
5466 logger = Logger ( logPath: logPath)
5567 listener = try ! NWListener ( using: . tcp, on: . any)
5668
@@ -77,7 +89,7 @@ private class Release {
7789 listener. newConnectionHandler = didAccept ( conn: )
7890 listener. start ( queue: . global( ) )
7991
80- let seconds = 15
92+ let seconds = 5
8193 let timeout = DispatchTime . now ( ) + DispatchTimeInterval. seconds ( seconds)
8294
8395 if semaphore. wait ( timeout: timeout) == . timedOut {
@@ -86,7 +98,7 @@ private class Release {
8698 }
8799
88100 public func stop( ) {
89- connection! . cancel ( )
101+ connection? . cancel ( )
90102 listener. cancel ( )
91103 waitUntilExit ( )
92104 }
@@ -117,11 +129,12 @@ private class Release {
117129 env [ " ELIXIRKIT_PORT " ] = port
118130 process. environment = env
119131 try ! process. run ( )
132+ semaphore. signal ( )
120133 }
121134
122135 private func didAccept( conn: NWConnection ) {
123136 self . connection = Connection ( conn: conn, logger: logger)
124- semaphore . signal ( )
137+ readyHandler ( )
125138 }
126139}
127140
0 commit comments