@kelnishi/satmouse-client 0.1.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.
- package/dist/chunk-I5MEZZOT.cjs +34 -0
- package/dist/chunk-I5MEZZOT.cjs.map +1 -0
- package/dist/chunk-X6NIARXW.js +32 -0
- package/dist/chunk-X6NIARXW.js.map +1 -0
- package/dist/connection-CH2YsPn1.d.cts +144 -0
- package/dist/connection-CH2YsPn1.d.ts +144 -0
- package/dist/core/index.cjs +405 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +53 -0
- package/dist/core/index.d.ts +53 -0
- package/dist/core/index.js +392 -0
- package/dist/core/index.js.map +1 -0
- package/dist/react/index.cjs +1003 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +239 -0
- package/dist/react/index.d.ts +239 -0
- package/dist/react/index.js +992 -0
- package/dist/react/index.js.map +1 -0
- package/dist/utils/index.cjs +231 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +99 -0
- package/dist/utils/index.d.ts +99 -0
- package/dist/utils/index.js +219 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +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/config.ts","../../src/utils/persistence.ts","../../src/utils/transforms.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 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 if (pos + 4 + len > buffer.length) break;\n const json = new TextDecoder().decode(buffer.subarray(pos + 4, pos + 4 + len));\n events.push(JSON.parse(json) as ButtonEvent);\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 = 4444, wtPort = 4443): 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\") ?? \"4444\";\n const wtPort = url.searchParams.get(\"wtPort\") ?? \"4443\";\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\" | \"wsSubprotocol\">\n> = {\n transports: [\"webtransport\", \"websocket\"],\n reconnectDelay: 2000,\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\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 =\n this.options.tdUrl ??\n new URL(\"/td.json\", globalThis.location?.origin ?? \"http://localhost:4444\").href;\n\n try {\n const td = await fetchThingDescription(tdUrl);\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 } catch (err) {\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n // Fall back to default WS URL\n wsUrl = `ws://${globalThis.location?.hostname ?? \"localhost\"}:${globalThis.location?.port ?? \"4444\"}/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 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.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 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 fallbackUrl = options?.fallbackUrl ?? PROJECT_URL;\n const timeout = options?.timeout ?? 2500;\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 { FlipConfig, SensitivityConfig, AxisMap } from \"./transforms.js\";\n\nexport interface InputConfig {\n sensitivity: SensitivityConfig;\n flip: FlipConfig;\n deadZone: number;\n dominant: boolean;\n axisRemap: AxisMap;\n lockPosition: boolean;\n lockRotation: boolean;\n}\n\nexport const DEFAULT_CONFIG: InputConfig = {\n sensitivity: { translation: 0.001, rotation: 0.001 },\n flip: { tx: false, ty: true, tz: true, rx: false, ry: true, rz: true },\n deadZone: 0,\n dominant: false,\n axisRemap: { tx: \"x\", ty: \"y\", tz: \"z\", rx: \"x\", ry: \"y\", rz: \"z\" },\n lockPosition: false,\n lockRotation: false,\n};\n\nexport function mergeConfig(base: InputConfig, partial: Partial<InputConfig>): InputConfig {\n return {\n ...base,\n ...partial,\n sensitivity: { ...base.sensitivity, ...partial.sensitivity },\n flip: { ...base.flip, ...partial.flip },\n axisRemap: { ...base.axisRemap, ...partial.axisRemap },\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 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 return JSON.parse(raw) as Partial<InputConfig>;\n } catch {\n return null;\n }\n}\n","import type { SpatialData, Vec3 } from \"../core/types.js\";\n\nexport interface FlipConfig {\n tx: boolean;\n ty: boolean;\n tz: boolean;\n rx: boolean;\n ry: boolean;\n rz: boolean;\n}\n\nexport interface SensitivityConfig {\n translation: number;\n rotation: number;\n}\n\n/** Maps each input axis to an output axis. E.g., { tx: \"tz\", tz: \"tx\" } swaps X and Z translation. */\nexport type AxisMap = {\n tx: keyof Vec3;\n ty: keyof Vec3;\n tz: keyof Vec3;\n rx: keyof Vec3;\n ry: keyof Vec3;\n rz: keyof Vec3;\n};\n\nexport const DEFAULT_AXIS_MAP: AxisMap = {\n tx: \"x\", ty: \"y\", tz: \"z\",\n rx: \"x\", ry: \"y\", rz: \"z\",\n};\n\nexport function applyFlip(data: SpatialData, flip: FlipConfig): SpatialData {\n return {\n ...data,\n translation: {\n x: flip.tx ? -data.translation.x : data.translation.x,\n y: flip.ty ? -data.translation.y : data.translation.y,\n z: flip.tz ? -data.translation.z : data.translation.z,\n },\n rotation: {\n x: flip.rx ? -data.rotation.x : data.rotation.x,\n y: flip.ry ? -data.rotation.y : data.rotation.y,\n z: flip.rz ? -data.rotation.z : data.rotation.z,\n },\n };\n}\n\nexport function applySensitivity(data: SpatialData, sens: SensitivityConfig): SpatialData {\n return {\n ...data,\n translation: {\n x: data.translation.x * sens.translation,\n y: data.translation.y * sens.translation,\n z: data.translation.z * sens.translation,\n },\n rotation: {\n x: data.rotation.x * sens.rotation,\n y: data.rotation.y * sens.rotation,\n z: data.rotation.z * sens.rotation,\n },\n };\n}\n\nexport function applyDominant(data: SpatialData): SpatialData {\n const axes = [\n { group: \"t\" as const, key: \"x\" as const, v: Math.abs(data.translation.x) },\n { group: \"t\" as const, key: \"y\" as const, v: Math.abs(data.translation.y) },\n { group: \"t\" as const, key: \"z\" as const, v: Math.abs(data.translation.z) },\n { group: \"r\" as const, key: \"x\" as const, v: Math.abs(data.rotation.x) },\n { group: \"r\" as const, key: \"y\" as const, v: Math.abs(data.rotation.y) },\n { group: \"r\" as const, key: \"z\" as const, v: Math.abs(data.rotation.z) },\n ];\n const max = axes.reduce((a, b) => (b.v > a.v ? b : a));\n\n const t: Vec3 = { x: 0, y: 0, z: 0 };\n const r: Vec3 = { x: 0, y: 0, z: 0 };\n\n if (max.group === \"t\") t[max.key] = data.translation[max.key];\n else r[max.key] = data.rotation[max.key];\n\n return { ...data, translation: t, rotation: r };\n}\n\nexport function applyDeadZone(data: SpatialData, threshold: number): SpatialData {\n const dz = (v: number) => (Math.abs(v) < threshold ? 0 : v);\n return {\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\nexport function applyAxisRemap(data: SpatialData, map: AxisMap): SpatialData {\n return {\n ...data,\n translation: {\n x: 0, y: 0, z: 0,\n [map.tx]: data.translation.x,\n [map.ty]: data.translation.y,\n [map.tz]: data.translation.z,\n } as Vec3,\n rotation: {\n x: 0, y: 0, z: 0,\n [map.rx]: data.rotation.x,\n [map.ry]: data.rotation.y,\n [map.rz]: data.rotation.z,\n } as Vec3,\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 } from \"./config.js\";\nimport { DEFAULT_CONFIG, mergeConfig } from \"./config.js\";\nimport { loadSettings, saveSettings, type StorageAdapter } from \"./persistence.js\";\nimport {\n applyFlip,\n applySensitivity,\n applyDominant,\n applyDeadZone,\n applyAxisRemap,\n} from \"./transforms.js\";\n\nexport interface InputManagerEvents {\n /** Processed spatial data (after all transforms) */\n spatialData: (data: SpatialData) => void;\n /** Raw spatial data (before transforms) */\n rawSpatialData: (data: SpatialData) => void;\n /** Button event (pass-through from connection) */\n buttonEvent: (data: ButtonEvent) => void;\n /** Connection state changed */\n stateChange: (state: ConnectionState, protocol: TransportProtocol) => void;\n /** Device connected/disconnected */\n deviceStatus: (event: \"connected\" | \"disconnected\", device: DeviceInfo) => void;\n /** Configuration changed */\n configChange: (config: InputConfig) => void;\n}\n\n/**\n * Unified device service that wraps one or more SatMouseConnections\n * and provides a single processed event stream.\n *\n * Applies a configurable transform pipeline to spatial data:\n * deadZone → dominant → flip → axisRemap → sensitivity → lock\n *\n * Persists settings to storage (localStorage by default).\n */\nexport class InputManager extends TypedEmitter<InputManagerEvents> {\n private connections: SatMouseConnection[] = [];\n private storage?: StorageAdapter;\n\n private _config: InputConfig;\n\n get config(): InputConfig {\n return this._config;\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 }\n\n /** Add a connection to the managed set */\n addConnection(connection: SatMouseConnection): void {\n this.connections.push(connection);\n this.wireConnection(connection);\n }\n\n /** Remove a connection */\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 /** Connect all managed connections */\n async connect(): Promise<void> {\n await Promise.all(this.connections.map((c) => c.connect()));\n }\n\n /** Disconnect all managed connections */\n disconnect(): void {\n for (const c of this.connections) c.disconnect();\n }\n\n /** Fetch device info from all connections */\n async fetchDeviceInfo(): Promise<DeviceInfo[]> {\n const results = await Promise.all(this.connections.map((c) => c.fetchDeviceInfo()));\n return results.flat();\n }\n\n /** Update configuration. Persists by default. */\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 /** Register a callback for processed spatial data. Returns unsubscribe function. */\n onSpatialData(callback: (data: SpatialData) => void): () => void {\n this.on(\"spatialData\", callback);\n return () => this.off(\"spatialData\", callback);\n }\n\n /** Register a callback for button events. Returns unsubscribe function. */\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 const processed = this.processSpatialData(raw);\n if (processed) this.emit(\"spatialData\", processed);\n });\n\n connection.on(\"buttonEvent\", (event) => this.emit(\"buttonEvent\", event));\n connection.on(\"stateChange\", (state, proto) => this.emit(\"stateChange\", state, proto));\n connection.on(\"deviceStatus\", (event, device) => this.emit(\"deviceStatus\", event, device));\n }\n\n private processSpatialData(raw: SpatialData): SpatialData | null {\n const cfg = this._config;\n let data = raw;\n\n // Transform pipeline\n if (cfg.deadZone > 0) data = applyDeadZone(data, cfg.deadZone);\n if (cfg.dominant) data = applyDominant(data);\n data = applyFlip(data, cfg.flip);\n data = applyAxisRemap(data, cfg.axisRemap);\n data = applySensitivity(data, cfg.sensitivity);\n\n // Lock axes\n if (cfg.lockPosition) {\n data = { ...data, translation: { x: 0, y: 0, z: 0 } };\n }\n if (cfg.lockRotation) {\n data = { ...data, rotation: { x: 0, y: 0, z: 0 } };\n }\n\n return data;\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 { useCallback } from \"react\";\nimport { useSatMouse } from \"../hooks.js\";\n\nexport interface SettingsPanelProps {\n className?: string;\n}\n\nconst FLIP_AXES = [\"tx\", \"ty\", \"tz\", \"rx\", \"ry\", \"rz\"] as const;\n\nfunction mapSlider(v: number): number {\n return 0.0001 * Math.pow(500, v / 100);\n}\n\nfunction unmapSlider(v: number): number {\n return (100 * Math.log(v / 0.0001)) / Math.log(500);\n}\n\nexport function SettingsPanel({ className }: SettingsPanelProps) {\n const { config, updateConfig } = useSatMouse();\n\n const onFlip = useCallback(\n (axis: (typeof FLIP_AXES)[number]) => {\n updateConfig({ flip: { ...config.flip, [axis]: !config.flip[axis] } });\n },\n [config.flip, updateConfig],\n );\n\n return (\n <div className={className}>\n <section data-section=\"sensitivity\">\n <label>\n Translation\n <input\n type=\"range\"\n min={0}\n max={100}\n value={Math.round(unmapSlider(config.sensitivity.translation))}\n onChange={(e) =>\n updateConfig({ sensitivity: { ...config.sensitivity, translation: mapSlider(+e.target.value) } })\n }\n />\n <span>{config.sensitivity.translation.toFixed(4)}</span>\n </label>\n <label>\n Rotation\n <input\n type=\"range\"\n min={0}\n max={100}\n value={Math.round(unmapSlider(config.sensitivity.rotation))}\n onChange={(e) =>\n updateConfig({ sensitivity: { ...config.sensitivity, rotation: mapSlider(+e.target.value) } })\n }\n />\n <span>{config.sensitivity.rotation.toFixed(4)}</span>\n </label>\n </section>\n\n <section data-section=\"flip\">\n {FLIP_AXES.map((axis) => (\n <label key={axis}>\n <input\n type=\"checkbox\"\n checked={config.flip[axis]}\n onChange={() => onFlip(axis)}\n />\n {axis.toUpperCase()}\n </label>\n ))}\n </section>\n\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"]}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
/** Minimal typed event emitter — no node:events dependency for browser compatibility */
|
|
6
|
+
declare class TypedEmitter<Events> {
|
|
7
|
+
private listeners;
|
|
8
|
+
on<K extends string & keyof Events>(event: K, listener: Events[K] & Function): this;
|
|
9
|
+
off<K extends string & keyof Events>(event: K, listener: Events[K] & Function): this;
|
|
10
|
+
protected emit<K extends string & keyof Events>(event: K, ...args: Events[K] extends (...a: infer A) => void ? A : never): void;
|
|
11
|
+
removeAllListeners(): void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface Vec3 {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
z: number;
|
|
18
|
+
}
|
|
19
|
+
/** 6DOF spatial input frame — matches spatial-data.schema.json */
|
|
20
|
+
interface SpatialData {
|
|
21
|
+
translation: Vec3;
|
|
22
|
+
rotation: Vec3;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
}
|
|
25
|
+
/** Button press/release event — matches button-event.schema.json */
|
|
26
|
+
interface ButtonEvent {
|
|
27
|
+
button: number;
|
|
28
|
+
pressed: boolean;
|
|
29
|
+
timestamp: number;
|
|
30
|
+
}
|
|
31
|
+
/** Device metadata from the bridge */
|
|
32
|
+
interface DeviceInfo$1 {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
model?: string;
|
|
36
|
+
vendor?: string;
|
|
37
|
+
vendorId?: number;
|
|
38
|
+
productId?: number;
|
|
39
|
+
connectionType?: "usb" | "wireless" | "bluetooth" | "unknown";
|
|
40
|
+
connected?: boolean;
|
|
41
|
+
}
|
|
42
|
+
type ConnectionState = "disconnected" | "connecting" | "connected";
|
|
43
|
+
type TransportProtocol = "webtransport" | "websocket" | "none";
|
|
44
|
+
interface SatMouseEvents {
|
|
45
|
+
spatialData: (data: SpatialData) => void;
|
|
46
|
+
buttonEvent: (data: ButtonEvent) => void;
|
|
47
|
+
stateChange: (state: ConnectionState, protocol: TransportProtocol) => void;
|
|
48
|
+
deviceStatus: (event: "connected" | "disconnected", device: DeviceInfo$1) => void;
|
|
49
|
+
error: (error: Error) => void;
|
|
50
|
+
}
|
|
51
|
+
interface ConnectOptions {
|
|
52
|
+
/**
|
|
53
|
+
* SatMouse URI: satmouse://connect?host=<ip>&wsPort=<port>&wtPort=<port>
|
|
54
|
+
* When provided, host/ports are extracted and used for discovery + transport.
|
|
55
|
+
* All params are optional — defaults to localhost:4444/4443.
|
|
56
|
+
*/
|
|
57
|
+
uri?: string;
|
|
58
|
+
/** URL to td.json. Defaults to /td.json relative to window.location */
|
|
59
|
+
tdUrl?: string;
|
|
60
|
+
/** Direct WebSocket URL (skips discovery) */
|
|
61
|
+
wsUrl?: string;
|
|
62
|
+
/** Direct WebTransport URL (skips discovery) */
|
|
63
|
+
wtUrl?: string;
|
|
64
|
+
/** Certificate hash for self-signed WebTransport certs (base64) */
|
|
65
|
+
certHash?: string;
|
|
66
|
+
/** Preferred transport order. Default: ["webtransport", "websocket"] */
|
|
67
|
+
transports?: TransportProtocol[];
|
|
68
|
+
/** Auto-reconnect delay in ms. 0 to disable. Default: 2000 */
|
|
69
|
+
reconnectDelay?: number;
|
|
70
|
+
/** WebSocket subprotocol. Default: "satmouse-json" */
|
|
71
|
+
wsSubprotocol?: "satmouse-json" | "satmouse-binary";
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Core connection to a SatMouse bridge.
|
|
76
|
+
*
|
|
77
|
+
* Handles discovery (via WoT Thing Description), transport negotiation
|
|
78
|
+
* (WebTransport with WebSocket fallback), event dispatch, and auto-reconnect.
|
|
79
|
+
*/
|
|
80
|
+
declare class SatMouseConnection extends TypedEmitter<SatMouseEvents> {
|
|
81
|
+
private options;
|
|
82
|
+
private transport;
|
|
83
|
+
private reconnectTimer;
|
|
84
|
+
private intentionalClose;
|
|
85
|
+
private deviceInfoUrl;
|
|
86
|
+
private _state;
|
|
87
|
+
private _protocol;
|
|
88
|
+
get state(): ConnectionState;
|
|
89
|
+
get protocol(): TransportProtocol;
|
|
90
|
+
constructor(options?: ConnectOptions);
|
|
91
|
+
connect(): Promise<void>;
|
|
92
|
+
disconnect(): void;
|
|
93
|
+
fetchDeviceInfo(): Promise<DeviceInfo$1[]>;
|
|
94
|
+
private tryTransport;
|
|
95
|
+
private setState;
|
|
96
|
+
private scheduleReconnect;
|
|
97
|
+
private clearReconnect;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface FlipConfig {
|
|
101
|
+
tx: boolean;
|
|
102
|
+
ty: boolean;
|
|
103
|
+
tz: boolean;
|
|
104
|
+
rx: boolean;
|
|
105
|
+
ry: boolean;
|
|
106
|
+
rz: boolean;
|
|
107
|
+
}
|
|
108
|
+
interface SensitivityConfig {
|
|
109
|
+
translation: number;
|
|
110
|
+
rotation: number;
|
|
111
|
+
}
|
|
112
|
+
/** Maps each input axis to an output axis. E.g., { tx: "tz", tz: "tx" } swaps X and Z translation. */
|
|
113
|
+
type AxisMap = {
|
|
114
|
+
tx: keyof Vec3;
|
|
115
|
+
ty: keyof Vec3;
|
|
116
|
+
tz: keyof Vec3;
|
|
117
|
+
rx: keyof Vec3;
|
|
118
|
+
ry: keyof Vec3;
|
|
119
|
+
rz: keyof Vec3;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
interface InputConfig {
|
|
123
|
+
sensitivity: SensitivityConfig;
|
|
124
|
+
flip: FlipConfig;
|
|
125
|
+
deadZone: number;
|
|
126
|
+
dominant: boolean;
|
|
127
|
+
axisRemap: AxisMap;
|
|
128
|
+
lockPosition: boolean;
|
|
129
|
+
lockRotation: boolean;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface StorageAdapter {
|
|
133
|
+
getItem(key: string): string | null;
|
|
134
|
+
setItem(key: string, value: string): void;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
interface InputManagerEvents {
|
|
138
|
+
/** Processed spatial data (after all transforms) */
|
|
139
|
+
spatialData: (data: SpatialData) => void;
|
|
140
|
+
/** Raw spatial data (before transforms) */
|
|
141
|
+
rawSpatialData: (data: SpatialData) => void;
|
|
142
|
+
/** Button event (pass-through from connection) */
|
|
143
|
+
buttonEvent: (data: ButtonEvent) => void;
|
|
144
|
+
/** Connection state changed */
|
|
145
|
+
stateChange: (state: ConnectionState, protocol: TransportProtocol) => void;
|
|
146
|
+
/** Device connected/disconnected */
|
|
147
|
+
deviceStatus: (event: "connected" | "disconnected", device: DeviceInfo$1) => void;
|
|
148
|
+
/** Configuration changed */
|
|
149
|
+
configChange: (config: InputConfig) => void;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Unified device service that wraps one or more SatMouseConnections
|
|
153
|
+
* and provides a single processed event stream.
|
|
154
|
+
*
|
|
155
|
+
* Applies a configurable transform pipeline to spatial data:
|
|
156
|
+
* deadZone → dominant → flip → axisRemap → sensitivity → lock
|
|
157
|
+
*
|
|
158
|
+
* Persists settings to storage (localStorage by default).
|
|
159
|
+
*/
|
|
160
|
+
declare class InputManager extends TypedEmitter<InputManagerEvents> {
|
|
161
|
+
private connections;
|
|
162
|
+
private storage?;
|
|
163
|
+
private _config;
|
|
164
|
+
get config(): InputConfig;
|
|
165
|
+
constructor(config?: Partial<InputConfig>, storage?: StorageAdapter);
|
|
166
|
+
/** Add a connection to the managed set */
|
|
167
|
+
addConnection(connection: SatMouseConnection): void;
|
|
168
|
+
/** Remove a connection */
|
|
169
|
+
removeConnection(connection: SatMouseConnection): void;
|
|
170
|
+
/** Connect all managed connections */
|
|
171
|
+
connect(): Promise<void>;
|
|
172
|
+
/** Disconnect all managed connections */
|
|
173
|
+
disconnect(): void;
|
|
174
|
+
/** Fetch device info from all connections */
|
|
175
|
+
fetchDeviceInfo(): Promise<DeviceInfo$1[]>;
|
|
176
|
+
/** Update configuration. Persists by default. */
|
|
177
|
+
updateConfig(partial: Partial<InputConfig>, persist?: boolean): void;
|
|
178
|
+
/** Register a callback for processed spatial data. Returns unsubscribe function. */
|
|
179
|
+
onSpatialData(callback: (data: SpatialData) => void): () => void;
|
|
180
|
+
/** Register a callback for button events. Returns unsubscribe function. */
|
|
181
|
+
onButtonEvent(callback: (data: ButtonEvent) => void): () => void;
|
|
182
|
+
private wireConnection;
|
|
183
|
+
private processSpatialData;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
interface SatMouseContextValue {
|
|
187
|
+
manager: InputManager;
|
|
188
|
+
state: ConnectionState;
|
|
189
|
+
protocol: TransportProtocol;
|
|
190
|
+
config: InputConfig;
|
|
191
|
+
updateConfig: (partial: Partial<InputConfig>) => void;
|
|
192
|
+
}
|
|
193
|
+
declare const SatMouseContext: react.Context<SatMouseContextValue | null>;
|
|
194
|
+
interface SatMouseProviderProps {
|
|
195
|
+
connectOptions?: ConnectOptions;
|
|
196
|
+
config?: Partial<InputConfig>;
|
|
197
|
+
autoConnect?: boolean;
|
|
198
|
+
children: ReactNode;
|
|
199
|
+
}
|
|
200
|
+
declare function SatMouseProvider({ connectOptions, config: configOverrides, autoConnect, children, }: SatMouseProviderProps): react_jsx_runtime.JSX.Element;
|
|
201
|
+
|
|
202
|
+
/** Access the SatMouse context. Throws if used outside SatMouseProvider. */
|
|
203
|
+
declare function useSatMouse(): SatMouseContextValue;
|
|
204
|
+
/**
|
|
205
|
+
* Subscribe to processed spatial data.
|
|
206
|
+
* Batches updates to requestAnimationFrame to avoid re-rendering at device rate.
|
|
207
|
+
*/
|
|
208
|
+
declare function useSpatialData(): SpatialData | null;
|
|
209
|
+
/**
|
|
210
|
+
* Subscribe to raw (pre-transform) spatial data.
|
|
211
|
+
* Batches updates to requestAnimationFrame.
|
|
212
|
+
*/
|
|
213
|
+
declare function useRawSpatialData(): SpatialData | null;
|
|
214
|
+
/** Subscribe to button events via callback. Does not trigger re-renders. */
|
|
215
|
+
declare function useButtonEvent(callback: (event: ButtonEvent) => void): void;
|
|
216
|
+
|
|
217
|
+
interface ConnectionStatusProps {
|
|
218
|
+
className?: string;
|
|
219
|
+
}
|
|
220
|
+
declare function ConnectionStatus({ className }: ConnectionStatusProps): react_jsx_runtime.JSX.Element;
|
|
221
|
+
|
|
222
|
+
interface DeviceInfoProps {
|
|
223
|
+
className?: string;
|
|
224
|
+
/** Timeout in ms before showing "no device". Default: 5000 */
|
|
225
|
+
timeout?: number;
|
|
226
|
+
}
|
|
227
|
+
declare function DeviceInfo({ className, timeout }: DeviceInfoProps): react_jsx_runtime.JSX.Element;
|
|
228
|
+
|
|
229
|
+
interface SettingsPanelProps {
|
|
230
|
+
className?: string;
|
|
231
|
+
}
|
|
232
|
+
declare function SettingsPanel({ className }: SettingsPanelProps): react_jsx_runtime.JSX.Element;
|
|
233
|
+
|
|
234
|
+
interface DebugPanelProps {
|
|
235
|
+
className?: string;
|
|
236
|
+
}
|
|
237
|
+
declare function DebugPanel({ className }: DebugPanelProps): react_jsx_runtime.JSX.Element;
|
|
238
|
+
|
|
239
|
+
export { ConnectionStatus, type ConnectionStatusProps, DebugPanel, type DebugPanelProps, DeviceInfo, type DeviceInfoProps, SatMouseContext, type SatMouseContextValue, SatMouseProvider, type SatMouseProviderProps, SettingsPanel, type SettingsPanelProps, useButtonEvent, useRawSpatialData, useSatMouse, useSpatialData };
|