Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* 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 Flow
*
Sink (in)
*
Source (out)
*
*
*
cause: upstream (sink-side) receives completion
*
effect: receives completion
*
effect: receives cancel
*
*
*
cause: upstream (sink-side) receives error
*
effect: receives error
*
effect: receives cancel
*
*
*
cause: downstream (source-side) receives cancel
*
effect: completes
*
effect: receives cancel
*
*
*
effect: cancels upstream, completes downstream
*
effect: completes
*
cause: signals complete
*
*
*
effect: cancels upstream, errors downstream
*
effect: receives error
*
cause: signals error or throws
*
*
*
effect: cancels upstream, completes downstream
*
cause: cancels
*
effect: 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)
}
}