data transportation section

This commit is contained in:
2026-05-17 21:41:02 +02:00
parent 02d7ba2d52
commit 7ff6fd077f
2 changed files with 48 additions and 2 deletions
+46
View File
@@ -235,9 +235,55 @@ func advertiser(
== Transportowanie danych
W wysyłanym zaproszeniu wysyłamy w metadanych migawkę notatki zawierającą jej tytuł oraz ostatnio dostępną treść. Migawka jest kodowana w formacie JSON bazując na strukturze `NoteContent`. Przykładowym poprawnym zapisem JSON tej struktury jest poniższy przykład
```json
{
"title": "My new note",
"noteSnapshot": "Lorem Ipsum."
}
```
Po stronie klienta, każda zmiana jest ogłaszana serwerowi poprzez wywołanie metody `send()` obiektu `NoteEditingSessionClient`, która przyjmuje identyfikator użytkownika do które ma wiadomość trafić oraz całą zawartość notatki. Jej implementacja zamienia notatkę wraz z identyfikatorem w typ `NoteMessage`, następnie koduje do formatu JSON, finalnie próbuje wysłać do określonego użytkownika.
```swift
func send(note: String, to peer: MCPeerID) {
let message = NoteMessage(senderID: ownPeer.displayName, content: note)
guard let data = try? JSONEncoder().encode(message) else { return }
try? session.send(data, toPeers: [peer], with: .reliable)
}
```
Przykładowy zapis instancji obiektu `NoteMessage` wygląda następująco:
```json
{
"senderID": "User2",
"content": "Lorem Ipsum Test"
}
```
Po tym jak serwer odbierze wysłaną wiadomość, wywoływana jest metoda `session`, która w argumentach przekazuje zakodowane dane, sesję serwera oraz identyfikator użytkownika, który wysłał załączone dane. Po udanym zdekodowaniu danych, wybieramy wszystkich użytkowników, którzy dołączyli do sesji edycji notatki i wysyłamy do nich kopię otrzymanej wiadomości, a serwer dodatkowo wysyła identyczną kopię do warstwy prezentacji.
```swift
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
guard let message = try? JSONDecoder().decode(NoteMessage.self, from: data) else { return }
let otherPeers = session.connectedPeers.filter { $0 != peerID }
if !otherPeers.isEmpty {
try? session.send(data, toPeers: otherPeers, with: .reliable)
}
DispatchQueue.main.async {
self.noteChangesEmitter.send(message)
}
}
```
== Algorytm rozwiązywania konfliktów
== Środowisko developerskie i stack technologiczny
== Implementacja logiki P2P
== Interfejs użytkownika
BIN
View File
Binary file not shown.