Fill event gaps with noops, ensuring continuous flow
parent
07076df382
commit
6fdb70f2ad
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue