fix(server): skip an unmappable event on replay instead of tearing down the stream

Wrap the per-event mapper.map in runCatching in the replay loop so a single
event the mapper can't handle no longer kills the whole WebSocket stream.
Defense-in-depth beyond the AnyMapSerializer fix.
This commit is contained in:
2026-07-03 01:01:04 +04:00
parent 527490e5df
commit ca3fd7971e
@@ -31,9 +31,12 @@ class SessionStreamHandler(private val module: ServerModule) {
log.debug("replaying {} event(s) for session={}", replayEvents.size, sessionId.value) log.debug("replaying {} event(s) for session={}", replayEvents.size, sessionId.value)
for (event in replayEvents) { for (event in replayEvents) {
mapper.map(event)?.let { msg -> runCatching { mapper.map(event) }
session.send(Frame.Text(ProtocolSerializer.encodeServerMessage(msg))) .onFailure { log.warn("skipping unmappable event seq={}: {}", event.sequence, it.message) }
} .getOrNull()
?.let { msg ->
session.send(Frame.Text(ProtocolSerializer.encodeServerMessage(msg)))
}
} }
module.approvalCoordinator.registerClient(sessionId, session) module.approvalCoordinator.registerClient(sessionId, session)