Open bminer opened 3 years ago
Thank you. Had the exact same issue, your solution worked perfectly.
+1 here also. I'm on parcel
^2.0.1
and socket.io-client
^4.3.2
, changing the hmr socket worked for me.
Thank you. Your solution worked for me.
Thank you so much! I was getting something like below (in case others run into this) on the server side (Scala/Java).
io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameException: bytes are not UTF-8
AFAIK, this is still an issue. Either a documentation change should be made to inform users of this, or the bug should be fixed.
This issue is still exist in the latest version.
This is the relevant code for the case of --port
=== --hmr-port
.
The HTTP server creation including proxyrc is here (the server
here becomes devServer
in HMRServer above): https://github.com/parcel-bundler/parcel/blob/2facd5df904b3888774a965a6be0e16248006449/packages/reporters/dev-server/src/Server.js#L465-L497
I think the issue is that the HMR server uses ws to create a new WebSocket server with the server
option set:
https://github.com/parcel-bundler/parcel/blob/2facd5df904b3888774a965a6be0e16248006449/packages/reporters/dev-server/src/HMRServer.js#L89
This basically ensures that this.wss
now handles all WebSocket requests for this.options.devServer
; thus, only HMR WebSocket requests work and WebSocket proxy requests using http-middleware-proxy are essentially closed preemptively by the HMR WebSocket upgrade handler. Here's the relevant code from the ws
library:
https://github.com/websockets/ws/blob/06728e444d8f54aa5602b51360f4f98794cb1754/lib/websocket-server.js#L260-L263
The solution here is to tell the HMR WebSocket.Server
to run in noServer
mode and only handle upgrade events when it's for the HMR. See ws docs here. So line 89 above would change to:
this.wss = new WebSocket.Server({noServer: true});
and then the server's upgrade event would need to be handled manually as shown in this ws usage example:
server.on('upgrade', function upgrade(req, socket, head) {
let {pathname} = url.parse(req.originalUrl || req.url);
if (pathname != null && pathname.startsWith(HMR_ENDPOINT)) {
this.wss.handleUpgrade(req, socket, head, function done(ws) {
this.wss.emit('connection', ws, req);
});
}
// else, we simply do nothing and hope the request got proxied
});
Anyway, hope this is an easy fix. If you want, I can try my hand at a PR for this.
PR is still open
This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs.
π bug report
When running
parcel serve
where the--port
is the same as the--hmr-port
(the default behavior AFAIK), the WebSocket proxy (i.e..proxyrc
) no longer functions properly.π Configuration
Running this command exhibits the bug:
π€ Expected Behavior
WebSocket proxy should work. When the browser connects to
ws://localhost:1234/ws
, it should be proxied tolocalhost:1235/ws
using http-proxy-middlewareπ― Current Behavior
When the browser establishes the WebSocket connection to
ws://localhost:1234/ws
, parcel indicates that the web browser immediately disconnects:On the WebSocket server running in Go on port 1235, I get an error that seems to indicate that the socket is closed:
On the browser (Firefox), I get a message like this:
which occurs on the line where I create the
new WebSocket(...)
.π Possible Solution
Everything runs fine without
parcel
. If Iparcel build
and bypass the parcel server and HMR server, it works.Running Parcel with a different HMR port also seems to work (note that HMR port is set to 1236):
... and in this case, it all works splendidly.
This seems to indicate that
parcel serve
does not properly handle WebSocket proxying with http-proxy-middleware when the HMR server is running on the same port as the normal parcel HTTP server.π¦ Context
I'm just trying to run
parcel serve [entry_point]
and have it work (ideally without a separate HMR port).π» Code Sample
I can provide a sample upon request, but it will take time.
π Your Environment