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

io.udash.rpc.DefaultAtmosphereServiceConfig.scala Maven / Gradle / Ivy

There is a newer version: 0.16.0
Show newest version
package io.udash.rpc

import com.avsystem.commons._
import com.typesafe.scalalogging.LazyLogging
import io.udash.utils.{CallbacksHandler, Registration}
import org.atmosphere.cpr._

import scala.util.Try

/**
  * 

Default [[io.udash.rpc.AtmosphereServiceConfig]] implementation.

* *

Creates RPC endpoint per HTTP connection. Endpoint can be aware of [[io.udash.rpc.ClientId]].

*/ class DefaultAtmosphereServiceConfig[ServerRPCType](localRpc: ClientId => ExposesServerRPC[ServerRPCType]) extends AtmosphereServiceConfig[ServerRPCType] with LazyLogging { protected final val RPCName = "RPC" private val _connections = new DefaultAtmosphereResourceSessionFactory protected def connections: AtmosphereResourceSessionFactory = _connections protected final val newConnectionCallbacks = new CallbacksHandler[ClientId] protected final val closedConnectionCallbacks = new CallbacksHandler[ClientId] override def resolveRpc(resource: AtmosphereResource): ExposesServerRPC[ServerRPCType] = connections.synchronized { if (connections.getSession(resource).getAttribute(RPCName) == null) initRpc(resource) connections.getSession(resource).getAttribute(RPCName).asInstanceOf[ExposesServerRPC[ServerRPCType]] } override def initRpc(resource: AtmosphereResource): Unit = connections.synchronized { val session = connections.getSession(resource) if (session.getAttribute(RPCName) == null) { val clientId = ClientId(resource.uuid()) session.setAttribute(RPCName, localRpc(clientId)) newConnectionCallbacks.fire(clientId) } } override def filters: ISeq[AtmosphereResource => Try[Unit]] = List() override def onClose(resource: AtmosphereResource): Unit = { val clientId = ClientId(resource.uuid()) closedConnectionCallbacks.fire(clientId) } /** Registers callback which will be called on every new connection. */ def onNewConnection(callback: newConnectionCallbacks.CallbackType): Registration = newConnectionCallbacks.register(callback) /** Registers callback which will be called on every closed connection. */ def onClosedConnection(callback: closedConnectionCallbacks.CallbackType): Registration = closedConnectionCallbacks.register(callback) }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy