일곱 줄짜리 서버
FastAPI 가 WebSocket 을 @app.websocket decorator 로 노출. handler 는 WebSocket 인자 하나 받는 coroutine. 세 가지가 순서대로 일어나야 해: await websocket.accept() 로 handshake 완료, await websocket.receive_*() loop 안에서, await websocket.send_*() 로 응답.
accept() 는 옵션 아냐
accept() 부르기 전엔 handshake 미완료, 모든 send 가 throw. accept 안 하기 도 선택지야 — auth 체크 중 connection reject 하는 방법이 그거. accept 후엔 connection 완전 열림, frame 흘러.
실행 & 테스트
uvicorn 으로 띄우고; CLI 에서 websocat 이나 wscat 로 테스트. cwkPippa 는 의도적으로 --reload 없이 Uvicorn 돌려 (피파 adapter 가 살아있는 brain stem; reload 가 session 죽여). 학습 땐 --reload 써.