Skip to content

Commit

Permalink
Merge pull request #397 from WalletConnect/#377-auth-respond-service
Browse files Browse the repository at this point in the history
[Auth] #395 Auth Request Subscriber
  • Loading branch information
llbartekll authored Aug 5, 2022
2 parents 203255e + 0451334 commit eb80d6e
Show file tree
Hide file tree
Showing 21 changed files with 185 additions and 20 deletions.
6 changes: 6 additions & 0 deletions Sources/Auth/Services/Common/NetworkingInteractor.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import Foundation
import WalletConnectRelay
import WalletConnectUtils
import Combine
import WalletConnectKMS
import JSONRPC

protocol NetworkInteracting {
var requestPublisher: AnyPublisher<RequestSubscriptionPayload, Never> {get}
func subscribe(topic: String) async throws
func request(_ request: RPCRequest, topic: String, envelopeType: Envelope.EnvelopeType) async throws
}
Expand All @@ -20,6 +22,10 @@ class NetworkingInteractor: NetworkInteracting {
private let relayClient: RelayClient
private let serializer: Serializing
private let rpcHistory: RPCHistory
var requestPublisher: AnyPublisher<RequestSubscriptionPayload, Never> {
requestPublisherSubject.eraseToAnyPublisher()
}
private let requestPublisherSubject = PassthroughSubject<RequestSubscriptionPayload, Never>()

init(relayClient: RelayClient,
serializer: Serializing,
Expand Down
11 changes: 11 additions & 0 deletions Sources/Auth/Services/Common/SIWEMessageFormatter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import Foundation

protocol SIWEMessageFormatting {
func formatMessage(from request: AuthRequestParams) throws -> String
}

struct SIWEMessageFormatter: SIWEMessageFormatting {
func formatMessage(from request: AuthRequestParams) throws -> String {
fatalError("not implemented")
}
}
38 changes: 38 additions & 0 deletions Sources/Auth/Services/Wallet/AuthRequestSubscriber.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Combine
import Foundation
import WalletConnectUtils
import JSONRPC

class AuthRequestSubscriber {
private let networkingInteractor: NetworkInteracting
private let logger: ConsoleLogging
private var publishers = [AnyCancellable]()
private let messageFormatter: SIWEMessageFormatting
var onRequest: ((_ id: RPCID, _ message: String)->())?

init(networkingInteractor: NetworkInteracting,
logger: ConsoleLogging,
messageFormatter: SIWEMessageFormatting) {
self.networkingInteractor = networkingInteractor
self.logger = logger
self.messageFormatter = messageFormatter
subscribeForRequest()
}

private func subscribeForRequest() {
networkingInteractor.requestPublisher.sink { [unowned self] subscriptionPayload in
guard subscriptionPayload.request.method == "wc_authRequest" else { return }
guard let authRequest = try? subscriptionPayload.request.params?.get(AuthRequestParams.self) else {
logger.debug("Malformed auth request params")
return
}
do {
let message = try messageFormatter.formatMessage(from: authRequest)
guard let requestId = subscriptionPayload.request.id else { return }
onRequest?(requestId, message)
} catch {
logger.debug(error)
}
}.store(in: &publishers)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

actor AuthService {
actor AuthRespondService {
private let networkingInteractor: NetworkInteracting

init(networkingInteractor: NetworkInteracting) {
Expand Down
2 changes: 1 addition & 1 deletion Sources/Auth/Types/Cacao/CacaoHeader.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation

struct CacaoHeader {
struct CacaoHeader: Codable, Equatable {
let t: String
}
2 changes: 1 addition & 1 deletion Sources/Auth/Types/Cacao/CacaoPayload.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

struct CacaoPayload {
struct CacaoPayload: Codable, Equatable {
let iss: String
let domain: String
let aud: String
Expand Down
2 changes: 1 addition & 1 deletion Sources/Auth/Types/Cacao/CacaoSignature.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

struct CacaoSignature {
struct CacaoSignature: Codable, Equatable {
let t: String
let s: String
let m: String
Expand Down
File renamed without changes.
13 changes: 13 additions & 0 deletions Sources/Auth/Types/ProtocolRPCParams/AuthResponseParams.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

import Foundation
import WalletConnectUtils

struct AuthResponseParams: Codable, Equatable {
let header: CacaoHeader
let payload: CacaoPayload
let signature: CacaoSignature

static var tag: Int {
return 3001
}
}
7 changes: 7 additions & 0 deletions Sources/Auth/Types/RequestSubscriptionPayload.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Foundation
import JSONRPC

struct RequestSubscriptionPayload: Codable {
let topic: String
let request: RPCRequest
}
4 changes: 2 additions & 2 deletions Sources/JSONRPC/RPCID.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Commons

public typealias RPCID = Either<String, Int>
public typealias RPCID = Either<String, Int64>

public protocol IdentifierGenerator {
func next() -> RPCID
Expand All @@ -9,6 +9,6 @@ public protocol IdentifierGenerator {
struct IntIdentifierGenerator: IdentifierGenerator {

func next() -> RPCID {
return RPCID(Int.random(in: Int.min...Int.max))
return RPCID(Int64.random(in: Int64.min...Int64.max))
}
}
10 changes: 7 additions & 3 deletions Sources/JSONRPC/RPCRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public struct RPCRequest: Equatable {
try self.init(method: method, checkedParams: params, id: idGenerator.next())
}

public init<C>(method: String, checkedParams params: C, id: Int) throws where C: Codable {
public init<C>(method: String, checkedParams params: C, id: Int64) throws where C: Codable {
try self.init(method: method, checkedParams: params, id: .right(id))
}

Expand All @@ -49,10 +49,14 @@ public struct RPCRequest: Equatable {
self.init(method: method, params: AnyCodable(params), id: idGenerator.next())
}

public init<C>(method: String, params: C, id: Int) where C: Codable {
public init<C>(method: String, params: C, id: Int64) where C: Codable {
self.init(method: method, params: AnyCodable(params), id: .right(id))
}

public init<C>(method: String, params: C, rpcid: RPCID) where C: Codable {
self.init(method: method, params: AnyCodable(params), id: rpcid)
}

public init<C>(method: String, params: C, id: String) where C: Codable {
self.init(method: method, params: AnyCodable(params), id: .left(id))
}
Expand All @@ -61,7 +65,7 @@ public struct RPCRequest: Equatable {
self.init(method: method, params: nil, id: idGenerator.next())
}

public init(method: String, id: Int) {
public init(method: String, id: Int64) {
self.init(method: method, params: nil, id: .right(id))
}

Expand Down
6 changes: 3 additions & 3 deletions Sources/JSONRPC/RPCResponse.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,23 @@ public struct RPCResponse: Equatable {
self.init(id: matchingRequest.id, outcome: .failure(error))
}

public init<C>(id: Int, result: C) where C: Codable {
public init<C>(id: Int64, result: C) where C: Codable {
self.init(id: RPCID(id), outcome: .success(AnyCodable(result)))
}

public init<C>(id: String, result: C) where C: Codable {
self.init(id: RPCID(id), outcome: .success(AnyCodable(result)))
}

public init(id: Int, error: JSONRPCError) {
public init(id: Int64, error: JSONRPCError) {
self.init(id: RPCID(id), outcome: .failure(error))
}

public init(id: String, error: JSONRPCError) {
self.init(id: RPCID(id), outcome: .failure(error))
}

public init(id: Int, errorCode: Int, message: String, associatedData: AnyCodable? = nil) {
public init(id: Int64, errorCode: Int, message: String, associatedData: AnyCodable? = nil) {
self.init(id: RPCID(id), outcome: .failure(JSONRPCError(code: errorCode, message: message, data: associatedData)))
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/WalletConnectRelay/RPC/WalletConnectRPCID.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ struct WalletConnectRPCID: IdentifierGenerator {
func next() -> RPCID {
let timestamp = Int64(Date().timeIntervalSince1970 * 1000) * 1000
let random = Int64.random(in: 0..<1000)
return .right(Int(timestamp + random))
return .right(Int64(timestamp + random))
}
}
6 changes: 0 additions & 6 deletions Tests/AuthTests/AuthClientTest.swift

This file was deleted.

42 changes: 42 additions & 0 deletions Tests/AuthTests/AuthRequstSubscriberTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import Foundation
import XCTest
@testable import Auth
import WalletConnectUtils
@testable import WalletConnectKMS
@testable import TestingUtils
import JSONRPC

class AuthRequstSubscriberTests: XCTestCase {
var networkingInteractor: NetworkingInteractorMock!
var sut: AuthRequestSubscriber!
var messageFormatter: SIWEMessageFormatterMock!
let defaultTimeout: TimeInterval = 0.01

override func setUp() {
networkingInteractor = NetworkingInteractorMock()
messageFormatter = SIWEMessageFormatterMock()
sut = AuthRequestSubscriber(networkingInteractor: networkingInteractor,
logger: ConsoleLoggerMock(),
messageFormatter: messageFormatter)
}

func testSubscribeRequest() {
let expectedMessage = "Expected Message"
let expectedRequestId: RPCID = RPCID(1234)
let messageExpectation = expectation(description: "receives formatted message")
messageFormatter.formattedMessage = expectedMessage
var messageId: RPCID!
var message: String!
sut.onRequest = { id, formattedMessage in
messageId = id
message = formattedMessage
messageExpectation.fulfill()
}

networkingInteractor.requestPublisherSubject.send(RequestSubscriptionPayload.stub(id: expectedRequestId))

wait(for: [messageExpectation], timeout: defaultTimeout)
XCTAssertEqual(message, expectedMessage)
XCTAssertEqual(messageId, expectedRequestId)
}
}
16 changes: 16 additions & 0 deletions Tests/AuthTests/Mocks/NetworkingInteractorMock.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import Foundation
import Combine
@testable import Auth

struct NetworkingInteractorMock: NetworkInteracting {
let requestPublisherSubject = PassthroughSubject<RequestSubscriptionPayload, Never>()
var requestPublisher: AnyPublisher<RequestSubscriptionPayload, Never> {
requestPublisherSubject.eraseToAnyPublisher()
}

func subscribe(topic: String) async throws {

}


}
10 changes: 10 additions & 0 deletions Tests/AuthTests/Mocks/SIWEMessageFormatterMock.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import Foundation
@testable import Auth

class SIWEMessageFormatterMock: SIWEMessageFormatting {
var formattedMessage: String!
func formatMessage(from request: AuthRequestParams) throws -> String {
return formattedMessage
}
}

8 changes: 8 additions & 0 deletions Tests/AuthTests/Stubs/RequestParams.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import Foundation
@testable import Auth

extension RequestParams {
static func stub() -> RequestParams {
return RequestParams(domain: "", chainId: "", nonce: "", aud: "", nbf: nil, exp: nil, statement: nil, requestId: nil, resources: nil)
}
}
16 changes: 16 additions & 0 deletions Tests/AuthTests/Stubs/RequestSubscriptionPayload.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import Foundation
@testable import Auth
import JSONRPC

extension RequestSubscriptionPayload {
static func stub(id: RPCID) -> RequestSubscriptionPayload {
let appMetadata = AppMetadata(name: "", description: "", url: "", icons: [])
let requester = AuthRequestParams.Requester(publicKey: "", metadata: appMetadata)
let issueAt = ISO8601DateFormatter().string(from: Date())
let payload = AuthPayload(requestParams: RequestParams.stub(), iat: issueAt)
let params = AuthRequestParams(requester: requester, payloadParams: payload)
let request = RPCRequest(method: "wc_authRequest", params: params, rpcid: id)
return RequestSubscriptionPayload(topic: "", request: request)
}
}

2 changes: 1 addition & 1 deletion Tests/TestingUtils/Mocks/RPC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public extension RPCRequest {
RPCRequest(method: "method", params: EmptyCodable())
}

static func stub(method: String, id: Int) -> RPCRequest {
static func stub(method: String, id: Int64) -> RPCRequest {
RPCRequest(method: method, params: EmptyCodable(), id: id)
}
}

0 comments on commit eb80d6e

Please sign in to comment.