New
cam(id)bound accessor —manager.camera(id)returns aBoundCamerawith every API method pre-bound to the camera ID. Callers no longer repeatcameraIdon every invocation:CameraManagernow drives discovery polling with auto-reconnect,autoConnect, and event-driven updates. Replaces the older ad-hocCameraClient+ manual polling pattern.
Fixed
- Poll stacking under idle —
setIntervalhad no in-flight guard, so polls queued after the browser woke and saturated the 6-connection pool. AddedisPollingflag inCameraManagerCore.poll(). - Property-refresh connection exhaustion —
refreshPropertiesfired 12 parallelgetPropertyGETs; after ~2 minutes all connections were held. Replaced with a singlegetAllPropertiescall plus a mutex (isRefreshingRef) against concurrent bursts. - Ghost SSE callbacks after reconnect —
EventStream.off()removed handlers from an internal map but not from the nativeEventSource. AddednativeListenerMapsooff()reaches both layers. - ISO duplicate entries in
getAllProperties— SDK returns two ISO rows (one read-only, no values; one writable). Server-side dedup now prefers the entry with values/writable.

