Skip to content

Commit 8eb8b6c

Browse files
committed
chore: make dedicated servers be more restrictive if using steam relay
1 parent 5a1a32d commit 8eb8b6c

2 files changed

Lines changed: 86 additions & 18 deletions

File tree

hasura/functions/servers/get_server_connection.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ DECLARE
55
connection_string text;
66
min_role_to_connect text;
77
BEGIN
8-
IF server.enabled = false OR server.type = 'Ranked' OR server.host IS NULL OR server.port IS NULL THEN
8+
IF server.connected = false OR server.enabled = false OR server.type = 'Ranked' OR server.host IS NULL OR server.port IS NULL THEN
99
RETURN NULL;
1010
END IF;
1111

@@ -32,7 +32,7 @@ DECLARE
3232
server_host text;
3333
min_role_to_connect text;
3434
BEGIN
35-
IF server.enabled = false OR server.type = 'Ranked' OR server.connect_password IS NOT NULL THEN
35+
IF server.connected = false OR server.enabled = false OR server.type = 'Ranked' OR server.connect_password IS NOT NULL THEN
3636
RETURN NULL;
3737
END IF;
3838

src/dedicated-servers/dedicated-servers.service.ts

Lines changed: 84 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,11 @@ export class DedicatedServersService {
321321
},
322322
});
323323

324-
this.logger.verbose(`[${serverId}] create service for dedicated server`);
325-
326324
if (!steamRelay) {
325+
this.logger.verbose(
326+
`[${serverId}] create service for dedicated server`,
327+
);
328+
327329
await this.core.createNamespacedService({
328330
namespace: this.namespace,
329331
body: {
@@ -377,16 +379,27 @@ export class DedicatedServersService {
377379
__args: {
378380
pk_columns: { id: serverId },
379381
_set: {
380-
connected: true,
382+
connected: false,
383+
steam_relay: null,
381384
},
382385
},
383386
id: true,
384387
},
385388
});
386389

387-
setTimeout(() => {
388-
this.pingDedicatedServer(serverId);
389-
}, 10000);
390+
void this.waitForPodReady(serverId)
391+
.then(() => {
392+
setTimeout(async () => {
393+
this.logger.verbose(`[${serverId}] dedicated server is ready`);
394+
await this.pingDedicatedServer(serverId);
395+
}, 10000);
396+
})
397+
.catch((error) => {
398+
this.logger.error(
399+
`[${serverId}] error waiting for pod to be ready`,
400+
error,
401+
);
402+
});
390403

391404
return true;
392405
} catch (error) {
@@ -491,6 +504,7 @@ export class DedicatedServersService {
491504
servers_by_pk: {
492505
__args: { id: serverId },
493506
connected: true,
507+
steam_relay: true,
494508
server_region: {
495509
steam_relay: true,
496510
},
@@ -513,7 +527,8 @@ export class DedicatedServersService {
513527
let steamId = null;
514528
const status = JSON.parse(await rcon.send("status_json"));
515529

516-
if (server.server_region?.steam_relay) {
530+
const steamRelayeEnabled = server.server_region?.steam_relay;
531+
if (steamRelayeEnabled) {
517532
steamId = status.server.steamid;
518533
}
519534

@@ -529,19 +544,15 @@ export class DedicatedServersService {
529544

530545
await this.redis.expire("dedicated-servers:stats", 120);
531546

532-
const { servers_by_pk: currentServer } = await this.hasura.query({
533-
servers_by_pk: {
534-
__args: { id: serverId },
535-
steam_relay: true,
536-
},
537-
});
538-
539-
if (currentServer.steam_relay !== steamId) {
547+
if (server.steam_relay !== steamId) {
540548
await this.hasura.mutation({
541549
update_servers_by_pk: {
542550
__args: {
543551
pk_columns: { id: serverId },
544-
_set: { steam_relay: steamId },
552+
_set: {
553+
steam_relay: steamId,
554+
connected: !steamRelayeEnabled || steamId !== null,
555+
},
545556
},
546557
id: true,
547558
},
@@ -606,4 +617,61 @@ export class DedicatedServersService {
606617
private getDedicatedServerDeploymentName(serverId: string): string {
607618
return `dedicated-server-${serverId}`;
608619
}
620+
621+
private async waitForPodReady(
622+
serverId: string,
623+
maxWaitTime: number = 60 * 1000,
624+
): Promise<void> {
625+
const deploymentName = this.getDedicatedServerDeploymentName(serverId);
626+
const startTime = Date.now();
627+
628+
this.logger.log(`[${serverId}] waiting for pod to be ready`);
629+
630+
return new Promise((resolve, reject) => {
631+
const checkPodStatus = async () => {
632+
try {
633+
const deployment = await this.apps.readNamespacedDeployment({
634+
name: deploymentName,
635+
namespace: this.namespace,
636+
});
637+
638+
const readyReplicas = deployment.status?.readyReplicas || 0;
639+
const desiredReplicas = deployment.spec?.replicas || 1;
640+
641+
if (readyReplicas >= desiredReplicas) {
642+
resolve();
643+
return;
644+
}
645+
646+
if (Date.now() - startTime >= maxWaitTime) {
647+
reject(
648+
new Error(
649+
`[${serverId}] timeout waiting for pod to be ready after ${maxWaitTime}ms`,
650+
),
651+
);
652+
return;
653+
}
654+
655+
setTimeout(checkPodStatus, 5000);
656+
} catch (error) {
657+
this.logger.warn(
658+
`[${serverId}] error checking pod status: ${error.message}`,
659+
);
660+
661+
if (Date.now() - startTime >= maxWaitTime) {
662+
reject(
663+
new Error(
664+
`[${serverId}] timeout waiting for pod to be ready after ${maxWaitTime}ms`,
665+
),
666+
);
667+
return;
668+
}
669+
670+
setTimeout(checkPodStatus, 5000);
671+
}
672+
};
673+
674+
checkPodStatus();
675+
});
676+
}
609677
}

0 commit comments

Comments
 (0)