From 64de230601bd3f8b251aef41bf114e10c5a51ced Mon Sep 17 00:00:00 2001 From: Tanay Parikh Date: Tue, 13 Jul 2021 22:36:49 -0700 Subject: [PATCH 1/3] Address `JS` to `DotNet` byte[] Interop API Review Feedback Fixes: https://github.com/dotnet/aspnetcore/issues/34327 --- .../Server/src/Circuits/RemoteJSDataStream.cs | 14 +++++--------- .../Server/src/Circuits/RemoteJSRuntime.cs | 4 ++-- .../test/Circuits/RemoteJSDataStreamTest.cs | 12 ++++++------ .../Services/DefaultWebAssemblyJSRuntime.cs | 2 +- .../WebView/src/Services/WebViewJSRuntime.cs | 2 +- .../src/IJSStreamReference.cs | 19 +------------------ .../src/Implementation/JSStreamReference.cs | 4 ++-- .../Microsoft.JSInterop/src/JSRuntime.cs | 19 +------------------ .../src/PublicAPI.Unshipped.txt | 4 ++-- 9 files changed, 21 insertions(+), 59 deletions(-) diff --git a/src/Components/Server/src/Circuits/RemoteJSDataStream.cs b/src/Components/Server/src/Circuits/RemoteJSDataStream.cs index fa10c2a26bf3..67483b4f9981 100644 --- a/src/Components/Server/src/Circuits/RemoteJSDataStream.cs +++ b/src/Components/Server/src/Circuits/RemoteJSDataStream.cs @@ -40,22 +40,20 @@ public static async ValueTask CreateRemoteJSDataStreamAsync( RemoteJSRuntime runtime, IJSStreamReference jsStreamReference, long totalLength, - long maximumIncomingBytes, + long signalRMaximumIncomingBytes, TimeSpan jsInteropDefaultCallTimeout, - long pauseIncomingBytesThreshold = -1, - long resumeIncomingBytesThreshold = -1, CancellationToken cancellationToken = default) { // Enforce minimum 1 kb, maximum 50 kb, SignalR message size. // We budget 512 bytes overhead for the transfer, thus leaving at least 512 bytes for data // transfer per chunk with a 1 kb message size. // Additionally, to maintain interactivity, we put an upper limit of 50 kb on the message size. - var chunkSize = maximumIncomingBytes > 1024 ? - Math.Min(maximumIncomingBytes, 50*1024) - 512 : + var chunkSize = signalRMaximumIncomingBytes > 1024 ? + Math.Min(signalRMaximumIncomingBytes, 50*1024) - 512 : throw new ArgumentException($"SignalR MaximumIncomingBytes must be at least 1 kb."); var streamId = runtime.RemoteJSDataStreamNextInstanceId++; - var remoteJSDataStream = new RemoteJSDataStream(runtime, streamId, totalLength, jsInteropDefaultCallTimeout, pauseIncomingBytesThreshold, resumeIncomingBytesThreshold, cancellationToken); + var remoteJSDataStream = new RemoteJSDataStream(runtime, streamId, totalLength, jsInteropDefaultCallTimeout, cancellationToken); await runtime.InvokeVoidAsync("Blazor._internal.sendJSDataStream", jsStreamReference, streamId, chunkSize); return remoteJSDataStream; } @@ -65,8 +63,6 @@ private RemoteJSDataStream( long streamId, long totalLength, TimeSpan jsInteropDefaultCallTimeout, - long pauseIncomingBytesThreshold, - long resumeIncomingBytesThreshold, CancellationToken cancellationToken) { _runtime = runtime; @@ -80,7 +76,7 @@ private RemoteJSDataStream( _runtime.RemoteJSDataStreamInstances.Add(_streamId, this); - _pipe = new Pipe(new PipeOptions(pauseWriterThreshold: pauseIncomingBytesThreshold, resumeWriterThreshold: resumeIncomingBytesThreshold)); + _pipe = new Pipe(); _pipeReaderStream = _pipe.Reader.AsStream(); PipeReader = _pipe.Reader; } diff --git a/src/Components/Server/src/Circuits/RemoteJSRuntime.cs b/src/Components/Server/src/Circuits/RemoteJSRuntime.cs index f51fefb27ff1..42e25ff9a180 100644 --- a/src/Components/Server/src/Circuits/RemoteJSRuntime.cs +++ b/src/Components/Server/src/Circuits/RemoteJSRuntime.cs @@ -157,8 +157,8 @@ public void MarkPermanentlyDisconnected() _clientProxy = null; } - protected override async Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, CancellationToken cancellationToken = default) - => await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(this, jsStreamReference, totalLength, _maximumIncomingBytes, _options.JSInteropDefaultCallTimeout, pauseIncomingBytesThreshold, resumeIncomingBytesThreshold, cancellationToken); + protected override async Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, CancellationToken cancellationToken = default) + => await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(this, jsStreamReference, totalLength, _maximumIncomingBytes, _options.JSInteropDefaultCallTimeout, cancellationToken); public static class Log { diff --git a/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs b/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs index 85cf6bd28957..73837b43ea0a 100644 --- a/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs +++ b/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs @@ -27,7 +27,7 @@ public async Task CreateRemoteJSDataStreamAsync_CreatesStream() var jsStreamReference = Mock.Of(); // Act - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(_jsRuntime, jsStreamReference, totalLength: 100, maximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None).DefaultTimeout(); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(_jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None).DefaultTimeout(); // Assert Assert.NotNull(remoteJSDataStream); @@ -146,7 +146,7 @@ public async Task ReceiveData_ProvidedWithMoreBytesThanRemaining() // Arrange var jsRuntime = new TestRemoteJSRuntime(Options.Create(new CircuitOptions()), Options.Create(new HubOptions()), Mock.Of>()); var jsStreamReference = Mock.Of(); - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, maximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); var streamId = GetStreamId(remoteJSDataStream, jsRuntime); var chunk = new byte[110]; // 100 byte totalLength for stream @@ -166,7 +166,7 @@ public async Task ReceiveData_ProvidedWithOutOfOrderChunk_SimulatesSignalRDiscon // Arrange var jsRuntime = new TestRemoteJSRuntime(Options.Create(new CircuitOptions()), Options.Create(new HubOptions()), Mock.Of>()); var jsStreamReference = Mock.Of(); - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, maximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); var streamId = GetStreamId(remoteJSDataStream, jsRuntime); var chunk = new byte[5]; @@ -201,7 +201,7 @@ public async Task ReceiveData_NoDataProvidedBeforeTimeout_StreamDisposed() jsRuntime, jsStreamReference, totalLength: 15, - maximumIncomingBytes: 10_000, + signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromSeconds(2), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, @@ -244,7 +244,7 @@ public async Task ReceiveData_ReceivesDataThenTimesout_StreamDisposed() jsRuntime, jsStreamReference, totalLength: 15, - maximumIncomingBytes: 10_000, + signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromSeconds(3), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, @@ -281,7 +281,7 @@ public async Task ReceiveData_ReceivesDataThenTimesout_StreamDisposed() private static async Task CreateRemoteJSDataStreamAsync(TestRemoteJSRuntime jsRuntime = null) { var jsStreamReference = Mock.Of(); - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime ?? _jsRuntime, jsStreamReference, totalLength: 100, maximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime ?? _jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); return remoteJSDataStream; } diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs b/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs index c1586fae4c76..ab1b2c6d93fa 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs @@ -96,7 +96,7 @@ public static void NotifyByteArrayAvailable(int id) } /// - protected override Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, CancellationToken cancellationToken = default) + protected override Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, CancellationToken cancellationToken = default) => Task.FromResult(PullFromJSDataStream.CreateJSDataStream(this, jsStreamReference, totalLength, cancellationToken)); } } diff --git a/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs b/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs index 325b5cf276d9..d2f35b3d5473 100644 --- a/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs +++ b/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs @@ -51,7 +51,7 @@ protected override void SendByteArray(int id, byte[] data) _ipcSender.SendByteArray(id, data); } - protected override Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, CancellationToken cancellationToken = default) + protected override Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, CancellationToken cancellationToken = default) => Task.FromResult(PullFromJSDataStream.CreateJSDataStream(this, jsStreamReference, totalLength, cancellationToken)); } } diff --git a/src/JSInterop/Microsoft.JSInterop/src/IJSStreamReference.cs b/src/JSInterop/Microsoft.JSInterop/src/IJSStreamReference.cs index 267256d87c6b..686c323a08c3 100644 --- a/src/JSInterop/Microsoft.JSInterop/src/IJSStreamReference.cs +++ b/src/JSInterop/Microsoft.JSInterop/src/IJSStreamReference.cs @@ -22,25 +22,8 @@ public interface IJSStreamReference : IAsyncDisposable /// Opens a with the for the current data reference. /// /// Maximum number of bytes permitted to be read from JavaScript. - /// - /// The number of unconsumed bytes to accept from JS before blocking. - /// Defaults to -1, which indicates use of the default . - /// Avoid specifying an excessively large value because this could allow clients to exhaust memory. - /// A value of zero prevents JS from blocking, allowing .NET to receive an unlimited number of bytes. - /// - /// This only has an effect when using Blazor Server. - /// - /// - /// - /// The number of unflushed bytes at which point JS stops blocking. - /// Defaults to -1, which indicates use of the default . - /// Must be less than the to prevent thrashing at the limit. - /// - /// This only has an effect when using Blazor Server. - /// - /// /// for cancelling read. /// which can provide data associated with the current data reference. - ValueTask OpenReadStreamAsync(long maxAllowedSize = 512000, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, CancellationToken cancellationToken = default); + ValueTask OpenReadStreamAsync(long maxAllowedSize = 512000, CancellationToken cancellationToken = default); } } diff --git a/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSStreamReference.cs b/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSStreamReference.cs index a291c93b924d..842c0bc16df2 100644 --- a/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSStreamReference.cs +++ b/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSStreamReference.cs @@ -36,14 +36,14 @@ internal JSStreamReference(JSRuntime jsRuntime, long id, long totalLength) : bas } /// - async ValueTask IJSStreamReference.OpenReadStreamAsync(long maxLength, long pauseIncomingBytesThreshold, long resumeIncomingBytesThreshold, CancellationToken cancellationToken) + async ValueTask IJSStreamReference.OpenReadStreamAsync(long maxLength, CancellationToken cancellationToken) { if (Length > maxLength) { throw new ArgumentOutOfRangeException(nameof(maxLength), $"The incoming data stream of length {Length} exceeds the maximum length {maxLength}."); } - return await _jsRuntime.ReadJSDataAsStreamAsync(this, Length, pauseIncomingBytesThreshold, resumeIncomingBytesThreshold, cancellationToken); + return await _jsRuntime.ReadJSDataAsStreamAsync(this, Length, cancellationToken); } } } diff --git a/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs b/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs index f740c962d599..b7da01fe5c45 100644 --- a/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs +++ b/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs @@ -215,26 +215,9 @@ protected internal virtual void ReceiveByteArray(int id, byte[] data) /// /// to produce a data stream for. /// Expected length of the incoming data stream. - /// - /// The number of unconsumed bytes to accept from JS before blocking. - /// Defaults to -1, which indicates use of the default . - /// Avoid specifying an excessively large value because this could allow clients to exhaust memory. - /// A value of zero prevents JS from blocking, allowing .NET to receive an unlimited number of bytes. - /// - /// This only has an effect when using Blazor Server. - /// - /// - /// - /// The number of unflushed bytes at which point JS stops blocking. - /// Defaults to -1, which indicates use of the default . - /// Must be less than the to prevent thrashing at the limit. - /// - /// This only has an effect when using Blazor Server. - /// - /// /// for cancelling read. /// for the data reference represented by . - protected internal virtual Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, CancellationToken cancellationToken = default) + protected internal virtual Task ReadJSDataAsStreamAsync(IJSStreamReference jsStreamReference, long totalLength, CancellationToken cancellationToken = default) { // The reason it's virtual and not abstract is just for back-compat diff --git a/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Unshipped.txt b/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Unshipped.txt index 5eaf7afec314..c1c3f1adc9a2 100644 --- a/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Unshipped.txt +++ b/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Unshipped.txt @@ -1,7 +1,7 @@ #nullable enable Microsoft.JSInterop.IJSStreamReference Microsoft.JSInterop.IJSStreamReference.Length.get -> long -Microsoft.JSInterop.IJSStreamReference.OpenReadStreamAsync(long maxAllowedSize = 512000, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask +Microsoft.JSInterop.IJSStreamReference.OpenReadStreamAsync(long maxAllowedSize = 512000, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask Microsoft.JSInterop.Implementation.JSStreamReference Microsoft.JSInterop.Implementation.JSStreamReference.Length.get -> long Microsoft.JSInterop.Implementation.JSObjectReferenceJsonWorker @@ -36,7 +36,7 @@ static Microsoft.JSInterop.JSRuntimeExtensions.InvokeVoidAsync(this Microsoft.JS static Microsoft.JSInterop.JSRuntimeExtensions.InvokeVoidAsync(this Microsoft.JSInterop.IJSRuntime! jsRuntime, string! identifier, System.TimeSpan timeout, params object?[]? args) -> System.Threading.Tasks.ValueTask *REMOVED*static Microsoft.JSInterop.JSRuntimeExtensions.InvokeVoidAsync(this Microsoft.JSInterop.IJSRuntime! jsRuntime, string! identifier, params object![]! args) -> System.Threading.Tasks.ValueTask static Microsoft.JSInterop.JSRuntimeExtensions.InvokeVoidAsync(this Microsoft.JSInterop.IJSRuntime! jsRuntime, string! identifier, params object?[]? args) -> System.Threading.Tasks.ValueTask -virtual Microsoft.JSInterop.JSRuntime.ReadJSDataAsStreamAsync(Microsoft.JSInterop.IJSStreamReference! jsStreamReference, long totalLength, long pauseIncomingBytesThreshold = -1, long resumeIncomingBytesThreshold = -1, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +virtual Microsoft.JSInterop.JSRuntime.ReadJSDataAsStreamAsync(Microsoft.JSInterop.IJSStreamReference! jsStreamReference, long totalLength, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! virtual Microsoft.JSInterop.JSRuntime.ReceiveByteArray(int id, byte[]! data) -> void virtual Microsoft.JSInterop.JSRuntime.SendByteArray(int id, byte[]! data) -> void Microsoft.JSInterop.JSDisconnectedException From 3cc539e90109bef2eaa429562a67d6ffe00f446b Mon Sep 17 00:00:00 2001 From: Tanay Parikh Date: Wed, 14 Jul 2021 09:11:29 -0700 Subject: [PATCH 2/3] Update RemoteJSDataStreamTest.cs --- .../Server/test/Circuits/RemoteJSDataStreamTest.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs b/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs index 73837b43ea0a..721afe1ebb30 100644 --- a/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs +++ b/src/Components/Server/test/Circuits/RemoteJSDataStreamTest.cs @@ -27,7 +27,7 @@ public async Task CreateRemoteJSDataStreamAsync_CreatesStream() var jsStreamReference = Mock.Of(); // Act - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(_jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None).DefaultTimeout(); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(_jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), cancellationToken: CancellationToken.None).DefaultTimeout(); // Assert Assert.NotNull(remoteJSDataStream); @@ -146,7 +146,7 @@ public async Task ReceiveData_ProvidedWithMoreBytesThanRemaining() // Arrange var jsRuntime = new TestRemoteJSRuntime(Options.Create(new CircuitOptions()), Options.Create(new HubOptions()), Mock.Of>()); var jsStreamReference = Mock.Of(); - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), cancellationToken: CancellationToken.None); var streamId = GetStreamId(remoteJSDataStream, jsRuntime); var chunk = new byte[110]; // 100 byte totalLength for stream @@ -166,7 +166,7 @@ public async Task ReceiveData_ProvidedWithOutOfOrderChunk_SimulatesSignalRDiscon // Arrange var jsRuntime = new TestRemoteJSRuntime(Options.Create(new CircuitOptions()), Options.Create(new HubOptions()), Mock.Of>()); var jsStreamReference = Mock.Of(); - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), cancellationToken: CancellationToken.None); var streamId = GetStreamId(remoteJSDataStream, jsRuntime); var chunk = new byte[5]; @@ -203,8 +203,6 @@ public async Task ReceiveData_NoDataProvidedBeforeTimeout_StreamDisposed() totalLength: 15, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromSeconds(2), - pauseIncomingBytesThreshold: 50, - resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); var streamId = GetStreamId(remoteJSDataStream, jsRuntime); var chunk = new byte[] { 3, 5, 7 }; @@ -246,8 +244,6 @@ public async Task ReceiveData_ReceivesDataThenTimesout_StreamDisposed() totalLength: 15, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromSeconds(3), - pauseIncomingBytesThreshold: 50, - resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); var streamId = GetStreamId(remoteJSDataStream, jsRuntime); var chunk = new byte[] { 3, 5, 7 }; @@ -281,7 +277,7 @@ public async Task ReceiveData_ReceivesDataThenTimesout_StreamDisposed() private static async Task CreateRemoteJSDataStreamAsync(TestRemoteJSRuntime jsRuntime = null) { var jsStreamReference = Mock.Of(); - var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime ?? _jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), pauseIncomingBytesThreshold: 50, resumeIncomingBytesThreshold: 25, cancellationToken: CancellationToken.None); + var remoteJSDataStream = await RemoteJSDataStream.CreateRemoteJSDataStreamAsync(jsRuntime ?? _jsRuntime, jsStreamReference, totalLength: 100, signalRMaximumIncomingBytes: 10_000, jsInteropDefaultCallTimeout: TimeSpan.FromMinutes(1), cancellationToken: CancellationToken.None); return remoteJSDataStream; } From f34398f8b9bd6fc579fcdcbaa230192d89cbd354 Mon Sep 17 00:00:00 2001 From: Tanay Parikh Date: Wed, 14 Jul 2021 09:12:21 -0700 Subject: [PATCH 3/3] Update JSRuntimeTest.cs --- src/JSInterop/Microsoft.JSInterop/test/JSRuntimeTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JSInterop/Microsoft.JSInterop/test/JSRuntimeTest.cs b/src/JSInterop/Microsoft.JSInterop/test/JSRuntimeTest.cs index 8e27c40fe5a1..09615293f175 100644 --- a/src/JSInterop/Microsoft.JSInterop/test/JSRuntimeTest.cs +++ b/src/JSInterop/Microsoft.JSInterop/test/JSRuntimeTest.cs @@ -404,7 +404,7 @@ public async void ReadJSDataAsStreamAsync_ThrowsNotSupportedException() var dataReference = new JSStreamReference(runtime, 10, 10); // Act - var exception = await Assert.ThrowsAsync(async () => await runtime.ReadJSDataAsStreamAsync(dataReference, 10, 10, 10, CancellationToken.None)); + var exception = await Assert.ThrowsAsync(async () => await runtime.ReadJSDataAsStreamAsync(dataReference, 10, CancellationToken.None)); // Assert Assert.Equal("The current JavaScript runtime does not support reading data streams.", exception.Message);