Updated with Antigravity.
This commit is contained in:
+58
-20
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user