Skip to content

Commit 2d00958

Browse files
committed
Updated to latest dependencies (minus some .net 9 ones)
1 parent 15d9a16 commit 2d00958

File tree

13 files changed

+105
-54
lines changed

13 files changed

+105
-54
lines changed

Directory.Packages.props

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
44
</PropertyGroup>
55
<ItemGroup>
6-
<PackageVersion Include="DotPulsar" Version="3.3.1" />
6+
<PackageVersion Include="DotPulsar" Version="4.2.0" />
77
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
88
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
9-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
109
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
11-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
10+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
1211
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="all" />
13-
<PackageVersion Include="MinVer" Version="5.0.0" PrivateAssets="all" />
12+
<PackageVersion Include="MinVer" Version="6.0.0" PrivateAssets="all" />
1413
<PackageVersion Include="OpenTelemetry.Api" Version="1.9.0" />
15-
<PackageVersion Include="Polly" Version="8.4.1" />
16-
<PackageVersion Include="protobuf-net" Version="3.2.30" />
17-
<PackageVersion Include="Testcontainers.Pulsar" Version="3.9.0" />
18-
<PackageVersion Include="Ulid" Version="1.3.3" />
19-
<PackageVersion Include="xunit" Version="2.9.0" />
20-
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2">
14+
<PackageVersion Include="Polly" Version="8.5.2" />
15+
<PackageVersion Include="protobuf-net" Version="3.2.46" />
16+
<PackageVersion Include="System.Text.Json" Version="8.0.5" />
17+
<PackageVersion Include="Testcontainers.Pulsar" Version="4.3.0" />
18+
<PackageVersion Include="Ulid" Version="1.3.4" />
19+
<PackageVersion Include="xunit" Version="2.9.3" />
20+
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2">
2121
<PrivateAssets>all</PrivateAssets>
2222
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2323
</PackageVersion>

src/DotPulsar.Extensions.DependencyInjection/DotPulsar.Extensions.DependencyInjection.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<RootNamespace>DotPulsar</RootNamespace>
55
<PackageTags>$(PackageTags);Pulsar</PackageTags>
66
<Description>DotPulsar.Extensions.DependencyInjection adds support for using DotPulsar with the Microsoft.Extensions.DependencyInjection APIs.</Description>
7-
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
7+
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
88
<ImplicitUsings>enable</ImplicitUsings>
99
<Nullable>enable</Nullable>
1010
<LangVersion>latest</LangVersion>
@@ -15,7 +15,6 @@
1515

1616
<ItemGroup>
1717
<PackageReference Include="DotPulsar" />
18-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
1918
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
2019
</ItemGroup>
2120

src/DotPulsar.Extensions.DependencyInjection/Internal/PulsarClientCertificate.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ public string? Password {
4343
fullChain.ImportFromPemFile(Path);
4444

4545
if (KeyPath != null) {
46-
#pragma warning disable CA2000
46+
#pragma warning disable CA2000, SYSLIB0057
4747
var certificate = new X509Certificate2(Path);
48-
#pragma warning restore CA2000
48+
#pragma warning restore CA2000, SYSLIB0057
4949
try {
5050
certificate = LoadCertificateKey(certificate, KeyPath, Password);
5151
} catch {
@@ -65,7 +65,9 @@ public string? Password {
6565
return certificate;
6666
}
6767

68+
#pragma warning disable SYSLIB0057
6869
return new X509Certificate2(Path, Password);
70+
#pragma warning restore SYSLIB0057
6971
}
7072

7173
return null;
@@ -109,7 +111,9 @@ static X509Certificate2 PersistKey(X509Certificate2 fullCertificate) {
109111
// We need to force the key to be persisted.
110112
// See https://github.com/dotnet/runtime/issues/23749
111113
var certificateBytes = fullCertificate.Export(X509ContentType.Pkcs12, "");
114+
#pragma warning disable SYSLIB0057
112115
return new X509Certificate2(certificateBytes, "", X509KeyStorageFlags.DefaultKeySet);
116+
#pragma warning restore SYSLIB0057
113117
}
114118
}
115119
}

