10.0.0-rc.12 (2026-09-18)
⚠ BREAKING CHANGES
connection.changedis removed. Connectivity is published as two state stores
and nothing else:client.networkConnection.statefor the device andclient.wsConnection.state
for this client's socket. The event was silent oncloseConnection()and two error paths, and
held a drop for five seconds; the stores are written on every transition and publish immediately.client.wsConnectionis now aWSConnectionwrapper rather than the
StableWSConnectionitself, and is never null. The live socket isclient.wsConnection.connection,
replaced on every connect; readisHealthy,isConnecting,connect()anddisconnect()from the
wrapper.StableWSConnectionis constructed with{ wsConnection }instead of{ client }.client.defaultWSTimeoutis removed, along with theWebSocketImpland
wsUrlParamsclient options. They move to the socket's configuration asconnectTimeoutMs,
webSocketImplandurlParams, set withclient.config.set({ client: { wsConnection: { … } } }).
Unlike the fields and options they replace, these survive a reconnect.ThreadManagerState.lastConnectionDropAtis removed. Read
client.wsConnection.state.lastUnhealthyAt, which is written on every status transition,
including thedisconnect()path the old event was silent about.- requests that watch a channel or subscribe to presence now wait for a WebSocket
connection id instead of silently returning unwatched data. The gate is inApiClient._doRequest,
so it covers every endpoint carryingwatchorpresence, plusstopWatchingChanneland
longPoll. With no socket open and none being established the request rejects with "No connection
id is available"; an explicitwatch: falseis still honoured, and a caller'sAbortSignal
abandons the wait. Test fixtures that fake a connected user without a live socket will now throw. - a UI that renders a "connection lost" banner must hold the drop itself. The
socket's store publishes drops the moment they happen, where the old event delayed them by five
seconds.client.wsConnection.config.offlineNotificationDisplayDelayMs(5s) is the shared value to
wait for; nothing in this package acts on it. connection.recoveredis no longer dispatched when the socket drops while a
recovery is running, because every reload in it can have failed. Work keyed off that event will
correctly stop running for recoveries that recovered nothing.- openapi related clean up (#1870)
Bug Fixes
- add missing app config fields to AppSettingsAPIResponse (#1854) (18bc3cf)
- do not reset channel unread count on thread read (#1835) (79fbf54)
- hanging wsPromise after closeConnection (#1868) (b4e7a89), closes #1122 #1863
- isolate event listener errors from the dispatch loop (#1850) (dc56e57)
- reconnect past connection timeout (#1874) (2004a83), closes #1760
- send the read request regardless of read receipt privacy settings (#1853) (59d8f31)
Features
- client: support custom_set and custom_unset in batch channel update (#1856) (d05c2f5)
- establish network connection observer services (#1859) (4c46949)
- message pruning (696f56f)
- message pruning (#1875) (d4d2c6c)
- MessageComposer: add composition middleware for pending attachment uploads (#1845) (68e5d69)
- openapi related clean up (#1870) (b3fa906)