# WebMuxD `webmuxd` is a WebUSB implementation of Apple's `usbmuxd` protocol, compatible with [libimobiledevice/usbmuxd](https://github.com/libimobiledevice/usbmuxd). ## Usage Yarn: `yarn add webmuxd` NPM: `npm add webmuxd` ## iMobileDevice Interaction Module This package now includes a browser-side high-level module for direct iOS interaction: - `DirectUsbMuxClient`: usbmux + lockdownd + AFC + installation_proxy lifecycle - `installIpaViaInstProxy`: staging IPA via AFC and installing with InstProxy - Pairing helpers: `createHostId`, `createSystemBuid`, pair record encode/decode helpers Import from root package: `import { DirectUsbMuxClient, installIpaViaInstProxy } from "webmuxd"` When device session requires TLS/pairing, inject your own `tlsFactory` and `pairRecordFactory` in `DirectUsbMuxClient` options. ## How it Works In this repo you will find `webmuxd.ts`. This is a node module that provides the client side implementation of connecting to the WebUSB API surface and configuring the message pump. You can see a more complete example and implementation of this by looking at [webmuxd-example](https://github.com/webmuxd/webmuxd-example) and it's corresponding server component [go-webmuxd](https://github.com/webmuxd/go-webmuxd). The example connects up this component to a WebSocket and pipes the USB content back and forth to the `go-webmuxd` server, which finally passes it to `libimobiledevice` via a UNIX socket on disk. ## Building If you wish to create your own build it's rather simple: `yarn run build` ## Developing The simplest way to build, develop and diagnose is using the `XHC20` USB capture on macOS, and optionally `demuxusb` https://www.umpah.net/how-to-sniff-usb-traffic-reverse-engineer-usb-device-interactions/ Using a Chromebook as an endpoint: https://blog.rickmark.me/puppeteer-with-chromeos/ ## Contributing and License This project is happy to accept PRs and other contributions. It is free for commercial use under the MIT license, I would love to see it credited if so! ## Roadmap To make this component "production ready" and less of a proof of concept the following should be completed: * Handle all `usbmuxd` framing, and ACKs in script to reduce RTT (round trip time) * Create a standardized WebSocket protocol and move it from `webmuxd-example` to `webmuxd` keeping only the UI * Move `MobileDevice.ts` * Move `RemoteChannel.ts` * Move `transport.proto` / `transport.ts` * Factor out "common UI elements" to `webmuxd-ui` * Device Picker * Device Info * Improve `go-webmuxd` as a multi-session "meet me" service