Skip to content

Commit b56f770

Browse files
Merge pull request #264 from ably/post-MainActor-fixes
A few fixes post-`@MainActor`
2 parents 2d75985 + 5aa8081 commit b56f770

File tree

3 files changed

+31
-48
lines changed

3 files changed

+31
-48
lines changed

Sources/AblyChat/AblyCocoaExtensions/InternalAblyCocoaTypes.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Ably
77
/// - `async` methods instead of callbacks
88
/// - typed throws
99
/// - `JSONValue` instead of `Any`
10-
/// - `Sendable` types where helpful
1110
/// - `AsyncSequence` where helpful
1211
///
1312
/// Note that the API of this protocol is not currently consistent; for example there are some places in the codebase where we subscribe to Realtime channel state using callbacks, and other places where we subscribe using `AsyncSequence`. We should aim to make this consistent; see https://github.com/ably/ably-chat-swift/issues/245.
@@ -236,10 +235,6 @@ internal final class InternalRealtimeClientAdapter: InternalRealtimeClientProtoc
236235
underlying.unsubscribe(listener)
237236
}
238237

239-
internal func publish(_ name: String?, data: JSONValue?, extras: [String: JSONValue]?) {
240-
underlying.publish(name, data: data?.toAblyCocoaData, extras: extras?.toARTJsonCompatible)
241-
}
242-
243238
internal func subscribe(_ name: String, callback: @escaping @MainActor (ARTMessage) -> Void) -> ARTEventListener? {
244239
underlying.subscribe(name, callback: callback)
245240
}
@@ -403,7 +398,7 @@ internal final class InternalRealtimeClientAdapter: InternalRealtimeClientProtoc
403398
}
404399
}
405400

406-
/// A `Sendable` version of `ARTPresenceMessage`. Only contains the properties that the Chat SDK is currently using; add as needed.
401+
/// A version of `ARTPresenceMessage` that uses strongly-typed `data` and `extras` properties. Only contains the properties that the Chat SDK is currently using; add as needed.
407402
internal struct PresenceMessage {
408403
internal var clientId: String?
409404
internal var timestamp: Date?

Tests/AblyChatTests/DefaultMessagesTests.swift

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,22 @@ struct DefaultMessagesTests {
9191
channelSerial: "001"
9292
),
9393
initialState: .attached,
94-
messageToEmitOnSubscribe: .init(
95-
action: .create, // arbitrary
96-
serial: "", // arbitrary
97-
clientID: "", // arbitrary
98-
data: [
94+
messageToEmitOnSubscribe: {
95+
let message = ARTMessage()
96+
message.action = .create // arbitrary
97+
message.serial = "" // arbitrary
98+
message.clientId = "" // arbitrary
99+
message.data = [
99100
"text": "", // arbitrary
100-
],
101-
extras: [
101+
]
102+
message.extras = [
102103
"headers": ["numberKey": 10, "stringKey": "hello"],
103-
],
104-
operation: nil,
105-
version: ""
106-
)
104+
] as ARTJsonCompatible
105+
message.operation = nil
106+
message.version = ""
107+
108+
return message
109+
}()
107110
)
108111
let featureChannel = MockFeatureChannel(channel: channel)
109112
let defaultMessages = DefaultMessages(featureChannel: featureChannel, chatAPI: chatAPI, roomID: "basketball", clientID: "clientId", logger: TestLogger())
@@ -128,18 +131,21 @@ struct DefaultMessagesTests {
128131
channelSerial: "001"
129132
),
130133
initialState: .attached,
131-
messageToEmitOnSubscribe: .init(
132-
action: .create, // arbitrary
133-
serial: "", // arbitrary
134-
clientID: "", // arbitrary
135-
data: [
134+
messageToEmitOnSubscribe: {
135+
let message = ARTMessage()
136+
message.action = .create // arbitrary
137+
message.serial = "" // arbitrary
138+
message.clientId = "" // arbitrary
139+
message.data = [
136140
"text": "", // arbitrary
137141
"metadata": ["numberKey": 10, "stringKey": "hello"],
138-
],
139-
extras: [:],
140-
operation: nil,
141-
version: ""
142-
)
142+
]
143+
message.extras = [:] as ARTJsonCompatible
144+
message.operation = nil
145+
message.version = ""
146+
147+
return message
148+
}()
143149
)
144150
let featureChannel = MockFeatureChannel(channel: channel)
145151
let defaultMessages = DefaultMessages(featureChannel: featureChannel, chatAPI: chatAPI, roomID: "basketball", clientID: "clientId", logger: TestLogger())

Tests/AblyChatTests/Mocks/MockRealtimeChannel.swift

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,14 @@ final class MockRealtimeChannel: InternalRealtimeChannelProtocol {
1717
var lastMessagePublishedData: JSONValue?
1818
var lastMessagePublishedExtras: [String: JSONValue]?
1919

20-
// TODO: If we tighten up the types we then we should be able to get rid of the `@unchecked Sendable` here, but I’m in a rush. Revisit in https://github.com/ably/ably-chat-swift/issues/195
21-
struct MessageToEmit: @unchecked Sendable {
22-
var action: ARTMessageAction
23-
var serial: String
24-
var clientID: String
25-
var data: Any
26-
var extras: NSDictionary
27-
var operation: ARTMessageOperation?
28-
var version: String
29-
}
30-
3120
init(
3221
name: String? = nil,
3322
properties: ARTChannelProperties = .init(),
3423
initialState: ARTRealtimeChannelState? = nil,
3524
initialErrorReason: ARTErrorInfo? = nil,
3625
attachBehavior: AttachOrDetachBehavior? = nil,
3726
detachBehavior: AttachOrDetachBehavior? = nil,
38-
messageToEmitOnSubscribe: MessageToEmit? = nil,
27+
messageToEmitOnSubscribe: ARTMessage? = nil,
3928
subscribeToStateBehavior: SubscribeToStateBehavior? = nil
4029
) {
4130
_name = name
@@ -137,18 +126,11 @@ final class MockRealtimeChannel: InternalRealtimeChannelProtocol {
137126
try result.get()
138127
}
139128

140-
let messageToEmitOnSubscribe: MessageToEmit?
129+
let messageToEmitOnSubscribe: ARTMessage?
141130

142131
func subscribe(_: String, callback: @escaping @MainActor (ARTMessage) -> Void) -> ARTEventListener? {
143132
if let messageToEmitOnSubscribe {
144-
let message = ARTMessage(name: nil, data: messageToEmitOnSubscribe.data)
145-
message.action = messageToEmitOnSubscribe.action
146-
message.serial = messageToEmitOnSubscribe.serial
147-
message.clientId = messageToEmitOnSubscribe.clientID
148-
message.extras = messageToEmitOnSubscribe.extras
149-
message.operation = messageToEmitOnSubscribe.operation
150-
message.version = messageToEmitOnSubscribe.version
151-
callback(message)
133+
callback(messageToEmitOnSubscribe)
152134
}
153135
return ARTEventListener()
154136
}

0 commit comments

Comments
 (0)