websocket / polling toggle

This commit is contained in:
legop3
2026-01-15 11:35:14 -05:00
parent 9622129c73
commit 8212a14ea8
4 changed files with 45 additions and 9 deletions
+32
View File
@@ -8,6 +8,8 @@ import Tabs, { Tab, TabList, TabPanel, TabPanels } from './Tabs.jsx';
import SessionSnapshot from './SessionSnapshot.jsx';
import SocketLogPanel from './SocketLogPanel.jsx';
import { useHudMapSetting } from '../hooks/useHudMapSetting.js';
import { useSettingsNamespace } from '../settings/index.js';
import { useSocket } from '../context/SocketContext.jsx';
const manualTabs = [
{ key: 'start', label: 'Start OI' },
@@ -24,6 +26,12 @@ export default function SettingsPanel() {
} = useControlSystem();
const canControl = Boolean(roverId);
const [hudMapDesktop, setHudMapDesktop] = useHudMapSetting();
const socket = useSocket();
const { value: pageSettings, save: savePageSettings } = useSettingsNamespace('page', {
hudMapDesktop: false,
connectionTransport: 'websocket',
});
const connectionTransport = pageSettings?.connectionTransport || 'websocket';
const sensorButtons = useMemo(
() => [
@@ -37,6 +45,15 @@ export default function SettingsPanel() {
if (!roverId) return;
setSensorStream(enable);
};
const handleTransportChange = (event) => {
const next = event.target.value;
savePageSettings((current) => ({ ...(current ?? {}), connectionTransport: next }));
if (!socket?.io?.opts) return;
socket.io.opts.transports = next === 'polling' ? ['polling'] : ['websocket', 'polling'];
socket.disconnect();
socket.connect();
};
return (
<Tabs defaultTab="keybindings">
<TabList>
@@ -71,6 +88,21 @@ export default function SettingsPanel() {
</label>
<p className="text-xs text-slate-500">Mobile HUD keeps the map on by default.</p>
</section>
<section className="panel-section space-y-0.5 text-sm">
<p className="text-slate-400">Connection</p>
<label className="flex items-center justify-between gap-0.5 text-slate-200">
<span>Transport</span>
<select
value={connectionTransport}
onChange={handleTransportChange}
className="field-input text-sm"
>
<option value="websocket">WebSocket</option>
<option value="polling">Polling</option>
</select>
</label>
<p className="text-xs text-slate-500">Switching reconnects your session.</p>
</section>
</div>
</TabPanel>
<TabPanel id="admin">
+5 -1
View File
@@ -1,10 +1,14 @@
import { io } from 'socket.io-client';
import { loadSettings } from '../settings/persistence.js';
const configured = import.meta.env.VITE_ROVERD_URL?.trim();
const resolvedUrl = configured && configured.length > 0 ? configured : window.location.origin;
console.info('[socket] connecting to', resolvedUrl);
const settings = loadSettings();
const transportPref = settings?.page?.connectionTransport || 'websocket';
const transports = transportPref === 'polling' ? ['polling'] : ['websocket', 'polling'];
export const socket = io(resolvedUrl, {
transports: ['polling', 'websocket'],
transports,
timeout: 15000,
});
socket.on('connect_error', (err) => console.error('connect_error', err.code, err.message, err.data));