feat: complete gRPC streaming channel — site host, docker config, docs, integration tests

Switch site host to WebApplicationBuilder with Kestrel HTTP/2 gRPC server,
add GrpcPort/keepalive config, wire SiteStreamManager as ISiteStreamSubscriber,
expose gRPC ports in docker-compose, add site seed script, update all 10
requirement docs + CLAUDE.md + README.md for the new dual-transport architecture.
This commit is contained in:
Joseph Doherty
2026-03-21 12:38:33 -04:00
parent 3fe3c4161b
commit 416a03b782
34 changed files with 728 additions and 156 deletions

View File

@@ -24,7 +24,7 @@ public class SiteStreamGrpcServerTests : TestKit
private SiteStreamGrpcServer CreateServer(int maxStreams = 100)
{
return new SiteStreamGrpcServer(_subscriber, Sys, _logger, maxStreams);
return new SiteStreamGrpcServer(_subscriber, _logger, maxStreams);
}
private static InstanceStreamRequest MakeRequest(string correlationId = "corr-1", string instance = "Site1.Pump01")
@@ -55,7 +55,7 @@ public class SiteStreamGrpcServerTests : TestKit
public async Task RejectsWhenMaxStreamsReached()
{
var server = CreateServer(maxStreams: 1);
server.SetReady();
server.SetReady(Sys);
// Start one stream that blocks
var cts1 = new CancellationTokenSource();
@@ -86,7 +86,7 @@ public class SiteStreamGrpcServerTests : TestKit
public async Task CancelsDuplicateCorrelationId()
{
var server = CreateServer();
server.SetReady();
server.SetReady(Sys);
var cts1 = new CancellationTokenSource();
var context1 = CreateMockContext(cts1.Token);
@@ -121,7 +121,7 @@ public class SiteStreamGrpcServerTests : TestKit
public async Task CleansUpOnCancellation()
{
var server = CreateServer();
server.SetReady();
server.SetReady(Sys);
var cts = new CancellationTokenSource();
var context = CreateMockContext(cts.Token);
@@ -142,7 +142,7 @@ public class SiteStreamGrpcServerTests : TestKit
public async Task SubscribesAndRemovesFromStreamManager()
{
var server = CreateServer();
server.SetReady();
server.SetReady(Sys);
var cts = new CancellationTokenSource();
var context = CreateMockContext(cts.Token);
@@ -167,7 +167,7 @@ public class SiteStreamGrpcServerTests : TestKit
public async Task WritesEventsToResponseStream()
{
var server = CreateServer();
server.SetReady();
server.SetReady(Sys);
// Capture the relay actor so we can send it events
IActorRef? capturedActor = null;
@@ -212,7 +212,7 @@ public class SiteStreamGrpcServerTests : TestKit
{
var server = CreateServer();
// Initially not ready -- just verify the property works
server.SetReady();
server.SetReady(Sys);
// No assertion needed -- the other tests verify that SetReady enables streaming
Assert.Equal(0, server.ActiveStreamCount);
}