import asyncio, datetime
def ts(): return datetime.datetime.now().strftime("%H:%M:%S")
async def handle(reader, writer):
    peer=writer.get_extra_info('peername')
    print(f"[{ts()}] CONN from {peer}",flush=True)
    try:
        data=await asyncio.wait_for(reader.read(4096), timeout=25)
        if not data: print(f"[{ts()}] (closed empty)",flush=True); return
        if data[:1]==b'\x16': print(f"[{ts()}] *** TLS/wss {len(data)}B {data[:12].hex()}",flush=True)
        elif data[:3]==b'GET': print(f"[{ts()}] *** ws upgrade:\n{data[:800].decode('latin1')}",flush=True)
        else: print(f"[{ts()}] raw {len(data)}B {data[:100].hex()}",flush=True)
    except Exception as e: print(f"[{ts()}] {e}",flush=True)
    finally:
        try: writer.close()
        except: pass
async def main():
    await asyncio.start_server(handle,'0.0.0.0',5058)
    print("LISTEN 5058",flush=True)
    await asyncio.Event().wait()
asyncio.run(main())
