Skip to content

Commit

Permalink
Merge pull request #404 from WalletConnect/#396-Auth-Respond-Subscriber
Browse files Browse the repository at this point in the history
#396 auth respond subscriber
  • Loading branch information
llbartekll committed Aug 5, 2022
2 parents 73aab27 + 06875f3 commit 37ef8d1
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 3 deletions.
39 changes: 39 additions & 0 deletions Sources/Auth/Services/App/AuthRespondSubscriber.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import Combine
import Foundation
import WalletConnectUtils
import JSONRPC

class AuthRespondSubscriber {
private let networkingInteractor: NetworkInteracting
private let logger: ConsoleLogging
private let rpcHistory: RPCHistory
private var publishers = [AnyCancellable]()
var onResponse: ((_ id: RPCID, _ cacao: Cacao) -> Void)?

init(networkingInteractor: NetworkInteracting,
logger: ConsoleLogging,
rpcHistory: RPCHistory) {
self.networkingInteractor = networkingInteractor
self.logger = logger
self.rpcHistory = rpcHistory
subscribeForResponse()
}

private func subscribeForResponse() {
networkingInteractor.responsePublisher.sink { [unowned self] subscriptionPayload in
guard let request = rpcHistory.get(recordId: subscriptionPayload.request.id!)?.request,
request.method == "wc_authRequest" else { return }
networkingInteractor.unsubscribe(topic: subscriptionPayload.topic)
guard let cacao = try? subscriptionPayload.request.result?.get(Cacao.self) else {
logger.debug("Malformed auth response params")
return
}
do {
try CacaoSignatureVerifier().verifySignature(cacao)
onResponse?(subscriptionPayload.request.id!, cacao)
} catch {
logger.debug("Received response with invalid signature")
}
}.store(in: &publishers)
}
}
15 changes: 15 additions & 0 deletions Sources/Auth/Services/Common/CacaoSignatureVerifier.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Foundation

protocol CacaoSignatureVerifying {
func verifySignature(_ cacao: Cacao) throws
}

class CacaoSignatureVerifier: CacaoSignatureVerifying {
enum Errors: Error {
case signatureInvalid
}

func verifySignature(_ cacao: Cacao) throws {
fatalError("not implemented")
}
}
10 changes: 10 additions & 0 deletions Sources/Auth/Services/Common/NetworkingInteractor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import JSONRPC

protocol NetworkInteracting {
var requestPublisher: AnyPublisher<RequestSubscriptionPayload, Never> {get}
var responsePublisher: AnyPublisher<ResponseSubscriptionPayload, Never> {get}
func subscribe(topic: String) async throws
func unsubscribe(topic: String)
func request(_ request: RPCRequest, topic: String, tag: Int, envelopeType: Envelope.EnvelopeType) async throws
func respond(topic: String, response: RPCResponse, tag: Int, envelopeType: Envelope.EnvelopeType) async throws
}
Expand All @@ -26,6 +28,10 @@ class NetworkingInteractor: NetworkInteracting {
requestPublisherSubject.eraseToAnyPublisher()
}
private let requestPublisherSubject = PassthroughSubject<RequestSubscriptionPayload, Never>()
var responsePublisher: AnyPublisher<ResponseSubscriptionPayload, Never> {
responsePublisherSubject.eraseToAnyPublisher()
}
private let responsePublisherSubject = PassthroughSubject<ResponseSubscriptionPayload, Never>()

init(relayClient: RelayClient,
serializer: Serializing,
Expand All @@ -39,6 +45,10 @@ class NetworkingInteractor: NetworkInteracting {
try await relayClient.subscribe(topic: topic)
}

func unsubscribe(topic: String) {
fatalError("not implemented")
}

func request(_ request: RPCRequest, topic: String, tag: Int, envelopeType: Envelope.EnvelopeType) async throws {
try rpcHistory.set(request, forTopic: topic, emmitedBy: .local)
let message = try! serializer.serialize(topic: topic, encodable: request, envelopeType: envelopeType)
Expand Down
2 changes: 1 addition & 1 deletion Sources/Auth/Types/Cacao/Cacao.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

struct Cacao: Codable, Equatable {
public struct Cacao: Codable, Equatable {
let header: CacaoHeader
let payload: CacaoPayload
let signature: CacaoSignature
Expand Down
4 changes: 2 additions & 2 deletions Sources/Auth/Types/RequestSubscriptionPayload.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Foundation
import JSONRPC

struct RequestSubscriptionPayload: Codable {
let id: Int64
struct RequestSubscriptionPayload: Codable, Equatable {
let topic: String
let request: RPCRequest
}
7 changes: 7 additions & 0 deletions Sources/Auth/Types/ResponseSubscriptionPayload.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Foundation
import JSONRPC

struct ResponseSubscriptionPayload: Codable, Equatable {
let topic: String
let request: RPCResponse
}
9 changes: 9 additions & 0 deletions Tests/AuthTests/Mocks/NetworkingInteractorMock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ import WalletConnectKMS

struct NetworkingInteractorMock: NetworkInteracting {

var responsePublisher: AnyPublisher<ResponseSubscriptionPayload, Never> {
responsePublisherSubject.eraseToAnyPublisher()
}
private let responsePublisherSubject = PassthroughSubject<ResponseSubscriptionPayload, Never>()

let requestPublisherSubject = PassthroughSubject<RequestSubscriptionPayload, Never>()
var requestPublisher: AnyPublisher<RequestSubscriptionPayload, Never> {
requestPublisherSubject.eraseToAnyPublisher()
Expand All @@ -15,6 +20,10 @@ struct NetworkingInteractorMock: NetworkInteracting {

}

func unsubscribe(topic: String) {

}

func request(_ request: RPCRequest, topic: String, tag: Int, envelopeType: Envelope.EnvelopeType) async throws {

}
Expand Down

0 comments on commit 37ef8d1

Please sign in to comment.