MCPcopy Create free account
hub / github.com/devnullvoid/pvetui / proxyMessages

Method proxyMessages

internal/vnc/proxy.go:342–400  ·  view source on GitHub ↗

proxyMessages handles message forwarding between WebSocket connections.

(src, dst *websocket.Conn, direction, targetName string)

Source from the content-addressed store, hash-verified

340
341// proxyMessages handles message forwarding between WebSocket connections.
342func (p *WebSocketProxy) proxyMessages(src, dst *websocket.Conn, direction, targetName string) error {
343 var messageCount int
344
345 // Set initial read deadline
346 if deadlineErr := src.SetReadDeadline(time.Now().Add(5 * time.Minute)); deadlineErr != nil {
347 p.logger.Debug("Failed to set initial read deadline (%s) for %s: %v", direction, targetName, deadlineErr)
348 }
349
350 src.SetPongHandler(func(string) error {
351 p.logger.Debug("Pong received (%s) for %s", direction, targetName)
352
353 if deadlineErr := src.SetReadDeadline(time.Now().Add(5 * time.Minute)); deadlineErr != nil {
354 p.logger.Debug("Failed to reset read deadline (%s) for %s: %v", direction, targetName, deadlineErr)
355 }
356
357 return nil
358 })
359
360 for {
361 messageType, message, err := src.ReadMessage()
362 if err != nil {
363 if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
364 p.logger.Error("Unexpected close error (%s) for %s: %v", direction, targetName, err)
365
366 return fmt.Errorf("unexpected close error (%s): %w", direction, err)
367 }
368
369 p.logger.Debug("Normal close for %s (%s) after %d messages", direction, targetName, messageCount)
370
371 return nil // Normal close
372 }
373
374 // Reset read deadline on each message
375 if deadlineErr := src.SetReadDeadline(time.Now().Add(5 * time.Minute)); deadlineErr != nil {
376 p.logger.Debug("Failed to reset read deadline (%s) for %s: %v", direction, targetName, deadlineErr)
377 }
378
379 messageCount++
380 if messageCount == 1 {
381 p.logger.Debug("First message received (%s) for %s: type=%d, size=%d bytes",
382 direction, targetName, messageType, len(message))
383 } else if messageCount%100 == 0 {
384 p.logger.Debug("Message count (%s) for %s: %d messages processed",
385 direction, targetName, messageCount)
386 }
387
388 err = dst.WriteMessage(messageType, message)
389 if err != nil {
390 p.logger.Error("Write error (%s) for %s after %d messages: %v",
391 direction, targetName, messageCount, err)
392
393 return fmt.Errorf("write error (%s): %w", direction, err)
394 }
395
396 if p.session != nil {
397 p.session.UpdateLastUsed()
398 }
399 }

Callers 1

HandleWebSocketProxyMethod · 0.95

Calls 3

DebugMethod · 0.65
ErrorMethod · 0.65
UpdateLastUsedMethod · 0.65

Tested by

no test coverage detected