All Downloads are FREE. Search and download functionalities are using the official Maven repository.

akka.stream.scaladsl.CoupledTerminationFlow.scala Maven / Gradle / Ivy

/*
 * Copyright (C) 2017-2020 Lightbend Inc. 
 */

package akka.stream.scaladsl

import akka.stream._
import akka.stream.stage.{ GraphStage, GraphStageLogic, InHandler, OutHandler }

/**
 * Allows coupling termination (cancellation, completion, erroring) of Sinks and Sources while creating a Flow from them.
 * Similar to `Flow.fromSinkAndSource` however that API does not connect the completion signals of the wrapped operators.
 */
object CoupledTerminationFlow {

  /**
   * Similar to [[Flow.fromSinkAndSource]] however couples the termination of these two operators.
   *
   * E.g. if the emitted [[Flow]] gets a cancellation, the [[Source]] of course is cancelled,
   * however the Sink will also be completed. The table below illustrates the effects in detail:
   *
   * 
   *   
   *     
   *     
   *     
   *   
   *   
   *     
   *     
   *     
   *   
   *   
   *     
   *     
   *     
   *   
   *   
   *     
   *     
   *     
   *   
   *   
   *     
   *     
   *     
   *   
   *   
   *     
   *     
   *     
   *   
   *   
   *     
   *     
   *     
   *   
   * 
Returned FlowSink (in)Source (out)
cause: upstream (sink-side) receives completioneffect: receives completioneffect: receives cancel
cause: upstream (sink-side) receives erroreffect: receives erroreffect: receives cancel
cause: downstream (source-side) receives canceleffect: completeseffect: receives cancel
effect: cancels upstream, completes downstreameffect: completescause: signals complete
effect: cancels upstream, errors downstreameffect: receives errorcause: signals error or throws
effect: cancels upstream, completes downstreamcause: cancelseffect: receives cancel
* * The order in which the `in` and `out` sides receive their respective completion signals is not defined, do not rely on its ordering. */ @deprecated("Use `Flow.fromSinkAndSourceCoupledMat(..., ...)(Keep.both)` instead", "2.5.2") def fromSinkAndSource[I, O, M1, M2](in: Sink[I, M1], out: Source[O, M2]): Flow[I, O, (M1, M2)] = Flow.fromSinkAndSourceCoupledMat(in, out)(Keep.both) } /** INTERNAL API */ private[stream] final class CoupledTerminationBidi[I, O] extends GraphStage[BidiShape[I, I, O, O]] { val in1: Inlet[I] = Inlet("CoupledCompletion.in1") val out1: Outlet[I] = Outlet("CoupledCompletion.out1") val in2: Inlet[O] = Inlet("CoupledCompletion.in2") val out2: Outlet[O] = Outlet("CoupledCompletion.out2") override val shape: BidiShape[I, I, O, O] = BidiShape(in1, out1, in2, out2) override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) { val handler1 = new InHandler with OutHandler { override def onPush(): Unit = push(out1, grab(in1)) override def onPull(): Unit = pull(in1) override def onDownstreamFinish(cause: Throwable): Unit = cancelStage(cause) override def onUpstreamFinish(): Unit = completeStage() override def onUpstreamFailure(ex: Throwable): Unit = failStage(ex) } val handler2 = new InHandler with OutHandler { override def onPush(): Unit = push(out2, grab(in2)) override def onPull(): Unit = pull(in2) override def onDownstreamFinish(cause: Throwable): Unit = cancelStage(cause) override def onUpstreamFinish(): Unit = completeStage() override def onUpstreamFailure(ex: Throwable): Unit = failStage(ex) } setHandlers(in1, out1, handler1) setHandlers(in2, out2, handler2) } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy