@@ -33,6 +33,7 @@ import com.comcast.ip4s.Host
33
33
import com .comcast .ip4s .IpAddress
34
34
import com .comcast .ip4s .Port
35
35
import com .comcast .ip4s .SocketAddress
36
+ import fs2 .internal .jsdeps .node .eventsMod
36
37
import fs2 .internal .jsdeps .node .netMod
37
38
import fs2 .internal .jsdeps .node .nodeStrings
38
39
import fs2 .internal .jsdeps .std
@@ -81,40 +82,38 @@ private[net] trait SocketGroupCompanionPlatform { self: SocketGroup.type =>
81
82
): Resource [F , (SocketAddress [IpAddress ], Stream [F , Socket [F ]])] =
82
83
(for {
83
84
dispatcher <- Dispatcher [F ]
84
- queue <- Queue .unbounded[F , netMod.Socket ].toResource
85
- error <- F .deferred[Throwable ].toResource
85
+ queue <- Queue .unbounded[F , Option [netMod.Socket ]].toResource
86
86
server <- Resource .make(
87
87
F
88
88
.delay(
89
89
netMod.createServer(
90
90
netMod.ServerOpts ().setPauseOnConnect(true ).setAllowHalfOpen(true ),
91
- sock => dispatcher.unsafeRunAndForget(queue.offer(sock))
91
+ sock => dispatcher.unsafeRunAndForget(queue.offer(Some ( sock) ))
92
92
)
93
93
)
94
94
)(server =>
95
- F .async_ [Unit ] { cb =>
95
+ F .async [Unit ] { cb =>
96
96
if (server.listening)
97
- server.close(e => cb(e.toLeft(()).leftMap(js.JavaScriptException )))
97
+ F .delay(server.close(e => cb(e.toLeft(()).leftMap(js.JavaScriptException )))) >> queue
98
+ .offer(None )
99
+ .as(None )
98
100
else
99
- cb(Right (()))
101
+ F .delay( cb(Right (()))).as( None )
100
102
}
101
103
)
102
- _ <- registerListener[std.Error ](server, nodeStrings.error)(_.once_error(_, _)) { e =>
103
- dispatcher.unsafeRunAndForget(error.complete(js.JavaScriptException (e)))
104
- }
105
- _ <- error.get
106
- .race(
107
- F
108
- .async_[Unit ] { cb =>
109
- server.listen(
110
- address.foldLeft(
111
- netMod.ListenOptions ().setPort(port.fold(0.0 )(_.value.toDouble))
112
- )((opts, host) => opts.setHost(host.toString)),
113
- () => cb(Right (()))
114
- )
104
+ _ <- F
105
+ .async_[Unit ] { cb =>
106
+ server.once_error(nodeStrings.error, e => cb(Left (js.JavaScriptException (e))))
107
+ server.listen(
108
+ address.foldLeft(
109
+ netMod.ListenOptions ().setPort(port.fold(0.0 )(_.value.toDouble))
110
+ )((opts, host) => opts.setHost(host.toString)),
111
+ () => {
112
+ server.asInstanceOf [eventsMod.EventEmitter ].removeAllListeners(" error" )
113
+ cb(Right (()))
115
114
}
116
- )
117
- .rethrow
115
+ )
116
+ }
118
117
.toResource
119
118
ipAddress <- F
120
119
.delay(server.address())
@@ -124,10 +123,9 @@ private[net] trait SocketGroupCompanionPlatform { self: SocketGroup.type =>
124
123
}
125
124
.toResource
126
125
sockets = Stream
127
- .fromQueueUnterminated (queue)
126
+ .fromQueueNoneTerminated (queue)
128
127
.evalTap(setSocketOptions(options))
129
128
.flatMap(sock => Stream .resource(Socket .forAsync(sock)))
130
- .concurrently(Stream .eval(error.get.flatMap(F .raiseError[Unit ])))
131
129
} yield (ipAddress, sockets)).adaptError { case IOException (ex) => ex }
132
130
133
131
}
0 commit comments