-
Notifications
You must be signed in to change notification settings - Fork 49
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Low-level APIs and last clean-up before first release (#65)
* Implemented Pub/Sub/INatsSub low-level APIs * INatsConnection rename and namespace changes Also removed flush, observable and sharding. * NatsMsg as struct * Made low-level api internal
- Loading branch information
Showing
26 changed files
with
344 additions
and
564 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
using System.Buffers; | ||
using System.Collections.Concurrent; | ||
|
||
namespace NATS.Client.Core; | ||
|
||
internal interface INatsSub : IAsyncDisposable | ||
{ | ||
string Subject { get; } | ||
|
||
string? QueueGroup { get; } | ||
|
||
int Sid { get; } | ||
|
||
ValueTask ReceiveAsync(string subject, string? replyTo, in ReadOnlySequence<byte>? headersBuffer, in ReadOnlySequence<byte> payloadBuffer); | ||
} | ||
|
||
internal interface INatsSubBuilder<out T> | ||
where T : INatsSub | ||
{ | ||
T Build(string subject, string? queueGroup, NatsConnection connection, SubscriptionManager manager); | ||
} | ||
|
||
internal class NatsSubBuilder : INatsSubBuilder<NatsSub> | ||
{ | ||
public static readonly NatsSubBuilder Default = new(); | ||
|
||
public NatsSub Build(string subject, string? queueGroup, NatsConnection connection, SubscriptionManager manager) | ||
{ | ||
var sid = manager.GetNextSid(); | ||
return new NatsSub(connection, manager, subject, queueGroup, sid); | ||
} | ||
} | ||
|
||
internal class NatsSubModelBuilder<T> : INatsSubBuilder<NatsSub<T>> | ||
{ | ||
private static readonly ConcurrentDictionary<INatsSerializer, NatsSubModelBuilder<T>> Cache = new(); | ||
private readonly INatsSerializer _serializer; | ||
|
||
public NatsSubModelBuilder(INatsSerializer serializer) => _serializer = serializer; | ||
|
||
public static NatsSubModelBuilder<T> For(INatsSerializer serializer) => | ||
Cache.GetOrAdd(serializer, static s => new NatsSubModelBuilder<T>(s)); | ||
|
||
public NatsSub<T> Build(string subject, string? queueGroup, NatsConnection connection, SubscriptionManager manager) | ||
{ | ||
var sid = manager.GetNextSid(); | ||
return new NatsSub<T>(connection, manager, subject, queueGroup, sid, _serializer); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
src/NATS.Client.Core/NatsUri.cs → src/NATS.Client.Core/Internal/NatsUri.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
using System.Buffers; | ||
using NATS.Client.Core.Commands; | ||
|
||
namespace NATS.Client.Core; | ||
|
||
public partial class NatsConnection | ||
{ | ||
internal ValueTask PubAsync(string subject, string? replyTo = default, ReadOnlySequence<byte> payload = default, NatsHeaders? headers = default, CancellationToken cancellationToken = default) | ||
{ | ||
headers?.SetReadOnly(); | ||
|
||
if (ConnectionState == NatsConnectionState.Open) | ||
{ | ||
var command = AsyncPublishBytesCommand.Create(_pool, GetCommandTimer(cancellationToken), subject, replyTo, headers, payload); | ||
if (TryEnqueueCommand(command)) | ||
{ | ||
return command.AsValueTask(); | ||
} | ||
else | ||
{ | ||
return EnqueueAndAwaitCommandAsync(command); | ||
} | ||
} | ||
else | ||
{ | ||
return WithConnectAsync(subject, replyTo, headers, payload, cancellationToken, static (self, s, r, h, p, token) => | ||
{ | ||
var command = AsyncPublishBytesCommand.Create(self._pool, self.GetCommandTimer(token), s, r, h, p); | ||
return self.EnqueueAndAwaitCommandAsync(command); | ||
}); | ||
} | ||
} | ||
|
||
internal ValueTask PubModelAsync<T>(string subject, T data, INatsSerializer serializer, string? replyTo = default, NatsHeaders? headers = default, CancellationToken cancellationToken = default) | ||
{ | ||
headers?.SetReadOnly(); | ||
|
||
if (ConnectionState == NatsConnectionState.Open) | ||
{ | ||
var command = AsyncPublishCommand<T>.Create(_pool, GetCommandTimer(cancellationToken), subject, replyTo, headers, data, serializer); | ||
if (TryEnqueueCommand(command)) | ||
{ | ||
return command.AsValueTask(); | ||
} | ||
else | ||
{ | ||
return EnqueueAndAwaitCommandAsync(command); | ||
} | ||
} | ||
else | ||
{ | ||
return WithConnectAsync(subject, replyTo, headers, data, serializer, cancellationToken, static (self, s, r, h, v, ser, token) => | ||
{ | ||
var command = AsyncPublishCommand<T>.Create(self._pool, self.GetCommandTimer(token), s, r, h, v, ser); | ||
return self.EnqueueAndAwaitCommandAsync(command); | ||
}); | ||
} | ||
} | ||
|
||
internal ValueTask<T> SubAsync<T>(string subject, string? queueGroup, INatsSubBuilder<T> builder, CancellationToken cancellationToken = default) | ||
where T : INatsSub | ||
{ | ||
var sub = builder.Build(subject, queueGroup, this, _subscriptionManager); | ||
if (ConnectionState == NatsConnectionState.Open) | ||
{ | ||
return _subscriptionManager.SubscribeAsync(subject, queueGroup, sub, cancellationToken); | ||
} | ||
else | ||
{ | ||
return WithConnectAsync(subject, queueGroup, sub, cancellationToken, static (self, s, qg, sb, token) => | ||
{ | ||
return self._subscriptionManager.SubscribeAsync(s, qg, sb, token); | ||
}); | ||
} | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.