from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
import json
from datetime import datetime,timezone
EVENTS=[]
class Handler(BaseHTTPRequestHandler):
 def do_GET(self):
  if self.path=='/events':
   self.send_response(200);self.send_header('Content-type','application/json');self.end_headers();self.wfile.write(json.dumps(EVENTS).encode());return
  query=parse_qs(urlparse(self.path).query);attempt=query.get('attempt',['unknown'])[0];guard=query.get('guard',['0'])[0]=='1'
  freeze=query.get('freeze',['0'])[0]=='1'
  page='''<button>A</button><script>const attempt=ATTEMPT; if(FREEZE)document.querySelector('button').onclick=()=>{navigator.sendBeacon('/beacon?'+new URLSearchParams({attempt,type:'freeze-start'}));for(;;){}}; for(const type of ['beforeunload','pagehide','visibilitychange'])addEventListener(type,e=>{navigator.sendBeacon('/beacon?'+new URLSearchParams({attempt,type}));if(type==='beforeunload'&&GUARD){e.preventDefault();e.returnValue='';}});navigator.sendBeacon('/beacon?'+new URLSearchParams({attempt,type:'ready'}));</script>'''.replace('ATTEMPT',json.dumps(attempt)).replace('GUARD',str(guard).lower()).replace('FREEZE',str(freeze).lower())
  self.send_response(200);self.send_header('Content-type','text/html');self.end_headers();self.wfile.write(page.encode())
 def do_POST(self):
  event={'at':datetime.now(timezone.utc).isoformat(),'path':self.path};EVENTS.append(event);print(json.dumps(event),flush=True);self.send_response(204);self.end_headers()
HTTPServer(('127.0.0.1',18913),Handler).serve_forever()
