(state: BridgeState, detail_0?: string)
| 222 | |
| 223 | // State change callback — maps bridge lifecycle events to AppState. |
| 224 | function handleStateChange(state: BridgeState, detail_0?: string): void { |
| 225 | if (cancelled) return; |
| 226 | if (outboundOnly) { |
| 227 | logForDebugging(`[bridge:repl] Mirror state=${state}${detail_0 ? ` detail=${detail_0}` : ''}`); |
| 228 | // Sync replBridgeConnected so the forwarding effect starts/stops |
| 229 | // writing as the transport comes up or dies. |
| 230 | if (state === 'failed') { |
| 231 | setAppState(prev_3 => { |
| 232 | if (!prev_3.replBridgeConnected) return prev_3; |
| 233 | return { |
| 234 | ...prev_3, |
| 235 | replBridgeConnected: false |
| 236 | }; |
| 237 | }); |
| 238 | } else if (state === 'ready' || state === 'connected') { |
| 239 | setAppState(prev_4 => { |
| 240 | if (prev_4.replBridgeConnected) return prev_4; |
| 241 | return { |
| 242 | ...prev_4, |
| 243 | replBridgeConnected: true |
| 244 | }; |
| 245 | }); |
| 246 | } |
| 247 | return; |
| 248 | } |
| 249 | const handle = handleRef.current; |
| 250 | switch (state) { |
| 251 | case 'ready': |
| 252 | setAppState(prev_9 => { |
| 253 | const connectUrl = handle && handle.environmentId !== '' ? buildBridgeConnectUrl(handle.environmentId, handle.sessionIngressUrl) : prev_9.replBridgeConnectUrl; |
| 254 | const sessionUrl = handle ? getRemoteSessionUrl(handle.bridgeSessionId, handle.sessionIngressUrl) : prev_9.replBridgeSessionUrl; |
| 255 | const envId = handle?.environmentId; |
| 256 | const sessionId = handle?.bridgeSessionId; |
| 257 | if (prev_9.replBridgeConnected && !prev_9.replBridgeSessionActive && !prev_9.replBridgeReconnecting && prev_9.replBridgeConnectUrl === connectUrl && prev_9.replBridgeSessionUrl === sessionUrl && prev_9.replBridgeEnvironmentId === envId && prev_9.replBridgeSessionId === sessionId) { |
| 258 | return prev_9; |
| 259 | } |
| 260 | return { |
| 261 | ...prev_9, |
| 262 | replBridgeConnected: true, |
| 263 | replBridgeSessionActive: false, |
| 264 | replBridgeReconnecting: false, |
| 265 | replBridgeConnectUrl: connectUrl, |
| 266 | replBridgeSessionUrl: sessionUrl, |
| 267 | replBridgeEnvironmentId: envId, |
| 268 | replBridgeSessionId: sessionId, |
| 269 | replBridgeError: undefined |
| 270 | }; |
| 271 | }); |
| 272 | break; |
| 273 | case 'connected': |
| 274 | { |
| 275 | setAppState(prev_8 => { |
| 276 | if (prev_8.replBridgeSessionActive) return prev_8; |
| 277 | return { |
| 278 | ...prev_8, |
| 279 | replBridgeConnected: true, |
| 280 | replBridgeSessionActive: true, |
| 281 | replBridgeReconnecting: false, |
nothing calls this directly
no test coverage detected