-
-
Notifications
You must be signed in to change notification settings - Fork 7.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Socket.IO Adapter Close causes premature HTTP Server close() call and blocks application shutdown #13910
Comments
As a workaround you can hack in your own logic that disconnects clients and prevents new connections before initiating application shutdown. |
Here's a workaround: // FIXME: workaround for https://github.com/nestjs/nest/issues/13910
if (forceCloseConnections) {
const server = (app as NestExpressApplication).getHttpServer();
server.close = (close => (cb) => {
close(cb);
server.closeAllConnections();
return server;
})(server.close.bind(server));
} |
I think a fix for this is to never call Another way would be to close the http server early in the shutdown process without waiting for the callback, progress through other shutdown logic, then finally wait for the callback:
With the latter way it is up to each component what it wants to do with in-flight requests during shutdown, but they won't have to worry about new requests coming in. |
Would you like to create a PR for this issue? We should only do that for adapters that don't share the HTTP server instance (so for those that use a different port than a host application) |
@laino Could you please provide a full example of this? |
I want to create a PR for this. |
PRs are more than welcome |
On Nest application shutdown,
close()
is called on the socket.io server here.Internally socket.io will now disconnect all sockets handled by itself, then calls close() on the underlying http server here.
This is a problem because now we are blocking until all connections on the underlying http server are closed, but before the nest application has any chance to run logic that would disconnect other long-running connections. That means that if there's a long running connection that wasn't handled by that socket.io adapter, we now block forever.
For instance this disconnect logic is never reached.
The text was updated successfully, but these errors were encountered: