@@ -13,7 +13,13 @@ import {
1313export class MatchRelayService {
1414 private readonly gzip = promisify ( zlib . gzip ) ;
1515
16- private readonly broadcasts : { [ key : string ] : Map < number , Fragment > } = { } ;
16+ private readonly broadcasts : {
17+ [ key : string ] : {
18+ steamId : string ;
19+ masterCookie : string ;
20+ fragments : Map < number , Fragment > ;
21+ } ;
22+ } = { } ;
1723
1824 constructor ( private readonly logger : Logger ) { }
1925
@@ -23,7 +29,7 @@ export class MatchRelayService {
2329
2430 public getStart ( response : Response , matchId : string , fragmentIndex : number ) {
2531 const broadcast = this . broadcasts [ matchId ] ;
26- const startFragment = broadcast ?. get ( 0 ) ;
32+ const startFragment = broadcast ?. fragments . get ( 0 ) ;
2733
2834 if (
2935 startFragment == null ||
@@ -51,7 +57,7 @@ export class MatchRelayService {
5157 return ;
5258 }
5359
54- const fragment = broadcast . get ( fragmentIndex ) ;
60+ const fragment = broadcast . fragments . get ( fragmentIndex ) ;
5561 if ( ! fragment ) {
5662 response . writeHead ( 404 , "fragment not found" ) ;
5763 response . end ( ) ;
@@ -76,7 +82,7 @@ export class MatchRelayService {
7682 return ;
7783 }
7884
79- const startFragment = broadcast . get ( 0 ) ;
85+ const startFragment = broadcast . fragments . get ( 0 ) ;
8086
8187 if ( startFragment == null || startFragment . start ?. data == null ) {
8288 this . relayError ( response , 404 , `broadcast has not started yet` ) ;
@@ -88,7 +94,9 @@ export class MatchRelayService {
8894 let fragment : Fragment | null = null ;
8995
9096 const maxIndex =
91- broadcast . size > 0 ? Math . max ( ...Array . from ( broadcast . keys ( ) ) ) : 0 ;
97+ broadcast . fragments . size > 0
98+ ? Math . max ( ...Array . from ( broadcast . fragments . keys ( ) ) )
99+ : 0 ;
92100
93101 if ( fragmentParam == null ) {
94102 fragmentIndex = Math . max ( 0 , maxIndex - 7 ) ;
@@ -97,7 +105,7 @@ export class MatchRelayService {
97105 fragmentIndex >= 0 &&
98106 fragmentIndex >= ( startFragment . start . signup_fragment || 0 )
99107 ) {
100- const _fragment = broadcast . get ( fragmentIndex ) ;
108+ const _fragment = broadcast . fragments . get ( fragmentIndex ) ;
101109 if ( this . isSyncReady ( _fragment ) ) {
102110 fragment = _fragment ;
103111 }
@@ -110,7 +118,7 @@ export class MatchRelayService {
110118 }
111119
112120 for ( let i = fragmentIndex ; i <= maxIndex ; i ++ ) {
113- const _fragment = broadcast . get ( i ) ;
121+ const _fragment = broadcast . fragments . get ( i ) ;
114122 if ( this . isSyncReady ( _fragment ) ) {
115123 fragment = _fragment ;
116124 fragmentIndex = i ;
@@ -144,11 +152,12 @@ export class MatchRelayService {
144152 JSON . stringify ( {
145153 tick : fragTick ,
146154 endtick : fragEndtick ,
147- maxtick : this . getMatchBroadcastEndTick ( broadcast ) ,
155+ maxtick : this . getMatchBroadcastEndTick ( broadcast . fragments ) ,
148156 rtdelay : ( nowMs - ( fragTimestamp || nowMs ) ) / 1000 ,
149157 rcvage :
150158 ( nowMs -
151- ( this . getLastFragment ( broadcast ) ?. delta ?. timestamp || nowMs ) ) /
159+ ( this . getLastFragment ( broadcast . fragments ) ?. delta ?. timestamp ||
160+ nowMs ) ) /
152161 1000 ,
153162 fragment : fragmentIndex ,
154163 signup_fragment : startFragment . start ?. signup_fragment ,
@@ -163,32 +172,48 @@ export class MatchRelayService {
163172 public postField (
164173 request : Request ,
165174 response : Response ,
175+ token : string ,
166176 field : "start" | "full" | "delta" ,
167177 matchId : string ,
168178 fragmentIndex : number ,
169179 ) : void {
180+ const [ steamId , masterCookie ] = token . split ( "t" ) ;
181+
170182 if ( ! this . broadcasts [ matchId ] ) {
171- this . broadcasts [ matchId ] = new Map ( ) ;
183+ this . broadcasts [ matchId ] = {
184+ steamId,
185+ masterCookie,
186+ fragments : new Map ( ) ,
187+ } ;
172188 }
173189
174190 const broadcast = this . broadcasts [ matchId ] ;
175191
192+ if (
193+ broadcast . steamId !== steamId ||
194+ broadcast . masterCookie !== masterCookie
195+ ) {
196+ broadcast . steamId = steamId ;
197+ broadcast . masterCookie = masterCookie ;
198+ broadcast . fragments . clear ( ) ;
199+ }
200+
176201 if ( field == "start" ) {
177202 fragmentIndex = 0 ;
178203 }
179204
180- if ( field != "start" && ! broadcast . has ( 0 ) ) {
205+ if ( field != "start" && ! broadcast . fragments . has ( 0 ) ) {
181206 response . writeHead ( 205 ) ;
182207 response . end ( ) ;
183208 return ;
184209 }
185210
186211 response . writeHead ( 200 ) ;
187- if ( ! broadcast . has ( fragmentIndex ) ) {
188- broadcast . set ( fragmentIndex , { } ) ;
212+ if ( ! broadcast . fragments . has ( fragmentIndex ) ) {
213+ broadcast . fragments . set ( fragmentIndex , { } ) ;
189214 }
190215
191- const fragment = broadcast . get ( fragmentIndex ) ! ;
216+ const fragment = broadcast . fragments . get ( fragmentIndex ) ! ;
192217
193218 if ( fragment [ field ] == null ) {
194219 fragment [ field ] = {
@@ -259,7 +284,7 @@ export class MatchRelayService {
259284 const now = Date . now ( ) ;
260285 const indicesToDelete : number [ ] = [ ] ;
261286
262- for ( const [ index , fragment ] of broadcast . entries ( ) ) {
287+ for ( const [ index , fragment ] of broadcast . fragments . entries ( ) ) {
263288 if ( index === 0 ) {
264289 continue ;
265290 }
@@ -272,7 +297,7 @@ export class MatchRelayService {
272297 }
273298
274299 for ( const index of indicesToDelete ) {
275- broadcast . delete ( index ) ;
300+ broadcast . fragments . delete ( index ) ;
276301 }
277302 }
278303
0 commit comments