fix: 배포 중 화면 유지와 자동 재연결 적용
정상 DEPLOY 중에는 기존 정적 프론트엔드를 유지하고 새 artifact 준비 후 전환합니다. 게임 화면은 일시적인 gateway 오류를 별도 상태로 표시하고 읽기 전용 probe로 제한적으로 복구합니다.
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
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');
|
||||
});
|
||||
Reference in New Issue
Block a user