Nakama'da duruma atadığın nesne kopyalanır
EraClash’in online maçları Nakama üzerinde, TypeScript modülleriyle çalışıyor. Bir noktada komutlar ve checksum’lar sessizce kayboluyordu. Hata vermiyordu, sadece sonuç yanlıştı.
Sebep
Nakama’nın JavaScript çalışma ortamı, maç durumunu döngü çağrıları arasında Go değerlerine çeviriyor. Bu yüzden duruma atadığın nesne ya da dizi kopyalanır. Atadıktan sonra elindeki referansı değiştirirsen, durumdaki kopya bundan haberdar olmaz.
Aşağıdaki örnek, hatanın şeklini gösteriyor (gerçek koddan değil, anlatmak için yazıldı):
// Yanlış: atadıktan sonra aynı referansı değiştirmek
state.turns[n] = commands;
commands.push(cmd); // durumdaki kopya bunu görmez
// Doğru: önce kur, sonra ata
const next = [...commands, cmd];
state.turns[n] = next;
Çözüm
Kural basit: önce değeri tamamen kur, sonra ata. Atadıktan sonra aynı nesneye dokunma. Bu kuralı kodda en çok işe yarayacağı yere, kilit adımlı mantığın bulunduğu dosyanın başına not olarak yazdım. Komut zamanlama ve checksum kaydı bu kurala göre yeniden düzenlendi.
Neden bu kadar sinsiydi
- Hata fırlatmıyordu. Komut kaybolunca simülasyon sadece o komutsuz ilerliyordu.
- Mantık, Nakama’ya bağlı olmayan ayrı bir dosyada ve birim testlerde bu davranış görünmüyordu, çünkü kopyalama yalnızca Nakama’nın çalışma ortamında oluyor.
- Checksum karşılaştırması desync’i yakalamak için var; checksum’lar da kaybolunca o güvenlik ağı da çalışmadı.
Aklımda kalan
Bir ortamın “değeri sessizce kopyalaması” gibi davranışlar belgede küçük bir paragraf olabilir ama hata aramayı günlerce uzatabilir. Çalışma ortamının veri modelini baştan okumak, hata ayıklamaktan ucuz.