@@ -7,6 +7,9 @@ private let maxExcessSignalCount: Int = 2
77
88/// Data stream wrapper for a dispatch socket.
99public final class TCPSocketSink : Async . InputStream {
10+ /// Able to handle errors that are thrown to the Sink
11+ public typealias ErrorHandler = ( TCPSocketSink , Error ) -> ( )
12+
1013 /// See InputStream.Input
1114 public typealias Input = ByteBuffer
1215
@@ -34,15 +37,19 @@ public final class TCPSocketSink: Async.InputStream {
3437 /// The current number of signals received while downstream was not ready
3538 /// since it was last ready
3639 private var excessSignalCount : Int
40+
41+ /// This closure will be called with an error thrown from upstream
42+ private let onError : ErrorHandler
3743
3844 /// Creates a new `SocketSink`
39- internal init ( socket: TCPSocket , on worker: Worker ) {
45+ internal init ( socket: TCPSocket , on worker: Worker , onError : @escaping ErrorHandler ) {
4046 self . socket = socket
4147 self . eventLoop = worker. eventLoop
4248 self . inputBuffer = nil
4349 self . isClosed = false
4450 self . sourceIsSuspended = true
4551 self . excessSignalCount = 0
52+ self . onError = onError
4653 let writeSource = self . eventLoop. onWritable ( descriptor: socket. descriptor, writeSourceSignal)
4754 self . writeSource = writeSource
4855 }
@@ -64,8 +71,7 @@ public final class TCPSocketSink: Async.InputStream {
6471 case . close:
6572 close ( )
6673 case . error( let e) :
67- close ( )
68- fatalError ( " \( e) " )
74+ onError ( self , e)
6975 }
7076 }
7177
@@ -163,8 +169,15 @@ public final class TCPSocketSink: Async.InputStream {
163169
164170extension TCPSocket {
165171 /// Creates a data stream for this socket on the supplied event loop.
172+ public func sink( on eventLoop: Worker , onError: @escaping TCPSocketSink . ErrorHandler ) -> TCPSocketSink {
173+ return . init( socket: self , on: eventLoop, onError: onError)
174+ }
175+
176+ /// Creates a data stream for this socket on the supplied event loop.
177+ @available ( * , deprecated)
166178 public func sink( on eventLoop: Worker ) -> TCPSocketSink {
167- return . init( socket: self , on: eventLoop)
179+ return . init( socket: self , on: eventLoop) { _, error in
180+ fatalError ( " Uncaught error in TCPSocketSink: \( error) . " )
181+ }
168182 }
169183}
170-
0 commit comments