Skip to content

Releases: typelevel/fs2

v3.0.0-M2

23 Oct 14:55
e355955

Choose a tag to compare

v3.0.0-M2 Pre-release
Pre-release

FS2 3.0.0-M2 is the second milestone in the 3.x release series, featuring support for Cats Effect 3. Like Cats Effect 3, we expect a number of milestone releases before a 3.0.0 final release. Neither binary nor source compatibility with FS2 2.x is provided, though APIs are largely the same and porting should not be a large task.

The primary feature of FS2 3.0 is support for the Cats Effect 3 type class hierarchy. The Cats Effect 3.0.0-M2 release notes provide a great overview of the changes.

If you're coming from FS2 2.x, be sure to check out the release notes for v3.0.0-M1.

Besides integration with cats.effect.std.Dispatcher, this release contains a few new features:

  • TimedPull, a new type which simplifies implementing pulls that timeout (#2062)
  • Stream.bracketFull, providing the ability to have controlled interruptible resource acquisition (#2088)
  • Removal of Stream#translateInterruptible (#2082)
  • Addition of the fs2.io.Network[F] capability trait (#2071)
git shortlog -sn --no-merges "v3.0.0-M1".."v3.0.0-M2"
    75  Fabio Labella
    21  mpilquist
    10  Daniel Vigovszky
     7  Scala Steward
     6  Michael Pilquist
     3  Diego E. Alonso Blas
     1  Lucas Satabin
     1  Rafał Krzewski
     1  Lars Hupel
     1  satorg

v3.0.0-M1

07 Oct 13:07

Choose a tag to compare

v3.0.0-M1 Pre-release
Pre-release

FS2 3.0.0-M1 is the first milestone in the 3.x release series, featuring support for Cats Effect 3. Like Cats Effect 3, we expect a number of milestone releases before a 3.0.0 final release. Neither binary nor source compatibility with FS2 2.x is provided, though APIs are largely the same and porting should not be a large task.

The primary feature of FS2 3.0 is support for the Cats Effect 3 type class hierarchy. The Cats Effect 3.0.0-M1 release notes provide a great overview of the changes.

FS2 3 also includes some notable changes:

Stream Compilation

Streams are converted to effects via expressions like s.compile.toList and s.compile.drain. Calling s.compile on a Stream[F, O] requires an implicit Compiler[F, X] (where X is chosen based on the type of compilation requested).

In FS2 2.x, getting a Compiler[F, X] instance for the effect F generally required a Sync[F] (this is not true for the Pure and Fallible effects but is otherwise accurate). In FS2 3, compilation now only requires a Concurrent[F]. If a Concurrent[F] is not available, then compilation falls back to using a Sync[F] -- this allows stream compilation for effects like SyncIO which do not have a Concurrent instance.

In a polymorphic context, compilation is supported by either adding a Concurrent[F] constraint, or if compilation of non-concurrent effects is needed as well, a Compiler.Target constraint:

import fs2.{Compiler, Stream}
import cats.effect.Concurrent

// Allows compilation for any Concurrent[F] but not for things like SyncIO
def compileThis[F[_]: Concurrent, O](f: Stream[F, O]): F[Unit] = f.compile.drain

// Allows compilation for any Concurrent[F] or any Sync[F]
def compileThat[F[_]: Compiler.Target, O](f: Stream[F, O]): F[Unit] = f.compile.drain

No More Blocker

The cats.effect.Blocker type was removed in CE 3 -- instead, Sync[F] supports blocking calls via Sync[F].blocking(thunk). As a result, FS2 APIs that took a Blocker have been simplified and in some cases, operations have been combined (e.g., lines & linesAsync have been combined to just lines).

Sinks

The deprecated Sink trait has finally been removed and we now represent sinks via a stream transformation that discards all output values -- Stream[F, O] => Stream[F, Nothing] aka Pipe[F, O, Nothing]. This is different than the old definition of Sink which emitted an undefined number of Unit values -- and as a result of the behavior being undefined, implementations varied widely. Implementations included emitting:

  • 0 unit values
  • 1 unit at termination of the source stream
  • 1 unit per output element from source stream
  • 1 unit per output chunk from source stream
  • etc.

There are a few ergonomic improvements related to the new encoding of sinks:

  • Stream.exec(IO.println(...)) - Stream.exec takes an F[Unit] and returns a Stream[F, Nothing]
  • Stream(1, 2, 3).foreach(IO.println) - The foreach method on Stream takes a O => F[Unit] and returns a Stream[F, Nothing]
  • s.unitary - The unitary method on Stream converts a Stream[F, Nothing] to a Stream[F, Unit] which emits a single unit at termination of s
  • Calling flatMap on a Stream[F, Nothing] no longer compiles, which avoids mistakes that result in unexpected behavior.

Capability Traits

The fs2-io project provides support for working with files and networks, abstracting the Java NIO APIs. The implementations require either Async[F] or Sync[F] depending on whether the underlying NIO API is non-blocking or blocking.

One of the main features of CE3 is the position of the Sync and Async type classes in the hierarchy. As the most powerful type classes, they are now firmly at the bottom of the hierarchy. To avoid requiring Sync / Async constraints in code that uses fs2-io, we are adding capability traits -- traits which limit the capabilities of an effect to a discrete set of operations. The new fs2.io.file.Files[F] capability trait provides the ability to work with files in the effect F. For example:

def readAllText[F[_]: Files](directory: Path): Stream[F, String] =
  Files[F].directoryStream(directory).flatMap { f =>
    Files[F].readAll(f, 1024*1024)
      .through(text.utf8Decode)
      .through(text.lines)
  }

The readAllText method takes a Files[F] capability instead of an Async[F], providing better parametric reasoning.

In future FS2 3 milestones, we'll be adding additional capability traits -- e.g., for networking / sockets.

Roadmap

Our goal is to release FS2 3.0.0 final in conjunction with Cats Effect 3.0.0 and Scala 3.0.0. We're planning on including some additional improvements in the milestones between now and then, including:

  • Simplifying time limited pull operations via a new TimedPull construct (#2062)
  • Improving Queue -- both supporting the planned Queue in CE3 as well as providing a new, optimized queue implementation that supports stream concepts more directly (e.g., termination & error propagation).

Please provide feedback, both on existing features and the roadmap.

v2.4.4

22 Aug 13:12

Choose a tag to compare

This is a maintenance release for the 2.4 series which addresses and is fully backwards compatible with previous releases.

This release is built for Scala 2.12, 2.13, 0.26.0-RC1 and Scala.js 1.1.1. Scala.js 0.6 support has been dropped now that it is EOL.

This release fixes 2 important bugs found in the 2.4.3 release:

  • Fix Chunk.traverse losing elements (#2002)
  • Revert to released versions of cats and cats-effect (#2003)
git shortlog -sn --no-merges "v2.4.3".."v2.4.4"
     3  Fabio Labella
     2  Michael Pilquist
     2  mpilquist

v2.4.3

18 Aug 13:28

Choose a tag to compare

This is a maintenance release for the 2.4 series which addresses and is fully backwards compatible with previous releases.

This release is built for Scala 2.12, 2.13, 0.26.0-RC1 and Scala.js 1.1.1. Scala.js 0.6 support has been dropped now that it is EOL.

Notable changes:

  • Dotty support! (#1973 #1960 #1943)
  • Fixed a bug in TLSSocket#readN which could return more than requested number of bytes (#1989)
  • Added Pull.extendScopeTo to simplify common usage pattern with http4s (#1996)
  • Added withFilter to Stream to allow use in for-comprehensions (#1971)
  • Optimized Chunk#traverse (#1952 #1957)
  • Optimized UTF8 decoding (#1948)
  • Added Stream#evalMapFilter (#1933)
  • Added ArraySeq support (#1905 #1899)
  • Added cats.Defer instance for Stream (#1936)

There were a number of internal code improvements which pave the way for cats-effect 3 support. Additionally, the test suite was ported from ScalaTest to MUnit with its cats effect integration and scalacheck-effect integration.

Note: this version depends on cats 2.2.0-RC3.

For a full list of changes, see https://github.com/functional-streams-for-scala/fs2/milestone/28?closed=1.

git shortlog -sn --no-merges "v2.4.2".."v2.4.3"
    25  Scala Steward
    25  Michael Pilquist
    25  mpilquist
    11  P. Oscar Boykin
     8  Timothy McCarthy
     5  Jacob Wang
     5  Diego E. Alonso Blas
     5  Diego E. Alonso-Blas
     4  Dmitrii Bundin
     3  Vasil Vasilev
     3  oskin1
     2  Kamil Kloch
     1  Barry O'Neill
     1  shogan
     1  Christopher Davenport
     1  David Francoeur
     1  Jakub Kozłowski
     1  Marc
     1  Rob Norris
     1  Robert Marek
     1  Ross A. Baker
     1  arinal
     1  bedux
     1  d2a4u
     1  mhughe008

v2.4.2

12 Jun 12:58

Choose a tag to compare

This is a maintenance release for the 2.4 series which addresses some issues with TLS that were found when integrating fs2-io with skunk (#1896 #1897 #1898).

This release is built for Scala 2.12 and 2.13 and Scala.js 1.0.0 and 0.6.32.

v2.4.1

09 Jun 17:38

Choose a tag to compare

The 2.4.1 release is a rebuild of 2.4.0 with fixed Scala.js JARs. The 2.4.0 release were corrupted due to a build issue.

v2.4.0

08 Jun 19:54

Choose a tag to compare

This is the eighth release of the 2 series, featuring support for Cats 2 and Cats Effect 2.

This release is source and binary compatible with prior 2.x releases. Note there was a breaking source change in 2.2.0 & 2.2.1 -- the compile.to[X] method was removed in favor of compile.to(X).

This release is built for Scala 2.12 and 2.13 and Scala.js 1.0.0 and 0.6.32.

This release includes a couple fixes for memory leaks and hence, upgrading is highly encouraged.

Since 2.3.0, the following notable changes have occurred:

Features:

  • Added collectWhile to Stream (#1870)
  • Adjusted thread names of tcp.SocketGroup (#1862)
  • Added zipWithIndex to Chunk (#1859)
  • Added parZip to Stream (#1858)
  • Added chunkAll to Stream (#1855)
  • Added ability to construct a Stream from an F[_]: Foldable or an Iterable (#1830)
  • Improved compression.gunzip to output chunks eagerly (#1843)
  • Enhanced compression to allow configuration of deflate flush mode (#1842)

Bugs:

  • Fixed a memory leak in Stream.retry and in general, with pulls that do not consume all elements from the source (#1885)
  • Fixed a memory leak in SignallingRef (which impacts combinators like parJoin) (#1889)
  • Fixed a deadlock / stall in TLSEngine (#1877 #1873)
  • Fixed a bug in base64Decode where final non-padding byte could be lost (#1852 #1853)
  • Fixed a soundness bug that allowed a pure pull to be used on effectful streams (#1838 #1839)

For a full list of changes in 2.4.0, see: https://github.com/functional-streams-for-scala/fs2/pulls?q=is%3Apr+milestone%3A2.4.0+is%3Aclosed

git shortlog -sn --no-merges "v2.3.0".."v2.4.0"
    25  Michael Pilquist
    20  Scala Steward
    11  Fabio Labella
     8  Greg Atkinson
     4  Nick Hallstrom
     4  Damien O'Reilly
     2  Jakub Kozłowski
     2  Paulius Imbrasas
     1  Zelenya
     1  d.semenov
     1  geoffjohn11
     1  mhughe008
     1  Alex Zolotko
     1  sanjiv sahayam
     1  Arturas Slajus
     1  Frédéric Cabestre
     1  Gabriel Volpe
     1  Janek Bogucki
     1  Jon Alberdi
     1  Jostein Gogstad
     1  Zach McCoy

v2.3.0

20 Mar 15:41

Choose a tag to compare

This is the seventh release of the 2 series, featuring support for Cats 2 and Cats Effect 2.

This release is source and binary compatible with prior 2.x releases. Note there was a breaking source change in 2.2.0 & 2.2.1 -- the compile.to[X] method has been removed in favor of compile.to(X).

This release is built for Scala 2.12 and 2.13 and Scala.js 1.0.0 and 0.6.32. Scala 2.11 is no longer supported.

Since 2.2.2, the following notable changes have occurred:

Features:

  • Added evalMapChunk and evalTapChunk (#1793)
  • Added cats.Align instance for Stream (#1791)
  • fs2.compress was deprecated and replaced by fs2.compression (#1783)
  • Reactive Streams: Support for preemption-safe stream subscription (#1817)
  • Improved performance of Chunk.BufferChunk.iterator (#1785)
  • Add withTimeout combinator (#1777)

Bugs:

  • Prevent concurrent writes to fs2-io TCP socket from causing WritePendingException (#1781)

For a full list of changes in 2.3.0, see: https://github.com/functional-streams-for-scala/fs2/pulls?q=is%3Apr+milestone%3A2.3.0+is%3Aclosed

git shortlog -sn --no-merges "v2.2.2".."v2.3.0"
    21  Scala Steward
    18  Michael Pilquist
    15  mgibowski
     6  Ben Plommer
     4  Z1kkurat
     3  bobbyrauchenberg
     3  Daniel Spiewak
     3  Greg Atkinson
     2  Paulius Imbrasas
     2  Robert Glyde
     2  Domas Poliakas
     1  Ross A. Baker
     1  Luís Campos
     1  Jakub Kozłowski
     1  Uwe Sommerlatt

v2.2.2

30 Jan 01:13

Choose a tag to compare

This is the sixth release of the 2 series, featuring support for Cats 2 and Cats Effect 2.

This release is source and binary compatible with prior 2.x releases. Note there was a breaking source change in 2.2.0 & 2.2.1 -- the compile.to[X] method has been removed in favor of compile.to(X).

This release is built for Scala 2.12 and 2.13 and Scala.js 0.6.32. Scala 2.11 is no longer supported.

Since 2.2.1, the following notable changes have occurred:

Features:

  • Added support for getting & setting file permissions (#1751)
  • Made TLSParameters#toSSLParameters public (#1768)

Bugs:

  • Fixed .compile.to(Set) compilation issue on Scala 2.12 (#1769)
  • Support setting needClientAuth with TLSParameters (#1767)

For a full list of changes in 2.2.2, see: https://github.com/functional-streams-for-scala/fs2/pulls?q=is%3Apr+milestone%3A2.2.2+is%3Aclosed

git shortlog -sn --no-merges "v2.2.1".."v2.2.2"
    12  Jakub Kozłowski
     5  Michael Pilquist
     3  Ross A. Baker
     2  Robert Glyde
     2  Scala Steward
     1  Adam Rosien

v2.2.1

20 Jan 00:00

Choose a tag to compare

This is critical bug fix for the 2.2.0 release. It fixes two issues:

This release is binary compatible with all prior 2.x releases except for the 2.2.0 release, which should not be used.