mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-06 05:25:41 -05:00
63 lines
1.5 KiB
QML
63 lines
1.5 KiB
QML
import QtQuick
|
|
import Quickshell.Io
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property alias path: socket.path
|
|
property alias parser: socket.parser
|
|
property bool connected: false
|
|
|
|
property int reconnectBaseMs: 400
|
|
property int reconnectMaxMs: 15000
|
|
|
|
property int _reconnectAttempt: 0
|
|
|
|
signal connectionStateChanged()
|
|
|
|
onConnectedChanged: {
|
|
socket.connected = connected
|
|
}
|
|
|
|
Socket {
|
|
id: socket
|
|
|
|
onConnectionStateChanged: {
|
|
root.connectionStateChanged()
|
|
if (connected) {
|
|
root._reconnectAttempt = 0
|
|
return
|
|
}
|
|
if (root.connected) {
|
|
root._scheduleReconnect()
|
|
}
|
|
}
|
|
}
|
|
|
|
Timer {
|
|
id: reconnectTimer
|
|
interval: 0
|
|
repeat: false
|
|
onTriggered: {
|
|
socket.connected = false
|
|
Qt.callLater(() => socket.connected = true)
|
|
}
|
|
}
|
|
|
|
function send(data) {
|
|
const json = typeof data === "string" ? data : JSON.stringify(data)
|
|
const message = json.endsWith("\n") ? json : json + "\n"
|
|
socket.write(message)
|
|
socket.flush()
|
|
}
|
|
|
|
function _scheduleReconnect() {
|
|
const pow = Math.min(_reconnectAttempt, 10)
|
|
const base = Math.min(reconnectBaseMs * Math.pow(2, pow), reconnectMaxMs)
|
|
const jitter = Math.floor(Math.random() * Math.floor(base / 4))
|
|
reconnectTimer.interval = base + jitter
|
|
reconnectTimer.restart()
|
|
_reconnectAttempt++
|
|
}
|
|
}
|