Ensure that when viewing a specific callsign (e.g., /w5isp), the most
recent position packet is always displayed, regardless of how old it is
or what historical time period is selected.
The fix ensures that during historical loading, if we're tracking a
specific callsign and it's the first batch, we always include the
callsign's most recent packet even if it falls outside the selected
historical time filter (1h, 3h, 6h, etc.).
This resolves the issue where callsigns with very old last positions
would not be visible when viewing their specific page.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fix the issue where the historical data loading indicator would get stuck
indefinitely when no packets are found for a callsign or time period.
Changes:
- Handle empty packet results by properly updating loading state
- Add failsafe timeout (30s) to prevent infinite loading states
- Add debug logging to help identify when no packets are found
- Ensure loading progress is updated even when batches return no data
This fixes the issue where viewing callsigns with no recent data would
show "loading historical data" forever.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove all CachedQueries usage throughout the codebase
- Replace with direct Packets module calls
- Delete CachedQueries module entirely
- Rename get_recent_packets_optimized to get_recent_packets
- Add has_weather_packets? function to Packets module
- Fix duplicate function definitions
- Update all test references to use new function names
This simplifies the codebase by removing the caching layer and
eliminates the database ownership errors in tests.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit addresses two major areas:
1. Crash Prevention & Error Handling:
- Added error handling to all database queries to prevent crashes
- Implemented circuit breaker pattern for APRS-IS connection
- Added timeouts to all Redis operations (5 second timeout)
- Fixed unsafe pattern matches that could cause MatchError crashes
- Added try/rescue blocks around background tasks
- Improved socket operation error handling with proper cleanup
- Enhanced packet cleanup worker with comprehensive error handling
2. RF Path Station Markers:
- Fixed issue where digipeater/iGate icons weren't shown when searching for callsigns
- Now loads and displays position markers for all stations in the RF path
- Extracts RF path stations from tracked callsign packets
- Fetches latest position for each digipeater/iGate
- Properly displays complete RF path visualization with station positions
Technical details:
- Added Process.alive? checks before sending messages
- Fixed resource cleanup in terminate functions
- Added proper error handling to File.read operations
- Implemented safe wrapper for ShutdownHandler health checks
- All changes ensure the app continues running even when errors occur
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Increase debounce time from 300ms to 400ms for bounds updates
- Cancel in-progress historical loading when new bounds are scheduled
- Add stale update detection to skip outdated bounds updates
- Clear timer reference and pending bounds when processing updates
- Add debug logging for cancelled loads and stale updates
This prevents overlapping historical data loads during rapid zoom
changes, eliminating duplicate packets and improving performance.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
The function was sending a message but not returning the socket,
causing an ArgumentError when the result was passed to assign/3.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>