Skip to content

Commit

Permalink
Merge branch 'release/0.23.11/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
pixlwave committed Jul 12, 2022
2 parents c38f8b7 + cc2608b commit b3359bd
Show file tree
Hide file tree
Showing 40 changed files with 1,721 additions and 160 deletions.
23 changes: 23 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
## Changes in 0.23.11 (2022-07-12)

✨ Features

- Analytics: Track non-fatal issues if consent provided ([#1503](https://github.com/matrix-org/matrix-ios-sdk/pull/1503))
- Crypto: Integrate Rust-based OlmMachine to encrypt / decrypt messages ([#6357](https://github.com/vector-im/element-ios/issues/6357))

🙌 Improvements

- Include ID server access token when making a 3pid invite (and creating a room). ([#6385](https://github.com/vector-im/element-ios/issues/6385))

🐛 Bugfixes

- MXiOSAudioOutputRouter: fixed issue that prevents the system to properly switch from built-in to bluetooth output. ([#5368](https://github.com/vector-im/element-ios/issues/5368))
- Fix MXCall answer not being sent to server in some cases ([#6359](https://github.com/vector-im/element-ios/issues/6359))

Others

- Integration tests should wait until the room is ready ([#1516](https://github.com/matrix-org/matrix-ios-sdk/pull/1516))
- Analytics: Log errors with details in analytics ([#1517](https://github.com/matrix-org/matrix-ios-sdk/pull/1517))
- Secret Storage: Detect multiple valid SSSS keys ([#4569](https://github.com/vector-im/element-ios/issues/4569))


## Changes in 0.23.10 (2022-06-28)

✨ Features
Expand Down
2 changes: 1 addition & 1 deletion MatrixSDK.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|

s.name = "MatrixSDK"
s.version = "0.23.10"
s.version = "0.23.11"
s.summary = "The iOS SDK to build apps compatible with Matrix (https://www.matrix.org)"

s.description = <<-DESC
Expand Down
52 changes: 52 additions & 0 deletions MatrixSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1781,6 +1781,14 @@
ECF29BE62641953C0053E6D6 /* MXAssertedIdentityModel.m in Sources */ = {isa = PBXBuildFile; fileRef = ECF29BE42641953C0053E6D6 /* MXAssertedIdentityModel.m */; };
ED21F68528104DA2002FF83D /* MXMegolmEncryptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED21F68428104DA2002FF83D /* MXMegolmEncryptionTests.swift */; };
ED21F68628104DA2002FF83D /* MXMegolmEncryptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED21F68428104DA2002FF83D /* MXMegolmEncryptionTests.swift */; };
ED2DD114286C450600F06731 /* MXCryptoMachine.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD111286C450600F06731 /* MXCryptoMachine.swift */; };
ED2DD115286C450600F06731 /* MXCryptoMachine.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD111286C450600F06731 /* MXCryptoMachine.swift */; };
ED2DD116286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD112286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift */; };
ED2DD117286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD112286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift */; };
ED2DD118286C450600F06731 /* MXCryptoRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD113286C450600F06731 /* MXCryptoRequests.swift */; };
ED2DD119286C450600F06731 /* MXCryptoRequests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD113286C450600F06731 /* MXCryptoRequests.swift */; };
ED2DD11D286C4F4400F06731 /* MXCryptoRequestsUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD11B286C4F3E00F06731 /* MXCryptoRequestsUnitTests.swift */; };
ED2DD11E286C4F4400F06731 /* MXCryptoRequestsUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2DD11B286C4F3E00F06731 /* MXCryptoRequestsUnitTests.swift */; };
ED35652C281150310002BF6A /* MXOlmInboundGroupSessionUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED35652B281150310002BF6A /* MXOlmInboundGroupSessionUnitTests.swift */; };
ED35652D281150310002BF6A /* MXOlmInboundGroupSessionUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED35652B281150310002BF6A /* MXOlmInboundGroupSessionUnitTests.swift */; };
ED35652F281153480002BF6A /* MXMegolmSessionDataUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED35652E281153480002BF6A /* MXMegolmSessionDataUnitTests.swift */; };
Expand Down Expand Up @@ -1819,6 +1827,10 @@
EDBCF33A281A8D3D00ED5044 /* MXSharedHistoryKeyService.m in Sources */ = {isa = PBXBuildFile; fileRef = EDBCF338281A8D3D00ED5044 /* MXSharedHistoryKeyService.m */; };
EDC2A0E628369E740039F3D6 /* CryptoTests.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = EDC2A0E528369E740039F3D6 /* CryptoTests.xctestplan */; };
EDC2A0E728369E740039F3D6 /* CryptoTests.xctestplan in Resources */ = {isa = PBXBuildFile; fileRef = EDC2A0E528369E740039F3D6 /* CryptoTests.xctestplan */; };
EDF1B6902876CD2C00BBBCEE /* MXTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF1B68F2876CD2C00BBBCEE /* MXTaskQueue.swift */; };
EDF1B6912876CD2C00BBBCEE /* MXTaskQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF1B68F2876CD2C00BBBCEE /* MXTaskQueue.swift */; };
EDF1B6932876CD8600BBBCEE /* MXTaskQueueUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF1B6922876CD8600BBBCEE /* MXTaskQueueUnitTests.swift */; };
EDF1B6942876CD8600BBBCEE /* MXTaskQueueUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF1B6922876CD8600BBBCEE /* MXTaskQueueUnitTests.swift */; };
EDF4678727E3331D00435913 /* EventsEnumeratorDataSourceStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF4678627E3331D00435913 /* EventsEnumeratorDataSourceStub.swift */; };
EDF4678827E3331D00435913 /* EventsEnumeratorDataSourceStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDF4678627E3331D00435913 /* EventsEnumeratorDataSourceStub.swift */; };
F0173EAC1FCF0E8900B5F6A3 /* MXGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = F0173EAA1FCF0E8800B5F6A3 /* MXGroup.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -2805,6 +2817,10 @@
ECF29BDD264195320053E6D6 /* MXAssertedIdentityModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MXAssertedIdentityModel.h; sourceTree = "<group>"; };
ECF29BE42641953C0053E6D6 /* MXAssertedIdentityModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MXAssertedIdentityModel.m; sourceTree = "<group>"; };
ED21F68428104DA2002FF83D /* MXMegolmEncryptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXMegolmEncryptionTests.swift; sourceTree = "<group>"; };
ED2DD111286C450600F06731 /* MXCryptoMachine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MXCryptoMachine.swift; sourceTree = "<group>"; };
ED2DD112286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MXEventDecryptionResult+DecryptedEvent.swift"; sourceTree = "<group>"; };
ED2DD113286C450600F06731 /* MXCryptoRequests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MXCryptoRequests.swift; sourceTree = "<group>"; };
ED2DD11B286C4F3E00F06731 /* MXCryptoRequestsUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXCryptoRequestsUnitTests.swift; sourceTree = "<group>"; };
ED35652B281150310002BF6A /* MXOlmInboundGroupSessionUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXOlmInboundGroupSessionUnitTests.swift; sourceTree = "<group>"; };
ED35652E281153480002BF6A /* MXMegolmSessionDataUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXMegolmSessionDataUnitTests.swift; sourceTree = "<group>"; };
ED44F01028180BCC00452A5D /* MXSharedHistoryKeyRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MXSharedHistoryKeyRequest.swift; sourceTree = "<group>"; };
Expand All @@ -2826,6 +2842,8 @@
EDBCF335281A8AB900ED5044 /* MXSharedHistoryKeyService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MXSharedHistoryKeyService.h; sourceTree = "<group>"; };
EDBCF338281A8D3D00ED5044 /* MXSharedHistoryKeyService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MXSharedHistoryKeyService.m; sourceTree = "<group>"; };
EDC2A0E528369E740039F3D6 /* CryptoTests.xctestplan */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CryptoTests.xctestplan; sourceTree = "<group>"; };
EDF1B68F2876CD2C00BBBCEE /* MXTaskQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXTaskQueue.swift; sourceTree = "<group>"; };
EDF1B6922876CD8600BBBCEE /* MXTaskQueueUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MXTaskQueueUnitTests.swift; sourceTree = "<group>"; };
EDF4678627E3331D00435913 /* EventsEnumeratorDataSourceStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsEnumeratorDataSourceStub.swift; sourceTree = "<group>"; };
F0173EAA1FCF0E8800B5F6A3 /* MXGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MXGroup.h; sourceTree = "<group>"; };
F0173EAB1FCF0E8900B5F6A3 /* MXGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MXGroup.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3089,6 +3107,7 @@
32A9E8231EF4026E0081358A /* MXUIKitBackgroundModeHandler.m */,
B17B2BDA2369FC81009D6650 /* MXUIKitBackgroundTask.h */,
B17B2BDB2369FC81009D6650 /* MXUIKitBackgroundTask.m */,
EDF1B68F2876CD2C00BBBCEE /* MXTaskQueue.swift */,
);
path = Utils;
sourceTree = "<group>";
Expand Down Expand Up @@ -3133,6 +3152,7 @@
322985CA26FAF898001890BC /* MXSession.swift */,
322985CE26FBAE7B001890BC /* TestObserver.swift */,
322985D126FC9E61001890BC /* MXSessionTracker.swift */,
EDF1B6922876CD8600BBBCEE /* MXTaskQueueUnitTests.swift */,
);
path = Utils;
sourceTree = "<group>";
Expand All @@ -3152,6 +3172,7 @@
324DD296246AD25E00377005 /* SecretStorage */,
324BE4651E3FADB1008D99D4 /* Utils */,
3252DCAB224BE59E0032264F /* Verification */,
ED2DD110286C450600F06731 /* V2 */,
322A51B41D9AB15900C8536D /* MXCrypto.h */,
322A51B51D9AB15900C8536D /* MXCrypto.m */,
ED47CB6C28523995004FD755 /* MXCryptoV2.swift */,
Expand Down Expand Up @@ -4949,6 +4970,7 @@
ED44F01628180F1300452A5D /* KeySharing */,
ED35652A281150230002BF6A /* Data */,
ED21F67B28104BA1002FF83D /* Algorithms */,
ED2DD11A286C4F3100F06731 /* V2 */,
ED5C95CD2833E85600843D82 /* MXOlmDeviceUnitTests.swift */,
);
path = Crypto;
Expand All @@ -4971,6 +4993,24 @@
path = Megolm;
sourceTree = "<group>";
};
ED2DD110286C450600F06731 /* V2 */ = {
isa = PBXGroup;
children = (
ED2DD111286C450600F06731 /* MXCryptoMachine.swift */,
ED2DD112286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift */,
ED2DD113286C450600F06731 /* MXCryptoRequests.swift */,
);
path = V2;
sourceTree = "<group>";
};
ED2DD11A286C4F3100F06731 /* V2 */ = {
isa = PBXGroup;
children = (
ED2DD11B286C4F3E00F06731 /* MXCryptoRequestsUnitTests.swift */,
);
path = V2;
sourceTree = "<group>";
};
ED35652A281150230002BF6A /* Data */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -6227,6 +6267,7 @@
32F945F51FAB83D900622468 /* MXIncomingRoomKeyRequestCancellation.m in Sources */,
32D776821A27877300FC4AA2 /* MXMemoryRoomStore.m in Sources */,
EC8A53BF25B1BC77004E0802 /* MXCallRejectReplacementEventContent.m in Sources */,
ED2DD114286C450600F06731 /* MXCryptoMachine.swift in Sources */,
EC8A539125B1BC77004E0802 /* MXCallCandidate.m in Sources */,
B17B2BDD2369FC81009D6650 /* MXUIKitBackgroundTask.m in Sources */,
18B22A7227707CDD00482170 /* MXEventContentLocation.m in Sources */,
Expand Down Expand Up @@ -6307,6 +6348,7 @@
327E9AF02289C61100A98BC1 /* MXAggregations.m in Sources */,
B18B0E4A25FB783B00E32151 /* MXSpaceCreationParameters.swift in Sources */,
EC2EACFF266625170038B61F /* MXRoomLastMessage.m in Sources */,
EDF1B6902876CD2C00BBBCEE /* MXTaskQueue.swift in Sources */,
EC8A539525B1BC77004E0802 /* MXUserModel.m in Sources */,
3252DCAF224BE5D40032264F /* MXKeyVerificationManager.m in Sources */,
323E0C5C1A306D7A00A31D73 /* MXEvent.m in Sources */,
Expand Down Expand Up @@ -6337,6 +6379,7 @@
32A1515C1DB525DA00400192 /* NSObject+sortedKeys.m in Sources */,
32792BD52295A86600F4FC9D /* MXAggregatedReactionsUpdater.m in Sources */,
32618E7C20EFA45B00E1D2EA /* MXRoomMembers.m in Sources */,
ED2DD118286C450600F06731 /* MXCryptoRequests.swift in Sources */,
32B0E34123A378320054FF1A /* MXEventReference.m in Sources */,
324DD2A8246AE81300377005 /* MXSecretStorageKeyContent.m in Sources */,
02CAD43A217DD12F0074700B /* MXContentScanEncryptedBody.m in Sources */,
Expand Down Expand Up @@ -6395,6 +6438,7 @@
B19A30A82404257700FB6F35 /* MXSASKeyVerificationStart.m in Sources */,
ECCA02BB273485B200B6F34F /* MXThreadingService.swift in Sources */,
02CAD439217DD12F0074700B /* MXContentScanResult.m in Sources */,
ED2DD116286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift in Sources */,
EC60ED9C265CFE1700B39A4E /* MXRoomSyncState.m in Sources */,
32133016228AF4EF0070BA9B /* MXRealmAggregationsStore.m in Sources */,
B19A30A62404257700FB6F35 /* MXQRCodeKeyVerificationStart.m in Sources */,
Expand Down Expand Up @@ -6516,9 +6560,11 @@
B146D4FF21A5C0BD00D8C2C6 /* MXMediaScanStoreUnitTests.m in Sources */,
32BD34BE1E84134A006EDC0D /* MatrixSDKTestsE2EData.m in Sources */,
B146D4FE21A5C0BD00D8C2C6 /* MXEventScanStoreUnitTests.m in Sources */,
EDF1B6932876CD8600BBBCEE /* MXTaskQueueUnitTests.swift in Sources */,
32684CB821085F770046D2F9 /* MXLazyLoadingTests.m in Sources */,
18121F75273E6D2400B68ADF /* MXPollBuilderTests.swift in Sources */,
B14EECEE2578FE3F00448735 /* MXAuthenticationSessionUnitTests.swift in Sources */,
ED2DD11D286C4F4400F06731 /* MXCryptoRequestsUnitTests.swift in Sources */,
32832B5D1BCC048300241108 /* MXStoreMemoryStoreTests.m in Sources */,
EDB4209927DF842F0036AF39 /* MXEventFixtures.swift in Sources */,
32114A7F1A24E15500FF2EC4 /* MXMyUserTests.m in Sources */,
Expand Down Expand Up @@ -6787,6 +6833,7 @@
B14EF21D2397E90400758AF0 /* MXEncryptedContentKey.m in Sources */,
B14EF21E2397E90400758AF0 /* MXEventDecryptionResult.m in Sources */,
EC60EDBF265CFE8600B39A4E /* MXRoomSyncAccountData.m in Sources */,
ED2DD115286C450600F06731 /* MXCryptoMachine.swift in Sources */,
320B393D239FD15E00BE2C06 /* MXKeyVerificationRequest.m in Sources */,
18B22A7327707CDD00482170 /* MXEventContentLocation.m in Sources */,
EC05473725FF8A3C0047ECD7 /* MXVirtualRoomInfo.m in Sources */,
Expand Down Expand Up @@ -6867,6 +6914,7 @@
B18B0E5025FB783F00E32151 /* MXSpaceService.swift in Sources */,
B14EF2412397E90400758AF0 /* MXRoomFilter.m in Sources */,
EC8A53D925B1BCC6004E0802 /* MXThirdPartyProtocolInstance.m in Sources */,
EDF1B6912876CD2C00BBBCEE /* MXTaskQueue.swift in Sources */,
B14EF2422397E90400758AF0 /* MXDeviceInfo.m in Sources */,
B14EF2432397E90400758AF0 /* MXIncomingSASTransaction.m in Sources */,
B14EF2442397E90400758AF0 /* NSObject+sortedKeys.m in Sources */,
Expand Down Expand Up @@ -6897,6 +6945,7 @@
B14EF24E2397E90400758AF0 /* MXAllowedCertificates.m in Sources */,
B14EF24F2397E90400758AF0 /* MXLRUCache.m in Sources */,
B14EF2502397E90400758AF0 /* MXIncomingRoomKeyRequestManager.m in Sources */,
ED2DD119286C450600F06731 /* MXCryptoRequests.swift in Sources */,
B14EF2512397E90400758AF0 /* MXRoomEventFilter.m in Sources */,
B14EF2522397E90400758AF0 /* MXLoginPolicyData.m in Sources */,
B19A30C72404268600FB6F35 /* MXQRCodeDataBuilder.m in Sources */,
Expand Down Expand Up @@ -6955,6 +7004,7 @@
B14EF2682397E90400758AF0 /* MXFilterJSONModel.m in Sources */,
325AD44223BE3E7500FF5277 /* MXCrossSigningInfo.m in Sources */,
ECCA02BC273485B200B6F34F /* MXThreadingService.swift in Sources */,
ED2DD117286C450600F06731 /* MXEventDecryptionResult+DecryptedEvent.swift in Sources */,
B14EF2692397E90400758AF0 /* MXMatrixVersions.m in Sources */,
B14EF26A2397E90400758AF0 /* MXReactionCountChangeListener.m in Sources */,
B14EF26B2397E90400758AF0 /* MXMegolmBackupCreationInfo.m in Sources */,
Expand Down Expand Up @@ -7076,9 +7126,11 @@
B1E09A452397FD990057C069 /* MXLazyLoadingTests.m in Sources */,
B1E09A1C2397FCE90057C069 /* MXEventAnnotationUnitTests.swift in Sources */,
B1E09A262397FCE90057C069 /* MXPushRuleUnitTests.m in Sources */,
EDF1B6942876CD8600BBBCEE /* MXTaskQueueUnitTests.swift in Sources */,
B1E09A442397FD940057C069 /* Dummy.swift in Sources */,
18121F76273E6D2400B68ADF /* MXPollBuilderTests.swift in Sources */,
B1E09A1A2397FCE90057C069 /* MXAggregatedEditsTests.m in Sources */,
ED2DD11E286C4F4400F06731 /* MXCryptoRequestsUnitTests.swift in Sources */,
B1E09A1F2397FCE90057C069 /* MXAutoDiscoveryTests.m in Sources */,
EDB4209A27DF842F0036AF39 /* MXEventFixtures.swift in Sources */,
B1E09A2E2397FD750057C069 /* MXRestClientTests.m in Sources */,
Expand Down
9 changes: 9 additions & 0 deletions MatrixSDK/Contrib/Swift/Data/MXRoom.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ public extension MXRoom {
return httpOperation!
}

