efadc228eb53dbf85fbea3b76d489599d0d3e817
Chat file fetches failed 100% of the time with "file fetch: read failed: read error: connection lost" (both images and arbitrary files, both directions). Root cause: the FileRouter serve handler called send.finish() and immediately returned Ok(()), which dropped the Connection. In QUIC, finish() only marks the stream's EOF -- it does not wait for the written bytes to be delivered and acknowledged -- so the connection's CONNECTION_CLOSE raced ahead of the still-in-flight stream data and the fetcher's read_to_end aborted. Fix: after finishing, wait on connection.closed() (bounded by FILE_FETCH_TIMEOUT) so the link stays up until the fetcher has read everything and closed the connection itself, which is the signal the transfer landed. Wire-compatible (no protocol change), so version stays 0.3.0; both peers just need the rebuilt binary since either side can be the file server. Adds tests/file_transfer_loopback.rs: a real two-endpoint serve->fetch round-trip over FILES_ALPN with a 2 MiB multi-packet blob (deterministic A/B: 0/20 pass without the fix, 20/20 with it) plus an unknown-id "gone" case. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>