using System.Text; namespace ZB.MOM.NatsNet.Server; public sealed partial class NatsServer { internal void SendDomainLeaderElectAdvisory() { var (_, cluster) = GetJetStreamCluster(); var meta = cluster?.Meta; if (meta == null) return; Noticef( "JetStream domain leader elected advisory for leader {0} in cluster {1}", meta.GroupLeader(), CachedClusterName()); } internal void SendConsumerLostQuorumAdvisory(NatsConsumer? consumer) { if (consumer == null || !consumer.ShouldSendLostQuorum()) return; Noticef("JetStream consumer lost quorum advisory for consumer {0} on stream {1}", consumer.Name, consumer.Stream); } internal void SendConsumerLeaderElectAdvisory(NatsConsumer? consumer) { if (consumer == null) return; Noticef("JetStream consumer leader elected advisory for consumer {0} on stream {1}", consumer.Name, consumer.Stream); } internal void JsClusteredStreamRequest( ClientInfo clientInfo, Account account, string subject, string reply, byte[] rawMessage, StreamConfigRequest configRequest) { var (js, cluster) = GetJetStreamCluster(); if (js == null || cluster == null) return; var cfg = configRequest.Config; var engine = new JetStreamEngine(js); var limitsError = engine.JsClusteredStreamLimitsCheck(account, cfg); if (limitsError != null) { var response = new ApiResponse { Type = JsApiSubjects.JsApiStreamCreateResponseType, Error = limitsError, }; SendAPIErrResponse(clientInfo, account, subject, reply, string.Empty, JsonResponse(response)); return; } var (group, createError) = engine.CreateGroupForStream(clientInfo, cfg); if (group == null || createError != null) { var response = new ApiResponse { Type = JsApiSubjects.JsApiStreamCreateResponseType, Error = JsApiErrors.NewJSClusterNoPeersError(createError ?? new SelectPeerError { Misc = true }), }; SendAPIErrResponse(clientInfo, account, subject, reply, string.Empty, JsonResponse(response)); return; } var assignment = new StreamAssignment { Group = group, Config = cfg, Subject = subject, Reply = reply, Client = clientInfo, Created = DateTime.UtcNow, }; if (cluster.Meta != null) { cluster.Meta.Propose(Encoding.UTF8.GetBytes($"create-stream:{account.Name}:{cfg.Name}")); cluster.TrackInflightStreamProposal(account.Name, assignment, deleted: false); } } }