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

im.actor.server.session.SessionMessageDiscriminator.scala Maven / Gradle / Ivy

The newest version!
package im.actor.server.session

import akka.stream._
import akka.stream.stage.{ OutHandler, GraphStage, GraphStageLogic, InHandler }
import im.actor.api.rpc.sequence.ApiUpdateOptimization
import im.actor.server.mtproto.protocol._
import im.actor.server.session.SessionStreamMessage._

object SessionMessageDiscriminator {
  type Shape = FanOutShape6[SessionStreamMessage, Set[Long], HandleRpcRequest, SubscribeCommand, RequestResend, MessageAck, ReSenderMessage]
}

private[session] final class SessionMessageDiscriminator extends GraphStage[SessionMessageDiscriminator.Shape] {
  val in = Inlet[SessionStreamMessage]("sessionStreamMessage")
  val outOutgoingAcks = Outlet[Set[Long]]("acks")
  val outRpc = Outlet[HandleRpcRequest]("rpc")
  val outSubscribe = Outlet[SubscribeCommand]("subscribe")
  val outRequestResend = Outlet[RequestResend]("requestResend")
  val outIncomingAck = Outlet[MessageAck]("incomingAck")
  val outResenderMessage = Outlet[ReSenderMessage]("resenderMessage")

  override def shape: Shape = new FanOutShape6[SessionStreamMessage, Set[Long], HandleRpcRequest, SubscribeCommand, RequestResend, MessageAck, ReSenderMessage](
    in,
    outOutgoingAcks,
    outRpc,
    outSubscribe,
    outRequestResend,
    outIncomingAck,
    outResenderMessage
  )

  override def createLogic(inheritedAttributes: Attributes): GraphStageLogic = new GraphStageLogic(shape) {
    val pullIn = () ⇒ {
      if (!hasBeenPulled(in))
        pull(in)
    }

    setHandler(in, new InHandler {
      override def onPush(): Unit = {
        val msg = grab(in)

        msg match {
          case SessionStreamMessage.HandleMessageBox(MessageBox(messageId, ProtoRpcRequest(bodyBytes)), clientData) ⇒
            emit(outRpc, HandleRpcRequest(messageId, bodyBytes, clientData), pullIn)
          case SessionStreamMessage.HandleMessageBox(MessageBox(messageId, m: MessageAck), clientData) ⇒
            emit(outIncomingAck, m, pullIn)
          case SessionStreamMessage.HandleMessageBox(MessageBox(messageId, m: RequestResend), _) ⇒
            emit(outRequestResend, m, pullIn)
          case SessionStreamMessage.HandleMessageBox(MessageBox(messageId, m: SessionHello), _) ⇒
            pullIn()
          case SessionStreamMessage.HandleOutgoingAck(acks) ⇒
            emit(outOutgoingAcks, acks.toSet, pullIn)
          case msg @ SessionStreamMessage.HandleSubscribe(command) ⇒
            command match {
              case SubscribeToSeq(opts) ⇒
                emit(outResenderMessage, ReSenderMessage.SetUpdateOptimizations(opts.toSet.map((id: Int) ⇒ ApiUpdateOptimization(id))), pullIn)
              case _ ⇒
            }

            emit(outSubscribe, command, pullIn)
          case unmatched ⇒ failStage(new RuntimeException(s"Unmatched message: $unmatched"))
        }
      }
    })

    val pullIt = new OutHandler {
      override def onPull(): Unit = {
        pullIn()
      }
    }

    setHandler(outOutgoingAcks, pullIt)
    setHandler(outRpc, pullIt)
    setHandler(outSubscribe, pullIt)
    setHandler(outRequestResend, pullIt)
    setHandler(outIncomingAck, pullIt)
    setHandler(outResenderMessage, pullIt)

    override def preStart(): Unit = pullIn()
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy