From 5ea9b496302adb900f5f6ddee102f77a9b251271 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Sat, 16 May 2026 22:11:44 +0900 Subject: [PATCH] installer: re-install client when navigation changes install payload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 state.client.clientInstalled boolean 은 packKey/installPlatform/skipMap 차이를 보지 않아, 참가자→싱글 로 뒤로가서 변경했을 때 skipMap=false 경로의 맵 설치가 영영 안 일어났다 (반대로 싱글→참가자 면 안 풀어도 될 맵이 남음). state.client.lastInstall 에 마지막 성공 payload 전체를 저장하고, 진입 시 새 payload 와 필드별 비교해서 다르면 재설치한다. 실패는 lastInstall 을 비워 다음 진입에서 자동 재시도. 리뷰어 지적사항(installer/renderer.js:657) 대응. Co-Authored-By: Claude Opus 4.7 --- installer/renderer.js | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/installer/renderer.js b/installer/renderer.js index a7b712b..460e27e 100644 --- a/installer/renderer.js +++ b/installer/renderer.js @@ -654,8 +654,20 @@ function renderSubStep42(host, back, done) { host.querySelector('#back').addEventListener('click', back) nextBtn.addEventListener('click', done) - // 이미 설치됐다면 다시 돌리지 않음 - if (state.client.clientInstalled) { + // 이번에 실제로 보내야 할 payload. 이전 진입에서 같은 payload 로 이미 끝났으면 + // 다시 돌리지 않지만, packKey / installPlatform / skipMap 중 하나라도 다르면 + // (예: 참가자 → 싱글 로 뒤로가서 변경) 재설치한다. + var payload = { + packKey: state.selectedPackKey, + installPlatform: !!state.client.installPlatform, + // 참가자는 친구 서버에 접속만 하므로 클라이언트에 맵을 풀지 않는다. + skipMap: state.mode === 'multi' && state.role === 'participant' + } + var last = state.client.lastInstall + if (last + && last.packKey === payload.packKey + && last.installPlatform === payload.installPlatform + && last.skipMap === payload.skipMap) { msg.textContent = tt('step4.sub42.done') msg.classList.add('success') nextBtn.disabled = false @@ -665,17 +677,14 @@ function renderSubStep42(host, back, done) { // 페이지 진입 즉시 자동 설치 ;(async function () { try { - await installerApi.installClient({ - packKey: state.selectedPackKey, - installPlatform: !!state.client.installPlatform, - // 참가자는 친구 서버에 접속만 하므로 클라이언트에 맵을 풀지 않는다. - skipMap: state.mode === 'multi' && state.role === 'participant' - }) + await installerApi.installClient(payload) msg.textContent = tt('step4.sub42.done') msg.classList.add('success') - state.client.clientInstalled = true + state.client.lastInstall = payload nextBtn.disabled = false } catch (err) { + // 실패한 호출은 "마지막 성공" 기록에 남기지 않는다. 다음 진입 시 재시도. + state.client.lastInstall = null msg.textContent = tt('step4.sub42.failed', { message: (err && err.message) ? err.message : String(err) }) msg.classList.add('error') }