Joseph Doherty
416a03b782
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.
2026-03-21 12:38:33 -04:00
Joseph Doherty
55a05914d0
feat: add SiteStreamGrpcServer with Channel<T> bridge and stream limits
...
- Define ISiteStreamSubscriber interface for decoupling from SiteRuntime
- Implement SiteStreamGrpcServer (inherits SiteStreamServiceBase) with:
- Readiness gate (SetReady)
- Max concurrent stream enforcement
- Duplicate correlationId replacement (cancels previous stream)
- StreamRelayActor creation per subscription
- Bounded Channel<SiteStreamEvent> bridge (1000 capacity, drop-oldest)
- Clean teardown: unsubscribe, stop actor, remove tracking entry
- Identity-safe cleanup using ConcurrentDictionary.TryRemove(KeyValuePair)
to prevent replacement streams from being removed by predecessor cleanup
- 7 unit tests covering reject-not-ready, max-streams, duplicate cancel,
cleanup-on-cancel, subscribe/remove lifecycle, event forwarding
2026-03-21 11:52:31 -04:00