chiark / gitweb /
timestamps in the log
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 14 Oct 2020 20:55:05 +0000 (21:55 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 14 Oct 2020 20:55:05 +0000 (21:55 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs
src/session.rs
src/updates.rs
templates/script.ts
templates/session.tera

index bebb4b168c4e7dacce35dfd85eedcc40db293d39..340aac71dd8c3098f7bcfb4bbda73de4edca7396 100644 (file)
@@ -45,7 +45,7 @@ pub struct GameState {
   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,
 }
 
@@ -73,6 +73,12 @@ pub struct LogEntry {
   pub html : Html,
 }
 
+#[derive(Debug,Serialize,Deserialize)]
+pub struct CommittedLogEntry {
+  pub when: Timestamp,
+  pub logent: LogEntry,
+}
+
 // ---------- piece trait, and rendering ----------
 
 type IE = InternalError;
index f9b959ecfe73a5b453b9336feae0f2b73e890b3b..4b2e5260c7f6da2a8004ad54a0e4e4a7f60cba1b 100644 (file)
@@ -14,7 +14,7 @@ struct SessionRenderContext {
   defs : Vec<(VisiblePieceId,Html)>,
   nick : String,
   load : String,
-  log : Vec<(Generation, Timestamp, Arc<LogEntry>)>,
+  log : Vec<Arc<CommittedLogEntry>>,
 }
 
 #[derive(Serialize,Debug)]
@@ -122,7 +122,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,OE> {
     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,
index 1984d333800270030870b5e67f74336a9eae4556..11df724f77dc26f9620c462f462f863d37173ddf 100644 (file)
@@ -47,7 +47,7 @@ pub enum PreparedUpdateEntry {
     op : PieceUpdateOp<PreparedPieceState,ZLevel>,
   },
   SetTableSize(Pos),
-  Log (Arc<LogEntry>),
+  Log (Arc<CommittedLogEntry>),
   Error (Option<ClientId> /* none: all */, ErrorSignaledViaUpdate),
 }
 
@@ -103,7 +103,7 @@ enum TransmitUpdateEntry<'u> {
     ns: &'u PreparedPieceState,
   },
   SetTableSize(Pos),
-  Log (&'u LogEntry),
+  Log (&'u CommittedLogEntry),
   Error(&'u ErrorSignaledViaUpdate),
 }
 
@@ -175,7 +175,7 @@ impl PreparedUpdateEntry {
         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(_,_) => {
@@ -399,15 +399,15 @@ impl<'r> PrepareUpdatesBuffer<'r> {
   }
 
   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));
     }
   }
 
index fd219ab0f595318600a0c02b53190f7e54f2116b..9f38f0a4c52002456ad2d1cb6e6124e9fa4b6ca3 100644 (file)
@@ -44,6 +44,7 @@ type ClientSeq = number;
 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;
@@ -777,8 +778,8 @@ function drag_cancel() {
 // ----- 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) {
index edd152f90c276111f07abd8c74f32d0deec4ab4c..e2d1555e6bbdd739787162c997871132429aba24 100644 (file)
@@ -50,7 +50,7 @@
 <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>