From: Ian Jackson Date: Sun, 28 Jun 2020 23:27:51 +0000 (+0100) Subject: wip new arrangements X-Git-Tag: otter-0.2.0~1499 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=e3604e7e7b98d7983c06345b5817912945f7b0ee;p=otter.git wip new arrangements --- diff --git a/src/bin/server.rs b/src/bin/server.rs index c085931f..ef03879f 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -41,18 +41,17 @@ impl<'r> FromParam<'r> for CheckedResourceLeaf { #[derive(Serialize,Debug)] struct LoadingRenderContext<'r> { - token : &'r str, + ptoken : &'r str, } - -#[get("/")] -fn loading(token : InstanceAccess) -> Result { - let c = LoadingRenderContext { token : token.raw_token }; +#[get("/")] +fn loading(ptoken : InstanceAccess) -> Result { + let c = LoadingRenderContext { ptoken : ptoken.raw_token }; Ok(Template::render("loading",&c)) } #[derive(Serialize,Debug)] struct SessionRenderContext { - clientid : ClientId, + ctoken : String, player : PlayerId, defs : Vec, uses : Vec, @@ -60,19 +59,26 @@ struct SessionRenderContext { #[derive(Deserialize)] struct SessionForm { - token : String, + ptoken : String, } #[post("/_/session", format="json", data="
")] fn session(form : Json) -> Result { // make session in this game, log a message to other players - let iad = lookup_token(&form.token).ok_or_else(|| anyhow!("unknown token"))?; + let iad = lookup_token(&form.ptoken) + .ok_or_else(|| anyhow!("unknown token"))?; let player = iad.ident; let c = { let mut ig = iad.g.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; - let pl = ig.gs.players.get_mut(player) + let _pl = ig.gs.players.get_mut(player) .ok_or_else(|| anyhow!("player deleted"))?; - let client = Client { player }; - let clientid = ig.clients.insert(client); + let cl = Client { player }; + let client = ig.clients.insert(cl); + + let ciad = InstanceAccessDetails { + g : iad.g.clone(), + ident : client, + }; + let ctoken = record_token(ciad); let mut uses = vec![]; let mut defs = vec![]; @@ -104,7 +110,7 @@ fn session(form : Json) -> Result { } SessionRenderContext { - clientid, + ctoken : ctoken.0, player, defs, uses, @@ -146,7 +152,7 @@ fn api_grab(form : Json) -> impl response::Responder<'static> { let u_gen = if client == p.lastclient { p.gen_lastclient } else { p.gen_before_lastclient }; - if u_gen > form.g { Err(OpError::Conflict)? } + if u_gen > q_gen { Err(OpError::Conflict)? } if p.held != None { Err(OpError::PieceHeld)? }; p.held = Some(player); gs.gen += 1; @@ -230,17 +236,17 @@ struct APIForm { } */ -#[get("/_/updates/")] +#[get("/_/updates/")] #[throws(RE)] -fn updates(token : InstanceAccess) +fn updates(ctoken : InstanceAccess) -> impl response::Responder<'static> { - let iad = token.i; + let iad = ctoken.i; let client = iad.ident; let _ = { let mut ig = iad.g.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?; - let g = &mut ig.gs; + let _g = &mut ig.gs; let cl = ig.clients.get(client).ok_or_else(|| anyhow!("no client"))?; - let player = cl.player; + let _player = cl.player; }; let tc = TestCounterInner { next : 0 }; let tc = BufReader::new(tc); diff --git a/src/global.rs b/src/global.rs index b8180d3f..50a02a54 100644 --- a/src/global.rs +++ b/src/global.rs @@ -8,7 +8,7 @@ visible_slotmap_key!{ ClientId('C') } visible_slotmap_key!{ PlayerId('#') } #[derive(Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)] -pub struct RawToken (String); +pub struct RawToken (pub String); impl Borrow for RawToken { fn borrow(&self) -> &str { &self.0 } } @@ -70,6 +70,17 @@ pub fn lookup_token(s : &str) Id::global_tokens().read().unwrap().get(s).cloned() } +pub fn record_token(iad : InstanceAccessDetails) + -> RawToken { + let mut rng = thread_rng(); + let token = RawToken ( + repeat_with(|| rng.sample(Alphanumeric)) + .take(64).collect() + ); + Id::global_tokens().write().unwrap().insert(token.clone(), iad); + token +} + const XXX_PLAYERS_TOKENS : &[(&str, &str)] = &[ ("kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe", "alice"), ("ccg9kzoTh758QrVE1xMY7BQWB36dNJTx", "bob"), diff --git a/src/imports.rs b/src/imports.rs index 4b5693b6..1cf8593e 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -9,6 +9,7 @@ pub use std::collections::HashMap; pub use std::borrow::Borrow; pub use std::convert::TryFrom; pub use std::str::FromStr; +pub use std::iter::repeat_with; pub use thiserror::Error; pub use anyhow::{Context,anyhow}; @@ -27,6 +28,10 @@ pub use rocket::request::{FromParam,FromRequest,FromFormValue,LenientForm}; pub use rocket::response::NamedFile; pub use rocket::response; +pub use rand::thread_rng; +pub use rand::Rng; +pub use rand::distributions::Alphanumeric; + pub use slotmap::dense::DenseSlotMap; pub type SecondarySlotMap = slotmap::secondary::SecondaryMap; pub use index_vec::{define_index_type,index_vec,IndexVec}; diff --git a/templates/loading.tera b/templates/loading.tera index 7cb658f1..c16b24c0 100644 --- a/templates/loading.tera +++ b/templates/loading.tera @@ -1,4 +1,4 @@ -

Loading!

+

Loading!

diff --git a/templates/script.js b/templates/script.js index bac8d498..4150e90d 100644 --- a/templates/script.js +++ b/templates/script.js @@ -95,10 +95,9 @@ function drag_mousedown(e) { dragging = DRAGGING.MAYBE_GRAB; set_grab(delt, us); api('grab', { - t : token, + t : ctoken, g : gen, p : delt.dataset.p, - c : clientid, s : 0, }) } @@ -182,7 +181,7 @@ messages.TestCounter = function(data) { function startup() { var body = document.getElementById("main-body"); - clientid = body.dataset.clientid; + ctoken = body.dataset.ctoken; us = body.dataset.us; status_node = document.getElementById('status'); status_node.innerHTML = 'js-done' @@ -190,7 +189,7 @@ function startup() { space = document.getElementById('space'); svg_ns = space.getAttribute('xmlns'); - es = new EventSource("/_/updates/"+token+"/"+clientid); + es = new EventSource("/_/updates/"+ctoken); es.onmessage = function(event) { var j = JSON.parse(event.data); var k = Object.keys(j)[0]; @@ -210,9 +209,9 @@ function startup() { function doload(){ console.log('DOLOAD'); var elem = document.getElementById('loading_token'); - token = elem.dataset.token; + ptoken = elem.dataset.ptoken; xhr_post_then('/_/session', - JSON.stringify({ token : token }), + JSON.stringify({ ptoken : ptoken }), loaded); } diff --git a/templates/test.tera b/templates/test.tera index a787df00..6b55a747 100644 --- a/templates/test.tera +++ b/templates/test.tera @@ -1,4 +1,4 @@ - +

Hi!