Releases: BANG88/simfarm
Release list
v0.3.1
Patch Changes
-
#6
f990f69Thanks @BANG88! - Shutting an iOS simulator down while a stream was attached — or attaching to one CoreSimulator considers shut down — no longer takes the whole server with it. serve-sim starts its native capture without looking at the promise, and theFrameCapture Code=2 "Device not booted (state: Shutdown)"it rejects with was an unhandled rejection that ended the process, every session and every other device's stream with it. The provider now guards that call: the stream on the affected device ends with anerrorevent that says why, the stream id is freed, the device is re-listed as shut down, and serve-sim's dead in-process session is dropped so the next boot streams again instead of serving its last cached picture at 0 fps (which is what a re-attach after a reboot got before). Anattachon a simulator that is not booted, or whose capture cannot start, answersok:falsewith the reason and the way out; theshutdownop ends the device's streams before the simulator goes, whatever order the client sends things in. A process-level guard logs any other unhandled rejection or uncaught exception with its likely source and keeps serving; only a failure to bind the listening socket still exits. Android: a scrcpy process that cannot be spawned ends its stream instead of throwing at the event loop. -
#8
18295a5Thanks @BANG88! - serve-sim 0.1.45 -> 0.1.46 (upstream PR #140, "restore Xcode 27 Device Hub streaming and input"). On Xcode 27 the native capture now picks the simulator's own framebuffer instead of the larger Device Hub presentation surface that made VideoToolbox fail withencodingFailed, browser keyboard events reach iOS 27 through a guarded Device Hub route (opt out withSERVE_SIM_DISABLE_DEVICE_HUB_KEYBOARD=1; Xcode 26 and older keep the HID path simfarm's input uses), andsimctl bootstatusis no longer called with a redundant-bthat could block after boot. serve-sim's in-process session also awaits its native capture start now, answers a stream route 503 and evicts the failed session instead of dropping the promise; simfarm's own capture guard stays in front of that so a failed capture still ends the affected stream with the reason, re-lists the device and drops the dead session. No simfarm behaviour changes on Xcode 26.
v0.3.0
Minor Changes
- #4
afe02f8Thanks @BANG88! - The iOS JPEG path now has the same discipline as the Android one. serve-sim encodes the whole framebuffer — 1206x2622 on an iPhone 17 Pro, 100-700 KB a picture, at whatever rate the guest redraws — and a phone viewer drawing it at 402x874 points paid for every byte. Each attached JPEG stream now runs through ffmpeg (mjpeg -> scale -> mjpeg) with three new flags:--ios-max-size(default 1024, longest side, aspect kept, even dimensions;0disables scaling),--ios-jpeg-max-fps(default 20, drop-never-queue, applied before ffmpeg so a dropped picture costs nothing;0uncaps) and--ios-jpeg-quality(default 70).screen.scaleshrinks in step with the picture sowidth / scaleis still the device's point size;statson an iOS stream reportsframeSizebesidevideoSize, and the attach log line says the delivered size. Without a usable ffmpeg the pictures still arrive, at full size, and the log says so. The iOS H.264 path is unchanged.
v0.2.0
Minor Changes
- #2
7047f70Thanks @BANG88! - Android devices now offer JPEG as well as H.264: the H.264 stream scrcpy sends is transcoded through ffmpeg (h264 -> mjpeg) and each picture is delivered as a key frame, so a client with no video decoder — a native app that can only draw JPEG, or a browser on a plain-http IP origin whereVideoDecoderis undefined — can show an Android device at all. The capability is probed at startup: with a usable ffmpeg the device declares["h264", "jpeg"], without one it stays["h264"], and H.264 stays the default for clients that can decode it. The transcoder runs only while a JPEG stream is attached. New flags:--android-jpeg-max-fps(default 20,0uncaps),--android-jpeg-quality(default 70),--android-ffmpeg PATH,--android-no-jpeg.