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

com.twitter.finagle.mux.Mux.scala Maven / Gradle / Ivy

The newest version!
package com.twitter.finagle

import com.twitter.finagle.client._
import com.twitter.finagle.netty3._
import com.twitter.finagle.pool.ReusingPool
import com.twitter.finagle.server._
import com.twitter.finagle.stack.Endpoint
import com.twitter.finagle.stats.{ClientStatsReceiver, StatsReceiver}
import com.twitter.finagle.transport.Transport
import com.twitter.util.{Closable, CloseAwaitably, Future, Promise, Return, Time}
import java.net.SocketAddress
import org.jboss.netty.buffer.{ChannelBuffer => CB}

object MuxTransporter extends Netty3Transporter[CB, CB](
  "mux", mux.PipelineFactory)

object MuxClient extends MuxClient
class MuxClient extends DefaultClient[CB, CB](
  name = "mux",
  endpointer = (sa, sr) =>
    (mux.lease.LeasedBridge[CB, CB, CB, CB](
      MuxTransporter, new mux.ClientDispatcher(_, sr))(sa, sr)),
  pool = (sr: StatsReceiver) => new ReusingPool(_, sr.scope("reusingpool"))
)

object MuxListener extends Netty3Listener[CB, CB]("mux", mux.PipelineFactory)
object MuxServer extends DefaultServer[CB, CB, CB, CB](
  "mux", MuxListener, new mux.ServerDispatcher(_, _, true)
)

package exp {
  private[finagle] object MuxTransporter {
    def apply(prms: Stack.Params): Transporter[CB, CB] =
      Netty3Transporter(mux.PipelineFactory, prms)
  }

  private[finagle] object MuxClient extends StackClient[CB, CB](
    // LeasedFactory.module needs to be directly before the stack endpoint.
    StackClient.newStack
      .replace(StackClient.Role.pool, ReusingPool.module[CB, CB])
      .replace(StackClient.Role.prepConn, mux.lease.LeasedFactory.module[CB, CB]),
    Stack.Params.empty) {
    protected type In = CB
    protected type Out = CB
    protected val newTransporter = MuxTransporter(_)
    protected val newDispatcher: Stack.Params => Dispatcher = { prms =>
      val param.Stats(sr) = prms[param.Stats]
      trans => new mux.ClientDispatcher(trans.cast[CB, CB], sr)
    }
  }

  private[finagle] object MuxListener {
    def apply(prms: Stack.Params): Listener[CB, CB] =
      Netty3Listener(mux.PipelineFactory, prms)
  }

  private[finagle] object MuxServer extends StackServer[CB, CB] {
    protected type In = CB
    protected type Out = CB
    protected val newListener = MuxListener(_)
    protected val newDispatcher: Stack.Params => Dispatcher =
      Function.const(new mux.ServerDispatcher(_, _, true, mux.lease.exp.ClockedDrainer.flagged))
  }
}

/**
 * A client and server for the mux protocol described in [[com.twitter.finagle.mux]].
 */
object Mux extends Client[CB, CB] with Server[CB, CB] {
  def newClient(dest: Name, label: String): ServiceFactory[CB, CB] =
    exp.MuxClient.newClient(dest, label)

  def serve(addr: SocketAddress, service: ServiceFactory[CB, CB]): ListeningServer =
    exp.MuxServer.serve(addr, service)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy