Skip to content

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.

Flow: full-size image

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
Loading

Steps

  1. The thumbnail carries data-mumcord-full="<sha256>:<size>". The requester only starts if the sender announced full-image.
  2. 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, or 1 (unavailable). Setup is in Flow-Direct-Connection.
  3. Fallback. The requester sends Get (kind 1, a transfer id it picks, the SHA-256) to the original sender only.
  4. The sender serves one transfer at a time in arrival order. If it is busy it answers Queued and the request waits. Otherwise it sends Start with the size, then Chunk messages with index 0, 1, 2 ... and 1 to 960 image bytes each, one every 350 ms (about 2.9 per second).
  5. 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.

Timeouts

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

Limits and errors

  • 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.

Packets used

Packet-mumcord-image, Packet-mumcord-p2p (for the direct path).

Clone this wiki locally