Skip to content

Commit

Permalink
Merge pull request #5103 from armanbilge/readable-stream-cancellation
Browse files Browse the repository at this point in the history
Check if `ReadableStream` is locked in all exit cases
  • Loading branch information
isomarcte committed Aug 23, 2021
2 parents ea157f5 + c3e971e commit 9a19b6e
Showing 1 changed file with 15 additions and 14 deletions.
29 changes: 15 additions & 14 deletions dom-core/src/main/scala/org/http4s/dom/package.scala
Expand Up @@ -60,19 +60,20 @@ package object dom {
}

private[dom] def closeReadableStream[F[_], A](rs: ReadableStream[A], exitCase: Resource.ExitCase)(
implicit F: Async[F]): F[Unit] = exitCase match {
case Resource.ExitCase.Succeeded =>
F.fromPromise {
F.delay {
// Best guess: Firefox internally locks a ReadableStream after it is "drained"
// This checks if the stream is locked before canceling it to avoid an error
if (!rs.locked) rs.cancel(null) else scalajs.js.Promise.resolve[Unit](())
}
}.void
case Resource.ExitCase.Errored(ex) =>
F.fromPromise(F.delay(rs.cancel(ex.getMessage()))).void
case Resource.ExitCase.Canceled =>
F.fromPromise(F.delay(rs.cancel(null))).void
}
implicit F: Async[F]): F[Unit] = F.fromPromise {
F.delay {
// Best guess: Firefox internally locks a ReadableStream after it is "drained"
// This checks if the stream is locked before canceling it to avoid an error
if (!rs.locked) exitCase match {
case Resource.ExitCase.Succeeded =>
rs.cancel(null)
case Resource.ExitCase.Errored(ex) =>
rs.cancel(ex.getLocalizedMessage())
case Resource.ExitCase.Canceled =>
rs.cancel(null)
}
else scalajs.js.Promise.resolve[Unit](())
}
}.void

}

0 comments on commit 9a19b6e

Please sign in to comment.