Skip to content

Commit 83d9888

Browse files
committed
Exposed sender information
1 parent a135dbd commit 83d9888

7 files changed

Lines changed: 38 additions & 20 deletions

File tree

Sources/MultipeerKit/Internal API/MockMultipeerConnection.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import Foundation
2+
import MultipeerConnectivity.MCPeerID
23

34
final class MockMultipeerConnection: MultipeerProtocol {
45

5-
var didReceiveData: ((Data, PeerName) -> Void)?
6+
let localPeer: Peer = {
7+
let underlyingPeer = MCPeerID(displayName: "MockPeer")
8+
return try! Peer(peer: underlyingPeer, discoveryInfo: nil)
9+
}()
10+
11+
var didReceiveData: ((Data, Peer) -> Void)?
612
var didFindPeer: ((Peer) -> Void)?
713
var didLosePeer: ((Peer) -> Void)?
814
var didConnectToPeer: ((Peer) -> Void)?
@@ -19,7 +25,7 @@ final class MockMultipeerConnection: MultipeerProtocol {
1925
}
2026

2127
func broadcast(_ data: Data) throws {
22-
didReceiveData?(data, "MockPeer")
28+
didReceiveData?(data, localPeer)
2329
}
2430

2531
func send(_ data: Data, to peers: [Peer]) throws {
@@ -31,7 +37,7 @@ final class MockMultipeerConnection: MultipeerProtocol {
3137
}
3238

3339
func getLocalPeerId() -> String? {
34-
return "MockId"
40+
return localPeer.id
3541
}
3642

3743
}

Sources/MultipeerKit/Internal API/Models/MultipeerMessage.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import Foundation
2828

2929
struct MultipeerMessage: Codable {
30+
static let senderUserInfoKey = CodingUserInfoKey(rawValue: "sender")!
31+
3032
let type: String
3133
let payload: Any?
3234

@@ -40,17 +42,17 @@ struct MultipeerMessage: Codable {
4042
case payload
4143
}
4244

43-
private typealias MessageDecoder = (KeyedDecodingContainer<CodingKeys>) throws -> Any
45+
private typealias MessageDecoder = (KeyedDecodingContainer<CodingKeys>, Peer) throws -> Any
4446
private typealias MessageEncoder = (Any, inout KeyedEncodingContainer<CodingKeys>) throws -> Void
4547

4648
private static var decoders: [String: MessageDecoder] = [:]
4749
private static var encoders: [String: MessageEncoder] = [:]
4850

49-
static func register<T: Codable>(_ type: T.Type, for typeName: String, closure: @escaping (T) -> Void) {
50-
decoders[typeName] = { container in
51+
static func register<T: Codable>(_ type: T.Type, for typeName: String, closure: @escaping (T, Peer) -> Void) {
52+
decoders[typeName] = { container, peer in
5153
let payload = try container.decode(T.self, forKey: .payload)
5254

53-
DispatchQueue.main.async { closure(payload) }
55+
DispatchQueue.main.async { closure(payload, peer) }
5456

5557
return payload
5658
}
@@ -67,9 +69,11 @@ struct MultipeerMessage: Codable {
6769
init(from decoder: Decoder) throws {
6870
let container = try decoder.container(keyedBy: CodingKeys.self)
6971
type = try container.decode(String.self, forKey: .type)
72+
73+
let sender = decoder.userInfo[MultipeerMessage.senderUserInfoKey]! as! Peer
7074

7175
if let decode = Self.decoders[type] {
72-
payload = try decode(container)
76+
payload = try decode(container, sender)
7377
} else {
7478
payload = nil
7579
}

Sources/MultipeerKit/Internal API/MultipeerConnection.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ final class MultipeerConnection: NSObject, MultipeerProtocol {
2727
self.me = MCPeerID.fetchOrCreate(with: configuration)
2828
}
2929

30-
var didReceiveData: ((Data, PeerName) -> Void)?
30+
var didReceiveData: ((Data, Peer) -> Void)?
3131
var didFindPeer: ((Peer) -> Void)?
3232
var didLosePeer: ((Peer) -> Void)?
3333
var didConnectToPeer: ((Peer) -> Void)?
@@ -145,7 +145,11 @@ extension MultipeerConnection: MCSessionDelegate {
145145
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
146146
os_log("%{public}@", log: log, type: .debug, #function)
147147

148-
didReceiveData?(data, peerID.displayName)
148+
if let peer = try? Peer(peer: peerID, discoveryInfo: nil) {
149+
didReceiveData?(data, peer)
150+
} else {
151+
os_log("Received data, but cannot create peer for %s", log: log, type: .error, #function, peerID.displayName)
152+
}
149153
}
150154

151155
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {

Sources/MultipeerKit/Internal API/MultipeerProtocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ typealias PeerName = String
44

55
protocol MultipeerProtocol: AnyObject {
66

7-
var didReceiveData: ((Data, PeerName) -> Void)? { get set }
7+
var didReceiveData: ((Data, Peer) -> Void)? { get set }
88
var didFindPeer: ((Peer) -> Void)? { get set }
99
var didLosePeer: ((Peer) -> Void)? { get set }
1010
var didConnectToPeer: ((Peer) -> Void)? { get set }

Sources/MultipeerKit/Public API/MultipeerTransceiver.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,13 @@ public final class MultipeerTransceiver {
7474
/// - type: The `Codable` type to receive.
7575
/// - closure: The closure that will be called whenever a payload of the specified type is received.
7676
/// - payload: The payload decoded from the remote message.
77+
/// - sender: The remote peer who sent the message.
7778
///
7879
/// MultipeerKit communicates data between peers as JSON-encoded payloads which originate with
7980
/// `Codable` entities. You register a closure to handle each specific type of entity,
8081
/// and this closure is automatically called by the framework when a remote peer sends
8182
/// a message containing an entity that decodes to the specified type.
82-
public func receive<T: Codable>(_ type: T.Type, using closure: @escaping (_ payload: T) -> Void) {
83+
public func receive<T: Codable>(_ type: T.Type, using closure: @escaping (_ payload: T, _ sender: Peer) -> Void) {
8384
MultipeerMessage.register(type, for: String(describing: type), closure: closure)
8485
}
8586

@@ -127,11 +128,13 @@ public final class MultipeerTransceiver {
127128
}
128129
}
129130

130-
private func handleDataReceived(_ data: Data, from peer: PeerName) {
131+
private func handleDataReceived(_ data: Data, from peer: Peer) {
131132
os_log("%{public}@", log: log, type: .debug, #function)
132133

133134
do {
134-
let message = try JSONDecoder().decode(MultipeerMessage.self, from: data)
135+
let decoder = JSONDecoder()
136+
decoder.userInfo[MultipeerMessage.senderUserInfoKey] = peer
137+
let message = try decoder.decode(MultipeerMessage.self, from: data)
135138

136139
os_log("Received message %@", log: self.log, type: .debug, String(describing: message))
137140
} catch {

Tests/MultipeerKitTests/MultipeerKitTests.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ final class MultipeerKitTests: XCTestCase {
3636

3737
let expect = XCTestExpectation(description: "Receive payload")
3838

39-
mock.receive(TestPayload.self) { p in
40-
XCTAssertEqual(p, tsPayload)
39+
mock.receive(TestPayload.self) { payload, sender in
40+
XCTAssertEqual(payload, tsPayload)
41+
XCTAssertEqual(sender.id, mock.localPeerId!)
4142

4243
expect.fulfill()
4344
}

example/MultipeerKitExample/MultipeerKitExample/SceneDelegate.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
2424

2525
let t = MultipeerTransceiver(configuration: config)
2626

27-
t.receive(ExamplePayload.self) { [weak self] payload in
27+
t.receive(ExamplePayload.self) { [weak self] payload, peer in
2828
print("Got payload: \(payload)")
2929

30-
self?.notify(with: payload)
30+
self?.notify(with: payload, peer: peer)
3131
}
3232

3333
return t
@@ -37,9 +37,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
3737
MultipeerDataSource(transceiver: transceiver)
3838
}()
3939

40-
private func notify(with payload: ExamplePayload) {
40+
private func notify(with payload: ExamplePayload, peer: Peer) {
4141
let content = UNMutableNotificationContent()
42-
content.body = payload.message
42+
content.body = "\"\(payload.message)\" from \(peer.name)"
4343
let request = UNNotificationRequest(identifier: payload.message, content: content, trigger: nil)
4444
UNUserNotificationCenter.current().add(request) { _ in
4545

0 commit comments

Comments
 (0)