diff --git a/src/App.h b/src/App.h index 7473d3f..8c2b6b6 100644 --- a/src/App.h +++ b/src/App.h @@ -137,7 +137,12 @@ public: /* Copy all handlers */ webSocketContext->getExt()->messageHandler = std::move(behavior.message); webSocketContext->getExt()->drainHandler = std::move(behavior.drain); - webSocketContext->getExt()->closeHandler = std::move(behavior.close); + webSocketContext->getExt()->closeHandler = std::move([closeHandler = std::move(behavior.close)](WebSocket *ws, int code, std::string_view message) mutable { + closeHandler(ws, code, message); + + /* Destruct user data after returning from close handler */ + ((UserData *) ws->getUserData())->~UserData(); + }); /* Copy settings */ webSocketContext->getExt()->maxPayloadLength = behavior.maxPayloadLength; @@ -228,6 +233,10 @@ public: /* Emit open event and start the timeout */ if (behavior.open) { us_socket_timeout(SSL, (us_socket_t *) webSocket, behavior.idleTimeout); + + /* Default construct the UserData right before calling open handler */ + new (webSocket->getUserData()) UserData; + behavior.open(webSocket, req); }