installer: re-install client when navigation changes install payload

기존 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 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 22:11:44 +09:00
parent 49f320fa71
commit 5ea9b49630

View File

@@ -654,8 +654,20 @@ function renderSubStep42(host, back, done) {
host.querySelector('#back').addEventListener('click', back) host.querySelector('#back').addEventListener('click', back)
nextBtn.addEventListener('click', done) nextBtn.addEventListener('click', done)
// 이미 설치됐다면 다시 돌리지 않음 // 이번에 실제로 보내야 할 payload. 이전 진입에서 같은 payload 로 이미 끝났으면
if (state.client.clientInstalled) { // 다시 돌리지 않지만, 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.textContent = tt('step4.sub42.done')
msg.classList.add('success') msg.classList.add('success')
nextBtn.disabled = false nextBtn.disabled = false
@@ -665,17 +677,14 @@ function renderSubStep42(host, back, done) {
// 페이지 진입 즉시 자동 설치 // 페이지 진입 즉시 자동 설치
;(async function () { ;(async function () {
try { try {
await installerApi.installClient({ await installerApi.installClient(payload)
packKey: state.selectedPackKey,
installPlatform: !!state.client.installPlatform,
// 참가자는 친구 서버에 접속만 하므로 클라이언트에 맵을 풀지 않는다.
skipMap: state.mode === 'multi' && state.role === 'participant'
})
msg.textContent = tt('step4.sub42.done') msg.textContent = tt('step4.sub42.done')
msg.classList.add('success') msg.classList.add('success')
state.client.clientInstalled = true state.client.lastInstall = payload
nextBtn.disabled = false nextBtn.disabled = false
} catch (err) { } catch (err) {
// 실패한 호출은 "마지막 성공" 기록에 남기지 않는다. 다음 진입 시 재시도.
state.client.lastInstall = null
msg.textContent = tt('step4.sub42.failed', { message: (err && err.message) ? err.message : String(err) }) msg.textContent = tt('step4.sub42.failed', { message: (err && err.message) ? err.message : String(err) })
msg.classList.add('error') msg.classList.add('error')
} }