using System.Text.Json; using System.Text.Json.Serialization; namespace NATS.Server.JetStream.Models; // Go: server/stream.go — counterMsgPayload struct { Value string `json:"val"` } // Reference: golang/nats-server/server/stream.go:20759 public sealed class CounterValue { [JsonPropertyName("val")] public string Value { get; set; } = "0"; public long AsLong() => long.TryParse(Value, out var v) ? v : 0; public static CounterValue FromLong(long value) => new() { Value = value.ToString() }; public byte[] ToPayload() => JsonSerializer.SerializeToUtf8Bytes(this); public static CounterValue FromPayload(ReadOnlySpan payload) { if (payload.IsEmpty) return new CounterValue(); try { return JsonSerializer.Deserialize(payload) ?? new CounterValue(); } catch (JsonException) { return new CounterValue(); } } } // Go: NATS header constants for counter messages. // Reference: golang/nats-server/server/stream.go — counter header constants. public static class CounterHeaders { public const string NatsIncr = "Nats-Incr"; public const string NatsCounterSources = "Nats-Counter-Sources"; public const string NatsStreamSource = "Nats-Stream-Source"; }