Safer socket connection
This commit is contained in:
parent
24d28fbfea
commit
136e91e936
|
@ -20,7 +20,7 @@ object AppC extends LilaController {
|
||||||
|
|
||||||
def socket = WebSocket.async[JsValue] { implicit request ⇒
|
def socket = WebSocket.async[JsValue] { implicit request ⇒
|
||||||
env.siteSocket.join(
|
env.siteSocket.join(
|
||||||
uid = get("uid") err "Socket UID missing",
|
uidOption = get("uid"),
|
||||||
username = get("username"))
|
username = get("username"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,8 +29,8 @@ object AppC extends LilaController {
|
||||||
env.gameSocket.join(
|
env.gameSocket.join(
|
||||||
gameId = gameId,
|
gameId = gameId,
|
||||||
colorName = color,
|
colorName = color,
|
||||||
uid = get("uid") err "Socket UID missing",
|
uidOption = get("uid"),
|
||||||
version = getInt("version") err "Socket version missing",
|
versionOption = getInt("version"),
|
||||||
playerId = get("playerId")).unsafePerformIO
|
playerId = get("playerId")).unsafePerformIO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@ object LobbyC extends LilaController {
|
||||||
|
|
||||||
def socket = WebSocket.async[JsValue] { implicit request ⇒
|
def socket = WebSocket.async[JsValue] { implicit request ⇒
|
||||||
env.lobbySocket.join(
|
env.lobbySocket.join(
|
||||||
uid = get("uid") err "Socket UID missing",
|
uidOption = get("uid"),
|
||||||
version = getInt("version") err "Socket version missing",
|
versionOption = getInt("version"),
|
||||||
hook = get("hook")
|
hook = get("hook")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import scalaz.effects._
|
||||||
|
|
||||||
import chess.Color
|
import chess.Color
|
||||||
import model.{ DbGame, Pov, PovRef, Progress, Event }
|
import model.{ DbGame, Pov, PovRef, Progress, Event }
|
||||||
|
import socket.Util
|
||||||
import RichJs._
|
import RichJs._
|
||||||
|
|
||||||
final class Socket(
|
final class Socket(
|
||||||
|
@ -67,13 +68,15 @@ final class Socket(
|
||||||
def join(
|
def join(
|
||||||
gameId: String,
|
gameId: String,
|
||||||
colorName: String,
|
colorName: String,
|
||||||
uid: String,
|
uidOption: Option[String],
|
||||||
version: Int,
|
versionOption: Option[Int],
|
||||||
playerId: Option[String]): IO[SocketPromise] =
|
playerId: Option[String]): IO[SocketPromise] =
|
||||||
getGame(gameId) map { gameOption ⇒
|
getGame(gameId) map { gameOption ⇒
|
||||||
val promise: Option[SocketPromise] = for {
|
val promise: Option[SocketPromise] = for {
|
||||||
game ← gameOption
|
game ← gameOption
|
||||||
color ← Color(colorName)
|
color ← Color(colorName)
|
||||||
|
uid ← uidOption
|
||||||
|
version ← versionOption
|
||||||
hub = hubMemo get gameId
|
hub = hubMemo get gameId
|
||||||
} yield (hub ? Join(
|
} yield (hub ? Join(
|
||||||
uid = uid,
|
uid = uid,
|
||||||
|
@ -90,7 +93,7 @@ final class Socket(
|
||||||
},
|
},
|
||||||
member.channel)
|
member.channel)
|
||||||
}
|
}
|
||||||
promise | connectionFail
|
promise | Util.connectionFail
|
||||||
}
|
}
|
||||||
|
|
||||||
private def scheduleForDeletion(hub: ActorRef, gameId: String) {
|
private def scheduleForDeletion(hub: ActorRef, gameId: String) {
|
||||||
|
@ -98,10 +101,4 @@ final class Socket(
|
||||||
hub ! IfEmpty(hubMemo remove gameId)
|
hub ! IfEmpty(hubMemo remove gameId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def connectionFail = Promise.pure {
|
|
||||||
Done[JsValue, Unit]((), Input.EOF) -> (Enumerator[JsValue](
|
|
||||||
JsObject(Seq("error" -> JsString("Invalid request")))
|
|
||||||
) andThen Enumerator.enumInput(Input.EOF))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,16 +11,20 @@ import play.api.libs.concurrent._
|
||||||
import scalaz.effects._
|
import scalaz.effects._
|
||||||
|
|
||||||
import RichJs._
|
import RichJs._
|
||||||
|
import socket.Util
|
||||||
|
|
||||||
final class Socket(hub: ActorRef) {
|
final class Socket(hub: ActorRef) {
|
||||||
|
|
||||||
implicit val timeout = Timeout(1 second)
|
implicit val timeout = Timeout(1 second)
|
||||||
|
|
||||||
def join(
|
def join(
|
||||||
uid: String,
|
uidOption: Option[String],
|
||||||
version: Int,
|
versionOption: Option[Int],
|
||||||
hook: Option[String]): SocketPromise =
|
hook: Option[String]): SocketPromise = {
|
||||||
(hub ? Join(uid, version, hook)).asPromise map {
|
val socket = for {
|
||||||
|
uid ← uidOption
|
||||||
|
version ← versionOption
|
||||||
|
} yield (hub ? Join(uid, version, hook)).asPromise map {
|
||||||
case Connected(channel) ⇒
|
case Connected(channel) ⇒
|
||||||
val iteratee = Iteratee.foreach[JsValue] { e ⇒
|
val iteratee = Iteratee.foreach[JsValue] { e ⇒
|
||||||
e str "t" match {
|
e str "t" match {
|
||||||
|
@ -35,7 +39,9 @@ final class Socket(hub: ActorRef) {
|
||||||
hub ! Quit(uid)
|
hub ! Quit(uid)
|
||||||
}
|
}
|
||||||
(iteratee, channel)
|
(iteratee, channel)
|
||||||
}
|
}: SocketPromise
|
||||||
|
socket | Util.connectionFail
|
||||||
|
}
|
||||||
|
|
||||||
def addEntry(entry: model.Entry): IO[Unit] = io {
|
def addEntry(entry: model.Entry): IO[Unit] = io {
|
||||||
hub ! Entry(entry)
|
hub ! Entry(entry)
|
||||||
|
|
|
@ -5,20 +5,23 @@ import akka.actor._
|
||||||
import akka.pattern.ask
|
import akka.pattern.ask
|
||||||
import akka.util.duration._
|
import akka.util.duration._
|
||||||
import akka.util.Timeout
|
import akka.util.Timeout
|
||||||
|
|
||||||
import play.api._
|
|
||||||
import play.api.libs.json._
|
import play.api.libs.json._
|
||||||
import play.api.libs.iteratee._
|
import play.api.libs.iteratee._
|
||||||
import play.api.libs.concurrent._
|
import play.api.libs.concurrent._
|
||||||
|
|
||||||
import scalaz.effects._
|
import scalaz.effects._
|
||||||
|
|
||||||
|
import socket.Util
|
||||||
|
|
||||||
final class Socket(hub: ActorRef) {
|
final class Socket(hub: ActorRef) {
|
||||||
|
|
||||||
implicit val timeout = Timeout(1 second)
|
implicit val timeout = Timeout(1 second)
|
||||||
|
|
||||||
def join(uid: String, username: Option[String]): SocketPromise =
|
def join(
|
||||||
(hub ? Join(uid, username)).asPromise map {
|
uidOption: Option[String],
|
||||||
|
username: Option[String]): SocketPromise = {
|
||||||
|
val socket = for {
|
||||||
|
uid ← uidOption
|
||||||
|
} yield (hub ? Join(uid, username)).asPromise map {
|
||||||
case Connected(channel) ⇒
|
case Connected(channel) ⇒
|
||||||
val iteratee = Iteratee.foreach[JsValue] { _ ⇒
|
val iteratee = Iteratee.foreach[JsValue] { _ ⇒
|
||||||
Unit
|
Unit
|
||||||
|
@ -26,5 +29,7 @@ final class Socket(hub: ActorRef) {
|
||||||
hub ! Quit(uid)
|
hub ! Quit(uid)
|
||||||
}
|
}
|
||||||
(iteratee, channel)
|
(iteratee, channel)
|
||||||
}
|
} : SocketPromise
|
||||||
|
socket | Util.connectionFail
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
16
app/socket/Util.scala
Normal file
16
app/socket/Util.scala
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package lila
|
||||||
|
package socket
|
||||||
|
|
||||||
|
import play.api.libs.concurrent._
|
||||||
|
import play.api.libs.json._
|
||||||
|
import play.api.libs.iteratee._
|
||||||
|
|
||||||
|
object Util {
|
||||||
|
|
||||||
|
val connectionFail: SocketPromise = Promise.pure {
|
||||||
|
Done[JsValue, Unit]((), Input.EOF) -> (Enumerator[JsValue](
|
||||||
|
JsObject(Seq("error" -> JsString("Invalid request")))
|
||||||
|
) andThen Enumerator.enumInput(Input.EOF))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue