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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user