add websocket support, event-driven