pub pieces : Pieces,
pub players : PlayerMap,
pub gen : Generation,
- pub log : Vec<(Generation, Timestamp, Arc<LogEntry>)>, // xxx expiry
+ pub log : Vec<(Generation, Arc<CommittedLogEntry>)>, // xxx expiry
pub max_z : ZCoord,
}
pub html : Html,
}
+#[derive(Debug,Serialize,Deserialize)]
+pub struct CommittedLogEntry {
+ pub when: Timestamp,
+ pub logent: LogEntry,
+}
+
// ---------- piece trait, and rendering ----------
type IE = InternalError;
defs : Vec<(VisiblePieceId,Html)>,
nick : String,
load : String,
- log : Vec<(Generation, Timestamp, Arc<LogEntry>)>,
+ log : Vec<Arc<CommittedLogEntry>>,
}
#[derive(Serialize,Debug)]
let src = SessionRenderContext {
ctoken,
gen : ig.gs.gen,
- log : ig.gs.log.clone(),
+ log : ig.gs.log.iter().map(|(_,logent)| logent.clone()).collect(),
table_size : ig.gs.table_size,
player,
defs : alldefs,
op : PieceUpdateOp<PreparedPieceState,ZLevel>,
},
SetTableSize(Pos),
- Log (Arc<LogEntry>),
+ Log (Arc<CommittedLogEntry>),
Error (Option<ClientId> /* none: all */, ErrorSignaledViaUpdate),
}
ns: &'u PreparedPieceState,
},
SetTableSize(Pos),
- Log (&'u LogEntry),
+ Log (&'u CommittedLogEntry),
Error(&'u ErrorSignaledViaUpdate),
}
op.new_state().map(|x| x.svg.0.as_bytes().len()).unwrap_or(0)
},
Log(logent) => {
- logent.html.0.as_bytes().len() * 3
+ logent.logent.html.0.as_bytes().len() * 28
},
SetTableSize(_) |
Error(_,_) => {
}
pub fn log_updates(&mut self, logents: Vec<LogEntry>) {
- for logentry in logents {
- let logentry = Arc::new(logentry);
- let gen = self.gen();
- let now = Timestamp::now();
+ let now = Timestamp::now();
+ for logent in logents {
let when = iter::once(now).chain(
- self.g.gs.log.last().map(|l| l.1)
+ self.g.gs.log.last().map(|l| l.1.when)
).max().unwrap();
- self.g.gs.log.push((gen, when, logentry.clone()));
- self.us.push(PreparedUpdateEntry::Log(logentry));
+ let logent = Arc::new(CommittedLogEntry { when, logent });
+ let gen = self.gen();
+ self.g.gs.log.push((gen, logent.clone()));
+ self.us.push(PreparedUpdateEntry::Log(logent));
}
}
type Generation = number;
type UoKind = 'Client' | "Global"| "Piece" | "ClientExtra" | "GlobalExtra";
type WhatResponseToClientOp = "Predictable" | "Unpredictable" | "UpdateSvg";
+type Timestamp = number; // unix time_t, will break in 285My
type UoDescription = {
kind: UoKind;
// ----- logs -----
messages.Log = <MessageHandler>function
-(j: { html: string }) {
- add_log_message(j.html);
+(j: { when: Timestamp, logent: { html: string } }) {
+ add_log_message(j.when + '|' + j.logent.html);
}
function add_log_message(msg_html: string) {
<p>
<div id="log" style="overflow-y: scroll; height: 200px;">
{% for ent in log %}
- <div>{{ ent.2.html | safe }}</div>
+ <div>{{ent.when}}: {{ ent.logent.html | safe }}</div>
{%- endfor %}
</div>