src/DotPulsar.Extensions.OpenTelemetry/DotPulsar.Extensions.OpenTelemetry.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<RootNamespace>DotPulsar</RootNamespace>
55
<PackageTags>$(PackageTags);Pulsar</PackageTags>
66
<Description>DotPulsar.OpenTelemetry integrates DotPulsar with OpenTelemetry APIs.</Description>
7-
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
7+
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
88
<ImplicitUsings>enable</ImplicitUsings>
99
<Nullable>enable</Nullable>
1010
<LangVersion>latest</LangVersion>

src/DotPulsar.Extensions.Resiliency/DotPulsar.Extensions.Resiliency.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<RootNamespace>DotPulsar</RootNamespace>
55
<PackageTags>$(PackageTags);Pulsar</PackageTags>
66
<Description>DotPulsar.Extensions.Resiliency adds resiliency extensions working with Pulsar.</Description>
7-
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
7+
<TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
88
<ImplicitUsings>enable</ImplicitUsings>
99
<Nullable>enable</Nullable>
1010
<LangVersion>latest</LangVersion>

src/DotPulsar.Extensions.Resiliency/Extensions/DeadLetterPolicy.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,23 @@ public DeadLetterPolicy(
5757
var lazyDeadLetterProducer = new Lazy<IProducer<ReadOnlySequence<byte>>>(() => deadLetterProducerBuilder.CreateResilient(resiliencePipeline));
5858
disposeDeadLetterProducer = () => lazyDeadLetterProducer.IsValueCreated
5959
? lazyDeadLetterProducer.Value.DisposeAsync()
60+
#if NET6_0_OR_GREATER
6061
: ValueTask.CompletedTask;
62+
#else
63+
: default;
64+
#endif
6165
deadLetterProducer = async (metadata, message, ct) => await lazyDeadLetterProducer.Value.Send(metadata, message, ct).ConfigureAwait(false);
6266
}
6367

6468
if (retryProducerBuilder != null) {
6569
var lazyRetryProducer = new Lazy<IProducer<ReadOnlySequence<byte>>>(() => retryProducerBuilder.CreateResilient(resiliencePipeline));
6670
disposeRetryProducer = () => lazyRetryProducer.IsValueCreated
6771
? lazyRetryProducer.Value.DisposeAsync()
72+
#if NET6_0_OR_GREATER
6873
: ValueTask.CompletedTask;
74+
#else
75+
: default;
76+
#endif
6977
retryProducer = async (metadata, message, ct) => await lazyRetryProducer.Value.Send(metadata, message, ct).ConfigureAwait(false);
7078
}
7179

@@ -95,7 +103,13 @@ public async ValueTask DisposeAsync() {
95103
}
96104

