mirror of
https://github.com/wu736139669/hapi.git
synced 2026-10-24 22:10:59 +00:00
Pasted images were stored inline in the message JSON as full-size base64 data URLs. Every conversation load (open, paginate, mobile reconnect) had to download and parse those megabytes before anything rendered, with no lazy loading and no per-image caching. Measured on this hub: 115 messages holding 138MB of base64, the largest single message 18.3MB. New messages now carry only a small thumbnail (browser-generated, 768px webp/jpeg data URL); the original is uploaded as before and the hub keeps a durable copy under ~/.hapi/attachments (table chat_attachments, schema v27). The chat renders the thumbnail instantly and lazily swaps in the original from GET /api/sessions/:id/attachments/:id when the viewer opens; that endpoint answers sha256 ETag + immutable Cache-Control so repeated opens are free. Sessions scope the URL, deletes remove the copy, and hub/scripts/attachments.ts covers stats/verify/gc/export. Old messages keep their inline previews (migration deliberately deferred). Verified end-to-end against the local hub: upload returns the attachment id/url, original 200 with ETag, revalidation 304, cross-session 404, delete removes file+row (404 after). Typecheck clean; suite status matches the pre-change baseline; fixtures unchanged.