| File: Infrastructure\DotNetStreamReferenceJsonConverter.cs | Web Access |
| Project: src\aspnetcore\src\JSInterop\Microsoft.JSInterop\src\Microsoft.JSInterop.csproj (Microsoft.JSInterop) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Text.Json; using System.Text.Json.Serialization; namespace Microsoft.JSInterop.Infrastructure; internal sealed class DotNetStreamReferenceJsonConverter : JsonConverter<DotNetStreamReference> { private static readonly JsonEncodedText DotNetStreamRefKey = JsonEncodedText.Encode("__dotNetStream"); public DotNetStreamReferenceJsonConverter(JSRuntime jsRuntime) { JSRuntime = jsRuntime; } public JSRuntime JSRuntime { get; } public override DotNetStreamReference Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => throw new NotSupportedException($"{nameof(DotNetStreamReference)} cannot be supplied from JavaScript to .NET because the stream contents have already been transferred."); public override void Write(Utf8JsonWriter writer, DotNetStreamReference value, JsonSerializerOptions options) { // We only serialize a DotNetStreamReference using this converter when we're supplying that info // to JS. We want to transmit the stream immediately as part of this process, so that the .NET side // doesn't have to hold onto the stream waiting for JS to request it. If a developer doesn't really // want to send the data, they shouldn't include the DotNetStreamReference in the object graph // they are sending to the JS side. var id = JSRuntime.BeginTransmittingStream(value); writer.WriteStartObject(); writer.WriteNumber(DotNetStreamRefKey, id); writer.WriteEndObject(); } }