Skip to content

Commit afd835b

Browse files
committed
feat(realtime): add Sendable conformance and remove Delegated
1 parent 0c15316 commit afd835b

File tree

7 files changed

+155
-518
lines changed

7 files changed

+155
-518
lines changed

Sources/Realtime/Delegated.swift

Lines changed: 0 additions & 102 deletions
This file was deleted.

Sources/Realtime/Message.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import Foundation
2222

2323
/// Data that is received from the Server.
24-
public struct Message {
24+
public struct Message: Sendable {
2525
/// Reference number. Empty if missing
2626
public let ref: String
2727

Sources/Realtime/Presence.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,11 @@ public final class Presence {
227227
let diffEvent = opts.events[.diff]
228228
else { return }
229229

230-
self.channel?.delegateOn(stateEvent, filter: ChannelFilter(), to: self) { (self, message) in
231-
guard let newState = message.rawPayload as? State else { return }
230+
self.channel?.on(stateEvent, filter: ChannelFilter()) { [weak self] message in
231+
guard
232+
let self,
233+
let newState = message.rawPayload as? State
234+
else { return }
232235

233236
self.joinRef = self.channel?.joinRef
234237
self.state = Presence.syncState(
@@ -251,8 +254,12 @@ public final class Presence {
251254
self.caller.onSync()
252255
}
253256

254-
self.channel?.delegateOn(diffEvent, filter: ChannelFilter(), to: self) { (self, message) in
255-
guard let diff = message.rawPayload as? Diff else { return }
257+
self.channel?.on(diffEvent, filter: ChannelFilter()) { [weak self] message in
258+
guard
259+
let self,
260+
let diff = message.rawPayload as? Diff
261+
else { return }
262+
256263
if self.isPendingSyncState {
257264
self.pendingDiffs.append(diff)
258265
} else {

Sources/Realtime/Push.swift

Lines changed: 13 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import Foundation
2222

23-
/// Represnts pushing data to a `Channel` through the `Socket`
23+
/// Represents pushing data to a `Channel` through the `Socket`
2424
public class Push {
2525
/// The channel sending the Push
2626
public weak var channel: RealtimeChannel?
@@ -44,7 +44,7 @@ public class Push {
4444
var timeoutWorkItem: DispatchWorkItem?
4545

4646
/// Hooks into a Push. Where .receive("ok", callback(Payload)) are stored
47-
var receiveHooks: [PushStatus: [Delegated<Message, Void>]]
47+
var receiveHooks: [PushStatus: [@Sendable (Message) -> Void]]
4848

4949
/// True if the Push has been sent
5050
var sent: Bool
@@ -121,61 +121,25 @@ public class Push {
121121
@discardableResult
122122
public func receive(
123123
_ status: PushStatus,
124-
callback: @escaping ((Message) -> Void)
124+
callback: @escaping @Sendable (Message) -> Void
125125
) -> Push {
126-
var delegated = Delegated<Message, Void>()
127-
delegated.manuallyDelegate(with: callback)
128-
129-
return receive(status, delegated: delegated)
130-
}
131-
132-
/// Receive a specific event when sending an Outbound message. Automatically
133-
/// prevents retain cycles. See `manualReceive(status:, callback:)` if you
134-
/// want to handle this yourself.
135-
///
136-
/// Example:
137-
///
138-
/// channel
139-
/// .send(event:"custom", payload: ["body": "example"])
140-
/// .delegateReceive("error", to: self) { payload in
141-
/// print("Error: ", payload)
142-
/// }
143-
///
144-
/// - parameter status: Status to receive
145-
/// - parameter owner: The class that is calling .receive. Usually `self`
146-
/// - parameter callback: Callback to fire when the status is recevied
147-
@discardableResult
148-
public func delegateReceive<Target: AnyObject>(
149-
_ status: PushStatus,
150-
to owner: Target,
151-
callback: @escaping ((Target, Message) -> Void)
152-
) -> Push {
153-
var delegated = Delegated<Message, Void>()
154-
delegated.delegate(to: owner, with: callback)
155-
156-
return receive(status, delegated: delegated)
157-
}
158-
159-
/// Shared behavior between `receive` calls
160-
@discardableResult
161-
func receive(_ status: PushStatus, delegated: Delegated<Message, Void>) -> Push {
162126
// If the message has already been received, pass it to the callback immediately
163127
if hasReceived(status: status), let receivedMessage {
164-
delegated.call(receivedMessage)
128+
callback(receivedMessage)
165129
}
166130

167131
if receiveHooks[status] == nil {
168132
/// Create a new array of hooks if no previous hook is associated with status
169-
receiveHooks[status] = [delegated]
133+
receiveHooks[status] = [callback]
170134
} else {
171135
/// A previous hook for this status already exists. Just append the new hook
172-
receiveHooks[status]?.append(delegated)
136+
receiveHooks[status]?.append(callback)
173137
}
174138

175139
return self
176140
}
177141

178-
/// Resets the Push as it was after it was first tnitialized.
142+
/// Resets the Push as it was after it was first initialised.
179143
func reset() {
180144
cancelRefEvent()
181145
ref = nil
@@ -189,7 +153,7 @@ public class Push {
189153
/// - parameter status: Status which was received, e.g. "ok", "error", "timeout"
190154
/// - parameter response: Response that was received
191155
private func matchReceive(_ status: PushStatus, message: Message) {
192-
receiveHooks[status]?.forEach { $0.call(message) }
156+
receiveHooks[status]?.forEach { $0(message) }
193157
}
194158

195159
/// Reverses the result on channel.on(ChannelEvent, callback) that spawned the Push
@@ -225,14 +189,14 @@ public class Push {
225189

226190
/// If a response is received before the Timer triggers, cancel timer
227191
/// and match the received event to it's corresponding hook
228-
channel.delegateOn(refEvent, filter: ChannelFilter(), to: self) { (self, message) in
229-
self.cancelRefEvent()
230-
self.cancelTimeout()
231-
self.receivedMessage = message
192+
channel.on(refEvent, filter: ChannelFilter()) { [weak self] message in
193+
self?.cancelRefEvent()
194+
self?.cancelTimeout()
195+
self?.receivedMessage = message
232196

233197
/// Check if there is event a status available
234198
guard let status = message.status else { return }
235-
self.matchReceive(status, message: message)
199+
self?.matchReceive(status, message: message)
236200
}
237201

238202
/// Setup and start the Timeout timer.

0 commit comments

Comments
 (0)