Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Web/Messages/GetStatus/GetStatusRequest.swift
Original file line number Diff line number Diff line change
@@ -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
}

Expand Down
6 changes: 3 additions & 3 deletions Sources/Web/Messages/GetStatus/GetStatusResponse.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Sources/Web/Messages/Handshake/HandshakeComplete.swift
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion Sources/Web/Messages/Handshake/HandshakeRequest.swift
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion Sources/Web/Messages/Handshake/HandshakeResponse.swift
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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?
Expand Down
6 changes: 3 additions & 3 deletions Sources/Web/Messages/Onboarding/StartOnboardingRequest.swift
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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?
Expand Down
4 changes: 2 additions & 2 deletions Sources/Web/Messages/SharedTypes.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
6 changes: 3 additions & 3 deletions Sources/Web/Messages/Sign/NonCustodialSignRequest.swift
Original file line number Diff line number Diff line change
@@ -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
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/Web/Messages/Sign/NonCustodialSignResponse.swift
Original file line number Diff line number Diff line change
@@ -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?
Expand Down
6 changes: 4 additions & 2 deletions Sources/Web/WebViewCommunicationProxy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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)")
Expand Down
2 changes: 1 addition & 1 deletion Sources/Web/WebViewMessage.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
public protocol WebViewMessage: Sendable, Codable {
public protocol WebViewMessage: Equatable, Sendable, Codable {
static var messageType: String { get }
}
7 changes: 4 additions & 3 deletions Sources/Web/WebViewMessageHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class WebViewMessageHandler {

private var messageListeners: [UUID: CheckedContinuation<any WebViewMessage, Error>] = [:]
private var messagePredicates: [UUID: @Sendable (any WebViewMessage) -> Bool] = [:]
private var pendingMessages: [Data] = []
private var pendingMessages: [any WebViewMessage] = []
private var isReady = false

// Message buffer configuration
Expand Down Expand Up @@ -121,15 +121,16 @@ public class WebViewMessageHandler {
}
}

public func queueMessage(_ messageData: Data) -> Bool {
public func queueMessage<Message: WebViewMessage>(_ 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
Expand Down
10 changes: 5 additions & 5 deletions Tests/WebTests/WebViewMessageHandlerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -207,23 +207,23 @@ 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)

#expect(queued == true)

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")
func testDontQueueMessagesWhenReady() throws {
let handler = WebViewMessageHandler()
handler.setReady(true)

let messageData = Data("test message".utf8)
let messageData = GetStatusRequest(jwt: "jwt", apiKey: "apikey")

let queued = handler.queueMessage(messageData)

Expand All @@ -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)
Expand Down Expand Up @@ -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 {
Expand Down
Loading