Publish
Publishing is a mechanism for responding to subscriptions initiated by the other side (either client or server).
You register a TrackHandler with a TrackMux for each broadcast path. When a subscription request is received for a given track name, the handler is invoked and is responsible for sending the appropriate track data.
Publish and Announce Broadcasts
To make a broadcast available for subscription, use one of the following methods on a TrackMux:
Publish: Registers aTrackHandlerfor a specific path. Internally, it creates an activeAnnouncementand delegates toAnnounce.PublishFunc: Registers a function as a handler for a specific path (convenience wrapper forPublish).Announce: Registers a handler and an explicitAnnouncementobject. TheAnnouncementmust be active, otherwise the handler is not registered and no announcement is sent.
When you publish or announce a broadcast, an announcement is sent internally to notify other participants that the broadcast exists and is active. The announcement is distributed via the announcement tree and channels managed by the mux.
Handle Track Subscriptions
When the other side (client or server) subscribes to a broadcast path, the registered TrackHandler is invoked to serve the subscription. The handler receives a TrackWriter and is responsible for sending the appropriate track data for the requested track name.
Registering a TrackHandler with Publish:
mux := moqt.NewTrackMux()
var trackHandler moqt.TrackHandler
mux.Publish(ctx, "/broadcast_path", trackHandler)Using PublishFunc:
mux := moqt.NewTrackMux()
mux.PublishFunc(ctx, "/broadcast_path", func(tw *moqt.TrackWriter) {
defer tw.Close() // Always close when done
// Handle track subscription
})Context: The context is used to manage the lifecycle of the publication and can be cancelled to stop the broadcast.
Broadcast Path: The broadcast path is a unique identifier for the broadcast stream.
Track Handler: The track handler is a function that processes incoming track data for a specific broadcast path.
Announcements and Track Discovery
When you call Publish, PublishFunc, or Announce, a moqt.Announcement is initialized (or provided), and the announcement is sent to all registered channels in the announcement tree.
This ensures that all participants are aware of available broadcasts and their status. If the announcement ends (for example, if the context is cancelled), the mux cleans up the handler and announcement.
For more details, see the Announce & Discover documentation.
Producing a Track
Cancel a Publication
To stop serving a broadcast, cancel the context used for publishing. This will terminate the publication, trigger the announcement’s end handler, and release any associated resources.
Cancelling the Context:
ctx, cancel := context.WithCancel(context.Background())
mux.Publish(ctx, "/broadcast_path", trackHandler)
// Later, when you want to stop serving:
cancel() // This ends the announcement and removes the handler