From 060eb86c59c8736692740f0cef21d4800d4ae3ee Mon Sep 17 00:00:00 2001 From: Julian Date: Sat, 12 Jul 2025 14:56:51 +0200 Subject: [PATCH] sync working --- src/main/scala/fahrtenbuch/Main.scala | 3 +++ src/main/scala/fahrtenbuch/Networking.scala | 18 ++++++++++++++++++ src/main/scala/fahrtenbuch/Sync.scala | 13 +++++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/main/scala/fahrtenbuch/Main.scala b/src/main/scala/fahrtenbuch/Main.scala index 5c2aead..de13ebc 100644 --- a/src/main/scala/fahrtenbuch/Main.scala +++ b/src/main/scala/fahrtenbuch/Main.scala @@ -42,6 +42,9 @@ object Main { // update db when edit events happen entryEditBus.stream.addObserver(entryDbObserver)(using unsafeWindowOwner) + // sync out changes + entryEditBus.stream.addObserver(Sync.entrySyncOut)(using unsafeWindowOwner) + val allEntries: Signal[Set[Entry]] = allEntriesVar.signal diff --git a/src/main/scala/fahrtenbuch/Networking.scala b/src/main/scala/fahrtenbuch/Networking.scala index 250299c..ced9054 100644 --- a/src/main/scala/fahrtenbuch/Networking.scala +++ b/src/main/scala/fahrtenbuch/Networking.scala @@ -13,10 +13,13 @@ import typings.trystero.mod.joinRoom import typings.trystero.mod.selfId import scala.scalajs.js +import scala.scalajs.js.JSConverters.* import typings.trystero.mod.ActionProgress import typings.trystero.mod.ActionSender import typings.trystero.mod.ActionReceiver import model.Entry +import org.getshaka.nativeconverter.NativeConverter +import fahrtenbuch.Trystero.updatePeers object Trystero: private val eturn = new RTCIceServer: @@ -48,6 +51,7 @@ object Trystero: // track online peers val peerList: Var[List[(String, RTCPeerConnection)]] = Var(List.empty) def updatePeers(): Unit = + println(s"List of peers: ${room.getPeers().toList}") peerList.set(room.getPeers().toList) println(s"my peer ID is $selfId") room.onPeerJoin(peerId => @@ -69,3 +73,17 @@ object Actions: def sendEntry(entry: Entry): Unit = entryAction._1(entry.toNative) + + def sendEntry(entry: Entry, targetPeers: List[String]): Unit = + if targetPeers.isEmpty then sendEntry(entry) + else + entryAction._1(data = entry.toNative, targetPeers = targetPeers.toJSArray) + + def receiveEntry(callback: Entry => Unit): Unit = + entryAction._2((data: js.Any, peerId: String, metaData) => + val incoming = NativeConverter[Entry].fromNative(data) + callback(incoming) + ) + + // update peers when receiving entries + receiveEntry(_ => updatePeers()) diff --git a/src/main/scala/fahrtenbuch/Sync.scala b/src/main/scala/fahrtenbuch/Sync.scala index 29f233b..109f265 100644 --- a/src/main/scala/fahrtenbuch/Sync.scala +++ b/src/main/scala/fahrtenbuch/Sync.scala @@ -1,7 +1,20 @@ package fahrtenbuch import com.raquo.laminar.api.L.* import fahrtenbuch.model.Entry +import fahrtenbuch.DexieDB.upsertEntry +import fahrtenbuch.Main.allEntriesVar object Sync: val entrySyncOut = Observer[Entry](onNext = Actions.sendEntry(_)) + + val entrySyncIn = + Actions.receiveEntry(received => upsertEntry(received)) + + // sync all entries on initial connection + Trystero.room.onPeerJoin(peerId => + Trystero.updatePeers() + allEntriesVar + .now() + .foreach(entry => Actions.sendEntry(entry, List(peerId))) + )