@@ -16,6 +16,13 @@ use super::{ServeError, Track, TrackReader, TrackWriter};
1616use crate :: coding:: TrackNamespace ;
1717use crate :: watch:: { Queue , State } ;
1818
19+ /// Full track identifier: namespace + track name
20+ #[ derive( Hash , Eq , PartialEq , Clone , Debug ) ]
21+ pub struct FullTrackName {
22+ pub namespace : TrackNamespace ,
23+ pub name : String ,
24+ }
25+
1926/// Static information about a broadcast.
2027#[ derive( Debug ) ]
2128pub struct Tracks {
@@ -42,7 +49,7 @@ impl Tracks {
4249
4350#[ derive( Default ) ]
4451pub struct TracksState {
45- tracks : HashMap < String , TrackReader > ,
52+ tracks : HashMap < FullTrackName , TrackReader > ,
4653}
4754
4855/// Publish new tracks for a broadcast by name.
@@ -57,6 +64,7 @@ impl TracksWriter {
5764 }
5865
5966 /// Create a new track with the given name, inserting it into the broadcast.
67+ /// The track will use this writer's namespace.
6068 /// None is returned if all [TracksReader]s have been dropped.
6169 pub fn create ( & mut self , track : & str ) -> Option < TrackWriter > {
6270 let ( writer, reader) = Track {
@@ -66,17 +74,22 @@ impl TracksWriter {
6674 . produce ( ) ;
6775
6876 // NOTE: We overwrite the track if it already exists.
69- self . state
70- . lock_mut ( ) ?
71- . tracks
72- . insert ( track. to_owned ( ) , reader) ;
77+ let full_name = FullTrackName {
78+ namespace : self . namespace . clone ( ) ,
79+ name : track. to_owned ( ) ,
80+ } ;
81+ self . state . lock_mut ( ) ?. tracks . insert ( full_name, reader) ;
7382
7483 Some ( writer)
7584 }
7685
77- /// Remove a track from the broadcast by name.
78- pub fn remove ( & mut self , track_name : & str ) -> Option < TrackReader > {
79- self . state . lock_mut ( ) ?. tracks . remove ( track_name)
86+ /// Remove a track from the broadcast by full name.
87+ pub fn remove ( & mut self , namespace : & TrackNamespace , track_name : & str ) -> Option < TrackReader > {
88+ let full_name = FullTrackName {
89+ namespace : namespace. clone ( ) ,
90+ name : track_name. to_owned ( ) ,
91+ } ;
92+ self . state . lock_mut ( ) ?. tracks . remove ( & full_name)
8093 }
8194}
8295
@@ -143,28 +156,46 @@ impl TracksReader {
143156 Self { state, queue, info }
144157 }
145158
146- /// Get a track from the broadcast by name, if it exists.
147- pub fn get_track_reader ( & mut self , track_name : & str ) -> Option < TrackReader > {
159+ /// Get a track from the broadcast by full name, if it exists.
160+ pub fn get_track_reader (
161+ & mut self ,
162+ namespace : & TrackNamespace ,
163+ track_name : & str ,
164+ ) -> Option < TrackReader > {
148165 let state = self . state . lock ( ) ;
166+ let full_name = FullTrackName {
167+ namespace : namespace. clone ( ) ,
168+ name : track_name. to_owned ( ) ,
169+ } ;
149170
150- if let Some ( track_reader) = state. tracks . get ( track_name ) {
171+ if let Some ( track_reader) = state. tracks . get ( & full_name ) {
151172 return Some ( track_reader. clone ( ) ) ;
152173 }
153174 None
154175 }
155176
156- /// Get or request a track from the broadcast by name.
177+ /// Get or request a track from the broadcast by full name.
178+ /// The namespace parameter should be the full requested namespace, not just the announced prefix.
157179 /// None is returned if [TracksWriter] or [TracksRequest] cannot fufill the request.
158- pub fn subscribe ( & mut self , track_name : & str ) -> Option < TrackReader > {
180+ pub fn subscribe (
181+ & mut self ,
182+ namespace : TrackNamespace ,
183+ track_name : & str ,
184+ ) -> Option < TrackReader > {
159185 let state = self . state . lock ( ) ;
186+ let full_name = FullTrackName {
187+ namespace : namespace. clone ( ) ,
188+ name : track_name. to_owned ( ) ,
189+ } ;
160190
161- if let Some ( track_reader) = state. tracks . get ( track_name ) {
191+ if let Some ( track_reader) = state. tracks . get ( & full_name ) {
162192 return Some ( track_reader. clone ( ) ) ;
163193 }
164194
165195 let mut state = state. into_mut ( ) ?;
196+ // Use the full requested namespace, not self.namespace
166197 let track_writer_reader = Track {
167- namespace : self . namespace . clone ( ) ,
198+ namespace : namespace. clone ( ) ,
168199 name : track_name. to_owned ( ) ,
169200 }
170201 . produce ( ) ;
@@ -173,10 +204,10 @@ impl TracksReader {
173204 return None ;
174205 }
175206
176- // We requested the track sucessfully so we can deduplicate it.
207+ // We requested the track sucessfully so we can deduplicate it by full name .
177208 state
178209 . tracks
179- . insert ( track_name . to_owned ( ) , track_writer_reader. 1 . clone ( ) ) ;
210+ . insert ( full_name , track_writer_reader. 1 . clone ( ) ) ;
180211
181212 Some ( track_writer_reader. 1 . clone ( ) )
182213 }
0 commit comments