Repository navigation
Flow Full Image
Tobias Vorwachs edited this page Oct 26, 2026
·
1 revision
Part of the Plugin data protocol. Packet: Packet-mumcord-image. See also Flow-Direct-Connection.
A chat message carries only a thumbnail. A Mumcord user who opens it can fetch the original from the person who sent it. The client tries a direct connection first and falls back to plugin data.
sequenceDiagram
participant R as Requester
participant S as Mumble server
participant O as Original sender
R->>R: open thumbnail with data-mumcord-full
opt direct connection allowed and possible
R-->>O: stream kind 1 with SHA-256 (direct)
O-->>R: 0 + size + image bytes (direct)
end
Note over R,O: If there is no direct path (or it fails), fall back to plugin data
R->>S: plugin data mumcord.image Get (SHA-256)
S-->>O: relayed
O->>S: Queued (optional, if busy)
O->>S: Start (size)
S-->>R: relayed
loop 960 bytes per chunk, paced
O->>S: Chunk (index, bytes)
S-->>R: relayed
end
R->>R: check size, SHA-256, real image format, full decode
Note over O,R: Unavailable if the image is gone or the sender is busy
- The thumbnail carries
data-mumcord-full="<sha256>:<size>". The requester only starts if the sender announcedfull-image. -
Direct first. If a direct connection exists or can be set up, the requester opens a stream of kind 1 and sends the 32-byte SHA-256; the sender replies
0, the size and the image, or1(unavailable). Setup is in Flow-Direct-Connection. -
Fallback. The requester sends
Get(kind 1, a transfer id it picks, the SHA-256) to the original sender only. - The sender serves one transfer at a time in arrival order. If it is busy it answers
Queuedand the request waits. Otherwise it sendsStartwith the size, thenChunkmessages with index 0, 1, 2 ... and 1 to 960 image bytes each, one every 350 ms (about 2.9 per second). - The requester appends chunks in order. When the size is reached it checks the SHA-256 against the reference, checks the content is a real PNG, JPEG, GIF or WebP, and decodes the whole image.
Chunk arithmetic: a 204,800-byte image is 204,800 / 960 = 213.3, so 214 chunks (213 full chunks and one of 320 bytes), which takes about 75 seconds at 350 ms per chunk. The largest image, 512 KiB, is 547 chunks, about 3 minutes.
| What | Value |
|---|---|
No answer to Get
|
10 seconds |
Waiting behind other transfers (Queued) |
6 minutes |
| Silence between chunks | 15 seconds |
| Stalled read on a direct stream | 15 seconds |
- The sender serves only images it sent itself, only while "Offer my full-size images" is on.
- At most 4 requests wait at the sender; more get
Unavailable. Each requester gets 6 requests per minute; more are ignored. - The requester runs at most 3 downloads at once.
- Image at most 512 KiB and 3840 pixels per side.
-
Unavailable(kind 5): image gone, sender busy, or setting off. The requester shows an error. - Wrong size, wrong SHA-256, not a real image or failed decode: the bytes are discarded.
- A chunk out of order ends the transfer.
Packet-mumcord-image, Packet-mumcord-p2p (for the direct path).
Mumcord is licensed under the AGPL-3.0 (versions up to 0.1.1: MIT) · Source code · Website · Website source