5편까지 화면이 최신 값을 알려면 물어봐야 했다. 1초마다 묻거나, 사람이 새로고침하거나.
알린다
값을 바꾼 뒤 한 줄이다.
waiting -= n;
_save(waiting);
// Say that it changed. Not what it changed to.
server.notifyResourceUpdated('desk://waiting');
구독 가능한 리소스를 하나 두고, capability 에 subscribe: true 를 켠다.
resources: ResourcesCapability(listChanged: true, subscribe: true),
와이어에 나가는 것
{"jsonrpc":"2.0","method":"notifications/resources/updated","params":{"uri":"desk://waiting"}}
uri 하나뿐이다. 몇 명이 되었는지는 안 들어 있다.
값을 실으면 왜 안 되나
알림에 값을 넣는 게 당연해 보인다. 한 번에 끝나니까. 그런데 알림은 순서를 보장하지 않는다.
서버: waiting 2 로 바뀜 → 알림 A 발송
서버: waiting 1 로 바뀜 → 알림 B 발송
클라이언트: B 도착 (1) → A 도착 (2) ← 순서가 뒤집혔다
화면: 2
값이 실려 있으면 늦게 온 옛 알림이 새 값을 덮는다. 화면이 조용히 틀린 숫자를 띄우고, 아무도 모른다.
"바뀌었다" 만 보내면 이 문제가 사라진다. 알림이 몇 번 오든, 순서가 어떻든, 받은 쪽이 읽으면 그때의 최신값이 온다.
주방 화면 편에서 같은 결론에 닿았다. 그때는 설계로 골랐고, 여기서는 패키지가 그렇게만 보낸다 — notifyResourceUpdated(uri) 에 값을 실을 자리가 아예 없다.
구독하지 않으면 아무것도 안 간다
만들면서 걸린 것. notifyResourceUpdated 를 부르고 서버 로그에도 찍히는데 와이어에는 아무것도 안 나갔다.
notified desk://waiting ← 서버는 불렀다
(클라이언트 쪽에는 아무것도 없음)
구독하지 않은 클라이언트에는 보내지 않기 때문이다. 스펙대로다.
{"jsonrpc":"2.0","id":2,"method":"resources/subscribe","params":{"uri":"desk://waiting"}}
이걸 보낸 뒤부터 온다. 서버 쪽 결함으로 오해하기 쉬운 자리다 — 서버는 정상이고, 받을 준비를 안 한 것이다.