'Socket.io's "on" handler doesn't fire in middleware in redux-toolkit

I've wrote a middleware to store websoket connection in my redux-toolkit.

And socket.on('disconnect') event does not fire even if I call socket.disconnect(), but disconnect happens. Code of middleware:

export const socketMiddleware: Middleware = store => {
    
    let socket: Socket;
    
    return next => action => {
        const
            state = store.getState(),
            socketActions = socketSlice.actions;

        const isConnectionEstablished = socket && state.socketReducer.isConnected;
   
        if (socketActions.startConnection.match(action)) {
            socket = io(WS_URL, {
                path: '/chat/socket.io',
                transports: ['websocket', 'polling'],
                reconnection: true,
                autoConnect: true,
                extraHeaders: {
                    Authorization: `Bearer ${action.payload}`,
                },
            });           

            socket.on('connect', () => {
                console.log('connected');
                store.dispatch(socketActions.connectionSuccess());
            })
    
            socket.on('connect_error', err => {
                console.log(`connect_error`);
                store.dispatch(socketActions.connectionFail());
            });
    
            socket.on('disconnect', () => {
                console.log(`disconnected!`);
                store.dispatch(socketActions.disconnectionSuccess());
            });
        }

        if (socketActions.startDisconnection.match(action) && isConnectionEstablished) {
            // socket.disconnected === false
            socket.disconnect();
            // socket.disconnected === true
        }
   
        return next(action);
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source