fix(B05): [3D 업데이트]가 만든 코리도를 바로 올리고 보관함에도 담음

보조 창 지적 — [3D 업데이트]를 눌러도 브라우저가 만들기만 하고 PUT 이 없었음.
저장 시점이 B05->B06 이동뿐이라(2026-08-23 확정), 누른 뒤 새로고침하면 저장본이 낡은
채라 다음 사람이 또 만들어야 했음.

- 버튼 경로 끝에서 saveCorridorIfDirty 를 부름.
- saveCorridorIfDirty 가 PUT 성공 뒤 그 봉투를 브라우저 보관함에도 담음(옛 열쇠 자리는
  치움). 그러지 않으면 다음 진입이 새 열쇠 주소로 16.9MB 를 한 번 더 받았음.

typecheck 통과. 실측 확인은 보조 창이 자기 프로젝트에서(저장본이 최신인 자리) 진행.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-07 01:09:58 +09:00
co-authored by Claude Opus 5
parent 908c75d535
commit 710169fd00
2 changed files with 14 additions and 2 deletions
+10 -2
View File
@@ -224,8 +224,16 @@ function markDirty(projectId: string, routeId: number): void {
export async function saveCorridorIfDirty(projectId: string, routeId: number): Promise<void> {
const entry = cache.get(keyOf(projectId, routeId));
if (!entry || !entry.dirty) return;
const ok = await putStored(projectId, routeId, serialize(entry.build, entry.hash));
if (ok) entry.dirty = false;
const envelope = serialize(entry.build, entry.hash);
const ok = await putStored(projectId, routeId, envelope);
if (!ok) return;
entry.dirty = false;
// 방금 올린 것을 **보관함에도** 담는다(2026-09-06) — 그러지 않으면 다음 진입이 열쇠가
// 바뀐 주소로 한 번 더 받아 온다. 담아 두면 네트워크 없이 선다.
const url = `${corridorUrlPrefix(projectId, routeId)}?hash=${encodeURIComponent(entry.hash)}`;
const bytes = new TextEncoder().encode(JSON.stringify(envelope)).buffer as ArrayBuffer;
await purgeAssetsWithPrefix(projectId, corridorUrlPrefix(projectId, routeId));
await writeCachedBytes(projectId, url, bytes);
}
/** Page 훅 — 현재 종횡단 정본 그대로 코리도를 확보해 뷰어에 반영(실패 시 제거).
+4
View File
@@ -322,6 +322,10 @@ export async function renderB05Route(root: HTMLElement): Promise<void> {
);
// 측점 바·라벨·램프도 계획고를 따라 움직여야 한다(2026-08-23 지적 ③).
renderStationLines(currentSectionDetail);
// 만든 것을 **바로 올려 둔다**(2026-09-06) — 예전에는 B05→B06 이동 때만 올려서,
// 누른 뒤 새로고침하면 저장본이 낡은 채라 다음 사람이 또 만들어야 했다.
// 브라우저 보관함이 생긴 지금은 올려 두면 다음 진입이 네트워크 없이 선다.
void saveCorridorIfDirty(activeProjectId, latest.route.id);
},
onMovePoint: viewer.beginMoveSelected,
onDeletePoint: viewer.markers.deleteSelected,