[browser][wasm] Wasm websockets support#37962
[browser][wasm] Wasm websockets support#37962lewing merged 62 commits intodotnet:masterfrom kjpou1:wasm-websockets
Conversation
|
Tagging subscribers to this area: @dotnet/ncl |
.../System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ClientWebSocket.cs
Outdated
Show resolved
Hide resolved
…ClientWebSocket creation.
....Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ClientWebSocketOptions.cs
Outdated
Show resolved
Hide resolved
....Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ClientWebSocketOptions.cs
Outdated
Show resolved
Hide resolved
....Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ClientWebSocketOptions.cs
Outdated
Show resolved
Hide resolved
|
|
||
| namespace System.Net.WebSockets | ||
| { | ||
| internal sealed class ReceivePayload |
There was a problem hiding this comment.
Where is this type used?
There was a problem hiding this comment.
Used by BrowserWebSocket.cs to handle the received message queue
There was a problem hiding this comment.
It could be readonly struct
src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/ClientWebSocket.cs
Outdated
Show resolved
Hide resolved
src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs
Outdated
Show resolved
Hide resolved
- change accessor of _requestedSubProtocols to private - condition more code in WebSocketHandle.Managed.cs to not access _requestedSubProtocols
…websockets # Conflicts: # src/libraries/System.Net.WebSockets.Client/src/System.Net.WebSockets.Client.csproj # src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs
|
@marek-safar @stephentoub ping for a review when available. |
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
|
|
||
| namespace System.Net.WebSockets | ||
| { | ||
| internal sealed class ReceivePayload |
There was a problem hiding this comment.
It could be readonly struct
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
| @@ -0,0 +1,117 @@ | |||
| // Licensed to the .NET Foundation under one or more agreements. | |||
There was a problem hiding this comment.
Do we need to specialize this file for the browser? Or instead could ClientWebSocket.ConnectAsync just throw PNSE if it finds options set that aren't supported?
There was a problem hiding this comment.
The list of dependencies from the desktop version is much bigger (size savings) but it'd be nice to extract the common code to the shared file
There was a problem hiding this comment.
The list of dependencies from the desktop version is much bigger (size savings)
Only if the consumer uses them, though, right? Otherwise we should be able to ensure the relevant stuff is linked away?
There was a problem hiding this comment.
Yes if we don't call them internally, for example, to check if there were set.
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
...s/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/ReceivePayload.cs
Outdated
Show resolved
Hide resolved
src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
…ockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: campersau <buchholz.bastian@googlemail.com>
…ockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: campersau <buchholz.bastian@googlemail.com>
src/libraries/System.Net.WebSockets.Client/src/Resources/Strings.resx
Outdated
Show resolved
Hide resolved
src/libraries/System.Net.WebSockets.Client/src/System.Net.WebSockets.Client.csproj
Outdated
Show resolved
Hide resolved
src/libraries/System.Net.WebSockets.Client/src/System.Net.WebSockets.Client.csproj
Outdated
Show resolved
Hide resolved
src/libraries/System.Net.WebSockets.Client/src/System.Net.WebSockets.Client.csproj
Outdated
Show resolved
Hide resolved
src/libraries/System.Net.WebSockets.Client/src/System.Net.WebSockets.Client.csproj
Outdated
Show resolved
Hide resolved
…ockets.Client.csproj Co-authored-by: Maxim Lipnin <mlipnin@gmail.com>
…ockets.Client.csproj Co-authored-by: Maxim Lipnin <mlipnin@gmail.com>
…ockets.Client.csproj Co-authored-by: Maxim Lipnin <mlipnin@gmail.com>
…ockets.Client.csproj Co-authored-by: Maxim Lipnin <mlipnin@gmail.com>
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
|
|
||
| WebSocketValidate.ValidateArraySegment(buffer, nameof(buffer)); | ||
|
|
||
| _writeBuffer ??= new MemoryStream(); |
There was a problem hiding this comment.
Is this intentional? Caling SendAsync repeatably will grow MemoryStream with no limit
There was a problem hiding this comment.
The write buffer is nulled out below so it will be recreated.
MemoryStream writtenBuffer = _writeBuffer;
_writeBuffer = null;
There was a problem hiding this comment.
then why do you need ??=
There was a problem hiding this comment.
because the message needs to be buffered until end of message is reached. Once end of message is reached it gets nulled out and needs to be recreated.
- These are now released properly after reference counting went in.
marek-safar
left a comment
There was a problem hiding this comment.
LGTM from me. @stephentoub could you do another pass
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
| _writeBuffer.Write(buffer.Array!, buffer.Offset, buffer.Count); | ||
|
|
||
| if (!endOfMessage) | ||
| return Task.CompletedTask; |
There was a problem hiding this comment.
The browser websocket API isn't capable of sending messages split over multiple fragments? The endOfMessage argument elsewhere translates into the FIN bit in the websocket frame.
There was a problem hiding this comment.
We do not have access to the websocket frame through the browser api. Also, from my understanding there is not the concept of EndOfMessage. Not that I can find anyway.
There was a problem hiding this comment.
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send expects the full message so we need to buffer somewhere. An alternative to the MemoryStream buffer would be constructing a chain of Blobs on the JS side and calling send on that when endOfMessage is true.
There was a problem hiding this comment.
It's fine for the buffering to be in managed. I was questioning the buffering all-up, but if the websocket API doesn't support fragments, then ok.
...System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs
Outdated
Show resolved
Hide resolved
…ockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: Stephen Toub <stoub@microsoft.com>
…ockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: Stephen Toub <stoub@microsoft.com>
…ockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: Stephen Toub <stoub@microsoft.com>
No description provided.