diff --git a/Sources/Web/Messages/GetStatus/GetStatusRequest.swift b/Sources/Web/Messages/GetStatus/GetStatusRequest.swift index 77099da..bcb2900 100644 --- a/Sources/Web/Messages/GetStatus/GetStatusRequest.swift +++ b/Sources/Web/Messages/GetStatus/GetStatusRequest.swift @@ -1,12 +1,12 @@ public struct GetStatusRequest: WebViewMessage { public static let messageType = "request:get-status" - public struct AuthData: Codable, Sendable { + public struct AuthData: Codable, Equatable, Sendable { public let jwt: String public let apiKey: String } - public struct RequestData: Codable, Sendable { + public struct RequestData: Codable, Equatable, Sendable { public let authData: AuthData } diff --git a/Sources/Web/Messages/GetStatus/GetStatusResponse.swift b/Sources/Web/Messages/GetStatus/GetStatusResponse.swift index 5a9cac0..796b3a0 100644 --- a/Sources/Web/Messages/GetStatus/GetStatusResponse.swift +++ b/Sources/Web/Messages/GetStatus/GetStatusResponse.swift @@ -3,17 +3,17 @@ import Utils public struct GetStatusResponse: WebViewMessage { public static let messageType = "response:get-status" - public enum ResponseData: Codable, Sendable { + public enum ResponseData: Codable, Equatable, Sendable { case basic(BasicResponseData) case withPublicKeys(PublicKeysResponseData) - public struct BasicResponseData: Codable, Sendable { + public struct BasicResponseData: Codable, Equatable, Sendable { let status: ResponseStatus let signerStatus: SignerStatus? let error: String? } - public struct PublicKeysResponseData: Codable, Sendable { + public struct PublicKeysResponseData: Codable, Equatable, Sendable { let status: ResponseStatus let signerStatus: SignerStatus let publicKeys: PublicKeys diff --git a/Sources/Web/Messages/Handshake/HandshakeComplete.swift b/Sources/Web/Messages/Handshake/HandshakeComplete.swift index d3c5d86..2275996 100644 --- a/Sources/Web/Messages/Handshake/HandshakeComplete.swift +++ b/Sources/Web/Messages/Handshake/HandshakeComplete.swift @@ -1,7 +1,7 @@ public struct HandshakeComplete: WebViewMessage { public static let messageType = "handshakeComplete" - public struct Data: Codable, Sendable { + public struct Data: Codable, Equatable, Sendable { public let requestVerificationId: String } public let event: String diff --git a/Sources/Web/Messages/Handshake/HandshakeRequest.swift b/Sources/Web/Messages/Handshake/HandshakeRequest.swift index 8320ab9..1e61817 100644 --- a/Sources/Web/Messages/Handshake/HandshakeRequest.swift +++ b/Sources/Web/Messages/Handshake/HandshakeRequest.swift @@ -1,7 +1,7 @@ public struct HandshakeRequest: WebViewMessage { public static let messageType = "handshakeRequest" - struct Data: Codable, Sendable { + struct Data: Codable, Equatable, Sendable { let requestVerificationId: String } let event: String diff --git a/Sources/Web/Messages/Handshake/HandshakeResponse.swift b/Sources/Web/Messages/Handshake/HandshakeResponse.swift index 0dae10a..b52262f 100644 --- a/Sources/Web/Messages/Handshake/HandshakeResponse.swift +++ b/Sources/Web/Messages/Handshake/HandshakeResponse.swift @@ -1,7 +1,7 @@ public struct HandshakeResponse: WebViewMessage { public static let messageType = "handshakeResponse" - public struct Data: Codable, Sendable { + public struct Data: Codable, Equatable, Sendable { public let requestVerificationId: String } public let event: String diff --git a/Sources/Web/Messages/Onboarding/CompleteOnboardingRequest.swift b/Sources/Web/Messages/Onboarding/CompleteOnboardingRequest.swift index 8cd5063..b757e30 100644 --- a/Sources/Web/Messages/Onboarding/CompleteOnboardingRequest.swift +++ b/Sources/Web/Messages/Onboarding/CompleteOnboardingRequest.swift @@ -1,14 +1,14 @@ public struct CompleteOnboardingRequest: WebViewMessage { public static let messageType = "request:complete-onboarding" - public struct AuthData: Codable, Sendable { + public struct AuthData: Codable, Equatable, Sendable { public let jwt: String public let apiKey: String } - public struct RequestData: Codable, Sendable { - public struct Data: Codable, Sendable { - public struct OnboardingAuthenticationData: Codable, Sendable { + public struct RequestData: Codable, Equatable, Sendable { + public struct Data: Codable, Equatable, Sendable { + public struct OnboardingAuthenticationData: Codable, Equatable, Sendable { public let encryptedOtp: String } diff --git a/Sources/Web/Messages/Onboarding/CompleteOnboardingResponse.swift b/Sources/Web/Messages/Onboarding/CompleteOnboardingResponse.swift index 5ec2804..35acef1 100644 --- a/Sources/Web/Messages/Onboarding/CompleteOnboardingResponse.swift +++ b/Sources/Web/Messages/Onboarding/CompleteOnboardingResponse.swift @@ -1,7 +1,7 @@ public struct CompleteOnboardingResponse: WebViewMessage { public static let messageType = "response:complete-onboarding" - public struct ResponseData: Codable, Sendable { + public struct ResponseData: Codable, Equatable, Sendable { let status: ResponseStatus let signerStatus: SignerStatus? let publicKeys: PublicKeys? diff --git a/Sources/Web/Messages/Onboarding/StartOnboardingRequest.swift b/Sources/Web/Messages/Onboarding/StartOnboardingRequest.swift index a297c91..96c1166 100644 --- a/Sources/Web/Messages/Onboarding/StartOnboardingRequest.swift +++ b/Sources/Web/Messages/Onboarding/StartOnboardingRequest.swift @@ -1,13 +1,13 @@ public struct StartOnboardingRequest: WebViewMessage { public static let messageType = "request:start-onboarding" - public struct AuthData: Codable, Sendable { + public struct AuthData: Codable, Equatable, Sendable { public let jwt: String public let apiKey: String } - public struct RequestData: Codable, Sendable { - public struct Data: Codable, Sendable { + public struct RequestData: Codable, Equatable, Sendable { + public struct Data: Codable, Equatable, Sendable { public let authId: String } public let authData: AuthData diff --git a/Sources/Web/Messages/Onboarding/StartOnboardingResponse.swift b/Sources/Web/Messages/Onboarding/StartOnboardingResponse.swift index c5ff5db..f18bbdd 100644 --- a/Sources/Web/Messages/Onboarding/StartOnboardingResponse.swift +++ b/Sources/Web/Messages/Onboarding/StartOnboardingResponse.swift @@ -1,7 +1,7 @@ public struct StartOnboardingResponse: WebViewMessage { public static let messageType = "response:start-onboarding" - public struct ResponseData: Codable, Sendable { + public struct ResponseData: Codable, Equatable, Sendable { let status: ResponseStatus let signerStatus: SignerStatus? let error: String? diff --git a/Sources/Web/Messages/SharedTypes.swift b/Sources/Web/Messages/SharedTypes.swift index 17ab7d4..72d088e 100644 --- a/Sources/Web/Messages/SharedTypes.swift +++ b/Sources/Web/Messages/SharedTypes.swift @@ -3,13 +3,13 @@ public enum ResponseStatus: String, Codable, Sendable { case error } -public struct PublicKey: Codable, Sendable { +public struct PublicKey: Codable, Equatable, Sendable { public let bytes: String public let encoding: String public let keyType: String } -public struct PublicKeys: Codable, Sendable { +public struct PublicKeys: Codable, Equatable, Sendable { public let ed25519: PublicKey public let secp256k1: PublicKey } diff --git a/Sources/Web/Messages/Sign/NonCustodialSignRequest.swift b/Sources/Web/Messages/Sign/NonCustodialSignRequest.swift index 419e754..98640d8 100644 --- a/Sources/Web/Messages/Sign/NonCustodialSignRequest.swift +++ b/Sources/Web/Messages/Sign/NonCustodialSignRequest.swift @@ -1,18 +1,18 @@ public struct NonCustodialSignRequest: WebViewMessage { public static let messageType = "request:sign" - public struct AuthData: Codable, Sendable { + public struct AuthData: Codable, Equatable, Sendable { public let jwt: String public let apiKey: String } - public struct SignData: Codable, Sendable { + public struct SignData: Codable, Equatable, Sendable { public let keyType: String public let bytes: String public let encoding: String } - public struct RequestData: Codable, Sendable { + public struct RequestData: Codable, Equatable, Sendable { public let authData: AuthData public let data: SignData } diff --git a/Sources/Web/Messages/Sign/NonCustodialSignResponse.swift b/Sources/Web/Messages/Sign/NonCustodialSignResponse.swift index ebd5713..956be49 100644 --- a/Sources/Web/Messages/Sign/NonCustodialSignResponse.swift +++ b/Sources/Web/Messages/Sign/NonCustodialSignResponse.swift @@ -1,7 +1,7 @@ public struct NonCustodialSignResponse: WebViewMessage { public static let messageType = "response:sign" - public struct ResponseData: Codable, Sendable { + public struct ResponseData: Codable, Equatable, Sendable { public let status: ResponseStatus public let signature: PublicKey? public let publicKey: PublicKey? diff --git a/Sources/Web/WebViewCommunicationProxy.swift b/Sources/Web/WebViewCommunicationProxy.swift index 5608e82..856334f 100644 --- a/Sources/Web/WebViewCommunicationProxy.swift +++ b/Sources/Web/WebViewCommunicationProxy.swift @@ -109,7 +109,7 @@ public class DefaultWebViewCommunicationProxy: NSObject, ObservableObject, WKScr } // If page is not loaded yet, queue the message - if messageHandler.queueMessage(messageData) { + if messageHandler.queueMessage(message) { Logger.web.info("Frame not yet loaded, enqueuing message") return nil } @@ -162,8 +162,10 @@ public class DefaultWebViewCommunicationProxy: NSObject, ObservableObject, WKScr Task { @MainActor in let messages = messageHandler.getPendingMessages() - for messageData in messages { + for message in messages { + Logger.web.debug("Processing queued message \(type(of: message).messageType)") do { + let messageData = try JSONEncoder().encode(message) _ = try await executeJavaScript(messageData, in: webView) } catch { Logger.web.error("Error processing pending message: \(error)") diff --git a/Sources/Web/WebViewMessage.swift b/Sources/Web/WebViewMessage.swift index 798a437..d5e8464 100644 --- a/Sources/Web/WebViewMessage.swift +++ b/Sources/Web/WebViewMessage.swift @@ -1,3 +1,3 @@ -public protocol WebViewMessage: Sendable, Codable { +public protocol WebViewMessage: Equatable, Sendable, Codable { static var messageType: String { get } } diff --git a/Sources/Web/WebViewMessageHandler.swift b/Sources/Web/WebViewMessageHandler.swift index 093715c..6074122 100644 --- a/Sources/Web/WebViewMessageHandler.swift +++ b/Sources/Web/WebViewMessageHandler.swift @@ -10,7 +10,7 @@ public class WebViewMessageHandler { private var messageListeners: [UUID: CheckedContinuation] = [:] private var messagePredicates: [UUID: @Sendable (any WebViewMessage) -> Bool] = [:] - private var pendingMessages: [Data] = [] + private var pendingMessages: [any WebViewMessage] = [] private var isReady = false // Message buffer configuration @@ -121,15 +121,16 @@ public class WebViewMessageHandler { } } - public func queueMessage(_ messageData: Data) -> Bool { + public func queueMessage(_ messageData: Message) -> Bool { if !isReady { + Logger.web.debug("Enqueuing message \(Message.messageType)") pendingMessages.append(messageData) return true } return false } - public func getPendingMessages() -> [Data] { + public func getPendingMessages() -> [any WebViewMessage] { let messages = pendingMessages pendingMessages.removeAll() return messages diff --git a/Tests/WebTests/WebViewMessageHandlerTests.swift b/Tests/WebTests/WebViewMessageHandlerTests.swift index fa5562d..782fd7d 100644 --- a/Tests/WebTests/WebViewMessageHandlerTests.swift +++ b/Tests/WebTests/WebViewMessageHandlerTests.swift @@ -207,7 +207,7 @@ struct WebViewMessageHandlerTests { let handler = WebViewMessageHandler() handler.setReady(false) - let messageData = Data("test message".utf8) + let messageData = GetStatusRequest(jwt: "jwt", apiKey: "apikey") let queued = handler.queueMessage(messageData) @@ -215,7 +215,7 @@ struct WebViewMessageHandlerTests { let pendingMessages = handler.getPendingMessages() #expect(pendingMessages.count == 1) - #expect(pendingMessages.first == messageData) + #expect(pendingMessages.first as? GetStatusRequest == messageData) } @Test("Don't queue messages when ready") @@ -223,7 +223,7 @@ struct WebViewMessageHandlerTests { let handler = WebViewMessageHandler() handler.setReady(true) - let messageData = Data("test message".utf8) + let messageData = GetStatusRequest(jwt: "jwt", apiKey: "apikey") let queued = handler.queueMessage(messageData) @@ -238,7 +238,7 @@ struct WebViewMessageHandlerTests { let handler = WebViewMessageHandler() handler.setReady(false) - let messageData = Data("test message".utf8) + let messageData = GetStatusRequest(jwt: "jwt", apiKey: "apikey") _ = handler.queueMessage(messageData) handler.setReady(false) @@ -341,7 +341,7 @@ struct WebViewMessageHandlerTests { handler.setReady(true) handler.setReady(false) - let messageData = Data("test message".utf8) + let messageData = GetStatusRequest(jwt: "jwt", apiKey: "apikey") _ = handler.queueMessage(messageData) let expectation = Task {