Skip to content

Commit 3a291db

Browse files
authored
Merge pull request #2972 from armanbilge/fix/js-write-writable-hang-on-end
Fix hanging in `writeWritable` on unacked 'end'
2 parents 9b1f8b1 + 911d18c commit 3a291db

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

io/js/src/main/scala/fs2/io/ioplatform.scala

+9-4
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,18 @@ private[fs2] trait ioplatform {
158158
case None => Pull.done
159159
}
160160

161-
go(in).stream.onFinalizeCase[F] {
162-
case Resource.ExitCase.Succeeded =>
163-
if (endAfterUse)
161+
val end =
162+
if (endAfterUse)
163+
Stream.exec {
164164
F.async_[Unit] { cb =>
165165
writable.end(e => cb(e.toLeft(()).leftMap(js.JavaScriptException)))
166166
}
167-
else F.unit
167+
}
168+
else Stream.empty
169+
170+
(go(in).stream ++ end).onFinalizeCase[F] {
171+
case Resource.ExitCase.Succeeded =>
172+
F.unit
168173
case Resource.ExitCase.Errored(_) | Resource.ExitCase.Canceled =>
169174
// tempting, but don't propagate the error!
170175
// that would trigger a unhandled Node.js error that circumvents FS2/CE error channels

io/js/src/test/scala/fs2/io/IoPlatformSuite.scala

+23
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import fs2.Fs2Suite
2727
import fs2.io.internal.facade
2828
import org.scalacheck.effect.PropF.forAllF
2929

30+
import scala.concurrent.duration._
31+
3032
class IoPlatformSuite extends Fs2Suite {
3133

3234
test("to/read Readable") {
@@ -92,4 +94,25 @@ class IoPlatformSuite extends Fs2Suite {
9294
}.attempt
9395
}
9496

97+
test("unacknowledged 'end' does not prevent writeWritable cancelation") {
98+
val writable = IO {
99+
new facade.stream.Duplex(
100+
new facade.stream.DuplexOptions {
101+
var autoDestroy = false
102+
var read = _ => ()
103+
var write = (_, _, _, _) => ()
104+
var `final` = (_, _) => ()
105+
var destroy = (_, _, _) => ()
106+
}
107+
)
108+
}
109+
110+
Stream
111+
.empty[IO]
112+
.through(writeWritable[IO](writable))
113+
.compile
114+
.drain
115+
.timeoutTo(100.millis, IO.unit)
116+
}
117+
95118
}

0 commit comments

Comments
 (0)