using System.Buffers; using System.Buffers.Text; using System.Text.Json; using System.Text.Json.Serialization; namespace IdentityShroud.Core.Helpers; public class Base64UrlConverter : JsonConverter { public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // GetValueSpan gives you the raw UTF-8 bytes of the JSON string value if (reader.HasValueSequence) { var valueSequence = reader.ValueSequence.ToArray(); return Base64Url.DecodeFromUtf8(valueSequence); } return Base64Url.DecodeFromUtf8(reader.ValueSpan); } public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options) { int encodedLength = Base64Url.GetEncodedLength(value.Length); Span buffer = encodedLength <= 256 ? stackalloc byte[encodedLength] : new byte[encodedLength]; Base64Url.EncodeToUtf8(value, buffer); writer.WriteStringValue(buffer); } }