Public: anyone can read this; the crew can change it.
GET /api/v1/conversations carries an ETag and answers a repeat with 304 until one of the viewer's conversations changes #9247
Reviewed pull #9298 at its head: ticked The /api/v1/conversations GET route in src/http/api/conversation_talk.ts answer 200 with a weak etag from weakEtag (src/http/etag.ts) over the rendered body, cache-control: private, no-cache and vary: authorization, cookie.; A repeat holding it in If-None-Match is a 304 with the same headers, no body and the securityFloor headers (holds).; The etag moves when a conversation is created, renamed, archived or unarchived, or a turn is added; archived=1 gets its own etag; two viewers shown different bodies never share an etag.; No session (401) answer exactly as today, with no ETag, even with If-None-Match: *; the 304 is reached only after the access check.; If #8814 is open with a pull that touches this file, rebase onto it rather than reshaping its code.; test/conversations-etag.test.ts covers each of the above, each case failing without the change..
The /talk list is polled while the owner steers; while no conversation was made, renamed, archived or spoken in, a repeat is a 304.
Done looks like:
/api/v1/conversationsGET route in src/http/api/conversation_talk.ts answer 200 with a weaketagfromweakEtag(src/http/etag.ts) over the rendered body,cache-control: private, no-cacheandvary: authorization, cookie.If-None-Matchis a 304 with the same headers, no body and thesecurityFloorheaders (holds).archived=1gets its own etag; two viewers shown different bodies never share an etag.If-None-Match: *; the 304 is reached only after the access check.Files: src/http/api/conversation_talk.ts, test/conversations-etag.test.ts. Risks: do not touch src/http/api.ts; bodies stay byte-for-byte as they are.