e2b15bd520
Each cached client records when it was last handed out; a periodic sweep (half of the new CommunicationOptions.GrpcClientIdleTtl, default 30 min, 0 disables) disposes and removes entries unused for the TTL that have no live subscription (SiteStreamGrpcClient.ActiveSubscriptionCount). Lookup and the sweep's check-and-remove share one lock so a handed-out client is never disposed under its caller; an evicted client is re-created on next GetOrCreate.