@@ -46,24 +46,9 @@ impl Locals {
4646 Ok ( registration)
4747 }
4848
49- /// Lookup local tracks by namespace using hierarchical prefix matching.
50- /// Returns the TracksReader for the longest matching namespace prefix.
49+ /// Lookup local tracks by namespace.
5150 pub fn route ( & self , namespace : & TrackNamespace ) -> Option < TracksReader > {
52- let lookup = self . lookup . lock ( ) . unwrap ( ) ;
53-
54- // Find the longest matching prefix
55- let mut best_match: Option < ( usize , TracksReader ) > = None ;
56-
57- for ( registered_ns, tracks) in lookup. iter ( ) {
58- if registered_ns. is_prefix_of ( namespace) {
59- let prefix_len = registered_ns. len ( ) ;
60- if best_match. is_none ( ) || best_match. as_ref ( ) . unwrap ( ) . 0 < prefix_len {
61- best_match = Some ( ( prefix_len, tracks. clone ( ) ) ) ;
62- }
63- }
64- }
65-
66- best_match. map ( |( _, tracks) | tracks)
51+ self . lookup . lock ( ) . unwrap ( ) . get ( namespace) . cloned ( )
6752 }
6853}
6954
@@ -78,94 +63,3 @@ impl Drop for Registration {
7863 self . locals . lookup . lock ( ) . unwrap ( ) . remove ( & self . namespace ) ;
7964 }
8065}
81-
82- #[ cfg( test) ]
83- mod tests {
84- use super :: * ;
85- use moq_transport:: { coding:: TrackNamespace , serve:: Tracks } ;
86-
87- #[ tokio:: test]
88- async fn test_exact_match ( ) {
89- let mut locals = Locals :: new ( ) ;
90- let namespace = TrackNamespace :: from_utf8_path ( "moq-test-00" ) ;
91- let ( _writer, _request, reader) = Tracks :: new ( namespace. clone ( ) ) . produce ( ) ;
92-
93- let _registration = locals. register ( reader) . await . unwrap ( ) ;
94-
95- // Exact match should work
96- let result = locals. route ( & namespace) ;
97- assert ! ( result. is_some( ) ) ;
98- }
99-
100- #[ tokio:: test]
101- async fn test_hierarchical_match ( ) {
102- let mut locals = Locals :: new ( ) ;
103- let registered_ns = TrackNamespace :: from_utf8_path ( "moq-test-00" ) ;
104- let ( _writer, _request, reader) = Tracks :: new ( registered_ns. clone ( ) ) . produce ( ) ;
105-
106- let _registration = locals. register ( reader) . await . unwrap ( ) ;
107-
108- // Hierarchical match should work
109- let query_ns = TrackNamespace :: from_utf8_path ( "moq-test-00/1/2/3" ) ;
110- let result = locals. route ( & query_ns) ;
111- assert ! (
112- result. is_some( ) ,
113- "Should match hierarchical namespace moq-test-00/1/2/3 to registered moq-test-00"
114- ) ;
115- }
116-
117- #[ tokio:: test]
118- async fn test_no_match ( ) {
119- let mut locals = Locals :: new ( ) ;
120- let registered_ns = TrackNamespace :: from_utf8_path ( "moq-test-00" ) ;
121- let ( _writer, _request, reader) = Tracks :: new ( registered_ns. clone ( ) ) . produce ( ) ;
122-
123- let _registration = locals. register ( reader) . await . unwrap ( ) ;
124-
125- // Different namespace should not match
126- let query_ns = TrackNamespace :: from_utf8_path ( "other-namespace" ) ;
127- let result = locals. route ( & query_ns) ;
128- assert ! ( result. is_none( ) ) ;
129- }
130-
131- #[ tokio:: test]
132- async fn test_longest_match_wins ( ) {
133- let mut locals = Locals :: new ( ) ;
134-
135- // Register two namespaces at different levels
136- let ns1 = TrackNamespace :: from_utf8_path ( "moq-test-00" ) ;
137- let ( _writer1, _request1, reader1) = Tracks :: new ( ns1. clone ( ) ) . produce ( ) ;
138- let _reg1 = locals. register ( reader1) . await . unwrap ( ) ;
139-
140- let ns2 = TrackNamespace :: from_utf8_path ( "moq-test-00/1" ) ;
141- let ( _writer2, _request2, reader2) = Tracks :: new ( ns2. clone ( ) ) . produce ( ) ;
142- let _reg2 = locals. register ( reader2) . await . unwrap ( ) ;
143-
144- // Query for a deeper namespace
145- let query_ns = TrackNamespace :: from_utf8_path ( "moq-test-00/1/2/3" ) ;
146- let result = locals. route ( & query_ns) ;
147- assert ! ( result. is_some( ) ) ;
148-
149- // The result should be the more specific match (moq-test-00/1)
150- // We can verify this by checking the namespace on the returned TracksReader
151- let tracks_reader = result. unwrap ( ) ;
152- assert_eq ! ( tracks_reader. namespace, ns2) ;
153- }
154-
155- #[ tokio:: test]
156- async fn test_partial_match_fails ( ) {
157- let mut locals = Locals :: new ( ) ;
158- let registered_ns = TrackNamespace :: from_utf8_path ( "moq-test-00/1/2" ) ;
159- let ( _writer, _request, reader) = Tracks :: new ( registered_ns. clone ( ) ) . produce ( ) ;
160-
161- let _registration = locals. register ( reader) . await . unwrap ( ) ;
162-
163- // Querying for a shorter namespace should not match
164- let query_ns = TrackNamespace :: from_utf8_path ( "moq-test-00/1" ) ;
165- let result = locals. route ( & query_ns) ;
166- assert ! (
167- result. is_none( ) ,
168- "Shorter namespace should not match longer registered namespace"
169- ) ;
170- }
171- }
0 commit comments