정상 DEPLOY 중에는 기존 정적 프론트엔드를 유지하고 새 artifact 준비 후 전환합니다. 게임 화면은 일시적인 gateway 오류를 별도 상태로 표시하고 읽기 전용 probe로 제한적으로 복구합니다.
51 lines
2.1 KiB
TypeScript
51 lines
2.1 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import {
|
|
canConfirmGameServerRecovery,
|
|
createGameServerConnectionTracker,
|
|
isGameServerRecoveryRequest,
|
|
isRetryableGameServerStatus,
|
|
retryDelayForFailure,
|
|
} from '../src/utils/gameServerConnection.ts';
|
|
|
|
void test('classifies only transient deployment gateway responses as reconnectable', () => {
|
|
assert.equal(isRetryableGameServerStatus(502), true);
|
|
assert.equal(isRetryableGameServerStatus(503), true);
|
|
assert.equal(isRetryableGameServerStatus(504), true);
|
|
assert.equal(isRetryableGameServerStatus(401), false);
|
|
assert.equal(isRetryableGameServerStatus(403), false);
|
|
assert.equal(isRetryableGameServerStatus(500), false);
|
|
});
|
|
|
|
void test('does not treat a server error from the recovery probe as restored service', () => {
|
|
assert.equal(canConfirmGameServerRecovery(200), true);
|
|
assert.equal(canConfirmGameServerRecovery(401), true);
|
|
assert.equal(canConfirmGameServerRecovery(403), true);
|
|
assert.equal(canConfirmGameServerRecovery(500), false);
|
|
assert.equal(canConfirmGameServerRecovery(503), false);
|
|
});
|
|
|
|
void test('uses bounded reconnect delays', () => {
|
|
assert.equal(retryDelayForFailure(1), 500);
|
|
assert.equal(retryDelayForFailure(2), 1_000);
|
|
assert.equal(retryDelayForFailure(3), 2_000);
|
|
assert.equal(retryDelayForFailure(4), 4_000);
|
|
assert.equal(retryDelayForFailure(20), 4_000);
|
|
});
|
|
|
|
void test('recognizes only the read-only lobby probe as connection recovery evidence', () => {
|
|
assert.equal(isGameServerRecoveryRequest('/che/api/trpc/lobby.info'), true);
|
|
assert.equal(isGameServerRecoveryRequest('/che/api/trpc/auth.status,lobby.info?batch=1'), true);
|
|
assert.equal(isGameServerRecoveryRequest('/che/api/trpc/join.getConfig'), false);
|
|
});
|
|
|
|
void test('retains reconnecting state until the server responds again', () => {
|
|
const tracker = createGameServerConnectionTracker();
|
|
tracker.markFailure();
|
|
tracker.markFailure();
|
|
assert.equal(tracker.status.value, 'reconnecting');
|
|
tracker.markConnected();
|
|
assert.equal(tracker.status.value, 'connected');
|
|
});
|