Files
praca_inzynierska/Peered/NoteEditor/NoteEditingSessionServer.swift
T
oschly 87753865e2 Add showing visible members that aren't us
based on very flaky display name checking for now
2025-10-06 23:23:26 +02:00

76 lines
1.7 KiB
Swift

import MultipeerConnectivity
import Foundation
struct OwnPeer {
let peer: MCPeerID
static var fallback: Self { Self(peer: .init(displayName: "fallback_user")) }
}
struct Peer: Identifiable {
enum ConnectionState {
case available
case joined
case rejected
case invitationPending
}
var id: String {
mcPeer.displayName
}
let mcPeer: MCPeerID
var state: ConnectionState
}
@Observable
final class NoteEditingSessionServer: NSObject {
private let session: MCSession
private let browser: MCNearbyServiceBrowser
private let ownPeer: OwnPeer
var visiblePeers: [Peer] = []
init(peer: OwnPeer) {
ownPeer = peer
browser = .init(peer: peer.peer, serviceType: "peered")
session = .init(peer: peer.peer)
super.init()
browser.delegate = self
}
func startServer() {
browser.startBrowsingForPeers()
}
func stopServer() {
browser.stopBrowsingForPeers()
}
func invite(peer: Peer) {
guard peer.state == .available else { return }
browser.invitePeer(
peer.mcPeer,
to: session,
withContext: nil, // FIXME: put note here?
timeout: 5
)
}
}
extension NoteEditingSessionServer: MCNearbyServiceBrowserDelegate {
func browser(
_ browser: MCNearbyServiceBrowser,
foundPeer peerID: MCPeerID,
withDiscoveryInfo info: [String : String]?
) {
guard !visiblePeers.contains(where: { $0.mcPeer == peerID }) && peerID.displayName != ownPeer.peer.displayName else { return }
let newPeer = Peer(mcPeer: peerID, state: .available)
visiblePeers.append(newPeer)
}
func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
guard let peerIdx = visiblePeers.firstIndex(where: { $0.mcPeer == peerID }) else { return }
visiblePeers.remove(at: peerIdx)
}
}