crates/nornir-flight/.nornir/assets/nornir-flight-seam.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 520" font-family="ui-monospace,'JetBrains Mono',Menlo,monospace">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0b1c2e"/>
<stop offset="1" stop-color="#06111d"/>
</linearGradient>
<marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#4fd6e0"/>
</marker>
<marker id="arrg" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#54d98c"/>
</marker>
<filter id="g"><feGaussianBlur stdDeviation="2.2" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
</defs>
<rect width="1080" height="520" fill="url(#bg)"/>
<rect x="8" y="8" width="1064" height="504" rx="10" fill="none" stroke="#1c3a4f"/>
<text x="30" y="44" fill="#9fe8f0" font-size="20" font-weight="700">nornir-flight · the generic Arrow Flight transport seam</text>
<text x="30" y="68" fill="#6f93a0" font-size="13">ONE transport, schema-agnostic. Each use (build-info, skade-flight, …) is an independent consumer on top. Auth is REUSED from nornir-service, never re-rolled.</text>
<!-- PRODUCER -->
<g>
<rect x="34" y="150" width="250" height="150" rx="9" fill="#0e2436" stroke="#4fd6e0" stroke-width="1.5"/>
<text x="50" y="178" fill="#4fd6e0" font-size="14" font-weight="700">① PRODUCER</text>
<text x="50" y="204" fill="#cfe9f0" font-size="12">FlightConn::put(key, batches)</text>
<text x="50" y="224" fill="#cfe9f0" font-size="12">pushes RecordBatches</text>
<text x="50" y="250" fill="#9fe8f0" font-size="12">verb: do_put</text>
<text x="50" y="276" fill="#6f93a0" font-size="11.5">descriptor path = routing key</text>
</g>
<!-- AUTH GATE -->
<g>
<rect x="330" y="150" width="150" height="150" rx="9" fill="#11202b" stroke="#54d98c" stroke-width="1.5"/>
<text x="346" y="178" fill="#54d98c" font-size="13" font-weight="700">② AUTH</text>
<text x="346" y="202" fill="#cfe9f0" font-size="11.5">nornir_service::</text>
<text x="346" y="218" fill="#cfe9f0" font-size="11.5">auth_interceptor</text>
<text x="346" y="244" fill="#9fe8f0" font-size="11">Bearer <token></text>
<text x="346" y="264" fill="#6f93a0" font-size="10.5">empty ⟹ open</text>
<text x="346" y="280" fill="#6f93a0" font-size="10.5">const-time compare</text>
</g>
<!-- SEAM (server) -->
<g>
<rect x="526" y="120" width="300" height="240" rx="9" fill="#0e2436" stroke="#4fd6e0" stroke-width="1.5"/>
<text x="542" y="148" fill="#4fd6e0" font-size="14" font-weight="700">③ NornirFlightService</text>
<text x="542" y="172" fill="#6f93a0" font-size="11.5">FlightServer::serve(routes, addr)</text>
<text x="542" y="188" fill="#6f93a0" font-size="11.5">over nornir_service::serve loop</text>
<rect x="542" y="204" width="268" height="60" rx="6" fill="#11202b" stroke="#4fd6e0" stroke-opacity="0.6"/>
<text x="556" y="226" fill="#9fe8f0" font-size="12">do_put → FlightSink::put</text>
<text x="556" y="246" fill="#9fe8f0" font-size="12">do_get → FlightSource::get</text>
<rect x="542" y="272" width="268" height="30" rx="6" fill="#11202b" stroke="#4fd6e0" stroke-opacity="0.6"/>
<text x="556" y="292" fill="#9fe8f0" font-size="12">do_exchange → store-then-echo</text>
<text x="542" y="330" fill="#6f93a0" font-size="11">Arrow-IPC framing + backpressure</text>
<text x="542" y="346" fill="#6f93a0" font-size="11">handled once; callers see RecordBatch</text>
</g>
<!-- CONSUMER -->
<g>
<rect x="872" y="150" width="176" height="150" rx="9" fill="#0e2436" stroke="#4fd6e0" stroke-width="1.5"/>
<text x="888" y="178" fill="#4fd6e0" font-size="14" font-weight="700">④ CONSUMER</text>
<text x="888" y="204" fill="#cfe9f0" font-size="11.5">FlightConn::get(key)</text>
<text x="888" y="224" fill="#9fe8f0" font-size="12">verb: do_get</text>
<text x="888" y="250" fill="#cfe9f0" font-size="11.5">byte-identical</text>
<text x="888" y="268" fill="#cfe9f0" font-size="11.5">RecordBatches back</text>
</g>
<!-- SINK/SOURCE impls -->
<g>
<rect x="526" y="392" width="300" height="90" rx="9" fill="#0e2436" stroke="#8f7fe0" stroke-width="1.4"/>
<text x="542" y="418" fill="#b9a9ff" font-size="13" font-weight="700">FlightSink / FlightSource (traits)</text>
<text x="542" y="440" fill="#cfe9f0" font-size="11.5">MemFlightStore — default in-mem impl</text>
<text x="542" y="458" fill="#6f93a0" font-size="11">build-info emitter · sealer · viz live-tail</text>
<text x="542" y="474" fill="#6f93a0" font-size="11">plug in here — schema stays the caller's</text>
</g>
<!-- flow arrows -->
<line x1="284" y1="225" x2="328" y2="225" stroke="#54d98c" stroke-width="2" marker-end="url(#arrg)" filter="url(#g)"/>
<line x1="480" y1="225" x2="524" y2="225" stroke="#4fd6e0" stroke-width="2" marker-end="url(#arr)" filter="url(#g)"/>
<line x1="826" y1="225" x2="870" y2="225" stroke="#4fd6e0" stroke-width="2" marker-end="url(#arr)" filter="url(#g)"/>
<line x1="676" y1="360" x2="676" y2="390" stroke="#8f7fe0" stroke-width="2" marker-end="url(#arr)" filter="url(#g)"/>
<text x="286" y="216" fill="#6f93a0" font-size="10.5">gate</text>
<text x="835" y="216" fill="#6f93a0" font-size="10.5">stream</text>
<text x="30" y="502" fill="#54d98c" font-size="11.5">round-trip contract: put(key,b) then get(key) / exchange(key,b) returns b byte-identical — the acceptance test pins it. Loki: put 823 MiB/s · get 1513 MiB/s (12c).</text>
</svg>