Skip to content

Commit 8c23f4b

Browse files
committed
chore: refactor to make sure our steam id or master cookie changes we will reset the fragments for the match
1 parent d7a1cfc commit 8c23f4b

2 files changed

Lines changed: 47 additions & 16 deletions

File tree

src/matches/match-relay/match-relay.controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export class MatchRelayController {
9191

9292
@Post(":token/:fragment/start")
9393
public async handlePostStart(
94+
@Param("token") token: string,
9495
@Param("id") matchId: string,
9596
@Param("fragment") fragment: string,
9697
@Req() request: Request,
@@ -99,6 +100,7 @@ export class MatchRelayController {
99100
this.matchRelayService.postField(
100101
request,
101102
response,
103+
token,
102104
"start",
103105
matchId,
104106
parseInt(fragment),
@@ -107,6 +109,7 @@ export class MatchRelayController {
107109

108110
@Post(":token/:fragment/full")
109111
public async handlePostFull(
112+
@Param("token") token: string,
110113
@Param("id") matchId: string,
111114
@Param("fragment") fragment: string,
112115
@Req() request: Request,
@@ -115,6 +118,7 @@ export class MatchRelayController {
115118
this.matchRelayService.postField(
116119
request,
117120
response,
121+
token,
118122
"full",
119123
matchId,
120124
parseInt(fragment),
@@ -123,6 +127,7 @@ export class MatchRelayController {
123127

124128
@Post(":token/:fragment/delta")
125129
public async handlePostDelta(
130+
@Param("token") token: string,
126131
@Param("id") matchId: string,
127132
@Param("fragment") fragment: string,
128133
@Req() request: Request,
@@ -131,6 +136,7 @@ export class MatchRelayController {
131136
this.matchRelayService.postField(
132137
request,
133138
response,
139+
token,
134140
"delta",
135141
matchId,
136142
parseInt(fragment),

src/matches/match-relay/match-relay.service.ts

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@ import {
1313
export 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

Comments
 (0)