13 releases (7 breaking)

new 0.8.0 Dec 12, 2024
0.6.0 Nov 27, 2024

#1814 in Network programming

Download history 201/week @ 2024-10-10 215/week @ 2024-10-17 788/week @ 2024-10-24 152/week @ 2024-10-31 197/week @ 2024-11-07 39/week @ 2024-11-14 285/week @ 2024-11-21 256/week @ 2024-11-28 56/week @ 2024-12-05

641 downloads per month
Used in 6 crates (4 directly)

MIT/Apache

97KB
3K SLoC

Documentation Crates.io License: MIT

moq-transfork

A Rust implementation of (a fork of) the proposed IETF standard.

Specification Github


lib.rs:

An fork of the MoQ Transport protocol.

MoQ Transfork is a pub/sub protocol over QUIC. While originally designed for live media, MoQ Transfork is generic and can be used for other live applications. The specification is a work in progress and will change. See the specification and github for any updates.

The core of this crate is [Session], established with Session::connect (client) or Session::accept (server). Once you have a session, you can Session::publish or Session::subscribe.

Producing

There can be only 1 publisher.

  • [BroadcastProducer] can create any number of [TrackProducer]s. Each [Track] is produced independently with a specified order/priority.
  • [TrackProducer] can append any number of [GroupProducer]s, with new subscribers joining at [Group] boundaries (ex. keyframes).
  • [GroupProducer] can append any number of [Frame]s, either using GroupProducer::write_frame (contiguous) or GroupProducer::create_frame (chunked).
  • [FrameProducer] is thus optional, allowing you to specify an upfront size to write multiple chunks.

All methods are synchronous and will NOT block. If there are no subscribers, then no data will flow over the network but it will remain in cache. If the session is dropped, then any future writes will error.

Consuming

There can be N consumers (via [Clone]), each getting a copy of any requested data.

  • [BroadcastConsumer] can fetch any number of [TrackConsumer]s. Each [Track] is consumed independently with a specified order/priority.
  • [TrackConsumer] can fetch any number of [GroupConsumer]s, joining at a [Group] boundary (ex. keyframes).
  • [GroupConsumer] can fetch any number of [Frame]s, either using GroupConsumer::read_frame (contiguous) or GroupConsumer::next_frame (chunked).
  • [FrameConsumer] is thus optional, allowing you to read chunks as they arrive.

All methods are asynchronous and will block until data is available. If the publisher disconnects, then the consumer will error. If the publisher is dropped (clean FIN), then the above methods will return [None].

Dependencies

~5–18MB
~240K SLoC