Skip to content

Commit

Permalink
Migrate from Newtonsoft to System.Text.Json (#91)
Browse files Browse the repository at this point in the history
Co-authored-by: MD Ashique <noorani.ashique5@gmail.com>
Signed-off-by: Shubham Sharma <shubhash@microsoft.com>

This PR updates the codebase to use STJ (System.Text.Json) instead of Newtonsoft. There are a few updates

- Instead of JToken, all internal classes use JsonElement (STJ) for storing data, along with a custom JsonElementConverter that converts with UnsafeRelaxedJsonEscaping.
- The APIs support both STJ and NS as method parameters - this is because the underlying functions framework does not support expressions using STJ
- The method return type and all internals are STJ based only
- Update CloudEvents to 2.6.0
- Add Generic Converter base class for converting JsonElement to T types
- Add new tests
  • Loading branch information
shubham1172 authored Apr 6, 2023
1 parent a2a5696 commit 1f8e283
Show file tree
Hide file tree
Showing 71 changed files with 884 additions and 414 deletions.
2 changes: 1 addition & 1 deletion all.sln → Azure.Functions.Dapr.Extension.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29806.167
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extension.Dapr", "src\Microsoft.Azure.WebJobs.Extension.Dapr\Microsoft.Azure.WebJobs.Extension.Dapr.csproj", "{6D6AD659-C741-4AD8-B1AE-CC731A7B21EE}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Dapr", "src\Microsoft.Azure.WebJobs.Extensions.Dapr\Microsoft.Azure.WebJobs.Extensions.Dapr.csproj", "{6D6AD659-C741-4AD8-B1AE-CC731A7B21EE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DaprExtensionTests", "test\DaprExtensionTests\DaprExtensionTests.csproj", "{8F4768AF-D8B6-40CC-8FCA-C4EC32D442A9}"
EndProject
Expand Down
2 changes: 1 addition & 1 deletion docs/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ The following will get you started with a Function app that leverages the Dapr e
While this extension is in preview it is not included in the default extension bundle for functions. We can still include it, but will need to manually install it into the project, and opt-out to using the default extensions.

1. Open the `host.json` file from the root of the project and remove the `extensionBundle` property and values (if they exist). Save the file.
1. Run `func extensions install -p Microsoft.Azure.WebJobs.Extension.Dapr -v 1.0.0`. Be sure to use the latest version as published on [NuGet](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extension.Dapr).
1. Run `func extensions install -p Microsoft.Azure.WebJobs.Extensions.Dapr -v 1.0.0`. Be sure to use the latest version as published on [NuGet](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Dapr).

You can validate the extension installed successfully by running the function. Run `func start` and validate the app loads and the startup contains the logs

Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/BuildContainerImage.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ If you have updated the sample code to fit your scenario, you need to create new

1. Update function app as you see fit!
2. Build Docker image.
The sample project has a **project reference** for the `Microsoft.Azure.WebJobs.Extension.Dapr`, instead of a **nuget package reference**.
The sample project has a **project reference** for the `Microsoft.Azure.WebJobs.Extensions.Dapr`, instead of a **nuget package reference**.
Run docker build command from repo root and specify your image name:
```
docker build -f samples/dotnet-azurefunction/Dockerfile -t mydocker-image .
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/ConsumeMessageFromKafka.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace dotnet_azurefunction
{
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/CreateNewOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Newtonsoft.Json.Linq;

public static class CreateNewOrder
Expand Down
4 changes: 2 additions & 2 deletions samples/dotnet-azurefunction/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS installer-env

# Copy the Microsoft.Azure.WebJobs.Extension.Dapr, style cop, and dotnet sample into the installer-env to build
COPY /src/Microsoft.Azure.WebJobs.Extension.Dapr /src/src/Microsoft.Azure.WebJobs.Extension.Dapr
# Copy the Microsoft.Azure.WebJobs.Extensions.Dapr, style cop, and dotnet sample into the installer-env to build
COPY /src/Microsoft.Azure.WebJobs.Extensions.Dapr /src/src/Microsoft.Azure.WebJobs.Extensions.Dapr
COPY /.stylecop /src/.stylecop
COPY /samples/dotnet-azurefunction /src/samples/dotnet-function-app

Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/InvokeOutputBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace dotnet_azurefunction
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;

public static class InvokeOutputBinding
{
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/PrintTopicMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using CloudNative.CloudEvents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Microsoft.Extensions.Logging;

public static class PrintTopicMessage
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/PublishOutputBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace dotnet_azurefunction
using System.IO;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/RetrieveOrder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;

public static class RetrieveOrder
{
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/RetrieveSecret.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using System.Collections.Generic;

public static class RetrieveSecret
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/RetrieveSecretLocal.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using System.Collections.Generic;

public static class RetrieveSecretLocal
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/SendMessageToKafka.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Newtonsoft.Json.Linq;
using System.Threading.Tasks;

Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/StateInputBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace dotnet_azurefunction
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Microsoft.Extensions.Logging;

public static class StateInputBinding
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/StateOutputBinding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace dotnet_azurefunction
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;

public static class StateOutputBinding
{
Expand Down
2 changes: 1 addition & 1 deletion samples/dotnet-azurefunction/TransferEventBetweenTopics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace dotnet_azurefunction
{
using CloudNative.CloudEvents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extension.Dapr;
using Microsoft.Azure.WebJobs.Extensions.Dapr;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;

Expand Down
4 changes: 2 additions & 2 deletions samples/dotnet-azurefunction/dotnet-azurefunction.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
</ItemGroup>
<ItemGroup>
<!-- Switch to Nuget Reference by uncommenting following line and removing the Project Reference -->
<!--<PackageReference Include="Microsoft.Azure.WebJobs.Extension.Dapr" Version="$(NupkgVersion)" />-->
<ProjectReference Include="..\..\src\Microsoft.Azure.WebJobs.Extension.Dapr\Microsoft.Azure.WebJobs.Extension.Dapr.csproj" />
<!--<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Dapr" Version="$(NupkgVersion)" />-->
<ProjectReference Include="..\..\src\Microsoft.Azure.WebJobs.Extensions.Dapr\Microsoft.Azure.WebJobs.Extensions.Dapr.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
Expand Down
2 changes: 1 addition & 1 deletion samples/javascript-azurefunction/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ dotnet build -o bin extensions.csproj
Note that this extensions.csproj file is required in order to reference the exception as a project rather than as an nuget package. To do the equivalent step with a published version of the extension on nuget.org, run the following step:

```
func extensions install -p Microsoft.Azure.WebJobs.Extension.Dapr -v <version>
func extensions install -p Microsoft.Azure.WebJobs.Extensions.Dapr -v <version>
```

Run function host with Dapr:
Expand Down
2 changes: 1 addition & 1 deletion samples/javascript-azurefunction/extensions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
<PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.Azure.WebJobs.Extension.Dapr\Microsoft.Azure.WebJobs.Extension.Dapr.csproj" />
<ProjectReference Include="..\..\src\Microsoft.Azure.WebJobs.Extensions.Dapr\Microsoft.Azure.WebJobs.Extensions.Dapr.csproj" />
</ItemGroup>
</Project>
6 changes: 3 additions & 3 deletions samples/python-azurefunction/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ dotnet build -o bin/ extensions.csproj
Note that this extensions.csproj file is required in order to reference the exception as a project rather than as an nuget package. To do the equivalent step with a published version of the extension on nuget.org, run the following step:

```
func extensions install -p Microsoft.Azure.WebJobs.Extension.Dapr -v <version>
func extensions install -p Microsoft.Azure.WebJobs.Extensions.Dapr -v <version>
```

Run function host with Dapr. `--components-path` flag specifies the directory stored all Dapr Components for this sample. They should be language ignostic.
Expand Down Expand Up @@ -116,9 +116,9 @@ You're up and running! Both Dapr and your app logs will appear here.
When running `dotnet build`, if you see the error below:
```
Project Microsoft.Azure.WebJobs.Extension.Dapr is not compatible with netcore31 (.NETCore,Version=v3.1). Project Microsoft.Azure.WebJobs.Extension.Dapr supports: netstandard2.0 (.NETStandard,Version=v2.0)
Project Microsoft.Azure.WebJobs.Extensions.Dapr is not compatible with netcore31 (.NETCore,Version=v3.1). Project Microsoft.Azure.WebJobs.Extensions.Dapr supports: netstandard2.0 (.NETStandard,Version=v2.0)
```
Make sure the target framework for `extension.proj` is netstandard 2.0. Since a project reference for the Dapr Extension exists, build step tries to restore `Microsoft.Azure.WebJobs.Extension.Dapr.csproj` as other non-compatible framework, but Dapr Extension is using netstandard 2.0 framework. If you switch to a package reference, this should not be a concern since netstandard2.0 is compatible with netcore31.
Make sure the target framework for `extension.proj` is netstandard 2.0. Since a project reference for the Dapr Extension exists, build step tries to restore `Microsoft.Azure.WebJobs.Extensions.Dapr.csproj` as other non-compatible framework, but Dapr Extension is using netstandard 2.0 framework. If you switch to a package reference, this should not be a concern since netstandard2.0 is compatible with netcore31.
# Step 3 - Understand the Sample
Expand Down
2 changes: 1 addition & 1 deletion samples/python-azurefunction/extensions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
<PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.Azure.WebJobs.Extension.Dapr\Microsoft.Azure.WebJobs.Extension.Dapr.csproj" />
<ProjectReference Include="..\..\src\Microsoft.Azure.WebJobs.Extensions.Dapr\Microsoft.Azure.WebJobs.Extensions.Dapr.csproj" />
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion samples/quickstart/extensions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<DefaultItemExcludes>**</DefaultItemExcludes>
</PropertyGroup>
<ItemGroup>
<!-- TODO: Update this to Microsoft.Azure.WebJobs.Extension.Dapr once it is published to NuGet -->
<!-- TODO: Update this to Microsoft.Azure.WebJobs.Extensions.Dapr once it is published to NuGet -->
<PackageReference Include="Dapr.AzureFunctions.Extension" Version="0.8.0-preview01" />
<PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.3" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
// ------------------------------------------------------------

namespace Microsoft.Azure.WebJobs.Extensions.Dapr.Bindings.Converters
{
using System.IO;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Dapr.Services;

/// <summary>
/// A base class for generic converters.
/// </summary>
/// <typeparam name="T1">Type of the input data.</typeparam>
/// <typeparam name="T2">Type of the output data after conversion.</typeparam>
internal abstract class DaprGenericsConverterBase<T1, T2> : IAsyncConverter<T1, T2>
{
readonly DaprServiceClient daprClient;

public DaprGenericsConverterBase(DaprServiceClient daprClient)
{
this.daprClient = daprClient;
}

/// <summary>
/// Gets the string representation of the input data of type T1.
/// </summary>
/// <param name="input">The input data to be serialized.</param>
/// <param name="cancellationToken">Cancellation token.</param>
public abstract Task<string> GetStringContentAsync(T1 input, CancellationToken cancellationToken);

/// <summary>
/// Converts the input data of type T1 to the output data of type T2.
/// </summary>
/// <param name="input">The input data to be converted.</param>
/// <param name="cancellationToken">Cancellation token.</param>
async Task<T2> IAsyncConverter<T1, T2>.ConvertAsync(
T1 input,
CancellationToken cancellationToken)
{
string result = await this.GetStringContentAsync(input, cancellationToken);
return JsonSerializer.Deserialize<T2>(result)
?? throw new InvalidDataException("Unable to deserialize the secret.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,23 @@
// Licensed under the MIT License.
// ------------------------------------------------------------

namespace Microsoft.Azure.WebJobs.Extension.Dapr
namespace Microsoft.Azure.WebJobs.Extensions.Dapr.Bindings.Converters
{
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Newtonsoft.Json;
using Microsoft.Azure.WebJobs.Extensions.Dapr.Services;
using Microsoft.Azure.WebJobs.Extensions.Dapr.Utils;
using Newtonsoft.Json.Linq;

class DaprSecretConverter :
IAsyncConverter<DaprSecretAttribute, JObject>,
IAsyncConverter<DaprSecretAttribute, IDictionary<string, string>>,
IAsyncConverter<DaprSecretAttribute, byte[]>,
IAsyncConverter<DaprSecretAttribute, string?>
IAsyncConverter<DaprSecretAttribute, string?>,
IAsyncConverter<DaprSecretAttribute, JsonElement>,
IAsyncConverter<DaprSecretAttribute, JObject>
{
readonly DaprServiceClient daprClient;

Expand All @@ -26,39 +28,38 @@ public DaprSecretConverter(DaprServiceClient daprClient)
this.daprClient = daprClient;
}

Task<JObject> IAsyncConverter<DaprSecretAttribute, JObject>.ConvertAsync(
async Task<byte[]> IAsyncConverter<DaprSecretAttribute, byte[]>.ConvertAsync(
DaprSecretAttribute input,
CancellationToken cancellationToken)
{
return this.GetSecretsAsync(input, cancellationToken);
JsonDocument result = await this.GetSecretsAsync(input, cancellationToken);
return Encoding.UTF8.GetBytes(JsonSerializer.Serialize(result, JsonUtils.DefaultSerializerOptions));
}

async Task<IDictionary<string, string>> IAsyncConverter<DaprSecretAttribute, IDictionary<string, string>>.ConvertAsync(
async Task<string?> IAsyncConverter<DaprSecretAttribute, string?>.ConvertAsync(
DaprSecretAttribute input,
CancellationToken cancellationToken)
{
JObject result = await this.GetSecretsAsync(input, cancellationToken);
var obj = result.ToObject<Dictionary<string, string>>();
return obj ?? new Dictionary<string, string>();
JsonDocument result = await this.GetSecretsAsync(input, cancellationToken);
return JsonSerializer.Serialize(result, JsonUtils.DefaultSerializerOptions);
}

async Task<byte[]> IAsyncConverter<DaprSecretAttribute, byte[]>.ConvertAsync(
async Task<JsonElement> IAsyncConverter<DaprSecretAttribute, JsonElement>.ConvertAsync(
DaprSecretAttribute input,
CancellationToken cancellationToken)
{
JObject result = await this.GetSecretsAsync(input, cancellationToken);
return Encoding.UTF8.GetBytes(result.ToString(Formatting.None));
return (await this.GetSecretsAsync(input, cancellationToken)).RootElement;
}

async Task<string?> IAsyncConverter<DaprSecretAttribute, string?>.ConvertAsync(
async Task<JObject> IAsyncConverter<DaprSecretAttribute, JObject>.ConvertAsync(
DaprSecretAttribute input,
CancellationToken cancellationToken)
{
JObject result = await this.GetSecretsAsync(input, cancellationToken);
return result?.ToString(Formatting.None);
JsonDocument result = await this.GetSecretsAsync(input, cancellationToken);
return JObject.Parse(JsonSerializer.Serialize(result, JsonUtils.DefaultSerializerOptions));
}

Task<JObject> GetSecretsAsync(DaprSecretAttribute input, CancellationToken cancellationToken)
private Task<JsonDocument> GetSecretsAsync(DaprSecretAttribute input, CancellationToken cancellationToken)
{
return this.daprClient.GetSecretAsync(
input.DaprAddress,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
// ------------------------------------------------------------

namespace Microsoft.Azure.WebJobs.Extensions.Dapr.Bindings.Converters
{
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Dapr.Services;
using Microsoft.Azure.WebJobs.Extensions.Dapr.Utils;

internal class DaprSecretsGenericsConverter<T> : DaprGenericsConverterBase<DaprSecretAttribute, T>
{
readonly DaprServiceClient daprClient;

public DaprSecretsGenericsConverter(DaprServiceClient daprClient)
: base(daprClient)
{
this.daprClient = daprClient;
}

/// <summary>
/// Gets the string representation of DaprSecretAttribute.
/// </summary>
/// <param name="input">The DaprSecretAttribute to be serialized.</param>
/// <param name="cancellationToken">Cancellation token.</param>
public async override Task<string> GetStringContentAsync(DaprSecretAttribute input, CancellationToken cancellationToken)
{
var secret = await this.daprClient.GetSecretAsync(
input.DaprAddress,
input.SecretStoreName,
input.Key,
input.Metadata,
cancellationToken);
return JsonSerializer.Serialize(secret, JsonUtils.DefaultSerializerOptions);
}
}
}
Loading

0 comments on commit 1f8e283

Please sign in to comment.