@kelnishi/satmouse-client 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/emitter.ts","../../src/core/discovery.ts","../../src/core/decode.ts","../../src/core/transports/webtransport.ts","../../src/core/transports/websocket.ts","../../src/core/connection.ts","../../src/core/launch.ts","../../src/utils/action-map.ts","../../src/utils/config.ts","../../src/utils/persistence.ts","../../src/utils/input-manager.ts","../../src/react/context.tsx","../../src/react/hooks.ts","../../src/react/components/ConnectionStatus.tsx","../../src/react/components/DeviceInfo.tsx","../../src/react/components/SettingsPanel.tsx","../../src/react/components/DebugPanel.tsx"],"names":["createContext","useRef","manager","useState","useEffect","useMemo","jsx","useContext","jsxs","useCallback","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Minimal typed event emitter — no node:events dependency for browser compatibility */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class TypedEmitter<Events> {\n private listeners = new Map<string, Set<Function>>();\n\n on<K extends string & keyof Events>(event: K, listener: Events[K] & Function): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener);\n return this;\n }\n\n off<K extends string & keyof Events>(event: K, listener: Events[K] & Function): this {\n this.listeners.get(event)?.delete(listener);\n return this;\n }\n\n protected emit<K extends string & keyof Events>(\n event: K,\n ...args: Events[K] extends (...a: infer A) => void ? A : never\n ): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const fn of set) {\n (fn as Function)(...args);\n }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import type { ThingDescription } from \"./types.js\";\n\nexport interface ResolvedEndpoints {\n webtransport?: { url: string; certHash?: string };\n websocket?: { url: string };\n deviceInfoUrl?: string;\n}\n\n/** Fetch the WoT Thing Description from the bridge */\nexport async function fetchThingDescription(tdUrl: string): Promise<ThingDescription> {\n const res = await globalThis.fetch(tdUrl);\n if (!res.ok) throw new Error(`Failed to fetch TD: HTTP ${res.status}`);\n return res.json() as Promise<ThingDescription>;\n}\n\n/** Extract WebTransport, WebSocket, and device info endpoints from a Thing Description */\nexport function resolveEndpoints(td: ThingDescription): ResolvedEndpoints {\n const result: ResolvedEndpoints = {};\n\n const spatialForms = td.events?.spatialData?.forms ?? [];\n\n const wtForm = spatialForms.find((f) => f.subprotocol === \"webtransport\");\n if (wtForm) {\n result.webtransport = {\n url: wtForm.href,\n certHash: td[\"satmouse:certHash\"],\n };\n }\n\n const wsForm = spatialForms.find((f) => f.subprotocol === \"websocket\");\n if (wsForm) {\n result.websocket = { url: wsForm.href };\n }\n\n const deviceForm = td.properties?.deviceInfo?.forms?.[0];\n if (deviceForm) {\n result.deviceInfoUrl = deviceForm.href;\n }\n\n return result;\n}\n","import type { SpatialData, ButtonEvent } from \"./types.js\";\n\n/** Decode 24-byte binary spatial data datagram (WebTransport or raw binary) */\nexport function decodeBinaryFrame(buffer: ArrayBuffer | Uint8Array): SpatialData {\n const len = buffer instanceof ArrayBuffer ? buffer.byteLength : buffer.byteLength;\n if (len < 20) {\n throw new RangeError(`Spatial frame too short: expected ≥20 bytes, got ${len}`);\n }\n const ab = buffer instanceof ArrayBuffer ? buffer : buffer.buffer;\n const offset = buffer instanceof Uint8Array ? buffer.byteOffset : 0;\n const view = new DataView(ab, offset);\n return {\n translation: {\n x: view.getInt16(8, true),\n y: view.getInt16(10, true),\n z: view.getInt16(12, true),\n },\n rotation: {\n x: view.getInt16(14, true),\n y: view.getInt16(16, true),\n z: view.getInt16(18, true),\n },\n timestamp: view.getFloat64(0, true),\n };\n}\n\n/** Decode WebSocket binary frame (1-byte type prefix + 24-byte payload) */\nexport function decodeWsBinaryFrame(\n buffer: ArrayBuffer | Uint8Array,\n): { type: \"spatialData\"; data: SpatialData } | { type: \"buttonEvent\"; data: ButtonEvent } | null {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n if (bytes.length < 1) return null;\n\n const typePrefix = bytes[0];\n if (typePrefix === 0x01 && bytes.length >= 25) {\n return { type: \"spatialData\", data: decodeBinaryFrame(bytes.subarray(1, 25)) };\n }\n if (typePrefix === 0x02) {\n const json = new TextDecoder().decode(bytes.subarray(1));\n return { type: \"buttonEvent\", data: JSON.parse(json) as ButtonEvent };\n }\n return null;\n}\n\n/** Decode length-prefixed JSON button events from a WebTransport stream chunk */\nexport function decodeButtonStream(\n buffer: Uint8Array<ArrayBufferLike>,\n): { events: ButtonEvent[]; remainder: Uint8Array<ArrayBufferLike> } {\n const events: ButtonEvent[] = [];\n let pos = 0;\n\n while (pos + 4 <= buffer.length) {\n const view = new DataView(buffer.buffer, buffer.byteOffset + pos);\n const len = view.getUint32(0, true);\n // Guard against absurd lengths\n if (len > 65536 || pos + 4 + len > buffer.length) break;\n const json = new TextDecoder().decode(buffer.subarray(pos + 4, pos + 4 + len));\n try {\n const event = JSON.parse(json);\n if (typeof event.button === \"number\" && typeof event.pressed === \"boolean\") {\n events.push(event as ButtonEvent);\n }\n } catch {\n // Skip malformed JSON frames\n }\n pos += 4 + len;\n }\n\n return { events, remainder: buffer.subarray(pos) };\n}\n","import type { Transport } from \"./transport.js\";\nimport type { SpatialData, ButtonEvent } from \"../types.js\";\nimport { decodeBinaryFrame, decodeButtonStream } from \"../decode.js\";\n\nexport class WebTransportAdapter implements Transport {\n readonly protocol = \"webtransport\" as const;\n\n onSpatialData: ((data: SpatialData) => void) | null = null;\n onButtonEvent: ((data: ButtonEvent) => void) | null = null;\n onClose: (() => void) | null = null;\n onError: ((error: Error) => void) | null = null;\n\n private transport: any = null;\n private url: string;\n private certHash?: string;\n\n constructor(url: string, certHash?: string) {\n this.url = url;\n this.certHash = certHash;\n }\n\n async connect(): Promise<void> {\n if (typeof globalThis.WebTransport === \"undefined\") {\n throw new Error(\"WebTransport is not available in this environment\");\n }\n\n const options: any = {};\n if (this.certHash) {\n options.serverCertificateHashes = [\n {\n algorithm: \"sha-256\",\n value: Uint8Array.from(atob(this.certHash), (c) => c.charCodeAt(0)),\n },\n ];\n }\n\n this.transport = new (globalThis as any).WebTransport(this.url, options);\n await this.transport.ready;\n\n this.readDatagrams();\n this.readStreams();\n\n this.transport.closed\n .then(() => this.onClose?.())\n .catch(() => this.onClose?.());\n }\n\n close(): void {\n try {\n this.transport?.close();\n } catch {}\n this.transport = null;\n }\n\n private async readDatagrams(): Promise<void> {\n const reader = this.transport.datagrams.readable.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n this.onSpatialData?.(decodeBinaryFrame(value));\n }\n } catch {\n // Transport closed\n }\n }\n\n private async readStreams(): Promise<void> {\n const reader = this.transport.incomingUnidirectionalStreams.getReader();\n try {\n while (true) {\n const { value: stream, done } = await reader.read();\n if (done) break;\n this.readButtonStream(stream);\n }\n } catch {\n // Transport closed\n }\n }\n\n private async readButtonStream(stream: any): Promise<void> {\n const reader = stream.getReader();\n let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n const newBuf = new Uint8Array(buffer.length + value.length);\n newBuf.set(buffer);\n newBuf.set(value, buffer.length);\n\n const { events, remainder } = decodeButtonStream(newBuf);\n for (const event of events) {\n this.onButtonEvent?.(event);\n }\n buffer = remainder;\n }\n } catch {\n // Stream closed\n }\n }\n}\n","import type { Transport } from \"./transport.js\";\nimport type { SpatialData, ButtonEvent, DeviceInfo } from \"../types.js\";\nimport { decodeWsBinaryFrame } from \"../decode.js\";\n\nexport class WebSocketAdapter implements Transport {\n readonly protocol = \"websocket\" as const;\n\n onSpatialData: ((data: SpatialData) => void) | null = null;\n onButtonEvent: ((data: ButtonEvent) => void) | null = null;\n onDeviceStatus: ((event: \"connected\" | \"disconnected\", device: DeviceInfo) => void) | null = null;\n onClose: (() => void) | null = null;\n onError: ((error: Error) => void) | null = null;\n\n private ws: WebSocket | null = null;\n private url: string;\n private subprotocol: string;\n\n constructor(url: string, subprotocol: string = \"satmouse-json\") {\n this.url = url;\n this.subprotocol = subprotocol;\n }\n\n async connect(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.ws = new globalThis.WebSocket(this.url, this.subprotocol);\n if (this.subprotocol === \"satmouse-binary\") {\n this.ws.binaryType = \"arraybuffer\";\n }\n\n this.ws.onopen = () => resolve();\n\n this.ws.onerror = () => {\n reject(new Error(`WebSocket connection failed: ${this.url}`));\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n if (this.subprotocol === \"satmouse-binary\" && event.data instanceof ArrayBuffer) {\n const decoded = decodeWsBinaryFrame(event.data);\n if (decoded?.type === \"spatialData\") this.onSpatialData?.(decoded.data);\n else if (decoded?.type === \"buttonEvent\") this.onButtonEvent?.(decoded.data);\n } else if (typeof event.data === \"string\") {\n try {\n const msg = JSON.parse(event.data);\n if (msg.type === \"spatialData\") this.onSpatialData?.(msg.data);\n else if (msg.type === \"buttonEvent\") this.onButtonEvent?.(msg.data);\n else if (msg.type === \"deviceStatus\") {\n this.onDeviceStatus?.(msg.data.event, msg.data.device);\n }\n } catch {\n // Ignore malformed messages\n }\n }\n };\n\n this.ws.onclose = () => this.onClose?.();\n });\n }\n\n close(): void {\n try {\n this.ws?.close();\n } catch {}\n this.ws = null;\n }\n}\n","import { TypedEmitter } from \"./emitter.js\";\nimport { fetchThingDescription, resolveEndpoints } from \"./discovery.js\";\nimport { WebTransportAdapter } from \"./transports/webtransport.js\";\nimport { WebSocketAdapter } from \"./transports/websocket.js\";\nimport type { Transport } from \"./transports/transport.js\";\nimport type {\n ConnectOptions,\n ConnectionState,\n DeviceInfo,\n SatMouseEvents,\n TransportProtocol,\n} from \"./types.js\";\n\n/**\n * Build a satmouse:// connect URI from connection parameters.\n */\nexport function buildSatMouseUri(host = \"localhost\", wsPort = 18945, wtPort = 18946): string {\n return `satmouse://connect?host=${encodeURIComponent(host)}&wsPort=${wsPort}&wtPort=${wtPort}`;\n}\n\n/**\n * Parse a satmouse:// URI into connection parameters.\n *\n * Format: satmouse://connect?host=<ip>&wsPort=<port>&wtPort=<port>\n * All query params are optional. Defaults: host=localhost, wsPort=4444, wtPort=4443.\n */\nexport function parseSatMouseUri(uri: string): { tdUrl: string; wsUrl: string; wtUrl: string } {\n const url = new URL(uri);\n const host = url.searchParams.get(\"host\") ?? \"localhost\";\n const wsPort = url.searchParams.get(\"wsPort\") ?? \"18945\";\n const wtPort = url.searchParams.get(\"wtPort\") ?? \"18946\";\n return {\n tdUrl: `http://${host}:${wsPort}/td.json`,\n wsUrl: `ws://${host}:${wsPort}/spatial`,\n wtUrl: `https://${host}:${wtPort}`,\n };\n}\n\nconst DEFAULT_OPTIONS: Required<\n Pick<ConnectOptions, \"transports\" | \"reconnectDelay\" | \"maxRetries\" | \"wsSubprotocol\">\n> = {\n transports: [\"webtransport\", \"websocket\"],\n reconnectDelay: 2000,\n maxRetries: 3,\n wsSubprotocol: \"satmouse-json\",\n};\n\n/**\n * Core connection to a SatMouse bridge.\n *\n * Handles discovery (via WoT Thing Description), transport negotiation\n * (WebTransport with WebSocket fallback), event dispatch, and auto-reconnect.\n */\nexport class SatMouseConnection extends TypedEmitter<SatMouseEvents> {\n private options: ConnectOptions & typeof DEFAULT_OPTIONS;\n private transport: Transport | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private intentionalClose = false;\n private deviceInfoUrl: string | null = null;\n private retryCount = 0;\n\n private _state: ConnectionState = \"disconnected\";\n private _protocol: TransportProtocol = \"none\";\n\n get state(): ConnectionState {\n return this._state;\n }\n get protocol(): TransportProtocol {\n return this._protocol;\n }\n\n constructor(options?: ConnectOptions) {\n super();\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n async connect(): Promise<void> {\n this.intentionalClose = false;\n this.setState(\"connecting\", \"none\");\n\n // Resolve endpoints — satmouse:// URI takes priority\n let wtUrl = this.options.wtUrl;\n let wsUrl = this.options.wsUrl;\n let certHash = this.options.certHash;\n\n if (this.options.uri) {\n const parsed = parseSatMouseUri(this.options.uri);\n wtUrl = wtUrl ?? parsed.wtUrl;\n wsUrl = wsUrl ?? parsed.wsUrl;\n this.options.tdUrl = this.options.tdUrl ?? parsed.tdUrl;\n }\n\n if (!wtUrl && !wsUrl) {\n const tdUrl = this.options.tdUrl;\n // Try HTTPS first (works from HTTPS pages), fall back to HTTP\n const tdUrls = tdUrl\n ? [tdUrl]\n : [\"https://localhost:18947/td.json\", \"http://localhost:18945/td.json\"];\n\n let resolved = false;\n for (const url of tdUrls) {\n try {\n const td = await fetchThingDescription(url);\n const endpoints = resolveEndpoints(td);\n wtUrl = endpoints.webtransport?.url;\n wsUrl = endpoints.websocket?.url;\n certHash = certHash ?? endpoints.webtransport?.certHash;\n this.deviceInfoUrl = endpoints.deviceInfoUrl ?? null;\n resolved = true;\n break;\n } catch {\n // Try next URL\n }\n }\n if (!resolved) {\n this.emit(\"error\", new Error(\"Failed to fetch Thing Description\"));\n wsUrl = \"ws://localhost:18945/spatial\";\n }\n }\n\n // Try transports in preference order\n for (const proto of this.options.transports) {\n if (proto === \"webtransport\" && wtUrl) {\n try {\n if (typeof globalThis.WebTransport === \"undefined\") continue;\n const adapter = new WebTransportAdapter(wtUrl, certHash);\n if (await this.tryTransport(adapter)) return;\n } catch {\n continue;\n }\n }\n if (proto === \"websocket\" && wsUrl) {\n try {\n const adapter = new WebSocketAdapter(wsUrl, this.options.wsSubprotocol);\n if (await this.tryTransport(adapter)) return;\n } catch {\n continue;\n }\n }\n }\n\n this.setState(\"disconnected\", \"none\");\n this.scheduleReconnect();\n }\n\n /** Reset retry count and reconnect. Use after \"failed\" state. */\n retry(): void {\n this.retryCount = 0;\n this.intentionalClose = false;\n this.connect();\n }\n\n disconnect(): void {\n this.intentionalClose = true;\n this.clearReconnect();\n this.transport?.close();\n this.transport = null;\n this.setState(\"disconnected\", \"none\");\n }\n\n async fetchDeviceInfo(): Promise<DeviceInfo[]> {\n if (!this.deviceInfoUrl) return [];\n const res = await globalThis.fetch(this.deviceInfoUrl);\n if (!res.ok) return [];\n const data = await res.json();\n return data.devices ?? [];\n }\n\n private async tryTransport(adapter: Transport): Promise<boolean> {\n adapter.onSpatialData = (data) => this.emit(\"spatialData\", data);\n adapter.onButtonEvent = (data) => this.emit(\"buttonEvent\", data);\n adapter.onError = (err) => this.emit(\"error\", err);\n\n if (\"onDeviceStatus\" in adapter) {\n (adapter as any).onDeviceStatus = (event: \"connected\" | \"disconnected\", device: DeviceInfo) => {\n this.emit(\"deviceStatus\", event, device);\n };\n }\n\n adapter.onClose = () => {\n this.transport = null;\n this.setState(\"disconnected\", \"none\");\n if (!this.intentionalClose) this.scheduleReconnect();\n };\n\n try {\n await adapter.connect();\n this.transport = adapter;\n this.retryCount = 0;\n this.setState(\"connected\", adapter.protocol);\n return true;\n } catch (err) {\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n return false;\n }\n }\n\n private setState(state: ConnectionState, protocol: TransportProtocol): void {\n if (this._state === state && this._protocol === protocol) return;\n this._state = state;\n this._protocol = protocol;\n this.emit(\"stateChange\", state, protocol);\n }\n\n private scheduleReconnect(): void {\n if (this.options.reconnectDelay <= 0 || this.intentionalClose) return;\n\n this.retryCount++;\n console.log(`[SatMouse] Reconnect attempt ${this.retryCount}/${this.options.maxRetries}`);\n if (this.retryCount > this.options.maxRetries) {\n console.log(\"[SatMouse] Max retries exceeded, giving up\");\n this.setState(\"failed\", \"none\");\n return;\n }\n\n this.clearReconnect();\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, this.options.reconnectDelay);\n }\n\n private clearReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","const SCHEME_URL = \"satmouse://launch\";\nconst PROJECT_URL = \"https://github.com/kelnishi/SatMouse/releases/latest\";\n\nexport interface LaunchOptions {\n /** URL scheme to open. Default: \"satmouse://launch\" */\n schemeUrl?: string;\n /** Fallback URL if the app is not installed. Default: GitHub releases page */\n fallbackUrl?: string;\n /** Timeout in ms before assuming the app is not installed. Default: 2500 */\n timeout?: number;\n}\n\n/**\n * Attempt to launch SatMouse via the `satmouse://` URL scheme.\n *\n * If the app is installed and registered, the OS opens it. If not,\n * navigates to the fallback URL (project releases page) after a timeout.\n *\n * Returns true if the scheme likely opened, false if it fell back.\n */\nexport function launchSatMouse(options?: LaunchOptions): Promise<boolean> {\n const schemeUrl = options?.schemeUrl ?? SCHEME_URL;\n const timeout = options?.timeout ?? 2500;\n\n // Validate fallback URL — only allow http/https to prevent javascript: or data: injection\n let fallbackUrl = PROJECT_URL;\n if (options?.fallbackUrl) {\n try {\n const parsed = new URL(options.fallbackUrl);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n fallbackUrl = options.fallbackUrl;\n }\n } catch {}\n }\n\n return new Promise((resolve) => {\n // Track if we leave the page (scheme handler opened the app)\n let launched = false;\n\n const onBlur = () => {\n launched = true;\n };\n globalThis.addEventListener(\"blur\", onBlur);\n\n // Use a hidden iframe to trigger the scheme without navigating away\n const iframe = document.createElement(\"iframe\");\n iframe.style.display = \"none\";\n iframe.src = schemeUrl;\n document.body.appendChild(iframe);\n\n setTimeout(() => {\n globalThis.removeEventListener(\"blur\", onBlur);\n document.body.removeChild(iframe);\n\n if (launched || document.hidden) {\n resolve(true);\n } else {\n // App not installed — redirect to project page\n globalThis.location.href = fallbackUrl;\n resolve(false);\n }\n }, timeout);\n });\n}\n","import type { SpatialData } from \"../core/types.js\";\n\n/** Axis identifier — full or half */\nexport type InputAxis =\n | \"tx\" | \"ty\" | \"tz\" | \"rx\" | \"ry\" | \"rz\" | \"w\"\n | \"tx+\" | \"ty+\" | \"tz+\" | \"rx+\" | \"ry+\" | \"rz+\" | \"w+\"\n | \"tx-\" | \"ty-\" | \"tz-\" | \"rx-\" | \"ry-\" | \"rz-\" | \"w-\";\n\n/** The 7 full output axes (6DOF + W) */\nexport const FULL_AXES: InputAxis[] = [\"tx\", \"ty\", \"tz\", \"rx\", \"ry\", \"rz\", \"w\"];\n\n/** A single axis route — reads from source, writes to target */\nexport interface AxisRoute {\n source: InputAxis;\n target: InputAxis;\n /** Negate the value (default: false) */\n flip?: boolean;\n}\n\n/** Default 6DOF passthrough */\nexport const DEFAULT_ROUTES: AxisRoute[] = [\n { source: \"tx\", target: \"tx\" },\n { source: \"ty\", target: \"ty\" },\n { source: \"tz\", target: \"tz\" },\n { source: \"rx\", target: \"rx\" },\n { source: \"ry\", target: \"ry\" },\n { source: \"rz\", target: \"rz\" },\n];\n\n/** Build passthrough routes from a device's axis list. Half-axes target their base axis.\n * Negative half-axes (e.g., \"ty-\") get flip: true. */\nexport function buildRoutes(axes: string[]): AxisRoute[] {\n return axes.map((axis) => {\n const base = axis.replace(/[+-]$/, \"\");\n const flip = axis.endsWith(\"-\");\n return { source: axis as InputAxis, target: base as InputAxis, ...(flip && { flip: true }) };\n });\n}\n\n/** Read a value from SpatialData by axis name. Half-axes read the same as the full axis. */\nfunction readAxis(data: SpatialData, axis: InputAxis): number {\n const base = axis.replace(/[+-]$/, \"\");\n switch (base) {\n case \"tx\": return data.translation.x;\n case \"ty\": return data.translation.y;\n case \"tz\": return data.translation.z;\n case \"rx\": return data.rotation.x;\n case \"ry\": return data.rotation.y;\n case \"rz\": return data.rotation.z;\n case \"w\": return data.w ?? 0;\n default: return 0;\n }\n}\n\n/** Accumulator for applyRoutes */\ninterface RouteAccum {\n t: { x: number; y: number; z: number };\n r: { x: number; y: number; z: number };\n w: number;\n}\n\n/** Write a value to accumulators. Half-axis targets: \"tz+\" adds, \"tz-\" subtracts. */\nfunction writeAxis(acc: RouteAccum, axis: InputAxis, value: number): void {\n const isNeg = axis.endsWith(\"-\");\n const base = axis.replace(/[+-]$/, \"\");\n const sign = isNeg ? -1 : 1;\n if (base === \"w\") { acc.w += value * sign; return; }\n const group = base[0] as \"t\" | \"r\";\n const key = base[1] as \"x\" | \"y\" | \"z\";\n if (group === \"t\") acc.t[key] += value * sign;\n else acc.r[key] += value * sign;\n}\n\n/** Apply routes to SpatialData. Multiple routes targeting the same axis accumulate. */\nexport function applyRoutes(data: SpatialData, routes: AxisRoute[], translateScale = 1, rotateScale = 1, wScale = 1): SpatialData {\n const acc: RouteAccum = { t: { x: 0, y: 0, z: 0 }, r: { x: 0, y: 0, z: 0 }, w: 0 };\n\n for (const route of routes) {\n let value = readAxis(data, route.source);\n if (route.flip) value = -value;\n const targetBase = route.target.replace(/[+-]$/, \"\");\n const scale = targetBase === \"w\" ? wScale : targetBase[0] === \"t\" ? translateScale : rotateScale;\n value *= scale;\n writeAxis(acc, route.target, value);\n }\n\n return { translation: acc.t, rotation: acc.r, w: acc.w || undefined, timestamp: data.timestamp, deviceId: data.deviceId };\n}\n","import { DEFAULT_ROUTES, type AxisRoute } from \"./action-map.js\";\n\n/** Maps a device button to a keyboard key */\nexport interface ButtonRoute {\n /** Device button index */\n button: number;\n /** Keyboard key value (KeyboardEvent.key, e.g., \"a\", \"Shift\", \"ArrowUp\") */\n key: string;\n /** Keyboard code (KeyboardEvent.code, e.g., \"KeyA\", \"ShiftLeft\"). Optional. */\n code?: string;\n}\n\n/** Per-device configuration */\nexport interface DeviceConfig {\n /** Axis routing — each entry maps a device input to an output with optional flip */\n routes?: AxisRoute[];\n /** Button-to-key mappings */\n buttonRoutes?: ButtonRoute[];\n /** Scale multiplier for translation axes (tx, ty, tz) */\n translateScale?: number;\n /** Scale multiplier for rotation axes (rx, ry, rz) */\n rotateScale?: number;\n /** Scale multiplier for W axis */\n wScale?: number;\n /** Dead zone threshold (0-1). Values below this are zeroed. */\n deadZone?: number;\n /** Only pass the strongest axis, zero all others */\n dominant?: boolean;\n}\n\n/** Global configuration */\nexport interface InputConfig {\n /** Default axis routes (used when device has no override) */\n routes: AxisRoute[];\n /** Default button-to-key mappings */\n buttonRoutes: ButtonRoute[];\n /** Scale multiplier for translation axes */\n translateScale: number;\n /** Scale multiplier for rotation axes */\n rotateScale: number;\n /** Scale multiplier for W axis */\n wScale: number;\n /** Dead zone threshold */\n deadZone: number;\n /** Dominant axis mode */\n dominant: boolean;\n /** Lock translation to zero */\n lockPosition: boolean;\n /** Lock rotation to zero */\n lockRotation: boolean;\n /** Per-device overrides keyed by device ID or pattern (e.g., \"cnx-*\") */\n devices: Record<string, DeviceConfig>;\n}\n\nexport const DEFAULT_CONFIG: InputConfig = {\n routes: DEFAULT_ROUTES,\n buttonRoutes: [],\n translateScale: 0.001,\n rotateScale: 0.001,\n wScale: 0.001,\n deadZone: 0,\n dominant: false,\n lockPosition: false,\n lockRotation: false,\n devices: {\n \"cnx-*\": {\n routes: [\n { source: \"tx\", target: \"tx\" },\n { source: \"ty\", target: \"ty\", flip: true },\n { source: \"tz\", target: \"tz\", flip: true },\n { source: \"rx\", target: \"rx\" },\n { source: \"ry\", target: \"ry\", flip: true },\n { source: \"rz\", target: \"rz\", flip: true },\n ],\n },\n // PlayStation: L2 (ty) → TY, R2 (ry) → TY flipped (push-pull)\n \"hid-54c-*\": {\n routes: [\n { source: \"tx\", target: \"tx\" },\n { source: \"tz\", target: \"tz\" },\n { source: \"rz\", target: \"rz\" },\n { source: \"rx\", target: \"rx\" },\n { source: \"ty\", target: \"ty\" },\n { source: \"ry\", target: \"ty\", flip: true },\n ],\n },\n },\n};\n\nexport function mergeConfig(base: InputConfig, partial: Partial<InputConfig>): InputConfig {\n const merged = {\n ...base,\n ...partial,\n routes: partial.routes ?? [...base.routes],\n buttonRoutes: partial.buttonRoutes ?? [...base.buttonRoutes],\n devices: { ...base.devices },\n };\n\n if (partial.devices) {\n for (const [key, devCfg] of Object.entries(partial.devices)) {\n merged.devices[key] = { ...merged.devices[key], ...devCfg };\n }\n }\n\n return merged;\n}\n\n/** Resolve the effective config for a specific device */\nexport function resolveDeviceConfig(config: InputConfig, deviceId: string): InputConfig {\n let deviceOverride: DeviceConfig | undefined;\n\n if (config.devices[deviceId]) {\n deviceOverride = config.devices[deviceId];\n } else {\n for (const [pattern, cfg] of Object.entries(config.devices)) {\n if (pattern.endsWith(\"*\") && deviceId.startsWith(pattern.slice(0, -1))) {\n deviceOverride = cfg;\n break;\n }\n }\n }\n\n if (!deviceOverride) return config;\n\n return {\n ...config,\n routes: deviceOverride.routes ?? config.routes,\n buttonRoutes: deviceOverride.buttonRoutes ?? config.buttonRoutes,\n translateScale: deviceOverride.translateScale ?? config.translateScale,\n rotateScale: deviceOverride.rotateScale ?? config.rotateScale,\n wScale: deviceOverride.wScale ?? config.wScale,\n deadZone: deviceOverride.deadZone ?? config.deadZone,\n dominant: deviceOverride.dominant ?? config.dominant,\n };\n}\n","import type { InputConfig } from \"./config.js\";\n\nexport interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nconst STORAGE_KEY = \"satmouse:settings\";\n\nfunction getStorage(storage?: StorageAdapter): StorageAdapter | null {\n if (storage) return storage;\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nexport function saveSettings(config: InputConfig, storage?: StorageAdapter): void {\n const s = getStorage(storage);\n if (!s) return;\n s.setItem(STORAGE_KEY, JSON.stringify(config));\n}\n\nexport function clearSettings(storage?: StorageAdapter): void {\n const s = getStorage(storage);\n if (!s) return;\n s.setItem(STORAGE_KEY, \"{}\");\n}\n\nexport function loadSettings(storage?: StorageAdapter): Partial<InputConfig> | null {\n const s = getStorage(storage);\n if (!s) return null;\n const raw = s.getItem(STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as any;\n // Migrate old single \"scale\" to separate translate/rotate/w scales\n if (parsed.scale != null && parsed.translateScale == null) {\n parsed.translateScale = parsed.scale;\n parsed.rotateScale = parsed.scale;\n parsed.wScale = parsed.scale;\n delete parsed.scale;\n }\n return parsed as Partial<InputConfig>;\n } catch {\n return null;\n }\n}\n","import { TypedEmitter } from \"../core/emitter.js\";\nimport type { SatMouseConnection } from \"../core/connection.js\";\nimport type { SpatialData, ButtonEvent, DeviceInfo, ConnectionState, TransportProtocol } from \"../core/types.js\";\nimport type { InputConfig, DeviceConfig } from \"./config.js\";\nimport { DEFAULT_CONFIG, mergeConfig, resolveDeviceConfig } from \"./config.js\";\nimport { loadSettings, saveSettings, clearSettings, type StorageAdapter } from \"./persistence.js\";\nimport { applyRoutes, buildRoutes, DEFAULT_ROUTES, type AxisRoute } from \"./action-map.js\";\n\nexport interface InputManagerEvents {\n spatialData: (data: SpatialData) => void;\n rawSpatialData: (data: SpatialData) => void;\n buttonEvent: (data: ButtonEvent) => void;\n stateChange: (state: ConnectionState, protocol: TransportProtocol) => void;\n deviceStatus: (event: \"connected\" | \"disconnected\", device: DeviceInfo) => void;\n configChange: (config: InputConfig) => void;\n}\n\nexport interface DeviceWithConfig {\n device: DeviceInfo;\n config: DeviceConfig;\n}\n\nexport class InputManager extends TypedEmitter<InputManagerEvents> {\n private connections: SatMouseConnection[] = [];\n private storage?: StorageAdapter;\n private knownDevices = new Map<string, DeviceInfo>();\n\n private deviceAccumulators = new Map<string, { tx: number; ty: number; tz: number; rx: number; ry: number; rz: number; w: number }>();\n private accDirty = false;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n private _config: InputConfig;\n private _state: ConnectionState = \"disconnected\";\n private _protocol: TransportProtocol = \"none\";\n\n get config(): InputConfig {\n return this._config;\n }\n\n get state(): ConnectionState {\n return this._state;\n }\n\n get protocol(): TransportProtocol {\n return this._protocol;\n }\n\n constructor(config?: Partial<InputConfig>, storage?: StorageAdapter) {\n super();\n this.storage = storage;\n const persisted = loadSettings(storage);\n this._config = mergeConfig(DEFAULT_CONFIG, { ...config, ...persisted });\n this.flushTimer = setInterval(() => this.flushAccumulator(), 16);\n }\n\n addConnection(connection: SatMouseConnection): void {\n this.connections.push(connection);\n this.wireConnection(connection);\n }\n\n /** Reset retry count and reconnect all failed connections. */\n retry(): void {\n for (const c of this.connections) c.retry();\n }\n\n removeConnection(connection: SatMouseConnection): void {\n const idx = this.connections.indexOf(connection);\n if (idx !== -1) this.connections.splice(idx, 1);\n connection.removeAllListeners();\n }\n\n async connect(): Promise<void> {\n await Promise.all(this.connections.map((c) => c.connect()));\n }\n\n disconnect(): void {\n for (const c of this.connections) c.disconnect();\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n }\n\n async fetchDeviceInfo(): Promise<DeviceInfo[]> {\n const results = await Promise.all(this.connections.map((c) => c.fetchDeviceInfo()));\n const devices = results.flat();\n for (const d of devices) this.knownDevices.set(d.id, d);\n return devices;\n }\n\n getDevicesWithConfig(): DeviceWithConfig[] {\n return Array.from(this.knownDevices.values()).map((device) => ({\n device,\n config: this.getDeviceConfig(device.id),\n }));\n }\n\n getDeviceConfig(deviceId: string): DeviceConfig {\n const resolved = resolveDeviceConfig(this._config, deviceId);\n return {\n routes: resolved.routes,\n buttonRoutes: resolved.buttonRoutes,\n translateScale: resolved.translateScale,\n rotateScale: resolved.rotateScale,\n wScale: resolved.wScale,\n deadZone: resolved.deadZone,\n dominant: resolved.dominant,\n };\n }\n\n updateConfig(partial: Partial<InputConfig>, persist = true): void {\n this._config = mergeConfig(this._config, partial);\n if (persist) saveSettings(this._config, this.storage);\n this.emit(\"configChange\", this._config);\n }\n\n updateDeviceConfig(deviceId: string, partial: DeviceConfig, persist = true): void {\n const existing = this._config.devices[deviceId] ?? {};\n this._config = mergeConfig(this._config, {\n devices: { [deviceId]: { ...existing, ...partial } },\n });\n if (persist) saveSettings(this._config, this.storage);\n this.emit(\"configChange\", this._config);\n }\n\n resetDeviceConfig(deviceId: string, persist = true): void {\n const { [deviceId]: _, ...rest } = this._config.devices;\n this._config = { ...this._config, devices: rest };\n if (persist) saveSettings(this._config, this.storage);\n this.emit(\"configChange\", this._config);\n }\n\n resetAllConfig(): void {\n clearSettings(this.storage);\n this._config = { ...DEFAULT_CONFIG };\n this.emit(\"configChange\", this._config);\n }\n\n onSpatialData(callback: (data: SpatialData) => void): () => void {\n this.on(\"spatialData\", callback);\n return () => this.off(\"spatialData\", callback);\n }\n\n onButtonEvent(callback: (data: ButtonEvent) => void): () => void {\n this.on(\"buttonEvent\", callback);\n return () => this.off(\"buttonEvent\", callback);\n }\n\n private wireConnection(connection: SatMouseConnection): void {\n connection.on(\"spatialData\", (raw) => {\n this.emit(\"rawSpatialData\", raw);\n\n const id = raw.deviceId ?? \"_default\";\n const processed = this.processPerDevice(raw, id);\n\n this.deviceAccumulators.set(id, {\n tx: processed.translation.x,\n ty: processed.translation.y,\n tz: processed.translation.z,\n rx: processed.rotation.x,\n ry: processed.rotation.y,\n rz: processed.rotation.z,\n w: processed.w ?? 0,\n });\n this.accDirty = true;\n });\n\n connection.on(\"buttonEvent\", (event) => {\n // Check all device configs for matching button routes\n this.dispatchButtonKeys(event);\n this.emit(\"buttonEvent\", event);\n });\n connection.on(\"stateChange\", (state, proto) => {\n this._state = state;\n this._protocol = proto;\n this.emit(\"stateChange\", state, proto);\n });\n connection.on(\"deviceStatus\", (event, device) => {\n if (event === \"connected\") this.knownDevices.set(device.id, device);\n else this.knownDevices.delete(device.id);\n this.emit(\"deviceStatus\", event, device);\n });\n }\n\n private flushAccumulator(): void {\n if (!this.accDirty) return;\n\n const merged = { tx: 0, ty: 0, tz: 0, rx: 0, ry: 0, rz: 0, w: 0 };\n for (const acc of this.deviceAccumulators.values()) {\n merged.tx += acc.tx;\n merged.ty += acc.ty;\n merged.tz += acc.tz;\n merged.rx += acc.rx;\n merged.ry += acc.ry;\n merged.rz += acc.rz;\n merged.w += acc.w;\n }\n\n this.deviceAccumulators.clear();\n this.accDirty = false;\n\n let data: SpatialData = {\n translation: { x: merged.tx, y: merged.ty, z: merged.tz },\n rotation: { x: merged.rx, y: merged.ry, z: merged.rz },\n w: merged.w || undefined,\n timestamp: performance.now() * 1000,\n };\n\n if (this._config.lockPosition) {\n data = { ...data, translation: { x: 0, y: 0, z: 0 } };\n }\n if (this._config.lockRotation) {\n data = { ...data, rotation: { x: 0, y: 0, z: 0 } };\n }\n\n this.emit(\"spatialData\", data);\n }\n\n /** Per-device: deadZone → dominant → routes (flip + scale + remap in one pass) */\n private processPerDevice(raw: SpatialData, deviceId: string): SpatialData {\n const cfg = resolveDeviceConfig(this._config, deviceId);\n let data = raw;\n\n // Dead zone\n if (cfg.deadZone > 0) {\n const dz = (v: number) => (Math.abs(v) < cfg.deadZone ? 0 : v);\n data = {\n ...data,\n translation: { x: dz(data.translation.x), y: dz(data.translation.y), z: dz(data.translation.z) },\n rotation: { x: dz(data.rotation.x), y: dz(data.rotation.y), z: dz(data.rotation.z) },\n };\n }\n\n // Dominant axis\n if (cfg.dominant) {\n const axes = [\n { g: \"t\" as const, k: \"x\" as const, v: Math.abs(data.translation.x) },\n { g: \"t\" as const, k: \"y\" as const, v: Math.abs(data.translation.y) },\n { g: \"t\" as const, k: \"z\" as const, v: Math.abs(data.translation.z) },\n { g: \"r\" as const, k: \"x\" as const, v: Math.abs(data.rotation.x) },\n { g: \"r\" as const, k: \"y\" as const, v: Math.abs(data.rotation.y) },\n { g: \"r\" as const, k: \"z\" as const, v: Math.abs(data.rotation.z) },\n ];\n const max = axes.reduce((a, b) => (b.v > a.v ? b : a));\n const t = { x: 0, y: 0, z: 0 };\n const r = { x: 0, y: 0, z: 0 };\n if (max.g === \"t\") t[max.k] = data.translation[max.k];\n else r[max.k] = data.rotation[max.k];\n data = { ...data, translation: t, rotation: r };\n }\n\n // Routes: flip + scale + remap in one pass\n // Use device-specific routes if configured, otherwise build from device axes metadata\n const device = this.knownDevices.get(deviceId);\n const deviceRoutes = this.resolveRoutes(deviceId, device);\n data = applyRoutes(data, deviceRoutes, cfg.translateScale, cfg.rotateScale, cfg.wScale);\n\n return data;\n }\n\n /** Get the effective routes for a device: device config override > device axes metadata > global default */\n private resolveRoutes(deviceId: string, device?: DeviceInfo): AxisRoute[] {\n // Check for explicit device config (exact match or pattern)\n const devCfg = this._config.devices[deviceId];\n if (devCfg?.routes && Array.isArray(devCfg.routes)) return devCfg.routes;\n\n // Check pattern matches\n for (const [pattern, cfg] of Object.entries(this._config.devices)) {\n if (pattern.endsWith(\"*\") && deviceId.startsWith(pattern.slice(0, -1))) {\n if (cfg.routes && Array.isArray(cfg.routes)) return cfg.routes;\n }\n }\n\n // Build from device axes metadata\n if (device?.axes) return buildRoutes(device.axes);\n\n // Global fallback\n return DEFAULT_ROUTES;\n }\n\n /** Dispatch KeyboardEvents for button routes matching this button event */\n private dispatchButtonKeys(event: ButtonEvent): void {\n if (typeof document === \"undefined\") return;\n\n // Collect all button routes from all device configs + global\n const allRoutes = this.collectButtonRoutes();\n for (const route of allRoutes) {\n if (route.button === event.button) {\n document.dispatchEvent(new KeyboardEvent(\n event.pressed ? \"keydown\" : \"keyup\",\n { key: route.key, code: route.code ?? \"\", bubbles: true },\n ));\n }\n }\n }\n\n /** Gather all button routes from global config + all device configs */\n private collectButtonRoutes(): import(\"./config.js\").ButtonRoute[] {\n const routes = [...this._config.buttonRoutes];\n for (const devCfg of Object.values(this._config.devices)) {\n if (devCfg.buttonRoutes) routes.push(...devCfg.buttonRoutes);\n }\n return routes;\n }\n}\n","import { createContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { SatMouseConnection, type ConnectionState, type ConnectOptions, type TransportProtocol } from \"../core/index.js\";\nimport { InputManager, type InputConfig } from \"../utils/index.js\";\n\nexport interface SatMouseContextValue {\n manager: InputManager;\n state: ConnectionState;\n protocol: TransportProtocol;\n config: InputConfig;\n updateConfig: (partial: Partial<InputConfig>) => void;\n}\n\nexport const SatMouseContext = createContext<SatMouseContextValue | null>(null);\n\nexport interface SatMouseProviderProps {\n connectOptions?: ConnectOptions;\n config?: Partial<InputConfig>;\n autoConnect?: boolean;\n children: ReactNode;\n}\n\nexport function SatMouseProvider({\n connectOptions,\n config: configOverrides,\n autoConnect = true,\n children,\n}: SatMouseProviderProps) {\n const managerRef = useRef<InputManager | null>(null);\n\n if (!managerRef.current) {\n const connection = new SatMouseConnection(connectOptions);\n const manager = new InputManager(configOverrides);\n manager.addConnection(connection);\n managerRef.current = manager;\n }\n const manager = managerRef.current;\n\n const [state, setState] = useState<ConnectionState>(\"disconnected\");\n const [protocol, setProtocol] = useState<TransportProtocol>(\"none\");\n const [config, setConfig] = useState<InputConfig>(manager.config);\n\n useEffect(() => {\n const onState = (s: ConnectionState, p: TransportProtocol) => {\n setState(s);\n setProtocol(p);\n };\n const onConfig = (c: InputConfig) => setConfig({ ...c });\n\n manager.on(\"stateChange\", onState);\n manager.on(\"configChange\", onConfig);\n\n if (autoConnect) manager.connect();\n\n return () => {\n manager.off(\"stateChange\", onState);\n manager.off(\"configChange\", onConfig);\n manager.disconnect();\n };\n }, [manager, autoConnect]);\n\n const value = useMemo<SatMouseContextValue>(\n () => ({\n manager,\n state,\n protocol,\n config,\n updateConfig: (partial) => manager.updateConfig(partial),\n }),\n [manager, state, protocol, config],\n );\n\n return <SatMouseContext value={value}>{children}</SatMouseContext>;\n}\n","import { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { SatMouseContext, type SatMouseContextValue } from \"./context.js\";\nimport type { SpatialData, ButtonEvent } from \"../core/types.js\";\n\n/** Access the SatMouse context. Throws if used outside SatMouseProvider. */\nexport function useSatMouse(): SatMouseContextValue {\n const ctx = useContext(SatMouseContext);\n if (!ctx) throw new Error(\"useSatMouse must be used within a <SatMouseProvider>\");\n return ctx;\n}\n\n/**\n * Subscribe to processed spatial data.\n * Batches updates to requestAnimationFrame to avoid re-rendering at device rate.\n */\nexport function useSpatialData(): SpatialData | null {\n const { manager } = useSatMouse();\n const [data, setData] = useState<SpatialData | null>(null);\n const latestRef = useRef<SpatialData | null>(null);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const unsub = manager.onSpatialData((d) => {\n latestRef.current = d;\n if (!rafRef.current) {\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = 0;\n setData(latestRef.current);\n });\n }\n });\n return () => {\n unsub();\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [manager]);\n\n return data;\n}\n\n/**\n * Subscribe to raw (pre-transform) spatial data.\n * Batches updates to requestAnimationFrame.\n */\nexport function useRawSpatialData(): SpatialData | null {\n const { manager } = useSatMouse();\n const [data, setData] = useState<SpatialData | null>(null);\n const latestRef = useRef<SpatialData | null>(null);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const handler = (d: SpatialData) => {\n latestRef.current = d;\n if (!rafRef.current) {\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = 0;\n setData(latestRef.current);\n });\n }\n };\n manager.on(\"rawSpatialData\", handler);\n return () => {\n manager.off(\"rawSpatialData\", handler);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [manager]);\n\n return data;\n}\n\n/** Subscribe to button events via callback. Does not trigger re-renders. */\nexport function useButtonEvent(callback: (event: ButtonEvent) => void): void {\n const { manager } = useSatMouse();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const handler = (e: ButtonEvent) => callbackRef.current(e);\n return manager.onButtonEvent(handler);\n }, [manager]);\n}\n","import { useSatMouse } from \"../hooks.js\";\n\nexport interface ConnectionStatusProps {\n className?: string;\n}\n\nexport function ConnectionStatus({ className }: ConnectionStatusProps) {\n const { state, protocol } = useSatMouse();\n\n return (\n <div className={className} data-state={state}>\n <span data-role=\"dot\" data-state={state} />\n <span data-role=\"text\">{state === \"connected\" ? \"Connected\" : state === \"connecting\" ? \"Connecting...\" : \"Disconnected\"}</span>\n {protocol !== \"none\" && <span data-role=\"protocol\">{protocol}</span>}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSatMouse } from \"../hooks.js\";\nimport { launchSatMouse } from \"../../core/launch.js\";\nimport type { DeviceInfo as DeviceInfoType } from \"../../core/types.js\";\n\nexport interface DeviceInfoProps {\n className?: string;\n /** Timeout in ms before showing \"no device\". Default: 5000 */\n timeout?: number;\n}\n\ntype FetchState = \"loading\" | \"connected\" | \"empty\" | \"error\";\n\nexport function DeviceInfo({ className, timeout = 5000 }: DeviceInfoProps) {\n const { manager, state } = useSatMouse();\n const [devices, setDevices] = useState<DeviceInfoType[]>([]);\n const [fetchState, setFetchState] = useState<FetchState>(\"loading\");\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const poll = useCallback(\n (bridgeConnected: boolean) => {\n if (!bridgeConnected) {\n setFetchState(\"loading\");\n return;\n }\n\n setFetchState(\"loading\");\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n\n timeoutRef.current = setTimeout(() => {\n setFetchState(\"empty\");\n }, timeout);\n\n manager\n .fetchDeviceInfo()\n .then((result) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setDevices(result);\n setFetchState(result.length > 0 ? \"connected\" : \"empty\");\n })\n .catch(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setFetchState(\"error\");\n });\n },\n [manager, timeout],\n );\n\n useEffect(() => {\n poll(state === \"connected\");\n\n const onStatus = () => poll(true);\n manager.on(\"deviceStatus\", onStatus);\n return () => {\n manager.off(\"deviceStatus\", onStatus);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, [manager, state, poll]);\n\n if (fetchState === \"loading\" && state !== \"connected\") {\n return (\n <div className={className} data-state=\"loading\">\n <span data-role=\"message\">Waiting for bridge...</span>\n <span\n data-role=\"launch\"\n onClick={() => launchSatMouse()}\n role=\"button\"\n tabIndex={0}\n >\n Launch SatMouse\n </span>\n </div>\n );\n }\n\n if (fetchState === \"loading\") {\n return (\n <div className={className} data-state=\"loading\">\n <span data-role=\"message\">Detecting devices...</span>\n </div>\n );\n }\n\n if (fetchState === \"error\" || fetchState === \"empty\") {\n return (\n <div className={className} data-state=\"empty\">\n <span data-role=\"message\">No device connected</span>\n <span\n data-role=\"hint\"\n onClick={() => poll(state === \"connected\")}\n role=\"button\"\n tabIndex={0}\n >\n Click to retry\n </span>\n </div>\n );\n }\n\n return (\n <div className={className} data-state=\"connected\">\n {devices.map((d) => (\n <div key={d.id} data-role=\"device\">\n <span data-role=\"model\">{d.model ?? d.name}</span>\n <span data-role=\"vendor\">{d.vendor}</span>\n <span data-role=\"connection\">{formatConnectionType(d.connectionType)}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction formatConnectionType(type?: string): string {\n switch (type) {\n case \"usb\":\n return \"USB\";\n case \"wireless\":\n return \"Wireless\";\n case \"bluetooth\":\n return \"Bluetooth\";\n default:\n return \"\";\n }\n}\n","import { useSatMouse } from \"../hooks.js\";\n\nexport interface SettingsPanelProps {\n className?: string;\n}\n\nexport function SettingsPanel({ className }: SettingsPanelProps) {\n const { config, updateConfig } = useSatMouse();\n\n return (\n <div className={className}>\n <section data-section=\"toggles\">\n <label>\n <input\n type=\"checkbox\"\n checked={config.lockPosition}\n onChange={() => updateConfig({ lockPosition: !config.lockPosition })}\n />\n Lock Position\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={config.lockRotation}\n onChange={() => updateConfig({ lockRotation: !config.lockRotation })}\n />\n Lock Rotation\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={config.dominant}\n onChange={() => updateConfig({ dominant: !config.dominant })}\n />\n Dominant\n </label>\n </section>\n\n <section data-section=\"deadzone\">\n <label>\n Dead Zone\n <input\n type=\"range\"\n min={0}\n max={100}\n value={config.deadZone}\n onChange={(e) => updateConfig({ deadZone: +e.target.value })}\n />\n <span>{config.deadZone}</span>\n </label>\n </section>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useSatMouse, useRawSpatialData } from \"../hooks.js\";\n\nexport interface DebugPanelProps {\n className?: string;\n}\n\nexport function DebugPanel({ className }: DebugPanelProps) {\n const { state, protocol } = useSatMouse();\n const raw = useRawSpatialData();\n const [fps, setFps] = useState(0);\n const countRef = useRef(0);\n\n useEffect(() => {\n countRef.current++;\n });\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFps(countRef.current);\n countRef.current = 0;\n }, 1000);\n return () => clearInterval(interval);\n }, []);\n\n return (\n <div className={className}>\n <div data-role=\"connection\">\n <span data-role=\"label\">State</span>\n <span data-role=\"value\">{state}</span>\n </div>\n <div data-role=\"connection\">\n <span data-role=\"label\">Protocol</span>\n <span data-role=\"value\">{protocol}</span>\n </div>\n <div data-role=\"connection\">\n <span data-role=\"label\">Rate</span>\n <span data-role=\"value\">{fps} fps</span>\n </div>\n {raw && (\n <>\n <div data-role=\"axis\"><span>TX</span><span>{Math.round(raw.translation.x)}</span></div>\n <div data-role=\"axis\"><span>TY</span><span>{Math.round(raw.translation.y)}</span></div>\n <div data-role=\"axis\"><span>TZ</span><span>{Math.round(raw.translation.z)}</span></div>\n <div data-role=\"axis\"><span>RX</span><span>{Math.round(raw.rotation.x)}</span></div>\n <div data-role=\"axis\"><span>RY</span><span>{Math.round(raw.rotation.y)}</span></div>\n <div data-role=\"axis\"><span>RZ</span><span>{Math.round(raw.rotation.z)}</span></div>\n </>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/emitter.ts","../../src/core/discovery.ts","../../src/core/decode.ts","../../src/core/transports/webtransport.ts","../../src/core/transports/websocket.ts","../../src/core/connection.ts","../../src/core/launch.ts","../../src/utils/action-map.ts","../../src/utils/config.ts","../../src/utils/persistence.ts","../../src/utils/input-manager.ts","../../src/react/context.tsx","../../src/react/hooks.ts","../../src/react/components/ConnectionStatus.tsx","../../src/react/components/DeviceInfo.tsx","../../src/react/components/SettingsPanel.tsx","../../src/react/components/DebugPanel.tsx"],"names":["createContext","useRef","manager","useState","useEffect","useMemo","jsx","useContext","jsxs","useCallback","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Minimal typed event emitter — no node:events dependency for browser compatibility */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class TypedEmitter<Events> {\n private listeners = new Map<string, Set<Function>>();\n\n on<K extends string & keyof Events>(event: K, listener: Events[K] & Function): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener);\n return this;\n }\n\n off<K extends string & keyof Events>(event: K, listener: Events[K] & Function): this {\n this.listeners.get(event)?.delete(listener);\n return this;\n }\n\n protected emit<K extends string & keyof Events>(\n event: K,\n ...args: Events[K] extends (...a: infer A) => void ? A : never\n ): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const fn of set) {\n (fn as Function)(...args);\n }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import type { ThingDescription } from \"./types.js\";\n\nexport interface ResolvedEndpoints {\n webtransport?: { url: string; certHash?: string };\n websocket?: { url: string };\n deviceInfoUrl?: string;\n}\n\n/** Fetch the WoT Thing Description from the bridge */\nexport async function fetchThingDescription(tdUrl: string): Promise<ThingDescription> {\n const res = await globalThis.fetch(tdUrl);\n if (!res.ok) throw new Error(`Failed to fetch TD: HTTP ${res.status}`);\n return res.json() as Promise<ThingDescription>;\n}\n\n/** Extract WebTransport, WebSocket, and device info endpoints from a Thing Description */\nexport function resolveEndpoints(td: ThingDescription): ResolvedEndpoints {\n const result: ResolvedEndpoints = {};\n\n const spatialForms = td.events?.spatialData?.forms ?? [];\n\n const wtForm = spatialForms.find((f) => f.subprotocol === \"webtransport\");\n if (wtForm) {\n result.webtransport = {\n url: wtForm.href,\n certHash: td[\"satmouse:certHash\"],\n };\n }\n\n const wsForm = spatialForms.find((f) => f.subprotocol === \"websocket\");\n if (wsForm) {\n result.websocket = { url: wsForm.href };\n }\n\n const deviceForm = td.properties?.deviceInfo?.forms?.[0];\n if (deviceForm) {\n result.deviceInfoUrl = deviceForm.href;\n }\n\n return result;\n}\n","import type { SpatialData, ButtonEvent } from \"./types.js\";\n\n/** Decode 24-byte binary spatial data datagram (WebTransport or raw binary) */\nexport function decodeBinaryFrame(buffer: ArrayBuffer | Uint8Array): SpatialData {\n const len = buffer instanceof ArrayBuffer ? buffer.byteLength : buffer.byteLength;\n if (len < 20) {\n throw new RangeError(`Spatial frame too short: expected ≥20 bytes, got ${len}`);\n }\n const ab = buffer instanceof ArrayBuffer ? buffer : buffer.buffer;\n const offset = buffer instanceof Uint8Array ? buffer.byteOffset : 0;\n const view = new DataView(ab, offset);\n return {\n translation: {\n x: view.getInt16(8, true),\n y: view.getInt16(10, true),\n z: view.getInt16(12, true),\n },\n rotation: {\n x: view.getInt16(14, true),\n y: view.getInt16(16, true),\n z: view.getInt16(18, true),\n },\n timestamp: view.getFloat64(0, true),\n };\n}\n\n/** Decode WebSocket binary frame (1-byte type prefix + 24-byte payload) */\nexport function decodeWsBinaryFrame(\n buffer: ArrayBuffer | Uint8Array,\n): { type: \"spatialData\"; data: SpatialData } | { type: \"buttonEvent\"; data: ButtonEvent } | null {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n if (bytes.length < 1) return null;\n\n const typePrefix = bytes[0];\n if (typePrefix === 0x01 && bytes.length >= 25) {\n return { type: \"spatialData\", data: decodeBinaryFrame(bytes.subarray(1, 25)) };\n }\n if (typePrefix === 0x02) {\n const json = new TextDecoder().decode(bytes.subarray(1));\n return { type: \"buttonEvent\", data: JSON.parse(json) as ButtonEvent };\n }\n return null;\n}\n\n/** Decode length-prefixed JSON button events from a WebTransport stream chunk */\nexport function decodeButtonStream(\n buffer: Uint8Array<ArrayBufferLike>,\n): { events: ButtonEvent[]; remainder: Uint8Array<ArrayBufferLike> } {\n const events: ButtonEvent[] = [];\n let pos = 0;\n\n while (pos + 4 <= buffer.length) {\n const view = new DataView(buffer.buffer, buffer.byteOffset + pos);\n const len = view.getUint32(0, true);\n // Guard against absurd lengths\n if (len > 65536 || pos + 4 + len > buffer.length) break;\n const json = new TextDecoder().decode(buffer.subarray(pos + 4, pos + 4 + len));\n try {\n const event = JSON.parse(json);\n if (typeof event.button === \"number\" && typeof event.pressed === \"boolean\") {\n events.push(event as ButtonEvent);\n }\n } catch {\n // Skip malformed JSON frames\n }\n pos += 4 + len;\n }\n\n return { events, remainder: buffer.subarray(pos) };\n}\n","import type { Transport } from \"./transport.js\";\nimport type { SpatialData, ButtonEvent } from \"../types.js\";\nimport { decodeBinaryFrame, decodeButtonStream } from \"../decode.js\";\n\nexport class WebTransportAdapter implements Transport {\n readonly protocol = \"webtransport\" as const;\n\n onSpatialData: ((data: SpatialData) => void) | null = null;\n onButtonEvent: ((data: ButtonEvent) => void) | null = null;\n onClose: (() => void) | null = null;\n onError: ((error: Error) => void) | null = null;\n\n private transport: any = null;\n private url: string;\n private certHash?: string;\n\n constructor(url: string, certHash?: string) {\n this.url = url;\n this.certHash = certHash;\n }\n\n async connect(): Promise<void> {\n if (typeof globalThis.WebTransport === \"undefined\") {\n throw new Error(\"WebTransport is not available in this environment\");\n }\n\n const options: any = {};\n if (this.certHash) {\n options.serverCertificateHashes = [\n {\n algorithm: \"sha-256\",\n value: Uint8Array.from(atob(this.certHash), (c) => c.charCodeAt(0)),\n },\n ];\n }\n\n this.transport = new (globalThis as any).WebTransport(this.url, options);\n await this.transport.ready;\n\n this.readDatagrams();\n this.readStreams();\n\n this.transport.closed\n .then(() => this.onClose?.())\n .catch(() => this.onClose?.());\n }\n\n close(): void {\n try {\n this.transport?.close();\n } catch {}\n this.transport = null;\n }\n\n private async readDatagrams(): Promise<void> {\n const reader = this.transport.datagrams.readable.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n this.onSpatialData?.(decodeBinaryFrame(value));\n }\n } catch {\n // Transport closed\n }\n }\n\n private async readStreams(): Promise<void> {\n const reader = this.transport.incomingUnidirectionalStreams.getReader();\n try {\n while (true) {\n const { value: stream, done } = await reader.read();\n if (done) break;\n this.readButtonStream(stream);\n }\n } catch {\n // Transport closed\n }\n }\n\n private async readButtonStream(stream: any): Promise<void> {\n const reader = stream.getReader();\n let buffer: Uint8Array<ArrayBufferLike> = new Uint8Array(0);\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n const newBuf = new Uint8Array(buffer.length + value.length);\n newBuf.set(buffer);\n newBuf.set(value, buffer.length);\n\n const { events, remainder } = decodeButtonStream(newBuf);\n for (const event of events) {\n this.onButtonEvent?.(event);\n }\n buffer = remainder;\n }\n } catch {\n // Stream closed\n }\n }\n}\n","import type { Transport } from \"./transport.js\";\nimport type { SpatialData, ButtonEvent, DeviceInfo } from \"../types.js\";\nimport { decodeWsBinaryFrame } from \"../decode.js\";\n\nexport class WebSocketAdapter implements Transport {\n readonly protocol = \"websocket\" as const;\n\n onSpatialData: ((data: SpatialData) => void) | null = null;\n onButtonEvent: ((data: ButtonEvent) => void) | null = null;\n onDeviceStatus: ((event: \"connected\" | \"disconnected\", device: DeviceInfo) => void) | null = null;\n onClose: (() => void) | null = null;\n onError: ((error: Error) => void) | null = null;\n\n private ws: WebSocket | null = null;\n private url: string;\n private subprotocol: string;\n\n constructor(url: string, subprotocol: string = \"satmouse-json\") {\n this.url = url;\n this.subprotocol = subprotocol;\n }\n\n async connect(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.ws = new globalThis.WebSocket(this.url, this.subprotocol);\n if (this.subprotocol === \"satmouse-binary\") {\n this.ws.binaryType = \"arraybuffer\";\n }\n\n this.ws.onopen = () => resolve();\n\n this.ws.onerror = () => {\n reject(new Error(`WebSocket connection failed: ${this.url}`));\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n if (this.subprotocol === \"satmouse-binary\" && event.data instanceof ArrayBuffer) {\n const decoded = decodeWsBinaryFrame(event.data);\n if (decoded?.type === \"spatialData\") this.onSpatialData?.(decoded.data);\n else if (decoded?.type === \"buttonEvent\") this.onButtonEvent?.(decoded.data);\n } else if (typeof event.data === \"string\") {\n try {\n const msg = JSON.parse(event.data);\n if (msg.type === \"spatialData\") this.onSpatialData?.(msg.data);\n else if (msg.type === \"buttonEvent\") this.onButtonEvent?.(msg.data);\n else if (msg.type === \"deviceStatus\") {\n this.onDeviceStatus?.(msg.data.event, msg.data.device);\n }\n } catch {\n // Ignore malformed messages\n }\n }\n };\n\n this.ws.onclose = () => this.onClose?.();\n });\n }\n\n close(): void {\n try {\n this.ws?.close();\n } catch {}\n this.ws = null;\n }\n}\n","import { TypedEmitter } from \"./emitter.js\";\nimport { fetchThingDescription, resolveEndpoints } from \"./discovery.js\";\nimport { WebTransportAdapter } from \"./transports/webtransport.js\";\nimport { WebSocketAdapter } from \"./transports/websocket.js\";\nimport type { Transport } from \"./transports/transport.js\";\nimport type {\n ConnectOptions,\n ConnectionState,\n DeviceInfo,\n SatMouseEvents,\n TransportProtocol,\n} from \"./types.js\";\n\n/**\n * Build a satmouse:// connect URI from connection parameters.\n */\nexport function buildSatMouseUri(host = \"localhost\", wsPort = 18945, wtPort = 18946): string {\n return `satmouse://connect?host=${encodeURIComponent(host)}&wsPort=${wsPort}&wtPort=${wtPort}`;\n}\n\n/**\n * Parse a satmouse:// URI into connection parameters.\n *\n * Format: satmouse://connect?host=<ip>&wsPort=<port>&wtPort=<port>\n * All query params are optional. Defaults: host=localhost, wsPort=4444, wtPort=4443.\n */\nexport function parseSatMouseUri(uri: string): { tdUrl: string; wsUrl: string; wtUrl: string } {\n const url = new URL(uri);\n const host = url.searchParams.get(\"host\") ?? \"localhost\";\n const wsPort = url.searchParams.get(\"wsPort\") ?? \"18945\";\n const wtPort = url.searchParams.get(\"wtPort\") ?? \"18946\";\n return {\n tdUrl: `http://${host}:${wsPort}/td.json`,\n wsUrl: `ws://${host}:${wsPort}/spatial`,\n wtUrl: `https://${host}:${wtPort}`,\n };\n}\n\nconst DEFAULT_OPTIONS: Required<\n Pick<ConnectOptions, \"transports\" | \"reconnectDelay\" | \"maxRetries\" | \"wsSubprotocol\">\n> = {\n transports: [\"webtransport\", \"websocket\"],\n reconnectDelay: 2000,\n maxRetries: 3,\n wsSubprotocol: \"satmouse-json\",\n};\n\n/**\n * Core connection to a SatMouse bridge.\n *\n * Handles discovery (via WoT Thing Description), transport negotiation\n * (WebTransport with WebSocket fallback), event dispatch, and auto-reconnect.\n */\nexport class SatMouseConnection extends TypedEmitter<SatMouseEvents> {\n private options: ConnectOptions & typeof DEFAULT_OPTIONS;\n private transport: Transport | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private intentionalClose = false;\n private deviceInfoUrl: string | null = null;\n private retryCount = 0;\n\n private _state: ConnectionState = \"disconnected\";\n private _protocol: TransportProtocol = \"none\";\n\n get state(): ConnectionState {\n return this._state;\n }\n get protocol(): TransportProtocol {\n return this._protocol;\n }\n\n constructor(options?: ConnectOptions) {\n super();\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n async connect(): Promise<void> {\n this.intentionalClose = false;\n this.setState(\"connecting\", \"none\");\n\n // Resolve endpoints — satmouse:// URI takes priority\n let wtUrl = this.options.wtUrl;\n let wsUrl = this.options.wsUrl;\n let certHash = this.options.certHash;\n\n if (this.options.uri) {\n const parsed = parseSatMouseUri(this.options.uri);\n wtUrl = wtUrl ?? parsed.wtUrl;\n wsUrl = wsUrl ?? parsed.wsUrl;\n this.options.tdUrl = this.options.tdUrl ?? parsed.tdUrl;\n }\n\n if (!wtUrl && !wsUrl) {\n const tdUrl = this.options.tdUrl;\n // Use 127.0.0.1 (not localhost) — Safari treats the loopback IP as a\n // \"Potentially Trustworthy Origin\" more reliably than the hostname.\n // Try HTTPS first (works from HTTPS pages), fall back to HTTP.\n const tdUrls = tdUrl\n ? [tdUrl]\n : [\n \"https://127.0.0.1:18947/td.json\",\n \"http://127.0.0.1:18945/td.json\",\n ];\n\n let resolved = false;\n for (const url of tdUrls) {\n try {\n const td = await fetchThingDescription(url);\n const endpoints = resolveEndpoints(td);\n wtUrl = endpoints.webtransport?.url;\n wsUrl = endpoints.websocket?.url;\n certHash = certHash ?? endpoints.webtransport?.certHash;\n this.deviceInfoUrl = endpoints.deviceInfoUrl ?? null;\n resolved = true;\n break;\n } catch {\n // Try next URL\n }\n }\n if (!resolved) {\n this.emit(\"error\", new Error(\"Failed to fetch Thing Description\"));\n wsUrl = \"ws://127.0.0.1:18945/spatial\";\n }\n }\n\n // Try transports in preference order\n for (const proto of this.options.transports) {\n if (proto === \"webtransport\" && wtUrl) {\n try {\n if (typeof globalThis.WebTransport === \"undefined\") continue;\n const adapter = new WebTransportAdapter(wtUrl, certHash);\n if (await this.tryTransport(adapter)) return;\n } catch {\n continue;\n }\n }\n if (proto === \"websocket\" && wsUrl) {\n try {\n const adapter = new WebSocketAdapter(wsUrl, this.options.wsSubprotocol);\n if (await this.tryTransport(adapter)) return;\n } catch {\n continue;\n }\n }\n }\n\n this.setState(\"disconnected\", \"none\");\n this.scheduleReconnect();\n }\n\n /** Reset retry count and reconnect. Use after \"failed\" state. */\n retry(): void {\n this.retryCount = 0;\n this.intentionalClose = false;\n this.connect();\n }\n\n disconnect(): void {\n this.intentionalClose = true;\n this.clearReconnect();\n this.transport?.close();\n this.transport = null;\n this.setState(\"disconnected\", \"none\");\n }\n\n async fetchDeviceInfo(): Promise<DeviceInfo[]> {\n if (!this.deviceInfoUrl) return [];\n const res = await globalThis.fetch(this.deviceInfoUrl);\n if (!res.ok) return [];\n const data = await res.json();\n return data.devices ?? [];\n }\n\n private async tryTransport(adapter: Transport): Promise<boolean> {\n adapter.onSpatialData = (data) => this.emit(\"spatialData\", data);\n adapter.onButtonEvent = (data) => this.emit(\"buttonEvent\", data);\n adapter.onError = (err) => this.emit(\"error\", err);\n\n if (\"onDeviceStatus\" in adapter) {\n (adapter as any).onDeviceStatus = (event: \"connected\" | \"disconnected\", device: DeviceInfo) => {\n this.emit(\"deviceStatus\", event, device);\n };\n }\n\n adapter.onClose = () => {\n this.transport = null;\n this.setState(\"disconnected\", \"none\");\n if (!this.intentionalClose) this.scheduleReconnect();\n };\n\n try {\n await adapter.connect();\n this.transport = adapter;\n this.retryCount = 0;\n this.setState(\"connected\", adapter.protocol);\n return true;\n } catch (err) {\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n return false;\n }\n }\n\n private setState(state: ConnectionState, protocol: TransportProtocol): void {\n if (this._state === state && this._protocol === protocol) return;\n this._state = state;\n this._protocol = protocol;\n this.emit(\"stateChange\", state, protocol);\n }\n\n private scheduleReconnect(): void {\n if (this.options.reconnectDelay <= 0 || this.intentionalClose) return;\n\n this.retryCount++;\n console.log(`[SatMouse] Reconnect attempt ${this.retryCount}/${this.options.maxRetries}`);\n if (this.retryCount > this.options.maxRetries) {\n console.log(\"[SatMouse] Max retries exceeded, giving up\");\n this.setState(\"failed\", \"none\");\n return;\n }\n\n this.clearReconnect();\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, this.options.reconnectDelay);\n }\n\n private clearReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","const SCHEME_URL = \"satmouse://launch\";\nconst PROJECT_URL = \"https://github.com/kelnishi/SatMouse/releases/latest\";\n\n/** Result of a URI scheme negotiation */\nexport interface NegotiateResult {\n ip: string;\n wsPort: number;\n wtPort: number;\n httpsPort: number;\n certHash?: string;\n challenge?: string;\n}\n\n/**\n * Trigger the satmouse://negotiate URI scheme for discovery when direct\n * HTTP/HTTPS fetch is blocked (Safari LNA).\n *\n * The bridge intercepts the URI, then redirects back to your origin with\n * connection details as query parameters. Your app handles the callback\n * route and passes the result to SatMouseConnection.\n *\n * @param origin - Your app's origin (e.g., \"https://kelcite.app\")\n * @param callbackPath - Path the bridge redirects to (default: \"/satmouse-handshake\")\n * @param challenge - Optional challenge token for verification\n */\nexport function negotiateViaSatMouse(origin: string, callbackPath = \"/satmouse-handshake\", challenge?: string): void {\n const params = new URLSearchParams({ origin, callback: callbackPath });\n if (challenge) params.set(\"challenge\", challenge);\n globalThis.location.href = `satmouse://negotiate?${params}`;\n}\n\n/**\n * Parse the negotiate callback URL parameters (called on your callback route).\n * Returns connection details or null if the params are missing.\n */\nexport function parseNegotiateCallback(searchParams: URLSearchParams): NegotiateResult | null {\n const ip = searchParams.get(\"ip\");\n const wsPort = searchParams.get(\"wsPort\");\n if (!ip || !wsPort) return null;\n return {\n ip,\n wsPort: parseInt(wsPort, 10),\n wtPort: parseInt(searchParams.get(\"wtPort\") ?? \"18946\", 10),\n httpsPort: parseInt(searchParams.get(\"httpsPort\") ?? \"18947\", 10),\n certHash: searchParams.get(\"certHash\") ?? undefined,\n challenge: searchParams.get(\"challenge\") ?? undefined,\n };\n}\n\nexport interface LaunchOptions {\n /** URL scheme to open. Default: \"satmouse://launch\" */\n schemeUrl?: string;\n /** Fallback URL if the app is not installed. Default: GitHub releases page */\n fallbackUrl?: string;\n /** Timeout in ms before assuming the app is not installed. Default: 2500 */\n timeout?: number;\n}\n\n/**\n * Attempt to launch SatMouse via the `satmouse://` URL scheme.\n *\n * If the app is installed and registered, the OS opens it. If not,\n * navigates to the fallback URL (project releases page) after a timeout.\n *\n * Returns true if the scheme likely opened, false if it fell back.\n */\nexport function launchSatMouse(options?: LaunchOptions): Promise<boolean> {\n const schemeUrl = options?.schemeUrl ?? SCHEME_URL;\n const timeout = options?.timeout ?? 2500;\n\n // Validate fallback URL — only allow http/https to prevent javascript: or data: injection\n let fallbackUrl = PROJECT_URL;\n if (options?.fallbackUrl) {\n try {\n const parsed = new URL(options.fallbackUrl);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n fallbackUrl = options.fallbackUrl;\n }\n } catch {}\n }\n\n return new Promise((resolve) => {\n // Track if we leave the page (scheme handler opened the app)\n let launched = false;\n\n const onBlur = () => {\n launched = true;\n };\n globalThis.addEventListener(\"blur\", onBlur);\n\n // Use a hidden iframe to trigger the scheme without navigating away\n const iframe = document.createElement(\"iframe\");\n iframe.style.display = \"none\";\n iframe.src = schemeUrl;\n document.body.appendChild(iframe);\n\n setTimeout(() => {\n globalThis.removeEventListener(\"blur\", onBlur);\n document.body.removeChild(iframe);\n\n if (launched || document.hidden) {\n resolve(true);\n } else {\n // App not installed — redirect to project page\n globalThis.location.href = fallbackUrl;\n resolve(false);\n }\n }, timeout);\n });\n}\n","import type { SpatialData } from \"../core/types.js\";\n\n/** Axis identifier — full or half */\nexport type InputAxis =\n | \"tx\" | \"ty\" | \"tz\" | \"rx\" | \"ry\" | \"rz\" | \"w\"\n | \"tx+\" | \"ty+\" | \"tz+\" | \"rx+\" | \"ry+\" | \"rz+\" | \"w+\"\n | \"tx-\" | \"ty-\" | \"tz-\" | \"rx-\" | \"ry-\" | \"rz-\" | \"w-\";\n\n/** The 7 full output axes (6DOF + W) */\nexport const FULL_AXES: InputAxis[] = [\"tx\", \"ty\", \"tz\", \"rx\", \"ry\", \"rz\", \"w\"];\n\n/** A single axis route — reads from source, writes to target */\nexport interface AxisRoute {\n source: InputAxis;\n target: InputAxis;\n /** Negate the value (default: false) */\n flip?: boolean;\n}\n\n/** Default 6DOF passthrough */\nexport const DEFAULT_ROUTES: AxisRoute[] = [\n { source: \"tx\", target: \"tx\" },\n { source: \"ty\", target: \"ty\" },\n { source: \"tz\", target: \"tz\" },\n { source: \"rx\", target: \"rx\" },\n { source: \"ry\", target: \"ry\" },\n { source: \"rz\", target: \"rz\" },\n];\n\n/** Build passthrough routes from a device's axis list. Half-axes target their base axis.\n * Negative half-axes (e.g., \"ty-\") get flip: true. */\nexport function buildRoutes(axes: string[]): AxisRoute[] {\n return axes.map((axis) => {\n const base = axis.replace(/[+-]$/, \"\");\n const flip = axis.endsWith(\"-\");\n return { source: axis as InputAxis, target: base as InputAxis, ...(flip && { flip: true }) };\n });\n}\n\n/** Read a value from SpatialData by axis name. Half-axes read the same as the full axis. */\nfunction readAxis(data: SpatialData, axis: InputAxis): number {\n const base = axis.replace(/[+-]$/, \"\");\n switch (base) {\n case \"tx\": return data.translation.x;\n case \"ty\": return data.translation.y;\n case \"tz\": return data.translation.z;\n case \"rx\": return data.rotation.x;\n case \"ry\": return data.rotation.y;\n case \"rz\": return data.rotation.z;\n case \"w\": return data.w ?? 0;\n default: return 0;\n }\n}\n\n/** Accumulator for applyRoutes */\ninterface RouteAccum {\n t: { x: number; y: number; z: number };\n r: { x: number; y: number; z: number };\n w: number;\n}\n\n/** Write a value to accumulators. Half-axis targets: \"tz+\" adds, \"tz-\" subtracts. */\nfunction writeAxis(acc: RouteAccum, axis: InputAxis, value: number): void {\n const isNeg = axis.endsWith(\"-\");\n const base = axis.replace(/[+-]$/, \"\");\n const sign = isNeg ? -1 : 1;\n if (base === \"w\") { acc.w += value * sign; return; }\n const group = base[0] as \"t\" | \"r\";\n const key = base[1] as \"x\" | \"y\" | \"z\";\n if (group === \"t\") acc.t[key] += value * sign;\n else acc.r[key] += value * sign;\n}\n\n/** Apply routes to SpatialData. Multiple routes targeting the same axis accumulate. */\nexport function applyRoutes(data: SpatialData, routes: AxisRoute[], translateScale = 1, rotateScale = 1, wScale = 1): SpatialData {\n const acc: RouteAccum = { t: { x: 0, y: 0, z: 0 }, r: { x: 0, y: 0, z: 0 }, w: 0 };\n\n for (const route of routes) {\n let value = readAxis(data, route.source);\n if (route.flip) value = -value;\n const targetBase = route.target.replace(/[+-]$/, \"\");\n const scale = targetBase === \"w\" ? wScale : targetBase[0] === \"t\" ? translateScale : rotateScale;\n value *= scale;\n writeAxis(acc, route.target, value);\n }\n\n return { translation: acc.t, rotation: acc.r, w: acc.w || undefined, timestamp: data.timestamp, deviceId: data.deviceId };\n}\n","import { DEFAULT_ROUTES, type AxisRoute } from \"./action-map.js\";\n\n/** Maps a device button to a keyboard key */\nexport interface ButtonRoute {\n /** Device button index */\n button: number;\n /** Keyboard key value (KeyboardEvent.key, e.g., \"a\", \"Shift\", \"ArrowUp\") */\n key: string;\n /** Keyboard code (KeyboardEvent.code, e.g., \"KeyA\", \"ShiftLeft\"). Optional. */\n code?: string;\n}\n\n/** Per-device configuration */\nexport interface DeviceConfig {\n /** Axis routing — each entry maps a device input to an output with optional flip */\n routes?: AxisRoute[];\n /** Button-to-key mappings */\n buttonRoutes?: ButtonRoute[];\n /** Scale multiplier for translation axes (tx, ty, tz) */\n translateScale?: number;\n /** Scale multiplier for rotation axes (rx, ry, rz) */\n rotateScale?: number;\n /** Scale multiplier for W axis */\n wScale?: number;\n /** Dead zone threshold (0-1). Values below this are zeroed. */\n deadZone?: number;\n /** Only pass the strongest axis, zero all others */\n dominant?: boolean;\n}\n\n/** Global configuration */\nexport interface InputConfig {\n /** Default axis routes (used when device has no override) */\n routes: AxisRoute[];\n /** Default button-to-key mappings */\n buttonRoutes: ButtonRoute[];\n /** Scale multiplier for translation axes */\n translateScale: number;\n /** Scale multiplier for rotation axes */\n rotateScale: number;\n /** Scale multiplier for W axis */\n wScale: number;\n /** Dead zone threshold */\n deadZone: number;\n /** Dominant axis mode */\n dominant: boolean;\n /** Lock translation to zero */\n lockPosition: boolean;\n /** Lock rotation to zero */\n lockRotation: boolean;\n /** Per-device overrides keyed by device ID or pattern (e.g., \"cnx-*\") */\n devices: Record<string, DeviceConfig>;\n}\n\nexport const DEFAULT_CONFIG: InputConfig = {\n routes: DEFAULT_ROUTES,\n buttonRoutes: [],\n translateScale: 0.001,\n rotateScale: 0.001,\n wScale: 0.001,\n deadZone: 0,\n dominant: false,\n lockPosition: false,\n lockRotation: false,\n devices: {\n \"cnx-*\": {\n routes: [\n { source: \"tx\", target: \"tx\" },\n { source: \"ty\", target: \"ty\", flip: true },\n { source: \"tz\", target: \"tz\", flip: true },\n { source: \"rx\", target: \"rx\" },\n { source: \"ry\", target: \"ry\", flip: true },\n { source: \"rz\", target: \"rz\", flip: true },\n ],\n },\n // PlayStation: L2 (ty) → TY, R2 (ry) → TY flipped (push-pull)\n \"hid-54c-*\": {\n routes: [\n { source: \"tx\", target: \"tx\" },\n { source: \"tz\", target: \"tz\" },\n { source: \"rz\", target: \"rz\" },\n { source: \"rx\", target: \"rx\" },\n { source: \"ty\", target: \"ty\" },\n { source: \"ry\", target: \"ty\", flip: true },\n ],\n },\n },\n};\n\nexport function mergeConfig(base: InputConfig, partial: Partial<InputConfig>): InputConfig {\n const merged = {\n ...base,\n ...partial,\n routes: partial.routes ?? [...base.routes],\n buttonRoutes: partial.buttonRoutes ?? [...base.buttonRoutes],\n devices: { ...base.devices },\n };\n\n if (partial.devices) {\n for (const [key, devCfg] of Object.entries(partial.devices)) {\n merged.devices[key] = { ...merged.devices[key], ...devCfg };\n }\n }\n\n return merged;\n}\n\n/** Resolve the effective config for a specific device */\nexport function resolveDeviceConfig(config: InputConfig, deviceId: string): InputConfig {\n let deviceOverride: DeviceConfig | undefined;\n\n if (config.devices[deviceId]) {\n deviceOverride = config.devices[deviceId];\n } else {\n for (const [pattern, cfg] of Object.entries(config.devices)) {\n if (pattern.endsWith(\"*\") && deviceId.startsWith(pattern.slice(0, -1))) {\n deviceOverride = cfg;\n break;\n }\n }\n }\n\n if (!deviceOverride) return config;\n\n return {\n ...config,\n routes: deviceOverride.routes ?? config.routes,\n buttonRoutes: deviceOverride.buttonRoutes ?? config.buttonRoutes,\n translateScale: deviceOverride.translateScale ?? config.translateScale,\n rotateScale: deviceOverride.rotateScale ?? config.rotateScale,\n wScale: deviceOverride.wScale ?? config.wScale,\n deadZone: deviceOverride.deadZone ?? config.deadZone,\n dominant: deviceOverride.dominant ?? config.dominant,\n };\n}\n","import type { InputConfig } from \"./config.js\";\n\nexport interface StorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nconst STORAGE_KEY = \"satmouse:settings\";\n\nfunction getStorage(storage?: StorageAdapter): StorageAdapter | null {\n if (storage) return storage;\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nexport function saveSettings(config: InputConfig, storage?: StorageAdapter): void {\n const s = getStorage(storage);\n if (!s) return;\n s.setItem(STORAGE_KEY, JSON.stringify(config));\n}\n\nexport function clearSettings(storage?: StorageAdapter): void {\n const s = getStorage(storage);\n if (!s) return;\n s.setItem(STORAGE_KEY, \"{}\");\n}\n\nexport function loadSettings(storage?: StorageAdapter): Partial<InputConfig> | null {\n const s = getStorage(storage);\n if (!s) return null;\n const raw = s.getItem(STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as any;\n // Migrate old single \"scale\" to separate translate/rotate/w scales\n if (parsed.scale != null && parsed.translateScale == null) {\n parsed.translateScale = parsed.scale;\n parsed.rotateScale = parsed.scale;\n parsed.wScale = parsed.scale;\n delete parsed.scale;\n }\n return parsed as Partial<InputConfig>;\n } catch {\n return null;\n }\n}\n","import { TypedEmitter } from \"../core/emitter.js\";\nimport type { SatMouseConnection } from \"../core/connection.js\";\nimport type { SpatialData, ButtonEvent, DeviceInfo, ConnectionState, TransportProtocol } from \"../core/types.js\";\nimport type { InputConfig, DeviceConfig } from \"./config.js\";\nimport { DEFAULT_CONFIG, mergeConfig, resolveDeviceConfig } from \"./config.js\";\nimport { loadSettings, saveSettings, clearSettings, type StorageAdapter } from \"./persistence.js\";\nimport { applyRoutes, buildRoutes, DEFAULT_ROUTES, type AxisRoute } from \"./action-map.js\";\n\nexport interface InputManagerEvents {\n spatialData: (data: SpatialData) => void;\n rawSpatialData: (data: SpatialData) => void;\n buttonEvent: (data: ButtonEvent) => void;\n stateChange: (state: ConnectionState, protocol: TransportProtocol) => void;\n deviceStatus: (event: \"connected\" | \"disconnected\", device: DeviceInfo) => void;\n configChange: (config: InputConfig) => void;\n}\n\nexport interface DeviceWithConfig {\n device: DeviceInfo;\n config: DeviceConfig;\n}\n\nexport class InputManager extends TypedEmitter<InputManagerEvents> {\n private connections: SatMouseConnection[] = [];\n private storage?: StorageAdapter;\n private knownDevices = new Map<string, DeviceInfo>();\n\n private deviceAccumulators = new Map<string, { tx: number; ty: number; tz: number; rx: number; ry: number; rz: number; w: number }>();\n private accDirty = false;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n private _config: InputConfig;\n private _state: ConnectionState = \"disconnected\";\n private _protocol: TransportProtocol = \"none\";\n\n get config(): InputConfig {\n return this._config;\n }\n\n get state(): ConnectionState {\n return this._state;\n }\n\n get protocol(): TransportProtocol {\n return this._protocol;\n }\n\n constructor(config?: Partial<InputConfig>, storage?: StorageAdapter) {\n super();\n this.storage = storage;\n const persisted = loadSettings(storage);\n this._config = mergeConfig(DEFAULT_CONFIG, { ...config, ...persisted });\n this.flushTimer = setInterval(() => this.flushAccumulator(), 16);\n }\n\n addConnection(connection: SatMouseConnection): void {\n this.connections.push(connection);\n this.wireConnection(connection);\n }\n\n /** Reset retry count and reconnect all failed connections. */\n retry(): void {\n for (const c of this.connections) c.retry();\n }\n\n removeConnection(connection: SatMouseConnection): void {\n const idx = this.connections.indexOf(connection);\n if (idx !== -1) this.connections.splice(idx, 1);\n connection.removeAllListeners();\n }\n\n async connect(): Promise<void> {\n await Promise.all(this.connections.map((c) => c.connect()));\n }\n\n disconnect(): void {\n for (const c of this.connections) c.disconnect();\n if (this.flushTimer) { clearInterval(this.flushTimer); this.flushTimer = null; }\n }\n\n async fetchDeviceInfo(): Promise<DeviceInfo[]> {\n const results = await Promise.all(this.connections.map((c) => c.fetchDeviceInfo()));\n const devices = results.flat();\n for (const d of devices) this.knownDevices.set(d.id, d);\n return devices;\n }\n\n getDevicesWithConfig(): DeviceWithConfig[] {\n return Array.from(this.knownDevices.values()).map((device) => ({\n device,\n config: this.getDeviceConfig(device.id),\n }));\n }\n\n getDeviceConfig(deviceId: string): DeviceConfig {\n const resolved = resolveDeviceConfig(this._config, deviceId);\n return {\n routes: resolved.routes,\n buttonRoutes: resolved.buttonRoutes,\n translateScale: resolved.translateScale,\n rotateScale: resolved.rotateScale,\n wScale: resolved.wScale,\n deadZone: resolved.deadZone,\n dominant: resolved.dominant,\n };\n }\n\n updateConfig(partial: Partial<InputConfig>, persist = true): void {\n this._config = mergeConfig(this._config, partial);\n if (persist) saveSettings(this._config, this.storage);\n this.emit(\"configChange\", this._config);\n }\n\n updateDeviceConfig(deviceId: string, partial: DeviceConfig, persist = true): void {\n const existing = this._config.devices[deviceId] ?? {};\n this._config = mergeConfig(this._config, {\n devices: { [deviceId]: { ...existing, ...partial } },\n });\n if (persist) saveSettings(this._config, this.storage);\n this.emit(\"configChange\", this._config);\n }\n\n resetDeviceConfig(deviceId: string, persist = true): void {\n const { [deviceId]: _, ...rest } = this._config.devices;\n this._config = { ...this._config, devices: rest };\n if (persist) saveSettings(this._config, this.storage);\n this.emit(\"configChange\", this._config);\n }\n\n resetAllConfig(): void {\n clearSettings(this.storage);\n this._config = { ...DEFAULT_CONFIG };\n this.emit(\"configChange\", this._config);\n }\n\n onSpatialData(callback: (data: SpatialData) => void): () => void {\n this.on(\"spatialData\", callback);\n return () => this.off(\"spatialData\", callback);\n }\n\n onButtonEvent(callback: (data: ButtonEvent) => void): () => void {\n this.on(\"buttonEvent\", callback);\n return () => this.off(\"buttonEvent\", callback);\n }\n\n private wireConnection(connection: SatMouseConnection): void {\n connection.on(\"spatialData\", (raw) => {\n this.emit(\"rawSpatialData\", raw);\n\n const id = raw.deviceId ?? \"_default\";\n const processed = this.processPerDevice(raw, id);\n\n this.deviceAccumulators.set(id, {\n tx: processed.translation.x,\n ty: processed.translation.y,\n tz: processed.translation.z,\n rx: processed.rotation.x,\n ry: processed.rotation.y,\n rz: processed.rotation.z,\n w: processed.w ?? 0,\n });\n this.accDirty = true;\n });\n\n connection.on(\"buttonEvent\", (event) => {\n // Check all device configs for matching button routes\n this.dispatchButtonKeys(event);\n this.emit(\"buttonEvent\", event);\n });\n connection.on(\"stateChange\", (state, proto) => {\n this._state = state;\n this._protocol = proto;\n this.emit(\"stateChange\", state, proto);\n });\n connection.on(\"deviceStatus\", (event, device) => {\n if (event === \"connected\") this.knownDevices.set(device.id, device);\n else this.knownDevices.delete(device.id);\n this.emit(\"deviceStatus\", event, device);\n });\n }\n\n private flushAccumulator(): void {\n if (!this.accDirty) return;\n\n const merged = { tx: 0, ty: 0, tz: 0, rx: 0, ry: 0, rz: 0, w: 0 };\n for (const acc of this.deviceAccumulators.values()) {\n merged.tx += acc.tx;\n merged.ty += acc.ty;\n merged.tz += acc.tz;\n merged.rx += acc.rx;\n merged.ry += acc.ry;\n merged.rz += acc.rz;\n merged.w += acc.w;\n }\n\n this.deviceAccumulators.clear();\n this.accDirty = false;\n\n let data: SpatialData = {\n translation: { x: merged.tx, y: merged.ty, z: merged.tz },\n rotation: { x: merged.rx, y: merged.ry, z: merged.rz },\n w: merged.w || undefined,\n timestamp: performance.now() * 1000,\n };\n\n if (this._config.lockPosition) {\n data = { ...data, translation: { x: 0, y: 0, z: 0 } };\n }\n if (this._config.lockRotation) {\n data = { ...data, rotation: { x: 0, y: 0, z: 0 } };\n }\n\n this.emit(\"spatialData\", data);\n }\n\n /** Per-device: deadZone → dominant → routes (flip + scale + remap in one pass) */\n private processPerDevice(raw: SpatialData, deviceId: string): SpatialData {\n const cfg = resolveDeviceConfig(this._config, deviceId);\n let data = raw;\n\n // Dead zone\n if (cfg.deadZone > 0) {\n const dz = (v: number) => (Math.abs(v) < cfg.deadZone ? 0 : v);\n data = {\n ...data,\n translation: { x: dz(data.translation.x), y: dz(data.translation.y), z: dz(data.translation.z) },\n rotation: { x: dz(data.rotation.x), y: dz(data.rotation.y), z: dz(data.rotation.z) },\n };\n }\n\n // Dominant axis\n if (cfg.dominant) {\n const axes = [\n { g: \"t\" as const, k: \"x\" as const, v: Math.abs(data.translation.x) },\n { g: \"t\" as const, k: \"y\" as const, v: Math.abs(data.translation.y) },\n { g: \"t\" as const, k: \"z\" as const, v: Math.abs(data.translation.z) },\n { g: \"r\" as const, k: \"x\" as const, v: Math.abs(data.rotation.x) },\n { g: \"r\" as const, k: \"y\" as const, v: Math.abs(data.rotation.y) },\n { g: \"r\" as const, k: \"z\" as const, v: Math.abs(data.rotation.z) },\n ];\n const max = axes.reduce((a, b) => (b.v > a.v ? b : a));\n const t = { x: 0, y: 0, z: 0 };\n const r = { x: 0, y: 0, z: 0 };\n if (max.g === \"t\") t[max.k] = data.translation[max.k];\n else r[max.k] = data.rotation[max.k];\n data = { ...data, translation: t, rotation: r };\n }\n\n // Routes: flip + scale + remap in one pass\n // Use device-specific routes if configured, otherwise build from device axes metadata\n const device = this.knownDevices.get(deviceId);\n const deviceRoutes = this.resolveRoutes(deviceId, device);\n data = applyRoutes(data, deviceRoutes, cfg.translateScale, cfg.rotateScale, cfg.wScale);\n\n return data;\n }\n\n /** Get the effective routes for a device: device config override > device axes metadata > global default */\n private resolveRoutes(deviceId: string, device?: DeviceInfo): AxisRoute[] {\n // Check for explicit device config (exact match or pattern)\n const devCfg = this._config.devices[deviceId];\n if (devCfg?.routes && Array.isArray(devCfg.routes)) return devCfg.routes;\n\n // Check pattern matches\n for (const [pattern, cfg] of Object.entries(this._config.devices)) {\n if (pattern.endsWith(\"*\") && deviceId.startsWith(pattern.slice(0, -1))) {\n if (cfg.routes && Array.isArray(cfg.routes)) return cfg.routes;\n }\n }\n\n // Build from device axes metadata\n if (device?.axes) return buildRoutes(device.axes);\n\n // Global fallback\n return DEFAULT_ROUTES;\n }\n\n /** Dispatch KeyboardEvents for button routes matching this button event */\n private dispatchButtonKeys(event: ButtonEvent): void {\n if (typeof document === \"undefined\") return;\n\n // Collect all button routes from all device configs + global\n const allRoutes = this.collectButtonRoutes();\n for (const route of allRoutes) {\n if (route.button === event.button) {\n document.dispatchEvent(new KeyboardEvent(\n event.pressed ? \"keydown\" : \"keyup\",\n { key: route.key, code: route.code ?? \"\", bubbles: true },\n ));\n }\n }\n }\n\n /** Gather all button routes from global config + all device configs */\n private collectButtonRoutes(): import(\"./config.js\").ButtonRoute[] {\n const routes = [...this._config.buttonRoutes];\n for (const devCfg of Object.values(this._config.devices)) {\n if (devCfg.buttonRoutes) routes.push(...devCfg.buttonRoutes);\n }\n return routes;\n }\n}\n","import { createContext, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { SatMouseConnection, type ConnectionState, type ConnectOptions, type TransportProtocol } from \"../core/index.js\";\nimport { InputManager, type InputConfig } from \"../utils/index.js\";\n\nexport interface SatMouseContextValue {\n manager: InputManager;\n state: ConnectionState;\n protocol: TransportProtocol;\n config: InputConfig;\n updateConfig: (partial: Partial<InputConfig>) => void;\n}\n\nexport const SatMouseContext = createContext<SatMouseContextValue | null>(null);\n\nexport interface SatMouseProviderProps {\n connectOptions?: ConnectOptions;\n config?: Partial<InputConfig>;\n autoConnect?: boolean;\n children: ReactNode;\n}\n\nexport function SatMouseProvider({\n connectOptions,\n config: configOverrides,\n autoConnect = true,\n children,\n}: SatMouseProviderProps) {\n const managerRef = useRef<InputManager | null>(null);\n\n if (!managerRef.current) {\n const connection = new SatMouseConnection(connectOptions);\n const manager = new InputManager(configOverrides);\n manager.addConnection(connection);\n managerRef.current = manager;\n }\n const manager = managerRef.current;\n\n const [state, setState] = useState<ConnectionState>(\"disconnected\");\n const [protocol, setProtocol] = useState<TransportProtocol>(\"none\");\n const [config, setConfig] = useState<InputConfig>(manager.config);\n\n useEffect(() => {\n const onState = (s: ConnectionState, p: TransportProtocol) => {\n setState(s);\n setProtocol(p);\n };\n const onConfig = (c: InputConfig) => setConfig({ ...c });\n\n manager.on(\"stateChange\", onState);\n manager.on(\"configChange\", onConfig);\n\n if (autoConnect) manager.connect();\n\n return () => {\n manager.off(\"stateChange\", onState);\n manager.off(\"configChange\", onConfig);\n manager.disconnect();\n };\n }, [manager, autoConnect]);\n\n const value = useMemo<SatMouseContextValue>(\n () => ({\n manager,\n state,\n protocol,\n config,\n updateConfig: (partial) => manager.updateConfig(partial),\n }),\n [manager, state, protocol, config],\n );\n\n return <SatMouseContext value={value}>{children}</SatMouseContext>;\n}\n","import { useCallback, useContext, useEffect, useRef, useState } from \"react\";\nimport { SatMouseContext, type SatMouseContextValue } from \"./context.js\";\nimport type { SpatialData, ButtonEvent } from \"../core/types.js\";\n\n/** Access the SatMouse context. Throws if used outside SatMouseProvider. */\nexport function useSatMouse(): SatMouseContextValue {\n const ctx = useContext(SatMouseContext);\n if (!ctx) throw new Error(\"useSatMouse must be used within a <SatMouseProvider>\");\n return ctx;\n}\n\n/**\n * Subscribe to processed spatial data.\n * Batches updates to requestAnimationFrame to avoid re-rendering at device rate.\n */\nexport function useSpatialData(): SpatialData | null {\n const { manager } = useSatMouse();\n const [data, setData] = useState<SpatialData | null>(null);\n const latestRef = useRef<SpatialData | null>(null);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const unsub = manager.onSpatialData((d) => {\n latestRef.current = d;\n if (!rafRef.current) {\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = 0;\n setData(latestRef.current);\n });\n }\n });\n return () => {\n unsub();\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [manager]);\n\n return data;\n}\n\n/**\n * Subscribe to raw (pre-transform) spatial data.\n * Batches updates to requestAnimationFrame.\n */\nexport function useRawSpatialData(): SpatialData | null {\n const { manager } = useSatMouse();\n const [data, setData] = useState<SpatialData | null>(null);\n const latestRef = useRef<SpatialData | null>(null);\n const rafRef = useRef(0);\n\n useEffect(() => {\n const handler = (d: SpatialData) => {\n latestRef.current = d;\n if (!rafRef.current) {\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = 0;\n setData(latestRef.current);\n });\n }\n };\n manager.on(\"rawSpatialData\", handler);\n return () => {\n manager.off(\"rawSpatialData\", handler);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [manager]);\n\n return data;\n}\n\n/** Subscribe to button events via callback. Does not trigger re-renders. */\nexport function useButtonEvent(callback: (event: ButtonEvent) => void): void {\n const { manager } = useSatMouse();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const handler = (e: ButtonEvent) => callbackRef.current(e);\n return manager.onButtonEvent(handler);\n }, [manager]);\n}\n","import { useSatMouse } from \"../hooks.js\";\n\nexport interface ConnectionStatusProps {\n className?: string;\n}\n\nexport function ConnectionStatus({ className }: ConnectionStatusProps) {\n const { state, protocol } = useSatMouse();\n\n return (\n <div className={className} data-state={state}>\n <span data-role=\"dot\" data-state={state} />\n <span data-role=\"text\">{state === \"connected\" ? \"Connected\" : state === \"connecting\" ? \"Connecting...\" : \"Disconnected\"}</span>\n {protocol !== \"none\" && <span data-role=\"protocol\">{protocol}</span>}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSatMouse } from \"../hooks.js\";\nimport { launchSatMouse } from \"../../core/launch.js\";\nimport type { DeviceInfo as DeviceInfoType } from \"../../core/types.js\";\n\nexport interface DeviceInfoProps {\n className?: string;\n /** Timeout in ms before showing \"no device\". Default: 5000 */\n timeout?: number;\n}\n\ntype FetchState = \"loading\" | \"connected\" | \"empty\" | \"error\";\n\nexport function DeviceInfo({ className, timeout = 5000 }: DeviceInfoProps) {\n const { manager, state } = useSatMouse();\n const [devices, setDevices] = useState<DeviceInfoType[]>([]);\n const [fetchState, setFetchState] = useState<FetchState>(\"loading\");\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const poll = useCallback(\n (bridgeConnected: boolean) => {\n if (!bridgeConnected) {\n setFetchState(\"loading\");\n return;\n }\n\n setFetchState(\"loading\");\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n\n timeoutRef.current = setTimeout(() => {\n setFetchState(\"empty\");\n }, timeout);\n\n manager\n .fetchDeviceInfo()\n .then((result) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setDevices(result);\n setFetchState(result.length > 0 ? \"connected\" : \"empty\");\n })\n .catch(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n setFetchState(\"error\");\n });\n },\n [manager, timeout],\n );\n\n useEffect(() => {\n poll(state === \"connected\");\n\n const onStatus = () => poll(true);\n manager.on(\"deviceStatus\", onStatus);\n return () => {\n manager.off(\"deviceStatus\", onStatus);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, [manager, state, poll]);\n\n if (fetchState === \"loading\" && state !== \"connected\") {\n return (\n <div className={className} data-state=\"loading\">\n <span data-role=\"message\">Waiting for bridge...</span>\n <span\n data-role=\"launch\"\n onClick={() => launchSatMouse()}\n role=\"button\"\n tabIndex={0}\n >\n Launch SatMouse\n </span>\n </div>\n );\n }\n\n if (fetchState === \"loading\") {\n return (\n <div className={className} data-state=\"loading\">\n <span data-role=\"message\">Detecting devices...</span>\n </div>\n );\n }\n\n if (fetchState === \"error\" || fetchState === \"empty\") {\n return (\n <div className={className} data-state=\"empty\">\n <span data-role=\"message\">No device connected</span>\n <span\n data-role=\"hint\"\n onClick={() => poll(state === \"connected\")}\n role=\"button\"\n tabIndex={0}\n >\n Click to retry\n </span>\n </div>\n );\n }\n\n return (\n <div className={className} data-state=\"connected\">\n {devices.map((d) => (\n <div key={d.id} data-role=\"device\">\n <span data-role=\"model\">{d.model ?? d.name}</span>\n <span data-role=\"vendor\">{d.vendor}</span>\n <span data-role=\"connection\">{formatConnectionType(d.connectionType)}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction formatConnectionType(type?: string): string {\n switch (type) {\n case \"usb\":\n return \"USB\";\n case \"wireless\":\n return \"Wireless\";\n case \"bluetooth\":\n return \"Bluetooth\";\n default:\n return \"\";\n }\n}\n","import { useSatMouse } from \"../hooks.js\";\n\nexport interface SettingsPanelProps {\n className?: string;\n}\n\nexport function SettingsPanel({ className }: SettingsPanelProps) {\n const { config, updateConfig } = useSatMouse();\n\n return (\n <div className={className}>\n <section data-section=\"toggles\">\n <label>\n <input\n type=\"checkbox\"\n checked={config.lockPosition}\n onChange={() => updateConfig({ lockPosition: !config.lockPosition })}\n />\n Lock Position\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={config.lockRotation}\n onChange={() => updateConfig({ lockRotation: !config.lockRotation })}\n />\n Lock Rotation\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={config.dominant}\n onChange={() => updateConfig({ dominant: !config.dominant })}\n />\n Dominant\n </label>\n </section>\n\n <section data-section=\"deadzone\">\n <label>\n Dead Zone\n <input\n type=\"range\"\n min={0}\n max={100}\n value={config.deadZone}\n onChange={(e) => updateConfig({ deadZone: +e.target.value })}\n />\n <span>{config.deadZone}</span>\n </label>\n </section>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useSatMouse, useRawSpatialData } from \"../hooks.js\";\n\nexport interface DebugPanelProps {\n className?: string;\n}\n\nexport function DebugPanel({ className }: DebugPanelProps) {\n const { state, protocol } = useSatMouse();\n const raw = useRawSpatialData();\n const [fps, setFps] = useState(0);\n const countRef = useRef(0);\n\n useEffect(() => {\n countRef.current++;\n });\n\n useEffect(() => {\n const interval = setInterval(() => {\n setFps(countRef.current);\n countRef.current = 0;\n }, 1000);\n return () => clearInterval(interval);\n }, []);\n\n return (\n <div className={className}>\n <div data-role=\"connection\">\n <span data-role=\"label\">State</span>\n <span data-role=\"value\">{state}</span>\n </div>\n <div data-role=\"connection\">\n <span data-role=\"label\">Protocol</span>\n <span data-role=\"value\">{protocol}</span>\n </div>\n <div data-role=\"connection\">\n <span data-role=\"label\">Rate</span>\n <span data-role=\"value\">{fps} fps</span>\n </div>\n {raw && (\n <>\n <div data-role=\"axis\"><span>TX</span><span>{Math.round(raw.translation.x)}</span></div>\n <div data-role=\"axis\"><span>TY</span><span>{Math.round(raw.translation.y)}</span></div>\n <div data-role=\"axis\"><span>TZ</span><span>{Math.round(raw.translation.z)}</span></div>\n <div data-role=\"axis\"><span>RX</span><span>{Math.round(raw.rotation.x)}</span></div>\n <div data-role=\"axis\"><span>RY</span><span>{Math.round(raw.rotation.y)}</span></div>\n <div data-role=\"axis\"><span>RZ</span><span>{Math.round(raw.rotation.z)}</span></div>\n </>\n )}\n </div>\n );\n}\n"]}
@@ -303,7 +303,10 @@ var SatMouseConnection = class extends TypedEmitter {
303
303
  }
304
304
  if (!wtUrl && !wsUrl) {
305
305
  const tdUrl = this.options.tdUrl;
306
- const tdUrls = tdUrl ? [tdUrl] : ["https://localhost:18947/td.json", "http://localhost:18945/td.json"];
306
+ const tdUrls = tdUrl ? [tdUrl] : [
307
+ "https://127.0.0.1:18947/td.json",
308
+ "http://127.0.0.1:18945/td.json"
309
+ ];
307
310
  let resolved = false;
308
311
  for (const url of tdUrls) {
309
312
  try {
@@ -320,7 +323,7 @@ var SatMouseConnection = class extends TypedEmitter {
320
323
  }
321
324
  if (!resolved) {
322
325
  this.emit("error", new Error("Failed to fetch Thing Description"));
323
- wsUrl = "ws://localhost:18945/spatial";
326
+ wsUrl = "ws://127.0.0.1:18945/spatial";
324
327
  }
325
328
  }
326
329
  for (const proto of this.options.transports) {