fix(realtime): proper reconnect handling for socket.io

Socket.IO seems to include an own reconnect mechanism for some time.
HedgeDoc however built an own reconnect mechanism on top of that.
Since the 'reconnect' event was dropped for socket.io 4.x, the
reconnect-cleanup code didn't run anymore.

This commit fixes this by:
- removing the manual reconnect interval,
- putting the reconnect handler into the correct place,
- setting reconnection options on the server side

Signed-off-by: Erik Michelson <github@erik.michelson.eu>
This commit is contained in:
Erik Michelson
2026-08-21 13:07:30 +02:00
committed by Philip Molares
parent d1ad8d71fe
commit 766d00c4d9
3 changed files with 14 additions and 15 deletions

4
app.js
View File

@@ -89,6 +89,10 @@ const io = new Server(server, {
origin: config.serverURL,
methods: ['GET', 'POST'],
credentials: true
},
connectionStateRecovery: {
maxDisconnectionDuration: 2 * 60 * 1000,
skipMiddlewares: false
}
})

View File

@@ -9,7 +9,7 @@
### Bugfixes
- All links will be opened in new tabs instead of the same tab as the note. This was changed when the external link warning was implemented and now the old behavior is restored.
- Fixed a bug in the realtime disconnect handler that could lead to data-loss of users with a flaky connection
- Fixed multiple bugs in the realtime connection handling that could lead to data-loss of users with a flaky connection
## <i class="fa fa-tag"></i> 1.11.1 <i class="fa fa-calendar-o"></i> 2026-07-24

View File

@@ -2233,7 +2233,6 @@ socket.on('delete', function () {
})
}
})
let retryTimer = null
socket.on('maintenance', function () {
cmClient.revision = -1
})
@@ -2246,21 +2245,17 @@ socket.on('disconnect', function (data) {
if (!editor.getOption('readOnly')) {
editor.setOption('readOnly', true)
}
if (!retryTimer) {
retryTimer = setInterval(function () {
if (!needRefresh) socket.connect()
}, 1000)
}
})
socket.on('reconnect', function (data) {
socket.on('connect', function (data) {
if (socket.recovered) {
// sync back any change in offline
console.debug('Reconnected client')
emitUserStatus(true)
cursorActivity(editor)
socket.emit('online users')
})
socket.on('connect', function (data) {
clearInterval(retryTimer)
retryTimer = null
return
}
console.debug('Client connected (no reconnect)')
personalInfo.id = socket.id
showStatus(statusType.connected)
socket.emit('version')