[data-sync] Pasif/Aktif sync + Datastore + Collection #45

Closed
opened 2026-06-16 23:54:16 +03:00 by saqut · 1 comment
Owner

Client'lar arası paylaşımlı veri katmanı. Üç parça:

1) Pasif Sync (hızlı eşitleme): client'lar bir tablo/diziyi kendi aralarında yüksek hızla eşitler; ekleme/okuma için API sağlanır. Tüm client'lardan alınan veriler ortak bir havuzda toplanır ve hepsi tamamen eşit olana kadar veri iletişimi sürer.

2) Aktif Sync / Collection (CRUD broadcast): client'lar ortak bir tablo/dizide CRUD yapar; her işlem diğer client'lara bildirilir. Tüm client'lar verinin bir kopyasını tutar ve tamamen güncel olmadan işlem yapamaz. Tutarlılık için eşzamanlı değişiklikler sunucuya ulaşma zamanına göre önceliklendirilir.

3) Datastore (taslak): geçici/kalıcı veritabanı:

let store = wsjs.datastore({
  type: 'temp',     // temp (default) | permanent
  id: 'f129...',    // herkesçe ulaşılabilir link
  expires: 10,      // silinmeye açık olacağı süre
  primary: 'id'     // primary key
});

Bitti kriteri: iki client ortak veride CRUD yapıp tutarlı kalıyor; çakışan yazımlar arrival-time'a göre çözülüyor; temp/permanent datastore çalışıyor; testler yeşil.

Client'lar arası **paylaşımlı veri katmanı.** Üç parça: **1) Pasif Sync (hızlı eşitleme):** client'lar bir tablo/diziyi kendi aralarında yüksek hızla eşitler; ekleme/okuma için API sağlanır. Tüm client'lardan alınan veriler ortak bir havuzda toplanır ve hepsi tamamen eşit olana kadar veri iletişimi sürer. **2) Aktif Sync / Collection (CRUD broadcast):** client'lar ortak bir tablo/dizide CRUD yapar; her işlem diğer client'lara bildirilir. Tüm client'lar verinin bir kopyasını tutar ve **tamamen güncel olmadan işlem yapamaz.** Tutarlılık için eşzamanlı değişiklikler **sunucuya ulaşma zamanına göre** önceliklendirilir. **3) Datastore (taslak):** geçici/kalıcı veritabanı: ```js let store = wsjs.datastore({ type: 'temp', // temp (default) | permanent id: 'f129...', // herkesçe ulaşılabilir link expires: 10, // silinmeye açık olacağı süre primary: 'id' // primary key }); ``` **Bitti kriteri:** iki client ortak veride CRUD yapıp tutarlı kalıyor; çakışan yazımlar arrival-time'a göre çözülüyor; temp/permanent datastore çalışıyor; testler yeşil.
saqut added this to the 3.0.0 milestone 2026-06-16 23:54:16 +03:00
saqut added the
data-sync
label 2026-06-16 23:54:16 +03:00
Author
Owner

Tamamlandı (go-rewrite, commit 441093b). internal/datastore (saf, ws-bağımsız) + internal/services/datastore.go.

1) Aktif Sync / Collection (CRUD broadcast): data/open/data/set/data/delete/data/get. Sunucu otoriter kopyayı tutar; her mutasyon datastore kilidi altında monoton seq ile damgalanır → çakışan yazımlar arrival-time'a göre çözülür (kilidi en son alan kazanır), seq her broadcast'te taşınır, tüm client'lar yakınsar. Değişiklik diğer abonelere data/op sinyaliyle yayılır.

2) Pasif Sync (merge pool): sync/open/sync/push/sync/pull. Öğeler kanonik JSON hash'iyle dedupe edilir; push yalnızca yeni delta'yı sync/add ile yayar → ortak havuzda toplanır, hepsi eşit olana kadar sürer.

3) Datastore (temp/permanent): data/open {kind, primary, expires, id?} — id boşsa public id üretilir; temp TTL ile expire, permanent kalıcı. (Alan adı bilinçli kind; type WSTS handler seçicisi olduğu için.)

Leak yok: temp store/pool TTL + janitor; disconnect'te UnsubscribeAll. SDK I/O sözleşmesi korundu (tümü additive yeni type'lar).

Test: TestActiveSyncBroadcast/DeleteBroadcast, TestPassiveSyncConvergence, TestConcurrentSetsResolveByArrival, TestDataSubscriptionClearedOnDisconnect + datastore birim testleri. go test -race yeşil.

Tamamlandı (go-rewrite, commit 441093b). `internal/datastore` (saf, ws-bağımsız) + `internal/services/datastore.go`. **1) Aktif Sync / Collection (CRUD broadcast):** `data/open`/`data/set`/`data/delete`/`data/get`. Sunucu otoriter kopyayı tutar; her mutasyon datastore kilidi altında **monoton seq** ile damgalanır → **çakışan yazımlar arrival-time'a göre** çözülür (kilidi en son alan kazanır), seq her broadcast'te taşınır, tüm client'lar yakınsar. Değişiklik diğer abonelere `data/op` sinyaliyle yayılır. **2) Pasif Sync (merge pool):** `sync/open`/`sync/push`/`sync/pull`. Öğeler kanonik JSON hash'iyle dedupe edilir; push yalnızca yeni delta'yı `sync/add` ile yayar → ortak havuzda toplanır, hepsi eşit olana kadar sürer. **3) Datastore (temp/permanent):** `data/open {kind, primary, expires, id?}` — id boşsa public id üretilir; temp TTL ile expire, permanent kalıcı. (Alan adı bilinçli `kind`; `type` WSTS handler seçicisi olduğu için.) **Leak yok:** temp store/pool TTL + janitor; disconnect'te `UnsubscribeAll`. **SDK I/O sözleşmesi** korundu (tümü additive yeni type'lar). **Test:** `TestActiveSyncBroadcast/DeleteBroadcast`, `TestPassiveSyncConvergence`, `TestConcurrentSetsResolveByArrival`, `TestDataSubscriptionClearedOnDisconnect` + datastore birim testleri. `go test -race` yeşil.
saqut closed this issue 2026-06-17 08:30:49 +03:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: saqut/MWSE#45
No description provided.