Well known resolver rewrite work
2 files changed, 107 insertions, 0 deletions
diff --git a/LibMatrix/Services/WellKnownResolvers/ClientWellKnownResolver.cs b/LibMatrix/Services/WellKnownResolvers/ClientWellKnownResolver.cs
new file mode 100644
index 0000000..d4d0166
--- /dev/null
+++ b/LibMatrix/Services/WellKnownResolvers/ClientWellKnownResolver.cs
@@ -0,0 +1,53 @@
+using System.Text.Json.Serialization;
+using ArcaneLibs.Collections;
+using LibMatrix.Extensions;
+using Microsoft.Extensions.Logging;
+
+namespace LibMatrix.Services.WellKnownResolvers;
+
+public class ClientWellKnownResolver(ILogger<ClientWellKnownResolver> logger) {
+ private static readonly SemaphoreCache<WellKnownResolutionResult> ClientWellKnownCache = new() {
+ StoreNulls = false
+ };
+ private static readonly MatrixHttpClient HttpClient = new();
+
+ public Task<WellKnownResolutionResult> TryResolveClientWellKnown(string homeserver) {
+ return ClientWellKnownCache.TryGetOrAdd(homeserver, async () => {
+ logger.LogTrace($"Resolving client well-known: {homeserver}");
+ if ((await TryGetClientWellKnownFromHttps(homeserver)) is { } clientWellKnown)
+ return new() {
+ Source = WellKnownResolverService.WellKnownSource.Https,
+ WellKnown = clientWellKnown
+ };
+
+ return default!;
+ });
+ }
+
+ private async Task<ClientWellKnown?> TryGetClientWellKnownFromHttps(string homeserver) {
+ try {
+ return await HttpClient.TryGetFromJsonAsync<ClientWellKnown>($"https://{homeserver}/.well-known/matrix/client");
+ }
+ catch {
+ return null;
+ }
+ }
+
+
+
+ public class ClientWellKnown {
+ [JsonPropertyName("m.homeserver")]
+ public required WellKnownHomeserver Homeserver { get; set; }
+
+ public class WellKnownHomeserver {
+ [JsonPropertyName("base_url")]
+ public required string BaseUrl { get; set; }
+ }
+ }
+
+ public struct WellKnownResolutionResult {
+ public WellKnownResolverService.WellKnownSource Source { get; set; }
+ public ClientWellKnown WellKnown { get; set; }
+ public List<WellKnownResolverService.WellKnownResolutionWarning> Warnings { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/LibMatrix/Services/WellKnownResolvers/SupportWellKnownResolver.cs b/LibMatrix/Services/WellKnownResolvers/SupportWellKnownResolver.cs
new file mode 100644
index 0000000..1d7567a
--- /dev/null
+++ b/LibMatrix/Services/WellKnownResolvers/SupportWellKnownResolver.cs
@@ -0,0 +1,54 @@
+using System.Text.Json.Serialization;
+using ArcaneLibs.Collections;
+using LibMatrix.Extensions;
+using Microsoft.Extensions.Logging;
+
+namespace LibMatrix.Services.WellKnownResolvers;
+
+public class SupportWellKnownResolver(ILogger<SupportWellKnownResolver> logger) {
+ private static readonly SemaphoreCache<WellKnownResolverService.WellKnownResolutionResult<SupportWellKnown>> ClientWellKnownCache = new() {
+ StoreNulls = false
+ };
+
+ private static readonly MatrixHttpClient HttpClient = new();
+
+ public Task<WellKnownResolverService.WellKnownResolutionResult<SupportWellKnown>> TryResolveClientWellKnown(string homeserver) {
+ return ClientWellKnownCache.TryGetOrAdd(homeserver, async () => {
+ logger.LogTrace($"Resolving client well-known: {homeserver}");
+ if ((await TryGetClientWellKnownFromHttps(homeserver)) is { } clientWellKnown)
+ return new() {
+ Source = WellKnownResolverService.WellKnownSource.Https,
+ WellKnown = clientWellKnown
+ };
+ return default!;
+ });
+ }
+
+ private async Task<SupportWellKnown?> TryGetClientWellKnownFromHttps(string homeserver) {
+ try {
+ return await HttpClient.TryGetFromJsonAsync<SupportWellKnown>($"https://{homeserver}/.well-known/matrix/support");
+ }
+ catch {
+ return null;
+ }
+ }
+
+ public struct SupportWellKnown {
+ [JsonPropertyName("contacts")]
+ public List<WellKnownContact>? Contacts { get; set; }
+
+ [JsonPropertyName("support_page")]
+ public Uri? SupportPage { get; set; }
+
+ public class WellKnownContact {
+ [JsonPropertyName("email_address")]
+ public string? EmailAddress { get; set; }
+
+ [JsonPropertyName("matrix_id")]
+ public string? MatrixId { get; set; }
+
+ [JsonPropertyName("role")]
+ public required string Role { get; set; }
+ }
+ }
+}
\ No newline at end of file
|