97105
public async ValueTask ReconsumeLater(IMessage message, TimeSpan? delayTime = null, IEnumerable<KeyValuePair<string, string?>>? customProperties = null, bool preventRetry = false, CancellationToken cancellationToken = default) {
106+
#if NET6_0_OR_GREATER
98107
ArgumentNullException.ThrowIfNull(message);
108+
#else
109+
if (message == null) {
110+
throw new ArgumentNullException(nameof(message));
111+
}
112+
#endif
99113

100114
var metadata = PrepareMetadata(message, delayTime ?? RetryDelay, customProperties);
101115
if (retryProducer != null && !preventRetry) {
@@ -133,8 +147,8 @@ static MessageMetadata PrepareMetadata(IMessage message, TimeSpan? delayTime, IE
133147
metadata.OrderingKey = message.OrderingKey;
134148
}
135149

136-
foreach (var (key, value) in message.Properties) {
137-
metadata[key] = value;
150+
foreach (var property in message.Properties) {
151+
metadata[property.Key] = property.Value;
138152
}
139153

140154
if (message.Properties.TryGetValue(DelayTimeMetadataKey, out var delayValue) && int.TryParse(delayValue, out var delayMillis)) {
@@ -153,9 +167,9 @@ static MessageMetadata PrepareMetadata(IMessage message, TimeSpan? delayTime, IE
153167
metadata[OriginMessageIdMetadataKey] = message.MessageId.ToString();
154168

155169
if (customProperties != null) {
156-
foreach (var (key, value) in customProperties) {
157-
if (value != null) {
158-
metadata[key] = value;
170+
foreach (var property in customProperties) {
171+
if (property.Value != null) {
172+
metadata[property.Key] = property.Value;
159173
}
160174
}
161175
}

src/DotPulsar.Extensions.Resiliency/Extensions/PulsarResilientExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,13 @@ public static bool ShouldRetryProducerException(Exception? exception) {
7272
}
7373

7474
public static IProducer<TMessage> CreateResilient<TMessage>(this IProducerBuilder<TMessage> producerBuilder, ResiliencePipeline? resiliencePipeline) {
75+
#if NET6_0_OR_GREATER
7576
ArgumentNullException.ThrowIfNull(producerBuilder);
77+
#else
78+
if (producerBuilder == null) {
79+
throw new ArgumentNullException(nameof(producerBuilder));
80+
}
81+
#endif
7682

7783
if (resiliencePipeline == null || Equals(resiliencePipeline, ResiliencePipeline.Empty)) {
7884
return producerBuilder.Create();

src/DotPulsar.Extensions.Resiliency/Internal/ResilientProducer.cs

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public ResilientProducer(IProducerBuilder<TMessage> producerBuilder, ResilienceP
3333
producer = GetOrCreateProducer();
3434
ServiceUrl = producer.ServiceUrl;
3535
Topic = producer.Topic;
36+
State = new ResilienceState(this);
3637
SendChannel = new ResilienceSendChannel(this);
3738
}
3839

@@ -44,6 +45,10 @@ public string Topic {
4445
get;
4546
}
4647

48+
public IState<ProducerState> State {
49+
get;
50+
}
51+
4752
public ISendChannel<TMessage> SendChannel {
4853
get;
4954
}
@@ -79,24 +84,6 @@ private IProducer<TMessage> GetOrCreateProducer() {
7984
return result;
8085
}
8186

82-
public bool IsFinalState() => disposed;
83-
84-
public bool IsFinalState(ProducerState state) => GetOrCreateProducer().IsFinalState(state);
85-
86-
public ValueTask<ProducerState> OnStateChangeTo(ProducerState state, CancellationToken cancellationToken) {
87-
return resiliencePipeline.ExecuteAsync(async static (args, ct) => {
88-
var (instance, state) = args;
89-
return await instance.GetOrCreateProducer().OnStateChangeTo(state, ct).ConfigureAwait(false);
90-
}, (this, state), cancellationToken);
91-
}
92-
93-
public ValueTask<ProducerState> OnStateChangeFrom(ProducerState state, CancellationToken cancellationToken = new CancellationToken()) {
94-
return resiliencePipeline.ExecuteAsync(async static (args, ct) => {
95-
var (instance, state) = args;
96-
return await instance.GetOrCreateProducer().OnStateChangeFrom(state, ct).ConfigureAwait(false);
97-
}, (this, state), cancellationToken);
98-
}
99-
10087
#pragma warning disable CA1816
10188
public ValueTask DisposeAsync() {
10289
if (!disposed) {
@@ -106,7 +93,11 @@ public ValueTask DisposeAsync() {
10693
return last.DisposeAsync();
10794
}
10895
}
96+
#if NET6_0_OR_GREATER
10997
return ValueTask.CompletedTask;
98+
#else
99+
return default;
100+
#endif
110101
}
111102
#pragma warning restore CA1816
112103

@@ -119,19 +110,50 @@ public StateChangedHandler(ResilientProducer<TMessage> instance) {
119110
}
120111

121112
public ValueTask OnStateChanged(ProducerStateChanged stateChanged, CancellationToken cancellationToken = new CancellationToken()) {
122-
if (stateChanged.Producer.IsFinalState(stateChanged.ProducerState)) {
113+
if (stateChanged.Producer.State.IsFinalState(stateChanged.ProducerState)) {
123114
var toDispose = Interlocked.CompareExchange(ref instance.producer, null, (IProducer<TMessage>)stateChanged.Producer);
124115
if (toDispose != null) {
125116
return toDispose.DisposeAsync();
126117
}
127118
}
128119

120+
#if NET6_0_OR_GREATER
129121
return ValueTask.CompletedTask;
122+
#else
123+
return default;
124+
#endif
130125
}
131126

132127
public CancellationToken CancellationToken => CancellationToken.None;
133128
}
134129

130+
private sealed class ResilienceState : IState<ProducerState>
131+
{
132+
private readonly ResilientProducer<TMessage> producer;
133+
134+
public ResilienceState(ResilientProducer<TMessage> producer) {
135+
this.producer = producer;
136+
}
137+
138+
public bool IsFinalState() => producer.disposed;
139+
140+
public bool IsFinalState(ProducerState state) => producer.GetOrCreateProducer().State.IsFinalState(state);
141+
142+
public ValueTask<ProducerState> OnStateChangeTo(ProducerState state, CancellationToken cancellationToken) {
143+
return producer.resiliencePipeline.ExecuteAsync(async static (args, ct) => {
144+
var (instance, state) = args;
145+
return await instance.GetOrCreateProducer().State.OnStateChangeTo(state, ct).ConfigureAwait(false);
146+
}, (producer, state), cancellationToken);
147+
}
148+
149+
public ValueTask<ProducerState> OnStateChangeFrom(ProducerState state, CancellationToken cancellationToken = new CancellationToken()) {
150+
return producer.resiliencePipeline.ExecuteAsync(async static (args, ct) => {
151+
var (instance, state) = args;
152+
return await instance.GetOrCreateProducer().State.OnStateChangeFrom(state, ct).ConfigureAwait(false);
153+
}, (producer, state), cancellationToken);
154+
}
155+
}
156+
135157
private sealed class ResilienceSendChannel : ISendChannel<TMessage>
136158
{
137159
private readonly ResilientProducer<TMessage> producer;
@@ -153,7 +175,7 @@ public void Complete() {
153175
}
154176

155177
public ValueTask Completion(CancellationToken cancellationToken) {
156-
return producer.producer?.SendChannel.Completion(cancellationToken) ?? ValueTask.CompletedTask;
178+
return producer.producer?.SendChannel.Completion(cancellationToken) ?? default;
157179
}
158180
}
159181
}

src/DotPulsar.Extensions.Schemas/DotPulsar.Extensions.Schemas.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<RootNamespace>DotPulsar</RootNamespace>
55
<PackageTags>$(PackageTags);Pulsar</PackageTags>
66
<Description>DotPulsar.Extensions.Schemas adds support for using Json and ProtoBuf producers, consumers, and receivers.</Description>
7-
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
7+
<TargetFrameworks>netstandard2.1;net6.0;net7.0;net8.0;net9.0</TargetFrameworks>
88
<ImplicitUsings>enable</ImplicitUsings>
99
<Nullable>enable</Nullable>
1010
<LangVersion>latest</LangVersion>
@@ -17,6 +17,10 @@
1717
<PackageReference Include="DotPulsar" />
1818
</ItemGroup>
1919

20+
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.1'">
21+
<PackageReference Include="System.Text.Json" />
22+
</ItemGroup>
23+
2024
<ItemGroup>
2125
<None Include="README.md" Pack="true" PackagePath="" />
2226
</ItemGroup>

test/DotPulsar.Extensions.DependencyInjection.Tests/DotPulsar.Extensions.DependencyInjection.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<RootNamespace>DotPulsar</RootNamespace>
5-
<TargetFramework>net8.0</TargetFramework>
5+
<TargetFramework>net9.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
<LangVersion>latest</LangVersion>

0 commit comments

Comments
 (0)