Client config'ini validate eder; ağ isteğini constructor'da başlatmaz.
ReadonlycatalogKatalog yüzeyi; her okuma çerez oturumuyla #request üzerinden gider ve 304'ü kabul eder.
ReadonlydataOyuncu verisi yüzeyi; okuma çerez oturumuyla #request, PUT/DELETE CSRF şeridi (#mutation) üzerinden gider.
ReadonlysessionCookie/session yaşam döngüsü.
ReadonlystoreMağaza yüzeyi; okuma çerez oturumuyla #request, satın alma CSRF şeridi (#mutation) üzerinden gider.
Current generation'ı internal transport fence'i için verir.
Bildirim yüzeyi (cihaz kaydı, web push, gelen kutusu); çıkış kancası logout içindedir.
Realtime façade; aynı PlayerClient için tek soket sahibi.
Parolayı değiştirir; başarıda sunucunun tüm oturumları düşürdüğünü yansıtıp signedOut döner.
Neden yazıldı: POST /v1/auth/change-password başarısında Open Play çağıranınki dahil oyuncunun tüm session
ailelerini iptal eder ve session/refresh cookie'lerini siler. SDK dışı ham çağrı, SDK state'ini ölü bir session
ile authenticated bırakır ve CSRF reddini "mevcut parola yanlış" ile karıştırır (CHG-0774).
Kullanım: Yalnız authenticated state'te çağrılır; misafir/parolasız hesapta sunucu reddeder. Başarıda logout
ile aynı geçiş uygulanır (generation +1, scopeInvalidated yayını, realtime fence'i, CSRF token temizliği, state
signedOut); uygulama oyuncuyu yeni parolayla yeniden giriş ekranına götürür. Parolalar yalnız bu isteğin gövdesine
yazılır; state, listener, journal, BroadcastChannel ya da hata içine girmez. Yanlış mevcut parola K2 kilidine
sayılır: CSRF katmanı geçilmiş 403 asla yeniden gönderilmez. Belirsiz sonuçta kör tekrar ve otomatik session probe'u
yoktur; gerçek durumu uygulamanın restore() çağrısı belirler.
input: ChangePasswordInput — mevcut ve yeni parola (her biri 1..1024, C0/DEL yok); politika (8..128) sunucudadır.options: SessionOperationOptions — her HTTP isteği için ayrı deadline ve caller iptali; lock bekleyişi ve CSRF
grant isteği caller sinyaliyle kesilmez (bekleyişte gelen iptal, lock alınınca istek gönderilmeden Cancelled olur).SessionState — her zaman { status: "signedOut" }.Her hata operation: "change_password" taşır; parola ve ham sunucu metni taşınmaz.
CrxError(Contract) — girdi taşıma sınırı dışında (istek yok).CrxError(Cancelled) — sinyal çağrıdan önce ya da lock beklenirken iptal edildi (istek yok, state değişmez).CrxError(Http, 403, reason: "current_password_rejected") — CSRF katmanı isteği kabul etti, sunucu mevcut parolayı
ya da credential hesabını reddetti; parola bir kez gönderildi, state değişmez.CrxError(Http) — 400 (yeni parola politikası), 429 ve diğer 4xx; state değişmez.CrxError(Auth) — state authenticated değil (status: null, istek yok), 401 (isteği gönderen session hâlâ
güncelse state reauthRequired) ya da iki kez CSRF reddi (403, reason: null).CrxError(ScopeChanged) — istek gönderilmeden önce oturum başka oyuncuya geçmişti.CrxError(UnknownOutcome) — POST gönderildikten sonra 5xx, yanıt kaybı/timeout/iptal ya da 204 olmayan 2xx;
deliveryState: "uncertain", state aynı oyuncu için hâlâ authenticated ise reauthRequired.CrxError(Disposed) — client kapalıysa ya da uçuşta kapatıldıysa (state disposed kalır).Google callback'ini generic provider completion sözleşmesine bağlar.
OAuth callback kodunu backend callback endpoint'ine teslim eder ve session'ı
yalnız /v1/auth/session probe'u ile doğrular.
Neden yazıldı: OAuth provider cevabındaki token/secret SDK public
state'ine taşınmadan, browser cookie session'ı ile tamamlanabilmelidir.
Kullanım: Uygulamanın callback route'u code ve state değerlerini
aldıktan sonra, akışı başlatan aynı sekmede çağırır; nonce/PKCE ve replay kontrolü
backend'e aittir. Ağdan önce provider/state, startOAuth/linkOAuth/startIdentityTransfer'in
yazdığı sessionStorage kaydıyla eşleştirilir (SPEC-0196 G10): kayıt yok, 10 dakikadan eski,
bozuk ya da farklıysa veya depo erişilemezse CrxError fırlatılır, ağ isteği gönderilmez ve
oturum durumu değişmez. Eşleşen kayıt ağ isteğinden ÖNCE silinir (tek kullanım): aynı çağrının
tekrarı yerelde reddedilir. Eşleşmeyen çağrı gerçek kaydı silmez. Callback yanıtı
kaybolursa SDK aynı code'u körlemesine tekrar göndermez, en fazla bir kontrollü session probe'u yapar.
Link niyetinde sunucunun kesin ret cevabı (409 account_already_linked: kimlik başka sürücüde,
birleştirme yok; 422 provider_already_linked; 429) mevcut oturumu düşürmez: durum çağrıdan önceki
haline döner (diğer niyetlerde ret signedOut/reauthRequired olur). message SDK'da taşınmaz; ayrım HTTP durumuyladır.
input: { provider: string; code: string; state: string } — doğrulama
için backend'e iletilecek bounded OAuth callback değerleri.options: SessionOperationOptions — toplam deadline ve caller iptali.AuthenticatedSession — cookie ile doğrulanmış, token içermeyen session.CrxError(Auth, code: oauth_binding_missing) — bekleyen kayıt yok/süresi dolmuş/bozuk (ağsız).CrxError(Auth, code: oauth_binding_mismatch) — provider ya da state kayıtla uyuşmuyor (ağsız).CrxError(Storage, code: oauth_storage_unavailable) — sessionStorage erişilemez; bağ kanıtlanamaz (ağsız).CrxError(UnknownOutcome) — callback uygulanmış olabilir ancak session
probe'u kesinleşmemişse.CrxError(Auth|Http|Contract|Network|Timeout|Cancelled) — callback veya
session sözleşmesi başarısızsa.Oyuncunun kendi hesabını siler; başarıda sunucunun tüm oturumları düşürdüğünü yansıtıp signedOut döner.
Neden yazıldı: Mağaza ve gizlilik beklentisi: oyuncu hesabını oyunun içinden silebilmelidir (DESIGN §10.37).
POST /v1/auth/account/delete başarısında sunucu oyuncunun tüm oturumlarını iptal eder, kimlikleri ayırır, oyuncu
verisini siler ve çerezleri temizler; SDK state'i ölü bir oturumla authenticated kalmamalıdır.
Kullanım: Yalnız authenticated state'te çağrılır. Başarıda changePassword ile aynı geçiş uygulanır (generation +1,
scopeInvalidated, realtime fence'i, CSRF token temizliği, state signedOut); uygulama oyuncuyu giriş ekranına götürür.
Geri alınamaz: arayüz çağrıdan önce açık onay almalıdır. Bağlı kimlikli hesapta giriş 10 dakikadan eskiyse sunucu 403
recent_sign_in_required döner ve hiçbir şey silinmez; uygulama oyuncuyu yeniden giriş yaptırıp çağrıyı tekrarlar (state
değişmez). Belirsiz sonuçta kör tekrar ve otomatik probe yoktur; gerçek durumu restore() belirler.
input: DeleteAccountInput — { confirm: "delete_my_account" }; başka değer ağsız Contract hatasıdır.options: SessionOperationOptions — her HTTP isteği için deadline ve caller iptali.SessionState — her zaman { status: "signedOut" }.Her hata operation: "delete_account" taşır.
CrxError(Contract) — confirm beklenen değer değil (istek yok).CrxError(Cancelled) — sinyal çağrıdan önce ya da lock beklenirken iptal edildi (istek yok, state değişmez).CrxError(Http, 403, reason: "recent_sign_in_required") — yeniden giriş gerekli; hesap silinmedi, state değişmez.CrxError(Http) — 422, 429 ve diğer 4xx; state değişmez.CrxError(Auth) — state authenticated değil (istek yok), 401 (state reauthRequired) ya da iki kez CSRF reddi.CrxError(ScopeChanged) — istek gönderilmeden önce oturum başka oyuncuya geçmişti.CrxError(UnknownOutcome) — POST gönderildikten sonra 5xx, yanıt kaybı/timeout ya da 204 olmayan 2xx; hesap silinmiş
olabilir (deliveryState: "uncertain", state reauthRequired).CrxError(Disposed) — client kapalıysa ya da uçuşta kapatıldıysa.Client'i kapatır; local socket/journal adapter'ı dışında server logout çağırmaz.
SessionControllerPort: state'i ve listener'ları yönetir.
Auth state değişiminde realtime ve eski plugin işleri için fence noktası.
Çekirdek leaderboard okuması; catalog gibi çerez oturumuyla tek #request GET'idir.
Oturumdaki oyuncuya bir sağlayıcı kimliği bağlama akışını başlatır (POST /v1/auth/link/{provider}).
Neden yazıldı: Misafir ilerlemesini koruyarak Google'a bağlanmak için sunucu callback'i, linki
başlatan oturumla eşler; bu yüzden başlangıç mevcut oturum çerezini kullanır ve SDK oturumsuzken hiç denemez.
Kullanım: startOAuth ile aynı biçim ve aynı sessionStorage bağı; kayıt niyeti link.
Başlangıçta 422 provider_already_linked (oyuncuda bu sağlayıcı zaten bağlı) ve 429 CrxError(Http) olarak
döner; message SDK'da taşınmaz, ayrım HTTP durumuyladır. Oturum durumu değişmez.
provider: string — sağlayıcı adı.callbackUrl: string — oyun domaininde callback adresi.options: SessionOperationOptions — deadline ve iptal sinyali.OAuthStartResult — authorize URL'i ve opaque state.CrxError(Auth) — SDK durumu authenticated değil (ağ isteği gönderilmez, durum değişmez).CrxError(Storage, code: oauth_storage_unavailable) — sessionStorage erişilemez ya da yazılamıyor.CrxError(Contract|Http|Auth|Network|Timeout|Cancelled|Disposed) — startOAuth ile aynı.Oturumdaki oyuncunun bağlı sağlayıcı kimliklerini okur (GET /v1/auth/identities).
Neden yazıldı: "Hesabım" ekranı ve link kararı (zaten bağlı mı, son sağlayıcı mı) sunucunun
tek doğruluk kaynağına bakmalıdır; liste yalnız sağlayıcı adı ve bağlanma anını taşır.
Kullanım: Salt okunur; oturum durumunu değiştirmez (401 yalnız çağırana CrxError(Auth) olarak döner).
Sunucu bu yanıtı private, no-store verir; SDK de cache: no-store ile ister. Çağrı sürerken oturum
çıkış/yenileme/başka oyuncuyla değişirse sonuç eski scope'a ait sayılır ve atılır.
options: SessionOperationOptions — deadline ve iptal sinyali.PlayerIdentities — playerId ve identities (provider + linkedAt), camelCase.CrxError(Contract) — yanıt biçimi beklenenden farklı (tip, UUID, sağlayıcı adı, RFC 3339, uzunluk).CrxError(ScopeChanged) — çağrı sürerken oturum scope'u değişti.CrxError(Auth|Http|Network|Timeout|Cancelled|Disposed) — istek hataları.Binding'i doğrulanmış player/session scope'una bağlar.
Generated binding'in yalnız anonim/public query yüzeyini bağlar.
Neden yazıldı: Public şehir/katalog/paylaşım okumaları authenticated player scope'una veya legacy bearer'a ihtiyaç duymamalıdır. Bu metot session signed-out iken de çalışır; command/module/private query erişimi binding ve runtime capability katmanında reddedilir.
binding: PluginBinding<TQueries, PluginCommandMap, PluginModuleMap> —
backend artifact'ından üretilmiş plugin binding'i.PublicBoundPlugin<TQueries> — credential'sız public query façade'ı.CrxError(CapabilityUnavailable) — private query çalıştırılmaya
çalışılırsa.CrxError(Contract) — binding metadata'sı geçersizse.Parola sıfırlama bağlantısı ister (POST /v1/auth/forgot-password).
Neden yazıldı: Parolasını unutan oyuncunun oturumu yoktur; sunucu SPEC-0049'a göre hesabın varlığını sızdırmayan
sabit bir 200 verir (CHG-0774).
Kullanım: Oturum gerekmez ve oturum durumu değişmez. Yanıt gövdesizdir. 403 yalnız CSRF katmanı reddiyse bir kez
taze grant ile yeniden gönderilir. Yanıt kaybında kör tekrar yoktur (UnknownOutcome); bağlantı e-postayla gelir.
input: PasswordResetRequestInput — email (3..320, C0/DEL yok).options: SessionOperationOptions — deadline ve iptal sinyali.void — sunucu isteği kabul etti (adres kayıtlı olmasa da aynı yanıt).Her hata operation: "forgot_password" taşır.
CrxError(Contract) — girdi taşıma sınırı dışında ya da yanıt beklenmeyen gövde taşıyor.CrxError(Cancelled) — sinyal çağrıdan önce iptal edildi (istek yok).CrxError(Http) — 429 (oran sınırı) ve diğer retler; CrxError(Auth) — 403.CrxError(UnknownOutcome) — POST gönderildikten sonra yanıt kaybı.E-postadaki token ile yeni parola yazar (POST /v1/auth/reset-password).
Neden yazıldı: Parola sıfırlama akışının ikinci yarısı; token tek kullanımlıktır ve başarıda sunucu o oyuncunun
TÜM oturumlarını iptal eder (CHG-0774).
Kullanım: Oturum gerekmez. SDK oturum durumunu değiştirmez: sıfırlanan hesap bu istemcinin oturumundaki oyuncu
olabilir de olmayabilir de; gerçek durumu restore() belirler. Token ve parola yalnız gövdeye girer (URL'ye, state'e,
hataya, günlüğe girmez). Politika reddi (400) token'ı yakmaz; aynı bağlantı yeniden denenebilir. CSRF katmanı geçilmiş
403 token'ın geçersiz/kullanılmış/süresi dolmuş olduğudur (ayrım sızmaz) ve yeniden gönderilmez. Yanıt kaybında token
harcanmış olabilir: UnknownOutcome, kör tekrar yok.
input: ResetPasswordInput — token (1..512, [A-Za-z0-9_-]) ve yeni parola (1..1024, C0/DEL yok).options: SessionOperationOptions — deadline ve iptal sinyali.void — parola değişti, tüm oturumlar düştü.Her hata operation: "reset_password" taşır; token, parola ve ham sunucu metni taşınmaz.
CrxError(Contract) — girdi taşıma sınırı dışında ya da yanıt beklenmeyen gövde taşıyor (istek yok / yanıt).CrxError(Cancelled) — sinyal çağrıdan önce iptal edildi (istek yok).CrxError(Http, 403, reason: "reset_token_rejected") — CSRF katmanı isteği kabul etti, sunucu token'ı reddetti.CrxError(Http) — 400 (parola politikası), 429 ve diğer retler.CrxError(UnknownOutcome) — POST gönderildikten sonra yanıt kaybı.Email + parola ile giriş yapar ve cookie session açar (POST /v1/auth/sign-in/email).
Neden yazıldı: signUpEmail ile aynı karar (CHG-0774); kayıtlı e-posta hesabıyla dönen oyuncu için giriş kapısı.
Kullanım: signUpEmail ile aynı kurallar: yanlış parola (CSRF katmanı geçilmiş 403) ikinci kez denenmez,
başarıda misafir bootstrap sırrı silinir, account_banned banned yapar. Parolası doğru banlı hesap dışında
ret ayrımı sızmaz (düz metin 403).
input: SignInEmailInput — email (3..320) ve parola (1..1024); C0/DEL yok.options: SessionOperationOptions — deadline ve iptal sinyali.AuthenticatedSession — cookie ile doğrulanmış, token içermeyen session.Her hata operation: "sign_in_email" taşır; signUpEmail ile aynı eşleme (409 yoktur).
Email + parola ile kayıt olur ve cookie session açar (POST /v1/auth/sign-up/email).
Neden yazıldı: SPEC-0196 S3/S4 iptal edildi; e-posta/parola seçeneği kullanıcı kararıyla (2026-10-30) oyuncuya
açık kalır ve SDK sunucunun gerçekten sunduğu bu ucu tüketir (CHG-0774).
Kullanım: Parola yalnız istek gövdesine yazılır; state, listener, BroadcastChannel, journal ya da hata içine
girmez. 403 yalnız CSRF katmanı reddiyse bir kez taze grant ile yeniden gönderilir (kimlik denemesi ikinci kez
yapılmaz). Başarıda kayıtlı misafir bootstrap sırrı silinir. Yanıt kaybında kör tekrar yoktur: en çok bir session
probe'u yapılır. account_banned (403 + makine kodu) durumu banned yapar, yeniden gönderilmez ve sır silinmez.
İstek hiç gönderilmeden (CSRF grant hatası, iptal) biten çağrı durumu çağrıdan önceki haline döndürür.
input: SignUpEmailInput — email (3..320), parola (1..1024) ve görünen ad (1..256); C0/DEL yok. Politika sunucudadır.options: SessionOperationOptions — deadline ve iptal sinyali.AuthenticatedSession — cookie ile doğrulanmış, token içermeyen session.Her hata operation: "sign_up_email" taşır; parola ve ham sunucu metni taşınmaz.
CrxError(Contract) — girdi taşıma sınırı dışında (istek yok).CrxError(Auth) — 401/403 (state signedOut); code: account_banned ise state banned.CrxError(Http) — 400 (politika), 409 (adres kayıtlı), 429 ve diğer retler (state reauthRequired).CrxError(UnknownOutcome) — yanıt kaybı ve session probe'u da sonuçsuz (deliveryState: "uncertain").CrxError(ScopeChanged|Disposed) — çağrı sürerken oturum ya da client değişti.Google OAuth başlangıcını generic provider yüzeyine güvenli biçimde bağlar.
Neden yazıldı: Oyunlar provider adını serbest metin olarak tekrar etmeden aynı OAuth sözleşmesini kullanabilmelidir. Kullanım: Backend'in döndürdüğü authorize URL'i browser'a yönlendirmeden önce çağrılır; callback/session exchange bu SDK'nın dışında, backend'e aittir.
callbackUrl: string — backend callback'inin HTTPS veya loopback adresi.options: SessionOperationOptions — timeout ve iptal sinyali.OAuthStartResult — güvenli authorize URL'i ve opaque state.CrxError — client kapalı, callback sözleşmesi veya backend yanıtı geçersizse.Operatörün verdiği tek kullanımlık kodla kimlik devri akışını başlatır
(POST /v1/auth/identity-transfer/start/{provider}).
Neden yazıldı: E-postasız kurtarmada operatör oyuncuya bir devir kodu verir; oyuncu yeni
sağlayıcı kimliğini o koda bağlayarak eski sürücüsüne girer. Oturum gerekmez.
Kullanım: startOAuth ile aynı biçim ve aynı sessionStorage bağı; kayıt niyeti transfer.
Kod yalnız istek gövdesine girer: hata mesajına, CrxError alanlarına, oturum durumuna, sessionStorage
kaydına ya da günlüğe yazılmaz. Yerel doğrulama: 1..128 karakter [A-Za-z0-9_-].
Tamamlama aynı completeOAuth ile yapılır. Oturum durumu değişmez.
provider: string — sağlayıcı adı.callbackUrl: string — oyun domaininde callback adresi.code: string — operatörün verdiği tek kullanımlık devir kodu (base64url/hex); sır olarak ele alınır.options: SessionOperationOptions — deadline ve iptal sinyali.OAuthStartResult — authorize URL'i ve opaque state.CrxError(Contract) — code biçimi geçersiz (ağ isteği gönderilmez; mesajda kod yoktur) ya da diğer sözleşme ihlalleri.CrxError(Storage, code: oauth_storage_unavailable) — sessionStorage erişilemez ya da yazılamıyor.CrxError(Http|Auth|Network|Timeout|Cancelled|Disposed) — istek hataları (yanlış/tüketilmiş kod, 429).OAuth giriş akışını başlatır ve dönen state'i bu tarayıcıya bağlar (SPEC-0196 G10).
Neden yazıldı: Giriş niyetinde sunucu state'i yalnız bir kez tüketir ama başlatan tarayıcıyı
bilmez; {state, provider, intent: signin, startedAt} kaydı sessionStorage'a yazılmadan
completeOAuth bu state'i kabul etmez (saldırganın code/state çiftini kurbana tamamlatma
saldırısı, login CSRF).
Kullanım: Dönen url'e tarayıcıyı yönlendirmeden önce çağrılır; aynı sekmede completeOAuth ile
tamamlanır. Yalnız en son başlatılan akış tamamlanabilir (yeni başlatma eskisinin kaydını ezer);
kayıt 10 dakika sonra geçersizdir. sessionStorage yoksa (SSR/Node, izin reddi) ağ isteği
gönderilmez; sunucuda boşa state üretilmez ve tamamlanamayacak bir akışa girilmez. Oturum durumu değişmez.
provider: string — [a-z][a-z0-9-]{0,63} sağlayıcı adı (google).callbackUrl: string — oyun domaininde HTTPS (ya da loopback HTTP) callback adresi; sorgu/fragment yok.options: SessionOperationOptions — deadline ve iptal sinyali.OAuthStartResult — güvenli authorize URL'i ve opaque state.CrxError(Storage, code: oauth_storage_unavailable) — sessionStorage erişilemez ya da yazılamıyor.CrxError(Contract) — provider/callback ya da sunucu yanıtı sözleşmeye uymuyor.CrxError(Http|Auth|Network|Timeout|Cancelled|Disposed) — istek hataları (örn. 429 oran sınırı).Oturumdaki misafiri aynı PlayerId üzerinde email kimliğine yükseltir (POST /v1/auth/guest/upgrade/email).
Neden yazıldı: Misafir ilerlemesi korunarak kalıcı hesap açılır; sunucu tek transaction'da credential ekler,
oyuncuyu is_guest = false yapar, eski session'ları iptal eder ve replacement session verir (CHG-0774).
Kullanım: SDK durumu authenticated olmalıdır (aksi halde ağsız CrxError(Auth)). Parola yalnız gövdeye girer.
Başarıda kayıtlı bootstrap sırrı silinir. Sunucunun kesin retleri (400/409/422/429: adres kayıtlı, politika, oran)
ve hiç gönderilmeyen istek (CSRF grant hatası, iptal) oturumu düşürmez: durum çağrıdan önceki haline döner
(linkOAuth ile aynı ilke). 401/403 durumu signedOut, account_banned banned yapar (sır silinmez). Yanıt
kaybında VE 5xx'te (sunucu commit'ten sonra da 500 verebilir, geçidin 502/504'ü commit edilmiş yanıtı yutabilir)
en çok bir session probe'u yapılır: is_guest = false oturum başarıdır; hâlâ misafir oturum
UnknownOutcome ile döner (oturum canlı kalır); oturum yoksa reauthRequired (yeni giriş signInEmail iledir).
input: UpgradeGuestInput — email (3..320), parola (1..1024), görünen ad (1..256); C0/DEL yok.options: SessionOperationOptions — deadline ve iptal sinyali.AuthenticatedSession — aynı playerId, yeni sessionId, isGuest: false.Her hata operation: "upgrade_guest" taşır; parola ve ham sunucu metni taşınmaz.
CrxError(Contract) — girdi taşıma sınırı dışında (istek yok).CrxError(Auth) — SDK authenticated değil (status: null, istek yok) ya da 401/403.CrxError(Http) — 400/409/422/429 ve diğer 4xx retleri (oturum olduğu gibi kalır).CrxError(UnknownOutcome) — yanıt kaybı ya da 5xx, sonuç belirsiz (status 5xx ise görünür kalır).CrxError(ScopeChanged|Disposed) — çağrı sürerken oturum ya da client değişti.
Cookie tabanlı, scope-fenced oyuncu client'ı.