Updated with Antigravity.

This commit is contained in:
Creeper Lv
2026-06-01 05:49:08 +10:00
parent e8ab8e0684
commit b263291dc2
7 changed files with 436 additions and 82 deletions
+58 -20
View File
@@ -28,6 +28,7 @@ public class Program
// Register custom security managers & HTTP utilities
builder.Services.AddSingleton<CertificateManager>();
builder.Services.AddSingleton<RsaKeyManager>();
builder.Services.AddSingleton<PeerCache>();
builder.Services.AddSingleton<HttpClient>();
@@ -66,24 +67,9 @@ public class Program
var hostApplicationLifetime = app.Services.GetRequiredService<IHostApplicationLifetime>();
var services = app.Services;
// Dynamic Bootstrapping check on startup
var config = app.Configuration;
var bootstrapUrl = config["BootstrapFromPeer"];
if (!string.IsNullOrEmpty(bootstrapUrl))
{
Task.Run(async () =>
{
// Wait briefly for server startup
await Task.Delay(2000);
using var scope = services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<ServerDbContext>();
var certManager = scope.ServiceProvider.GetRequiredService<CertificateManager>();
var client = scope.ServiceProvider.GetRequiredService<HttpClient>();
await SyncEndpoints.BootstrapFromPeerServerAsync(bootstrapUrl, db, certManager, client);
});
}
// Dynamic Handshake: Connect to target destination server and register local address on startup
// Dynamic Handshake & Bootstrapping: Connect to target destination server on startup, and optionally bootstrap
var destUrl = config["Sync:DestinationServerUrl"];
var localUrl = config["Sync:LocalServerUrl"];
if (!string.IsNullOrEmpty(destUrl) && !string.IsNullOrEmpty(localUrl))
@@ -93,9 +79,61 @@ public class Program
// Wait briefly for server startup
await Task.Delay(2000);
using var scope = services.CreateScope();
var certManager = scope.ServiceProvider.GetRequiredService<CertificateManager>();
var rsaKeyManager = scope.ServiceProvider.GetRequiredService<RsaKeyManager>();
var configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
var client = scope.ServiceProvider.GetRequiredService<HttpClient>();
await SyncEndpoints.RegisterPeerWithDestinationAsync(destUrl, localUrl, certManager, client);
// 1. Perform handshake
await SyncEndpoints.RegisterPeerWithDestinationAsync(destUrl, localUrl, rsaKeyManager, configuration, client);
// 2. Check if we have successfully handshaked and obtained a token
if (!string.IsNullOrEmpty(SyncEndpoints.UpstreamSessionToken))
{
var bootstrapMode = configuration["Sync:BootstrapFromUpstream"] ?? "Never";
bool doBootstrap = false;
if (string.Equals(bootstrapMode, "Always", StringComparison.OrdinalIgnoreCase))
{
doBootstrap = true;
}
else if (string.Equals(bootstrapMode, "FirstTime", StringComparison.OrdinalIgnoreCase))
{
var flagPath = Path.Combine(AppContext.BaseDirectory, "snote_bootstrapped.flag");
if (!File.Exists(flagPath))
{
doBootstrap = true;
}
else
{
Console.WriteLine("[Bootstrap] Skipped because BootstrapFromUpstream is set to FirstTime and server has bootstrapped before.");
}
}
if (doBootstrap)
{
var db = scope.ServiceProvider.GetRequiredService<ServerDbContext>();
await SyncEndpoints.BootstrapFromPeerServerAsync(destUrl, localUrl, SyncEndpoints.UpstreamSessionToken, db, client);
// If it's FirstTime, write the flag file
if (string.Equals(bootstrapMode, "FirstTime", StringComparison.OrdinalIgnoreCase))
{
try
{
var flagPath = Path.Combine(AppContext.BaseDirectory, "snote_bootstrapped.flag");
await File.WriteAllTextAsync(flagPath, DateTime.UtcNow.ToString("o"));
Console.WriteLine("[Bootstrap] Wrote bootstrap flag file.");
}
catch (Exception ex)
{
Console.WriteLine($"[Bootstrap] Warning: Could not write bootstrap flag file: {ex.Message}");
}
}
}
}
else
{
Console.WriteLine("[Bootstrap] Skipped because handshake failed (no token obtained).");
}
});
}
@@ -105,9 +143,9 @@ public class Program
var token = hostApplicationLifetime.ApplicationStopping;
using var scope = services.CreateScope();
var peerCache = scope.ServiceProvider.GetRequiredService<PeerCache>();
var certManager = scope.ServiceProvider.GetRequiredService<CertificateManager>();
var rsaKeyManager = scope.ServiceProvider.GetRequiredService<RsaKeyManager>();
var client = scope.ServiceProvider.GetRequiredService<HttpClient>();
await SyncEndpoints.StartHeartbeatPingerAsync(peerCache, certManager, client, token);
await SyncEndpoints.StartHeartbeatPingerAsync(peerCache, rsaKeyManager, client, token);
});
app.Run();