99 lines
2.6 KiB
C#
99 lines
2.6 KiB
C#
namespace ZB.MOM.NatsNet.Server;
|
|
|
|
internal sealed partial class NatsStream
|
|
{
|
|
internal Exception? ProcessInboundJetStreamMsg(InMsg? msg)
|
|
{
|
|
if (msg == null)
|
|
return new ArgumentNullException(nameof(msg));
|
|
|
|
try
|
|
{
|
|
return ProcessJetStreamMsg(
|
|
msg.Subject,
|
|
msg.Reply ?? string.Empty,
|
|
msg.Hdr,
|
|
msg.Msg,
|
|
lseq: 0,
|
|
ts: 0,
|
|
msgTrace: null,
|
|
sourced: false,
|
|
canRespond: true);
|
|
}
|
|
finally
|
|
{
|
|
msg.ReturnToPool();
|
|
}
|
|
}
|
|
|
|
internal Exception? ProcessJetStreamMsg(
|
|
string subject,
|
|
string reply,
|
|
byte[]? hdr,
|
|
byte[]? msg,
|
|
ulong lseq,
|
|
long ts,
|
|
object? msgTrace,
|
|
bool sourced,
|
|
bool canRespond)
|
|
{
|
|
_ = reply;
|
|
_ = msgTrace;
|
|
_ = sourced;
|
|
_ = canRespond;
|
|
|
|
if (string.IsNullOrWhiteSpace(subject))
|
|
return new ArgumentException("subject is required", nameof(subject));
|
|
|
|
if (Store == null)
|
|
return new InvalidOperationException("store not initialized");
|
|
|
|
var batchId = GetBatchId(hdr);
|
|
if (!string.IsNullOrEmpty(batchId))
|
|
return ProcessJetStreamBatchMsg(batchId, subject, reply, hdr, msg, msgTrace);
|
|
|
|
try
|
|
{
|
|
var (seq, _) = Store.StoreMsg(subject, hdr, msg, ttl: 0);
|
|
if (lseq > 0)
|
|
seq = lseq;
|
|
|
|
if (ts == 0)
|
|
ts = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() * 1_000_000L;
|
|
|
|
Interlocked.Exchange(ref LastSeq, (long)seq);
|
|
return null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return ex;
|
|
}
|
|
}
|
|
|
|
internal Exception? ProcessJetStreamBatchMsg(string batchId, string subject, string reply, byte[]? hdr, byte[]? msg, object? msgTrace)
|
|
{
|
|
_ = reply;
|
|
_ = msgTrace;
|
|
|
|
if (string.IsNullOrWhiteSpace(batchId))
|
|
return new InvalidOperationException(JsApiErrors.NewJSAtomicPublishInvalidBatchIDError().ToString());
|
|
|
|
var (_, exists) = GetBatchSequence(hdr);
|
|
if (!exists)
|
|
return new InvalidOperationException(JsApiErrors.NewJSAtomicPublishMissingSeqError().ToString());
|
|
|
|
if (Store == null)
|
|
return new InvalidOperationException("store not initialized");
|
|
|
|
try
|
|
{
|
|
Store.StoreMsg(subject, hdr, msg, ttl: 0);
|
|
return null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return ex;
|
|
}
|
|
}
|
|
}
|