File: Implementation\JSStreamReference.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.

namespace Microsoft.JSInterop.Implementation;

/// <summary>
/// Implements functionality for <see cref="IJSStreamReference"/>.
/// </summary>
public sealed class JSStreamReference : JSObjectReference, IJSStreamReference
{
    private readonly JSRuntime _jsRuntime;

    /// <inheritdoc />
    public long Length { get; }

    /// <summary>
    /// Initializes a new <see cref="JSStreamReference"/> instance.
    /// </summary>
    /// <param name="jsRuntime">The <see cref="JSRuntime"/> used for invoking JS interop calls.</param>
    /// <param name="id">The unique identifier.</param>
    /// <param name="totalLength">The length of the data stream coming from JS represented by this data reference.</param>
    internal JSStreamReference(JSRuntime jsRuntime, long id, long totalLength) : base(jsRuntime, id)
    {
        if (totalLength <= 0)
        {
            throw new ArgumentOutOfRangeException(nameof(totalLength), totalLength, "Length must be a positive value.");
        }

        _jsRuntime = jsRuntime;
        Length = totalLength;
    }

    /// <inheritdoc />
    async ValueTask<Stream> IJSStreamReference.OpenReadStreamAsync(long maxAllowedSize, CancellationToken cancellationToken)
    {
        if (Length > maxAllowedSize)
        {
            throw new ArgumentOutOfRangeException(nameof(maxAllowedSize), $"The incoming data stream of length {Length} exceeds the maximum allowed length {maxAllowedSize}.");
        }

        return await _jsRuntime.ReadJSDataAsStreamAsync(this, Length, cancellationToken);
    }
}