Skip to content

Commit 515860c

Browse files
feat(agent): add logging capabilities
add a mediator handler enhance public API
1 parent 0f41471 commit 515860c

33 files changed

+476
-283
lines changed

Castor/Sources/CastorImpl+Public.swift

+10-1
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,25 @@ extension CastorImpl: Castor {
4848
}
4949

5050
public func resolveDID(did: DID) async throws -> DIDDocument {
51+
logger.info(message: "Trying to resolve DID", metadata: [
52+
.maskedMetadataByLevel(key: "DID", value: did.string, level: .debug)
53+
])
5154
guard
5255
let resolver = resolvers.first(where: { $0.method == did.method })
5356
else {
57+
logger.error(message: "No resolvers for DID method \(did.method)", metadata: [
58+
.maskedMetadataByLevel(key: "DID", value: did.string, level: .debug)
59+
])
5460
throw CastorError.notPossibleToResolveDID
5561
}
5662
return try await resolver.resolve(did: did)
5763
}
5864

5965
public func getEcnumbasis(did: DID, keyPair: KeyPair) throws -> String {
60-
try CreatePeerDIDOperation(
66+
logger.debug(message: "Getting ecnumbasis", metadata: [
67+
.maskedMetadataByLevel(key: "DID", value: did.string, level: .debug)
68+
])
69+
return try CreatePeerDIDOperation(
6170
autenticationKeyPair: keyPair,
6271
agreementKeyPair: keyPair,
6372
services: []

Castor/Sources/CastorImpl.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import Foundation
55
public struct CastorImpl {
66
let apollo: Apollo
77
let resolvers: [DIDResolverDomain]
8+
let logger: PrismLogger
89

910
public init(apollo: Apollo, resolvers: [DIDResolverDomain] = []) {
11+
self.logger = PrismLogger(category: .castor)
1012
self.apollo = apollo
1113
self.resolvers = resolvers + [
12-
LongFormPrismDIDResolver(apollo: apollo),
14+
LongFormPrismDIDResolver(apollo: apollo, logger: logger),
1315
PeerDIDResolver()
1416
]
1517
}

Castor/Sources/Operations/CreatePeerDIDOperation.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct CreatePeerDIDOperation {
2828
let services: [DIDDocument.Service]
2929

3030
func compute() throws -> DID {
31-
try createPeerDID(
31+
return try createPeerDID(
3232
encryptionKeys: [try keyAgreementFromKeyPair(keyPair: agreementKeyPair)],
3333
signingKeys: [try authenticationFromKeyPair(keyPair: autenticationKeyPair)],
3434
services: services

Castor/Sources/Operations/VerifySignatureOperation.swift

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Core
12
import Domain
23
import Foundation
34

Castor/Sources/Resolvers/LongFormPrismDIDResolver.swift

+15-2
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ import Foundation
44

55
struct LongFormPrismDIDResolver: DIDResolverDomain {
66
let apollo: Apollo
7+
let logger: PrismLogger
78

89
var method = "prism"
910

1011
func resolve(did: DID) throws -> DIDDocument {
1112
let prismDID = try LongFormPrismDID(did: did)
1213
guard
1314
let data = Data(fromBase64URL: prismDID.encodedState)
14-
else { throw CastorError.initialStateOfDIDChanged }
15+
else {
16+
logger.error(message: "The DID state hash doesn't match the state", metadata: [
17+
.maskedMetadataByLevel(key: "DID", value: did.string, level: .debug)
18+
])
19+
throw CastorError.initialStateOfDIDChanged
20+
}
1521

1622
let (verificationMethods, services) = try decodeState(
1723
did: did,
@@ -48,7 +54,14 @@ struct LongFormPrismDIDResolver: DIDResolverDomain {
4854
guard stateHash == verifyEncodedState else { throw CastorError.initialStateOfDIDChanged }
4955
let operation = try Io_Iohk_Atala_Prism_Protos_AtalaOperation(serializedData: encodedData)
5056
let publicKeys = try operation.createDid.didData.publicKeys.map {
51-
try PrismDIDPublicKey(apollo: apollo, proto: $0)
57+
do {
58+
return try PrismDIDPublicKey(apollo: apollo, proto: $0)
59+
} catch {
60+
logger.error(message: "Failed to decode public key from document", metadata: [
61+
.maskedMetadataByLevel(key: "DID", value: did.string, level: .debug)
62+
])
63+
throw error
64+
}
5265
}
5366
let services = operation.createDid.didData.services.map {
5467
DIDDocument.Service(

Core/Sources/Logger/PrismLogger.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ private let METADATA_PRIVACY_STR = "------"
4343
// MARK: Prism Logger
4444

4545
public struct PrismLogger {
46-
static var logLevels = [LogComponent: LogLevel]()
46+
public static var logLevels = [LogComponent: LogLevel]()
4747
private static let hashingLog = UUID().uuidString
4848
private let logLevel: LogLevel
4949

Mercury/Sources/DIDCommWrappers/DIDCommDIDResolverWrapper.swift

+14-3
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import Domain
55
import Foundation
66

77
class DIDCommDIDResolverWrapper {
8+
let logger: PrismLogger
89
let castor: Castor
910
var publisher = PassthroughSubject<DIDDocument, Error>()
1011
var cancellables = [AnyCancellable]()
1112

12-
init(castor: Castor) {
13+
init(castor: Castor, logger: PrismLogger) {
1314
self.castor = castor
15+
self.logger = logger
1416
}
1517

1618
fileprivate func resolve(did: String) {
@@ -25,20 +27,29 @@ extension DIDCommDIDResolverWrapper: DidResolver {
2527
func resolve(did: String, cb: OnDidResolverResult) -> ErrorCode {
2628
publisher
2729
.first()
28-
.sink {
30+
.sink { [weak self] in
2931
switch $0 {
3032
case .finished:
3133
break
3234
case let .failure(error):
35+
self?.logger.error(message: "Error trying to resolve DID", metadata: [
36+
.publicMetadata(key: "Error", value: error.localizedDescription)
37+
])
3338
try? cb.error(
3439
err: ErrorKind.DidNotResolved(message: error.localizedDescription),
3540
msg: error.localizedDescription
3641
)
3742
}
38-
} receiveValue: {
43+
} receiveValue: { [weak self] in
3944
do {
45+
self?.logger.debug(message: "Success resolving DID", metadata: [
46+
.maskedMetadataByLevel(key: "DID", value: did, level: .debug)
47+
])
4048
try cb.success(result: try DidDoc(from: $0))
4149
} catch {
50+
self?.logger.error(message: "Error trying to resolve DID", metadata: [
51+
.publicMetadata(key: "Error", value: error.localizedDescription)
52+
])
4253
try? cb.error(
4354
err: ErrorKind.DidNotResolved(message: error.localizedDescription),
4455
msg: error.localizedDescription

Mercury/Sources/DIDCommWrappers/DIDCommSecretsResolverWrapper.swift

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Combine
2+
import Core
23
import DIDCommxSwift
34
import Domain
45
import Foundation
@@ -9,13 +10,15 @@ class DIDCommSecretsResolverWrapper {
910
let apollo: Apollo
1011
let pluto: Pluto
1112
let castor: Castor
13+
let logger: PrismLogger
1214
@Published var availableSecrets = [Domain.Secret]()
1315
var cancellables = [AnyCancellable]()
1416

15-
init(apollo: Apollo, pluto: Pluto, castor: Castor) {
17+
init(apollo: Apollo, pluto: Pluto, castor: Castor, logger: PrismLogger) {
1618
self.apollo = apollo
1719
self.pluto = pluto
1820
self.castor = castor
21+
self.logger = logger
1922

2023
startUpdating()
2124
}
@@ -68,11 +71,14 @@ extension DIDCommSecretsResolverWrapper: SecretsResolver {
6871
$availableSecrets
6972
.first()
7073
.map { $0.first { $0.id == secretid } }
71-
.sink {
74+
.sink { [weak self] in
7275
do {
7376
try cb.success(result: $0.map { DIDCommxSwift.Secret(from: $0) })
7477
} catch {
75-
print(error.localizedDescription)
78+
self?.logger.error(message: "Could not find secret", metadata: [
79+
.publicMetadata(key: "SecretId", value: secretid),
80+
.publicMetadata(key: "Error", value: error.localizedDescription)
81+
])
7682
}
7783
}
7884
.store(in: &cancellables)
@@ -90,11 +96,14 @@ extension DIDCommSecretsResolverWrapper: SecretsResolver {
9096
.filter { secretids.contains($0.id) }
9197
.map { $0.id }
9298
}
93-
.sink {
99+
.sink { [weak self] in
94100
do {
95101
try cb.success(result: $0)
96102
} catch {
97-
print(error.localizedDescription)
103+
self?.logger.error(message: "Could not find secrets", metadata: [
104+
.publicMetadata(key: "SecretsIds", value: secretids.description),
105+
.publicMetadata(key: "Error", value: error.localizedDescription)
106+
])
98107
}
99108
}
100109
.store(in: &cancellables)

Mercury/Sources/DIDCommWrappers/PackEncryptedOperation.swift

+22-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import Combine
2+
import Core
23
import DIDCommxSwift
34
import Domain
45
import Foundation
56

67
final class PackEncryptedOperation: OnPackEncryptedResult {
78
private let didcomm: DIDCommProtocol
9+
private let logger: PrismLogger
810
private var published = CurrentValueSubject<String?, Error>(nil)
911
private var cancellable: AnyCancellable?
1012

11-
init(didcomm: DIDCommProtocol) {
13+
init(didcomm: DIDCommProtocol, logger: PrismLogger) {
1214
self.didcomm = didcomm
15+
self.logger = logger
1316
}
1417

1518
func packEncrypted(msg: Domain.Message) async throws -> String {
@@ -22,11 +25,17 @@ final class PackEncryptedOperation: OnPackEncryptedResult {
2225
self.cancellable = self.published
2326
.drop(while: { $0 == nil })
2427
.first()
25-
.sink(receiveCompletion: {
28+
.sink(receiveCompletion: { [weak self] in
2629
switch $0 {
2730
case .finished:
2831
break
2932
case let .failure(error):
33+
self?.logger.error(
34+
message: "Could not pack message",
35+
metadata: [
36+
.publicMetadata(key: "Error", value: error.localizedDescription)
37+
]
38+
)
3039
continuation.resume(throwing: error)
3140
}
3241
}, receiveValue: {
@@ -68,6 +77,17 @@ final class PackEncryptedOperation: OnPackEncryptedResult {
6877
}
6978

7079
func error(err: DIDCommxSwift.ErrorKind, msg: String) {
80+
logger.error(
81+
message: "Could not pack message",
82+
metadata: [
83+
.publicMetadata(
84+
key: "Error",
85+
value: MercuryError
86+
.didcommError(msg: msg)
87+
.localizedDescription
88+
)
89+
]
90+
)
7191
published.send(completion: .failure(MercuryError.didcommError(msg: msg)))
7292
}
7393
}

Mercury/Sources/DIDCommWrappers/UnpackOperation.swift

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
import Combine
2+
import Core
23
import DIDCommxSwift
34
import Domain
45
import Foundation
56

67
final class UnpackOperation: OnUnpackResult {
78
private let didcomm: DIDCommProtocol
89
private let castor: Castor
10+
private let logger: PrismLogger
911
private var published = CurrentValueSubject<Domain.Message?, Error>(nil)
1012
private var cancellable: AnyCancellable?
1113

12-
init(didcomm: DIDCommProtocol, castor: Castor) {
14+
init(didcomm: DIDCommProtocol, castor: Castor, logger: PrismLogger) {
1315
self.didcomm = didcomm
1416
self.castor = castor
17+
self.logger = logger
1518
}
1619

1720
func unpackEncrypted(messageString: String) async throws -> Domain.Message {
@@ -28,11 +31,17 @@ final class UnpackOperation: OnUnpackResult {
2831
self.cancellable = self.published
2932
.drop(while: { $0 == nil })
3033
.first()
31-
.sink(receiveCompletion: {
34+
.sink(receiveCompletion: { [weak self] in
3235
switch $0 {
3336
case .finished:
3437
break
3538
case let .failure(error):
39+
self?.logger.error(
40+
message: "Could not unpack message",
41+
metadata: [
42+
.publicMetadata(key: "Error", value: error.localizedDescription)
43+
]
44+
)
3645
continuation.resume(throwing: error)
3746
}
3847
}, receiveValue: {
@@ -50,6 +59,12 @@ final class UnpackOperation: OnUnpackResult {
5059
let message: Domain.Message = try result.toDomain(castor: castor)
5160
published.send(message)
5261
} catch {
62+
logger.error(
63+
message: "Could not unpack message",
64+
metadata: [
65+
.publicMetadata(key: "Error", value: error.localizedDescription)
66+
]
67+
)
5368
published.send(completion: .failure(error))
5469
}
5570
}

Mercury/Sources/MercuryImpl+Public.swift

+6-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import Foundation
55

66
extension MercuryImpl: Mercury {
77
public func packMessage(msg: Domain.Message) async throws -> String {
8-
try await PackEncryptedOperation(didcomm: didcomm).packEncrypted(msg: msg)
8+
try await PackEncryptedOperation(didcomm: didcomm, logger: logger).packEncrypted(msg: msg)
99
}
1010

1111
public func unpackMessage(msg: String) async throws -> Domain.Message {
12-
try await UnpackOperation(didcomm: didcomm, castor: castor).unpackEncrypted(messageString: msg)
12+
try await UnpackOperation(didcomm: didcomm, castor: castor, logger: logger).unpackEncrypted(messageString: msg)
1313
}
1414

1515
public func sendMessage(msg: Domain.Message) async throws -> Data? {
@@ -18,7 +18,10 @@ extension MercuryImpl: Mercury {
1818
guard
1919
let urlString = document.services.first?.serviceEndpoint.uri,
2020
let url = URL(string: urlString)
21-
else { throw MercuryError.noValidServiceFoundError }
21+
else {
22+
logger.error(message: "Could not find a valid service on the DID to send message")
23+
throw MercuryError.noValidServiceFoundError
24+
}
2225
let packedMessage = try await packMessage(msg: msg)
2326
return try await session.post(
2427
url: url,

Mercury/Sources/MercuryImpl.swift

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Core
12
import DIDCommxSwift
23
import Domain
34
import Foundation
@@ -8,6 +9,7 @@ public struct MercuryImpl {
89
let apollo: Apollo
910
let pluto: Pluto
1011
let didcomm: DidComm
12+
let logger: PrismLogger
1113

1214
public init(
1315
session: URLSession = .shared,
@@ -16,15 +18,18 @@ public struct MercuryImpl {
1618
castor: Castor,
1719
pluto: Pluto
1820
) {
21+
let logger = PrismLogger(category: .mercury)
22+
self.logger = logger
1923
self.session = SessionManager(session: session, timeout: timeout)
2024
self.castor = castor
2125
self.apollo = apollo
2226
self.pluto = pluto
23-
let didResolver = DIDCommDIDResolverWrapper(castor: castor)
27+
let didResolver = DIDCommDIDResolverWrapper(castor: castor, logger: logger)
2428
let secretsResolver = DIDCommSecretsResolverWrapper(
2529
apollo: apollo,
2630
pluto: pluto,
27-
castor: castor
31+
castor: castor,
32+
logger: logger
2833
)
2934
self.didcomm = DidComm(
3035
didResolver: didResolver,

0 commit comments

Comments
 (0)