feat(websocket): add WebSocket Helper with RFC 6455 compliance
Add comprehensive WebSocket support for v-hono framework, inspired by Hono.js WebSocket Helper. Features: - upgrade_websocket() function for WebSocket route handlers - Event-based callbacks: on_open, on_message, on_close, on_error - WSContext with send(), send_bytes(), send_json(), close() methods - Connection state tracking (connecting, open, closing, closed) - Configurable options: ping_interval, max_message_size, timeout, protocols - Subprotocol negotiation support - Ping/pong keep-alive handling - Message size validation with 1009 close code - Integration with picoev and uSockets backends Protocol Compliance: - RFC 6455 compliant handshake with Sec-WebSocket-Accept computation - Frame encoding/decoding with proper masking - Close handshake with status codes and reasons - Text and binary message frame support Testing: - 13 property-based test files with 82 tests total - Validates handshake, frame encoding, masking, JSON round-trip - Tests context preservation, route patterns, connection state - All existing tests pass (no regressions) Files added: - websocket.v: Core WebSocket implementation - examples/websocket_demo.v: Chat room example - examples/websocket_test.html: Browser test client - tests/test_websocket_*.v: Property-based tests Files modified: - app.v: Add ws() method for WebSocket routes - middleware.v: Export WebSocket types and functions - picoev_server.v: WebSocket upgrade detection - usockets_server.v: WebSocket upgrade detection - README.md: WebSocket documentation
This commit is contained in:
@@ -175,6 +175,35 @@ pub fn (mut app Hono) options(path string, handler fn (mut Context) http.Respons
|
||||
app.context_trie_router.add_route('OPTIONS', path, h)
|
||||
}
|
||||
|
||||
// ws() - Register a WebSocket route
|
||||
// This method registers a WebSocket upgrade handler at the specified path.
|
||||
// The factory function receives the HTTP Context and returns WSEvents configuration.
|
||||
//
|
||||
// Parameters:
|
||||
// path: The route path (supports path parameters like /ws/:room/:id)
|
||||
// factory: A function that receives the HTTP Context and returns WSEvents
|
||||
// options: Optional WebSocket configuration
|
||||
//
|
||||
// Example:
|
||||
// app.ws('/chat/:room', fn (c Context) WSEvents {
|
||||
// room := c.params['room'] or { 'default' }
|
||||
// return WSEvents{
|
||||
// on_open: fn (mut ws WSContext) {
|
||||
// ws.send('Welcome to room!') or {}
|
||||
// }
|
||||
// on_message: fn (event WSMessageEvent, mut ws WSContext) {
|
||||
// ws.send('Echo: ${event.data}') or {}
|
||||
// }
|
||||
// }
|
||||
// })
|
||||
pub fn (mut app Hono) ws(path string, factory WSHandlerFactory, options ...WebSocketOptions) {
|
||||
// Create the WebSocket upgrade handler
|
||||
ws_handler := upgrade_websocket(factory, ...options)
|
||||
|
||||
// Register as a GET route (WebSocket upgrades use GET method)
|
||||
app.get(path, ws_handler)
|
||||
}
|
||||
|
||||
// all() 方法 - 为所有 HTTP 方法注册同一个处理器
|
||||
pub fn (mut app Hono) all(path string, handler fn (mut Context) http.Response) {
|
||||
app.get(path, handler)
|
||||
|
||||
Reference in New Issue
Block a user