const B="http://localhost:3000"; const api=async(a,u,n,x={})=>{const r=await fetch(B+"/api",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,uid:u,name:n,...x})});const d=await r.json();if(!r.ok)throw new Error(a+": "+d.error);return d}; (async()=>{ const c1=await api("create",null,"Ana",{roomName:"Flow",addBot:false}); const c2=await api("join",null,"Bil",{roomId:c1.room}); console.log("create OK:",c1.room,"players:",c1.snap.players.map(p=>p.name).join(",")); // wrong turn should be rejected try{await api("roll",c2.uid,"Bil");console.log("ERR: roll allowed out of turn!");}catch(e){console.log("turn guard OK:",e.message)} const st=await api("start",c1.uid,"Ana"); console.log("start OK. phase:",(await api("rejoin",c1.uid,"Ana",{roomId:c1.room})).snap.phase); // Ana = starter. roll->peek->declare low (honest) const r1=await api("roll",c1.uid,"Ana"); const r2=await api("peek",c1.uid,"Ana",{revealed:true}); const st2=(await api("rejoin",c1.uid,"Ana",{roomId:c1.room})).snap; console.log("Ana dice (private):",JSON.stringify(st2.myDice),"turn:",st2.turnName); const d1=st2.myDice[0],d2=st2.myDice[1]; // rank mirror const C=[[1,2],[1,3],[6,6],[5,5],[4,4],[3,3],[2,2],[1,1],[6,5],[6,4]],D=[[6,3],[6,2],[5,4],[5,3],[5,2],[4,3],[4,2],[3,2]]; const rank=(a,b)=>{const x=Math.min(a,b),y=Math.max(a,b);for(let i=0;ic[0]===y&&c[1]===x);return i>=0?10+i:-1}; const truth=rank(d1,d2); const dec=await api("declare",c1.uid,"Ana",{rank:truth}); const st3=(await api("rejoin",c2.uid,"Bil",{roomId:c1.room})).snap; console.log("declare OK. now phase:",st3.phase,"pending challenger:",st3.pending&&st3.pending.challenger===c2.uid,"lastClaim:",st3.lastClaim&&st3.lastClaim.label); // Bil trusts -> claim stands, Ana's turn again const p=await api("pass",c2.uid,"Bil"); const st4=(await api("rejoin",c1.uid,"Ana",{roomId:c1.room})).snap; console.log("pass OK. turn now:",st4.turnName,"lastClaim persists:",st4.lastClaim&&st4.lastClaim.label); // chat await api("chat",c2.uid,"Bil",{text:"godt spil! 🍺"}); console.log("FLOW COMPLETE ✅"); })().catch(e=>{console.error("FLOW FAIL:",e.message);process.exit(1)});