← Tüm notlar
Resonance Mobil29 Eylül 20265 dk okuma

Tek öneri motoru, iki platform

Resonance masaüstünde Tauri'de, Android'de React Native'de çalışıyor. Bir öneri motorunu, bir veritabanı şemasını ve bir bulutu paylaşıyorlar — monorepo olmadan ve iki taraf birbirinden uzaklaşmadan.

Resonance'ın Android sürümüne başladığımda cazip olan, öneri motorunu mobile uygun bir şekilde yeniden yazmaktı. Yapmadım; çünkü iki öneri motoru iki ayrı hata demek — daha kötüsü, dizüstünde bir şekilde, telefonda başka şekilde sıralanan bir çalma listesi demek.

Kopyala, ama bire bir

İki uygulama ayrı depolarda duruyor. Küçük bir betik masaüstündeki platformdan bağımsız dosyaları — öneri motoru, karma, zevk, akıllı listeler, senkron motoru; otuz kadar dosya — mobil uygulamaya hiç değiştirmeden kopyalıyor. Hash'leri karşılaştıran bir kontrol modu var; böylece sapma sürpriz olarak değil, başarısız bir kontrol olarak ortaya çıkıyor. Kural basit: kopyayı asla düzenleme; masaüstünde düzelt ve yeniden kopyala.

Bu ancak kopyalar telefonda hiç dokunulmadan çalışabilirse işe yarıyor. Masaüstünde Tauri'nin invoke'u üzerinden Rust'a sesleniyorlar. Mobilde bir paketleyici takma adı aynı import'u bir ara katmana yönlendiriyor; o da aynı komut adlarını — arama, radyo, şarkı sözü — NewPipeExtractor üzerine kurulu yerel bir Kotlin modülüyle cevaplıyor. Kopyalanan dosyalar hangi platformda olduklarını hiç bilmiyor.

Tek şema, üretilmiş

İki uygulama da aynı Supabase projesiyle senkron oluyor; bu yüzden SQLite şemalarının tam olarak eşleşmesi gerekiyor. Migration'lar tek bir yerde duruyor — masaüstünün Rust kodunda — ve bir betik onları telefon için bir TypeScript listesine çeviriyor. Elle kopyalamak bir kere hızlı, sonsuza dek yanlış olurdu.

Kaybolan satırlar

İlk gerçek senkron 54 çalma listesi üyeliğini sessizce kaybetti. Her biri bir yabancı anahtar kontrolüne takılmıştı: masaüstünde var olan ama buluta hiç gönderilmemiş bir parçayı işaret ediyordu. Satır düşüyor, liste telefonda kısa kalıyor ve hiçbir şey nedenini söylemiyordu.

Çözüm paylaşılan şemaya dokunmuyor. Telefon bir tetikleyici ekliyor: elinde olmayan bir parça için üyelik gelirse önce bir yer tutucu parça oluşturuyor — güncelleme zamanı sıfır; böylece gerçek satır buluttan geldiği anda kazanıyor. Arka planda çalışan bir iş, yer tutucuların başlık ve sanatçı bilgisini dolduruyor.

CREATE TRIGGER IF NOT EXISTS pt_parent_track
BEFORE INSERT ON playlist_tracks
FOR EACH ROW WHEN NOT EXISTS (SELECT 1 FROM tracks WHERE id = NEW.track_id)
BEGIN
  INSERT INTO tracks (id, source, source_id, title, artist,
                      duration_ms, added_at, updated_at)
  VALUES (NEW.track_id, …, '', '', 0, …, 0);   -- updated_at = 0: the real row wins
END;
Telefonun veritabanı kurulumundan: eksik ebeveyn kaybolan bir satır değil, bir yer tutucu oluyor.
Veriyi sessizce kaybeden bir senkron, yüksek sesle çöken birinden daha kötüdür.
Sonraki not
Mobil hattı harcamadan ölçmek
WhatsApp'tan yaz+90 541 365 99 01
Eren Semih YıldızYükleniyor
Ses açık · ilk dokunuşta başlar
  1. 01Yazı tipleri···
  2. 02Sahne···
  3. 03Gölgelendiriciler···
  4. 04GPU'ya yükleme···
  5. 05Ekranlar···