mirror of
https://github.com/element-hq/element-x-ios.git
synced 2025-03-10 13:37:11 +00:00
Bump the RustSDK to v25.03.05
- adopt the new timeline configuration which now exposes read receipts tracking. For now it should be set to `false` for all timelines except the live one, which still gets configured properly on the rust side through `init_timeline`. Eventually we will converge on this configuration API for all of them. - also adopt the new rust side cache clearing method and remove our own
This commit is contained in:
parent
fb8a1f33d8
commit
4d34a1ed56
@ -8534,7 +8534,7 @@
|
|||||||
repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift";
|
repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift";
|
||||||
requirement = {
|
requirement = {
|
||||||
kind = exactVersion;
|
kind = exactVersion;
|
||||||
version = 25.02.28;
|
version = 25.03.05;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = {
|
701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = {
|
||||||
|
@ -149,8 +149,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/element-hq/matrix-rust-components-swift",
|
"location" : "https://github.com/element-hq/matrix-rust-components-swift",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "f42b210c7edce2a58e55f94830d7c19eaec7215a",
|
"revision" : "72da14a8d8077a799561e9a37519feac8c872e19",
|
||||||
"version" : "25.2.28"
|
"version" : "25.3.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -757,13 +757,12 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationFlowCoordinatorDeleg
|
|||||||
stopSync(isBackgroundTask: false)
|
stopSync(isBackgroundTask: false)
|
||||||
userSessionFlowCoordinator?.stop()
|
userSessionFlowCoordinator?.stop()
|
||||||
|
|
||||||
let userID = userSession.clientProxy.userID
|
|
||||||
tearDownUserSession()
|
tearDownUserSession()
|
||||||
|
|
||||||
// Allow for everything to deallocate properly
|
// Allow for everything to deallocate properly
|
||||||
Task {
|
Task {
|
||||||
try? await Task.sleep(for: .seconds(2))
|
try? await Task.sleep(for: .seconds(2))
|
||||||
userSessionStore.clearCache(for: userID)
|
await userSession.clientProxy.clearCaches()
|
||||||
stateMachine.processEvent(.startWithExistingSession)
|
stateMachine.processEvent(.startWithExistingSession)
|
||||||
hideLoadingIndicator()
|
hideLoadingIndicator()
|
||||||
}
|
}
|
||||||
|
@ -4258,6 +4258,71 @@ class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable {
|
|||||||
return getElementWellKnownReturnValue
|
return getElementWellKnownReturnValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//MARK: - clearCaches
|
||||||
|
|
||||||
|
var clearCachesUnderlyingCallsCount = 0
|
||||||
|
var clearCachesCallsCount: Int {
|
||||||
|
get {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
return clearCachesUnderlyingCallsCount
|
||||||
|
} else {
|
||||||
|
var returnValue: Int? = nil
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
returnValue = clearCachesUnderlyingCallsCount
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
clearCachesUnderlyingCallsCount = newValue
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
clearCachesUnderlyingCallsCount = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var clearCachesCalled: Bool {
|
||||||
|
return clearCachesCallsCount > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
var clearCachesUnderlyingReturnValue: Result<Void, ClientProxyError>!
|
||||||
|
var clearCachesReturnValue: Result<Void, ClientProxyError>! {
|
||||||
|
get {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
return clearCachesUnderlyingReturnValue
|
||||||
|
} else {
|
||||||
|
var returnValue: Result<Void, ClientProxyError>? = nil
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
returnValue = clearCachesUnderlyingReturnValue
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
clearCachesUnderlyingReturnValue = newValue
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
clearCachesUnderlyingReturnValue = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var clearCachesClosure: (() async -> Result<Void, ClientProxyError>)?
|
||||||
|
|
||||||
|
@discardableResult
|
||||||
|
func clearCaches() async -> Result<Void, ClientProxyError> {
|
||||||
|
clearCachesCallsCount += 1
|
||||||
|
if let clearCachesClosure = clearCachesClosure {
|
||||||
|
return await clearCachesClosure()
|
||||||
|
} else {
|
||||||
|
return clearCachesReturnValue
|
||||||
|
}
|
||||||
|
}
|
||||||
//MARK: - ignoreUser
|
//MARK: - ignoreUser
|
||||||
|
|
||||||
var ignoreUserUnderlyingCallsCount = 0
|
var ignoreUserUnderlyingCallsCount = 0
|
||||||
@ -17572,47 +17637,6 @@ class UserSessionStoreMock: UserSessionStoreProtocol, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
logoutUserSessionClosure?(userSession)
|
logoutUserSessionClosure?(userSession)
|
||||||
}
|
}
|
||||||
//MARK: - clearCache
|
|
||||||
|
|
||||||
var clearCacheForUnderlyingCallsCount = 0
|
|
||||||
var clearCacheForCallsCount: Int {
|
|
||||||
get {
|
|
||||||
if Thread.isMainThread {
|
|
||||||
return clearCacheForUnderlyingCallsCount
|
|
||||||
} else {
|
|
||||||
var returnValue: Int? = nil
|
|
||||||
DispatchQueue.main.sync {
|
|
||||||
returnValue = clearCacheForUnderlyingCallsCount
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
if Thread.isMainThread {
|
|
||||||
clearCacheForUnderlyingCallsCount = newValue
|
|
||||||
} else {
|
|
||||||
DispatchQueue.main.sync {
|
|
||||||
clearCacheForUnderlyingCallsCount = newValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var clearCacheForCalled: Bool {
|
|
||||||
return clearCacheForCallsCount > 0
|
|
||||||
}
|
|
||||||
var clearCacheForReceivedUserID: String?
|
|
||||||
var clearCacheForReceivedInvocations: [String] = []
|
|
||||||
var clearCacheForClosure: ((String) -> Void)?
|
|
||||||
|
|
||||||
func clearCache(for userID: String) {
|
|
||||||
clearCacheForCallsCount += 1
|
|
||||||
clearCacheForReceivedUserID = userID
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.clearCacheForReceivedInvocations.append(userID)
|
|
||||||
}
|
|
||||||
clearCacheForClosure?(userID)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
class VoiceMessageCacheMock: VoiceMessageCacheProtocol, @unchecked Sendable {
|
class VoiceMessageCacheMock: VoiceMessageCacheProtocol, @unchecked Sendable {
|
||||||
var urlForRecording: URL {
|
var urlForRecording: URL {
|
||||||
|
@ -552,6 +552,46 @@ open class ClientSDKMock: MatrixRustSDK.Client, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - clearCaches
|
||||||
|
|
||||||
|
open var clearCachesThrowableError: Error?
|
||||||
|
var clearCachesUnderlyingCallsCount = 0
|
||||||
|
open var clearCachesCallsCount: Int {
|
||||||
|
get {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
return clearCachesUnderlyingCallsCount
|
||||||
|
} else {
|
||||||
|
var returnValue: Int? = nil
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
returnValue = clearCachesUnderlyingCallsCount
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
clearCachesUnderlyingCallsCount = newValue
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
clearCachesUnderlyingCallsCount = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
open var clearCachesCalled: Bool {
|
||||||
|
return clearCachesCallsCount > 0
|
||||||
|
}
|
||||||
|
open var clearCachesClosure: (() async throws -> Void)?
|
||||||
|
|
||||||
|
open override func clearCaches() async throws {
|
||||||
|
if let error = clearCachesThrowableError {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
clearCachesCallsCount += 1
|
||||||
|
try await clearCachesClosure?()
|
||||||
|
}
|
||||||
|
|
||||||
//MARK: - createRoom
|
//MARK: - createRoom
|
||||||
|
|
||||||
open var createRoomRequestThrowableError: Error?
|
open var createRoomRequestThrowableError: Error?
|
||||||
@ -3389,6 +3429,52 @@ open class ClientSDKMock: MatrixRustSDK.Client, @unchecked Sendable {
|
|||||||
try await setDisplayNameNameClosure?(name)
|
try await setDisplayNameNameClosure?(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - setMediaRetentionPolicy
|
||||||
|
|
||||||
|
open var setMediaRetentionPolicyPolicyThrowableError: Error?
|
||||||
|
var setMediaRetentionPolicyPolicyUnderlyingCallsCount = 0
|
||||||
|
open var setMediaRetentionPolicyPolicyCallsCount: Int {
|
||||||
|
get {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
return setMediaRetentionPolicyPolicyUnderlyingCallsCount
|
||||||
|
} else {
|
||||||
|
var returnValue: Int? = nil
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
returnValue = setMediaRetentionPolicyPolicyUnderlyingCallsCount
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
setMediaRetentionPolicyPolicyUnderlyingCallsCount = newValue
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
setMediaRetentionPolicyPolicyUnderlyingCallsCount = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
open var setMediaRetentionPolicyPolicyCalled: Bool {
|
||||||
|
return setMediaRetentionPolicyPolicyCallsCount > 0
|
||||||
|
}
|
||||||
|
open var setMediaRetentionPolicyPolicyReceivedPolicy: MediaRetentionPolicy?
|
||||||
|
open var setMediaRetentionPolicyPolicyReceivedInvocations: [MediaRetentionPolicy] = []
|
||||||
|
open var setMediaRetentionPolicyPolicyClosure: ((MediaRetentionPolicy) async throws -> Void)?
|
||||||
|
|
||||||
|
open override func setMediaRetentionPolicy(policy: MediaRetentionPolicy) async throws {
|
||||||
|
if let error = setMediaRetentionPolicyPolicyThrowableError {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
setMediaRetentionPolicyPolicyCallsCount += 1
|
||||||
|
setMediaRetentionPolicyPolicyReceivedPolicy = policy
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.setMediaRetentionPolicyPolicyReceivedInvocations.append(policy)
|
||||||
|
}
|
||||||
|
try await setMediaRetentionPolicyPolicyClosure?(policy)
|
||||||
|
}
|
||||||
|
|
||||||
//MARK: - setPusher
|
//MARK: - setPusher
|
||||||
|
|
||||||
open var setPusherIdentifiersKindAppDisplayNameDeviceDisplayNameProfileTagLangThrowableError: Error?
|
open var setPusherIdentifiersKindAppDisplayNameDeviceDisplayNameProfileTagLangThrowableError: Error?
|
||||||
@ -13725,6 +13811,52 @@ open class RoomSDKMock: MatrixRustSDK.Room, @unchecked Sendable {
|
|||||||
try await reportContentEventIdScoreReasonClosure?(eventId, score, reason)
|
try await reportContentEventIdScoreReasonClosure?(eventId, score, reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - reportRoom
|
||||||
|
|
||||||
|
open var reportRoomReasonThrowableError: Error?
|
||||||
|
var reportRoomReasonUnderlyingCallsCount = 0
|
||||||
|
open var reportRoomReasonCallsCount: Int {
|
||||||
|
get {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
return reportRoomReasonUnderlyingCallsCount
|
||||||
|
} else {
|
||||||
|
var returnValue: Int? = nil
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
returnValue = reportRoomReasonUnderlyingCallsCount
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
if Thread.isMainThread {
|
||||||
|
reportRoomReasonUnderlyingCallsCount = newValue
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.sync {
|
||||||
|
reportRoomReasonUnderlyingCallsCount = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
open var reportRoomReasonCalled: Bool {
|
||||||
|
return reportRoomReasonCallsCount > 0
|
||||||
|
}
|
||||||
|
open var reportRoomReasonReceivedReason: String?
|
||||||
|
open var reportRoomReasonReceivedInvocations: [String?] = []
|
||||||
|
open var reportRoomReasonClosure: ((String?) async throws -> Void)?
|
||||||
|
|
||||||
|
open override func reportRoom(reason: String?) async throws {
|
||||||
|
if let error = reportRoomReasonThrowableError {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
reportRoomReasonCallsCount += 1
|
||||||
|
reportRoomReasonReceivedReason = reason
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.reportRoomReasonReceivedInvocations.append(reason)
|
||||||
|
}
|
||||||
|
try await reportRoomReasonClosure?(reason)
|
||||||
|
}
|
||||||
|
|
||||||
//MARK: - resetPowerLevels
|
//MARK: - resetPowerLevels
|
||||||
|
|
||||||
open var resetPowerLevelsThrowableError: Error?
|
open var resetPowerLevelsThrowableError: Error?
|
||||||
|
@ -702,6 +702,15 @@ class ClientProxy: ClientProxyProtocol {
|
|||||||
func getElementWellKnown() async -> Result<ElementWellKnown?, ClientProxyError> {
|
func getElementWellKnown() async -> Result<ElementWellKnown?, ClientProxyError> {
|
||||||
await client.getElementWellKnown().map(ElementWellKnown.init)
|
await client.getElementWellKnown().map(ElementWellKnown.init)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func clearCaches() async -> Result<Void, ClientProxyError> {
|
||||||
|
do {
|
||||||
|
return try await .success(client.clearCaches())
|
||||||
|
} catch {
|
||||||
|
MXLog.error("Failed clearing client caches with error: \(error)")
|
||||||
|
return .failure(.sdkError(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: Ignored users
|
// MARK: Ignored users
|
||||||
|
|
||||||
|
@ -179,6 +179,8 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol {
|
|||||||
func isAliasAvailable(_ alias: String) async -> Result<Bool, ClientProxyError>
|
func isAliasAvailable(_ alias: String) async -> Result<Bool, ClientProxyError>
|
||||||
|
|
||||||
func getElementWellKnown() async -> Result<ElementWellKnown?, ClientProxyError>
|
func getElementWellKnown() async -> Result<ElementWellKnown?, ClientProxyError>
|
||||||
|
|
||||||
|
@discardableResult func clearCaches() async -> Result<Void, ClientProxyError>
|
||||||
|
|
||||||
// MARK: - Ignored users
|
// MARK: - Ignored users
|
||||||
|
|
||||||
|
@ -36,9 +36,10 @@ class JoinedRoomProxy: JoinedRoomProxyProtocol {
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
let sdkTimeline = try await room.timelineWithConfiguration(configuration: .init(focus: .pinnedEvents(maxEventsToLoad: 100, maxConcurrentRequests: 10),
|
let sdkTimeline = try await room.timelineWithConfiguration(configuration: .init(focus: .pinnedEvents(maxEventsToLoad: 100, maxConcurrentRequests: 10),
|
||||||
allowedMessageTypes: .all,
|
filter: .all,
|
||||||
internalIdPrefix: nil,
|
internalIdPrefix: nil,
|
||||||
dateDividerMode: .daily))
|
dateDividerMode: .daily,
|
||||||
|
trackReadReceipts: false))
|
||||||
|
|
||||||
let timeline = TimelineProxy(timeline: sdkTimeline, kind: .pinned)
|
let timeline = TimelineProxy(timeline: sdkTimeline, kind: .pinned)
|
||||||
|
|
||||||
@ -159,9 +160,10 @@ class JoinedRoomProxy: JoinedRoomProxyProtocol {
|
|||||||
func timelineFocusedOnEvent(eventID: String, numberOfEvents: UInt16) async -> Result<TimelineProxyProtocol, RoomProxyError> {
|
func timelineFocusedOnEvent(eventID: String, numberOfEvents: UInt16) async -> Result<TimelineProxyProtocol, RoomProxyError> {
|
||||||
do {
|
do {
|
||||||
let sdkTimeline = try await room.timelineWithConfiguration(configuration: .init(focus: .event(eventId: eventID, numContextEvents: numberOfEvents),
|
let sdkTimeline = try await room.timelineWithConfiguration(configuration: .init(focus: .event(eventId: eventID, numContextEvents: numberOfEvents),
|
||||||
allowedMessageTypes: .all,
|
filter: .all,
|
||||||
internalIdPrefix: UUID().uuidString,
|
internalIdPrefix: UUID().uuidString,
|
||||||
dateDividerMode: .daily))
|
dateDividerMode: .daily,
|
||||||
|
trackReadReceipts: false))
|
||||||
|
|
||||||
return .success(TimelineProxy(timeline: sdkTimeline, kind: .detached))
|
return .success(TimelineProxy(timeline: sdkTimeline, kind: .detached))
|
||||||
} catch let error as FocusEventError {
|
} catch let error as FocusEventError {
|
||||||
@ -202,9 +204,10 @@ class JoinedRoomProxy: JoinedRoomProxyProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let sdkTimeline = try await room.timelineWithConfiguration(configuration: .init(focus: rustFocus,
|
let sdkTimeline = try await room.timelineWithConfiguration(configuration: .init(focus: rustFocus,
|
||||||
allowedMessageTypes: .only(types: rustMessageTypes),
|
filter: .onlyMessage(types: rustMessageTypes),
|
||||||
internalIdPrefix: nil,
|
internalIdPrefix: nil,
|
||||||
dateDividerMode: .monthly))
|
dateDividerMode: .monthly,
|
||||||
|
trackReadReceipts: false))
|
||||||
|
|
||||||
let timeline = TimelineProxy(timeline: sdkTimeline, kind: .media(presentation))
|
let timeline = TimelineProxy(timeline: sdkTimeline, kind: .media(presentation))
|
||||||
await timeline.subscribeForUpdates()
|
await timeline.subscribeForUpdates()
|
||||||
|
@ -8,8 +8,10 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// A preview object for the Room. useful to get all the possible info for rooms to which the user is not invited to
|
/// A preview object for the Room. useful to get all the possible info for rooms to which the user is not invited to
|
||||||
// sourcery: AutoMockable
|
|
||||||
protocol RoomPreviewProxyProtocol {
|
protocol RoomPreviewProxyProtocol {
|
||||||
var info: RoomPreviewInfoProxy { get }
|
var info: RoomPreviewInfoProxy { get }
|
||||||
var ownMembershipDetails: RoomMembershipDetailsProxyProtocol? { get async }
|
var ownMembershipDetails: RoomMembershipDetailsProxyProtocol? { get async }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sourcery: AutoMockable
|
||||||
|
extension RoomPreviewProxyProtocol { }
|
||||||
|
@ -91,15 +91,7 @@ class UserSessionStore: UserSessionStoreProtocol {
|
|||||||
credentials.restorationToken.sessionDirectories.delete()
|
credentials.restorationToken.sessionDirectories.delete()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func clearCache(for userID: String) {
|
|
||||||
guard let credentials = keychainController.restorationTokens().first(where: { $0.userID == userID }) else {
|
|
||||||
MXLog.error("Failed to clearing caches: Credentials missing")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
credentials.restorationToken.sessionDirectories.deleteTransientUserData()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
private func buildUserSessionWithClient(_ clientProxy: ClientProxyProtocol) -> UserSessionProtocol {
|
private func buildUserSessionWithClient(_ clientProxy: ClientProxyProtocol) -> UserSessionProtocol {
|
||||||
|
@ -36,7 +36,4 @@ protocol UserSessionStoreProtocol {
|
|||||||
|
|
||||||
/// Logs out of the specified session.
|
/// Logs out of the specified session.
|
||||||
func logout(userSession: UserSessionProtocol)
|
func logout(userSession: UserSessionProtocol)
|
||||||
|
|
||||||
/// Clears our all the matrix sdk state data for the specified session
|
|
||||||
func clearCache(for userID: String)
|
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ packages:
|
|||||||
# Element/Matrix dependencies
|
# Element/Matrix dependencies
|
||||||
MatrixRustSDK:
|
MatrixRustSDK:
|
||||||
url: https://github.com/element-hq/matrix-rust-components-swift
|
url: https://github.com/element-hq/matrix-rust-components-swift
|
||||||
exactVersion: 25.02.28
|
exactVersion: 25.03.05
|
||||||
# path: ../matrix-rust-sdk
|
# path: ../matrix-rust-sdk
|
||||||
Compound:
|
Compound:
|
||||||
url: https://github.com/element-hq/compound-ios
|
url: https://github.com/element-hq/compound-ios
|
||||||
|
Loading…
x
Reference in New Issue
Block a user