diff --git a/Thesis/Chapters/3. Implementation.typ b/Thesis/Chapters/3. Implementation.typ index 20961cc..fe61d99 100644 --- a/Thesis/Chapters/3. Implementation.typ +++ b/Thesis/Chapters/3. Implementation.typ @@ -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 ją do formatu JSON, finalnie próbuje ją 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 diff --git a/Thesis/main.pdf b/Thesis/main.pdf index 47dee64..62df296 100644 --- a/Thesis/main.pdf +++ b/Thesis/main.pdf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba4bf600ebca97141276160ada6e6333aed80b1264b6b4f25a78dc6e8e887d49 -size 370166 +oid sha256:1f7beba01574642d89d16bc7849255973df36f39123ae102801b0e5708e5dd4d +size 383010