Fill event gaps with noops, ensuring continuous flow

pull/1/merge
Thibault Duplessis 2012-06-05 01:14:28 +02:00
parent 07076df382
commit 6fdb70f2ad
3 changed files with 34 additions and 15 deletions

View File

@ -7,9 +7,25 @@ import scalaz.effects._
import chess.Color
import memo.Builder
case class VersionedEvent(js: JsObject, only: Option[Color], own: Boolean) {
case class VersionedEvent(
version: Int,
typ: String,
data: JsValue,
only: Option[Color],
own: Boolean) {
def visible(m: Member): Boolean =
def jsFor(m: Member): JsObject = visibleBy(m).fold(
JsObject(Seq(
"v" -> JsNumber(version),
"t" -> JsString(typ),
"d" -> data
)),
JsObject(Seq(
"v" -> JsNumber(version)
))
)
private def visibleBy(m: Member): Boolean =
if (own && !m.owner) false else only.fold(_ == m.color, true)
}
@ -30,16 +46,14 @@ final class History(timeout: Int) {
private def event(v: Int) = Option(events getIfPresent v)
def +=(event: Event): VersionedEvent = {
privateVersion = privateVersion + 1
privateVersion = version + 1
val vevent = VersionedEvent(
js = JsObject(Seq(
"v" -> JsNumber(privateVersion),
"t" -> JsString(event.typ),
"d" -> event.data
)),
version = version,
typ = event.typ,
data = event.data,
only = event.only,
own = event.owner)
events.put(privateVersion, vevent)
events.put(version, vevent)
vevent
}
}

View File

@ -90,11 +90,10 @@ final class Hub(
}
def batch(member: Member, vevents: List[VersionedEvent]) {
val filtered = vevents filter (_ visible member)
if (filtered.nonEmpty) {
if (vevents.nonEmpty) {
member.channel push JsObject(Seq(
"t" -> JsString("batch"),
"d" -> JsArray(filtered map (_.js))
"d" -> JsArray(vevents map (_ jsFor member))
))
}
}

View File

@ -107,12 +107,18 @@ $.websocket.prototype = {
self.debug("already has event " + m.v);
return;
}
if (m.v > self.version + 1) {
self.debug("event gap detected from " + self.version + " to " + m.v);
return;
}
self.version = m.v;
self.debug("set version " + self.version);
}
var h = self.settings.events[m.t];
if ($.isFunction(h)) h(m.d || null);
else self.debug(m.t + " not supported");
if (m.t) {
var h = self.settings.events[m.t];
if ($.isFunction(h)) h(m.d || null);
else self.debug(m.t + " not supported");
}
},
debug: function(msg) { if (this.options.debug) console.debug("[" + this.options.name + "]", msg); },
destroy: function() {