/**
The current list of members of the room using async API.
*/
@available(iOS 13.0.0, macOS 10.15.0, *)
func members() async throws -> MXRoomMembers? {
try await performCallbackRequest {
members(completion: $0)
}
}


// MARK: - Room Operations
Expand Down
33 changes: 33 additions & 0 deletions MatrixSDK/Contrib/Swift/MXResponse.swift
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,39 @@ internal func uncurryResponse<T>(_ response: MXResponse<T>, success: @escaping (
}
}

/// Async wrapper over callback-based functions returning `MXResponse<T>`
///
/// Example:
///
/// ```
/// // Legacy callback approach
/// room.members { response
/// switch response {
/// case .succes:
/// ...
/// case. failure:
/// ...
/// }
/// }
///
/// // Async approach
/// let members = try await performCallbackRequest {
/// room.members($0)
/// }
/// ```
@available(iOS 13.0.0, macOS 10.15.0, *)
internal func performCallbackRequest<T>(_ request: (@escaping (MXResponse<T>) -> Void) -> Void) async throws -> T {
return try await withCheckedThrowingContinuation { continuation in
request {
switch $0 {
case .success(let response):
continuation.resume(returning: response)
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}

/**
Reports ongoing progress of a process, and encapsulates relevant
Expand Down
Loading

0 comments on commit b3359bd

Please sign in to comment.