diff --git a/LibMatrix/Services/HomeserverProviderService.cs b/LibMatrix/Services/HomeserverProviderService.cs
index c61ef73..9867184 100644
--- a/LibMatrix/Services/HomeserverProviderService.cs
+++ b/LibMatrix/Services/HomeserverProviderService.cs
@@ -10,16 +10,19 @@ namespace LibMatrix.Services;
public class HomeserverProviderService(ILogger<HomeserverProviderService> logger, HomeserverResolverService hsResolver) {
private static SemaphoreCache<AuthenticatedHomeserverGeneric> AuthenticatedHomeserverCache = new();
private static SemaphoreCache<RemoteHomeserver> RemoteHomeserverCache = new();
+ private static SemaphoreCache<FederationClient> FederationClientCache = new();
public async Task<AuthenticatedHomeserverGeneric> GetAuthenticatedWithToken(string homeserver, string accessToken, string? proxy = null, string? impersonatedMxid = null,
- bool useGeneric = false) {
+ bool useGeneric = false, bool enableClient = true, bool enableServer = true) {
+ if (!enableClient && !enableServer)
+ throw new ArgumentException("At least one of enableClient or enableServer must be true");
+
return await AuthenticatedHomeserverCache.GetOrAdd($"{homeserver}{accessToken}{proxy}{impersonatedMxid}", async () => {
- var wellKnownUris = await hsResolver.ResolveHomeserverFromWellKnown(homeserver);
+ var wellKnownUris = await hsResolver.ResolveHomeserverFromWellKnown(homeserver, enableClient, enableServer);
var rhs = new RemoteHomeserver(homeserver, wellKnownUris, ref proxy);
-
+
AuthenticatedHomeserverGeneric? hs = null;
- if (!useGeneric)
- {
+ if (!useGeneric) {
ClientVersionsResponse? clientVersions = new();
try {
clientVersions = await rhs.GetClientVersionsAsync();
@@ -50,7 +53,7 @@ public class HomeserverProviderService(ILogger<HomeserverProviderService> logger
throw;
}
}
-
+
hs ??= new AuthenticatedHomeserverGeneric(homeserver, wellKnownUris, ref proxy, accessToken);
await hs.Initialise();
@@ -62,9 +65,17 @@ public class HomeserverProviderService(ILogger<HomeserverProviderService> logger
});
}
- public async Task<RemoteHomeserver> GetRemoteHomeserver(string homeserver, string? proxy = null) =>
- await RemoteHomeserverCache.GetOrAdd($"{homeserver}{proxy}",
- async () => { return new RemoteHomeserver(homeserver, await hsResolver.ResolveHomeserverFromWellKnown(homeserver), ref proxy); });
+ public async Task<RemoteHomeserver> GetRemoteHomeserver(string homeserver, string? proxy = null, bool useCache = true, bool enableServer = true) =>
+ useCache
+ ? await RemoteHomeserverCache.GetOrAdd($"{homeserver}{proxy}",
+ async () => { return new RemoteHomeserver(homeserver, await hsResolver.ResolveHomeserverFromWellKnown(homeserver, enableServer: enableServer), ref proxy); })
+ : new RemoteHomeserver(homeserver, await hsResolver.ResolveHomeserverFromWellKnown(homeserver, enableServer: enableServer), ref proxy);
+
+ public async Task<FederationClient> GetFederationClient(string homeserver, string keyId, string? proxy = null, bool useCache = true) =>
+ useCache
+ ? await FederationClientCache.GetOrAdd($"{homeserver}{keyId}{proxy}",
+ async () => { return new FederationClient((await hsResolver.ResolveHomeserverFromWellKnown(homeserver, enableClient: false)).Server!, proxy); })
+ : new FederationClient((await hsResolver.ResolveHomeserverFromWellKnown(homeserver, enableClient: false)).Server!, proxy);
public async Task<LoginResponse> Login(string homeserver, string user, string password, string? proxy = null) {
var hs = await GetRemoteHomeserver(homeserver, proxy);
diff --git a/LibMatrix/Services/HomeserverResolverService.cs b/LibMatrix/Services/HomeserverResolverService.cs
index 42ad0a1..05ce733 100644
--- a/LibMatrix/Services/HomeserverResolverService.cs
+++ b/LibMatrix/Services/HomeserverResolverService.cs
@@ -14,7 +14,7 @@ namespace LibMatrix.Services;
public class HomeserverResolverService {
private readonly MatrixHttpClient _httpClient = new() {
- Timeout = TimeSpan.FromMilliseconds(10000)
+ Timeout = TimeSpan.FromSeconds(60)
};
private static readonly SemaphoreCache<WellKnownUris> WellKnownCache = new();
@@ -30,40 +30,45 @@ public class HomeserverResolverService {
}
}
- private static SemaphoreSlim _wellKnownSemaphore = new(1, 1);
+ // private static SemaphoreSlim _wellKnownSemaphore = new(1, 1);
- public async Task<WellKnownUris> ResolveHomeserverFromWellKnown(string homeserver) {
+ public async Task<WellKnownUris> ResolveHomeserverFromWellKnown(string homeserver, bool enableClient = true, bool enableServer = true) {
ArgumentNullException.ThrowIfNull(homeserver);
return await WellKnownCache.GetOrAdd(homeserver, async () => {
- await _wellKnownSemaphore.WaitAsync();
+ // await _wellKnownSemaphore.WaitAsync();
_logger.LogTrace($"Resolving homeserver well-knowns: {homeserver}");
- var client = _tryResolveClientEndpoint(homeserver);
+ var client = enableClient ? _tryResolveClientEndpoint(homeserver) : null;
+ var server = enableServer ? _tryResolveServerEndpoint(homeserver) : null;
var res = new WellKnownUris();
// try {
- res.Client = await client ?? throw new Exception("Could not resolve client URL.");
+ if (client != null)
+ res.Client = await client ?? throw new Exception($"Could not resolve client URL for {homeserver}.");
// }
// catch (Exception e) {
// _logger.LogError(e, "Error resolving client well-known for {hs}", homeserver);
// }
- var server = _tryResolveServerEndpoint(homeserver);
-
// try {
- res.Server = await server ?? throw new Exception("Could not resolve server URL.");
+ if (server != null)
+ res.Server = await server ?? throw new Exception($"Could not resolve server URL for {homeserver}.");
// }
// catch (Exception e) {
// _logger.LogError(e, "Error resolving server well-known for {hs}", homeserver);
// }
_logger.LogInformation("Resolved well-knowns for {hs}: {json}", homeserver, res.ToJson(indent: false));
- _wellKnownSemaphore.Release();
+ // _wellKnownSemaphore.Release();
return res;
});
}
+ // private async Task<WellKnownUris> InternalResolveHomeserverFromWellKnown(string homeserver) {
+
+ // }
+
private async Task<string?> _tryResolveClientEndpoint(string homeserver) {
ArgumentNullException.ThrowIfNull(homeserver);
_logger.LogTrace("Resolving client well-known: {homeserver}", homeserver);
@@ -90,7 +95,7 @@ public class HomeserverResolverService {
if (!string.IsNullOrWhiteSpace(clientWellKnown?.Homeserver.BaseUrl))
return clientWellKnown.Homeserver.BaseUrl;
- _logger.LogInformation("No client well-known...");
+ _logger.LogInformation("No client well-known for {server}...", homeserver);
return null;
}
@@ -129,7 +134,7 @@ public class HomeserverResolverService {
if (clientUrl is not null && await _httpClient.CheckSuccessStatus($"{clientUrl}/_matrix/federation/v1/version"))
return clientUrl;
- _logger.LogInformation("No server well-known...");
+ _logger.LogInformation("No server well-known for {server}...", homeserver);
return null;
}
|