Skip to content

Commit 8cb1679

Browse files
authored
Merge pull request #30 from DatepollSystems/feature/print-network-disconnect-information
feat: print network disconnect information to all connected printers
2 parents 17e574f + 96d445b commit 8cb1679

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.datepollsystems.waiterrobot.mediator.printer
2+
3+
private const val NETWORK_ERROR_BASE64 = """
4+
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dE3O4qHu3ePxcP4/Y+Py5lwYWbykOCuckjbwe492slgVn2/+5Y55CmVuZHN0cmVhbQplbmRvYmoKCjE2IDAgb2JqCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL0Jhc2VGb250L0JBQUFBQStOb3RvU2Fucy1Cb2xkCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMTUKL1dpZHRoc1swIDU3MiA4MTMgNTYwIDU3OSA5NjcgNzk2IDY2MCA2NjQgMjYwIDYzNyA3NjUgOTQzIDc0MCAzODkgNjkwCl0KL0ZvbnREZXNjcmlwdG9yIDE0IDAgUgovVG9Vbmljb2RlIDE1IDAgUgo+PgplbmRvYmoKCjE3IDAgb2JqCjw8L0YxIDE2IDAgUgo+PgplbmRvYmoKCjE4IDAgb2JqCjw8Ci9Gb250IDE3IDAgUgovUHJvY1NldFsvUERGL1RleHRdCj4+CmVuZG9iagoKMSAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDExIDAgUi9SZXNvdXJjZXMgMTggMCBSL01lZGlhQm94WzAgMCAxOTIuNzU1OTA1NTExODExIDI4My40MzYyMjA0NzI0NDFdL1N0cnVjdFBhcmVudHMgMAovQ29udGVudHMgMiAwIFI+PgplbmRvYmoKCjUgMCBvYmoKPDwvVHlwZS9TdHJ1Y3RFbGVtCi9TL1N0YW5kYXJkCi9QIDQgMCBSCi9QZyAxIDAgUgovQSA8PC9PL0xheW91dC9QbGFjZW1lbnQvQmxvY2sKL1RleHRBbGlnbi9DZW50ZXIKPj4KL0tbMCBdCj4+CmVuZG9iagoKNiAwIG9iago8PC9UeXBlL1N0cnVjdEVsZW0KL1MvU3RhbmRhcmQKL1AgNCAwIFIKL1BnIDEgMCBSCi9BIDw8L08vTGF5b3V0L1BsYWNlbWVudC9CbG9jawovVGV4dEFsaWduL0NlbnRlcgo+PgovS1sxIDIgXQo+PgplbmRvYmoKCjcgMCBvYmoKPDwvVHlwZS9TdHJ1Y3RFbGVtCi9TL1N0YW5kYXJkCi9QIDQgMCBSCi9QZyAxIDAgUgovQSA8PC9PL0xheW91dC9QbGFjZW1lbnQvQmxvY2sKL1RleHRBbGlnbi9DZW50ZXIKPj4KL0tbMyBdCj4+CmVuZG9iagoKOCAwIG9iago8PC9UeXBlL1N0cnVjdEVsZW0KL1MvU3RhbmRhcmQKL1AgNCAwIFIKL1BnIDEgMCBSCi9BIDw8L08vTGF5b3V0L1BsYWNlbWVudC9CbG9jawovVGV4dEFsaWduL0NlbnRlcgo+Pgo+PgplbmRvYmoKCjkgMCBvYmoKPDwvVHlwZS9TdHJ1Y3RFbGVtCi9TL1N0YW5kYXJkCi9QIDQgMCBSCi9QZyAxIDAgUgovQSA8PC9PL0xheW91dC9QbGFjZW1lbnQvQmxvY2sKL1RleHRBbGlnbi9DZW50ZXIKPj4KL0tbNCBdCj4+CmVuZG9iagoKMTAgMCBvYmoKPDwvVHlwZS9TdHJ1Y3RFbGVtCi9TL1N0YW5kYXJkCi9QIDQgMCBSCi9QZyAxIDAgUgovQSA8PC9PL0xheW91dC9QbGFjZW1lbnQvQmxvY2sKL1RleHRBbGlnbi9DZW50ZXIKPj4KL0tbNSBdCj4+CmVuZG9iagoKNCAwIG9iago8PC9UeXBlL1N0cnVjdEVsZW0KL1MvRG9jdW1lbnQKL1AgMTkgMCBSCi9QZyAxIDAgUgovS1s1IDAgUiA2IDAgUiA3IDAgUiA4IDAgUiA5IDAgUiAxMCAwIFIgXQo+PgplbmRvYmoKCjE5IDAgb2JqCjw8L1R5cGUvU3RydWN0VHJlZVJvb3QKL1BhcmVudFRyZWUgMjAgMCBSCi9Sb2xlTWFwPDwvU3RhbmRhcmQvUAo+PgovS1s0IDAgUiBdCj4+CmVuZG9iagoKMjAgMCBvYmoKPDwvTnVtc1sKMCBbIDUgMCBSIDYgMCBSIDYgMCBSIDcgMCBSIDkgMCBSIDEwIDAgUiBdCl0+PgplbmRvYmoKCjExIDAgb2JqCjw8L1R5cGUvUGFnZXMKL1Jlc291cmNlcyAxOCAwIFIKL01lZGlhQm94WyAwIDAgMTkyLjc1NTkwNTUxMTgxMSAyODMuNDM2MjIwNDcyNDQxIF0KL0tpZHNbIDEgMCBSIF0KL0NvdW50IDE+PgplbmRvYmoKCjIxIDAgb2JqCjw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAxMSAwIFIKL1BhZ2VNb2RlL1VzZU91dGxpbmVzCi9PcGVuQWN0aW9uWzEgMCBSIC9YWVogbnVsbCBudWxsIDBdCi9TdHJ1Y3RUcmVlUm9vdCAxOSAwIFIKL0xhbmcoZGUtQVQpCi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4KPj4KZW5kb2JqCgoyMiAwIG9iago8PC9DcmVhdG9yPEZFRkYwMDU3MDA3MjAwNjkwMDc0MDA2NTAwNzI+Ci9Qcm9kdWNlcjxGRUZGMDA0QzAwNjkwMDYyMDA3MjAwNjUwMDRGMDA2NjAwNjYwMDY5MDA2MzAwNjUwMDIwMDAzNzAwMkUwMDM2PgovQ3JlYXRpb25EYXRlKEQ6MjAyNDA2MTExNTM3NTQrMDInMDAnKT4+CmVuZG9iagoKeHJlZgowIDIzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwNTc2NiAwMDAwMCBuIAowMDAwMDAwMDE5IDAwMDAwIG4gCjAwMDAwMDAzNzEgMDAwMDAgbiAKMDAwMDAwNjY3MiAwMDAwMCBuIAowMDAwMDA1OTA4IDAwMDAwIG4gCjAwMDAwMDYwMzYgMDAwMDAgbiAKMDAwMDAwNjE2NiAwMDAwMCBuIAowMDAwMDA2Mjk0IDAwMDAwIG4gCjAwMDAwMDY0MTUgMDAwMDAgbiAKMDAwMDAwNjU0MyAwMDAwMCBuIAowMDAwMDA2OTU1IDAwMDAwIG4gCjAwMDAwMDAzOTEgMDAwMDAgbiAKMDAwMDAwNDg3OCAwMDAwMCBuIAowMDAwMDA0OTAwIDAwMDAwIG4gCjAwMDAwMDUwOTggMDAwMDAgbiAKMDAwMDAwNTQ1OCAwMDAwMCBuIAowMDAwMDA1Njc3IDAwMDAwIG4gCjAwMDAwMDU3MTAgMDAwMDAgbiAKMDAwMDAwNjc4NCAwMDAwMCBuIAowMDAwMDA2ODgyIDAwMDAwIG4gCjAwMDAwMDcwODEgMDAwMDAgbiAKMDAwMDAwNzI1MCAwMDAwMCBuIAp0cmFpbGVyCjw8L1NpemUgMjMvUm9vdCAyMSAwIFIKL0luZm8gMjIgMCBSCi9JRCBbIDwwRUZEMEU5RjJEMkM0RjMyM0E3NUNFNzUzQUQxNjkwNT4KPDBFRkQwRTlGMkQyQzRGMzIzQTc1Q0U3NTNBRDE2OTA1PiBdCi9Eb2NDaGVja3N1bSAvQjg0NkUzMDA1Q0QzMjBFNjlCNEE4M0FBNTZFOUU2RDYKPj4Kc3RhcnR4cmVmCjc0MjUKJSVFT0YK
5+
"""
6+
7+
fun getNetworkErrorBase64() = NETWORK_ERROR_BASE64.trimIndent()

src/main/kotlin/org/datepollsystems/waiterrobot/mediator/printer/service/PrinterService.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ import org.datepollsystems.waiterrobot.mediator.core.ID
77
import org.datepollsystems.waiterrobot.mediator.data.api.dto.GetPrinterDto
88
import org.datepollsystems.waiterrobot.mediator.printer.AbstractLocalPrinter
99
import org.datepollsystems.waiterrobot.mediator.printer.PrinterWithIdNotFoundException
10+
import org.datepollsystems.waiterrobot.mediator.printer.getNetworkErrorBase64
1011
import org.datepollsystems.waiterrobot.mediator.ui.configurePrinters.ConfigurePrintersState
1112
import org.datepollsystems.waiterrobot.mediator.ui.main.PrintTransaction
13+
import org.datepollsystems.waiterrobot.mediator.utils.toHex
1214
import org.datepollsystems.waiterrobot.mediator.ws.messages.PrintPdfMessage
1315
import org.datepollsystems.waiterrobot.mediator.ws.messages.PrintedPdfMessage
1416
import org.datepollsystems.waiterrobot.mediator.ws.messages.RegisterPrinterMessage
1517
import java.time.LocalDateTime
18+
import kotlin.random.Random
1619

1720
object PrinterService {
1821

@@ -52,6 +55,17 @@ object PrinterService {
5255
print(it.body.id, it.body.printerId, it.body.file.data)
5356
}
5457
}
58+
59+
fun printNetworkDisconnect() {
60+
backendIdToPairing.values.forEach {
61+
it.loPrinter.printPdf(
62+
@Suppress("MagicNumber")
63+
"Network_Disconnect_${Random.nextBytes(5).toHex()}",
64+
it.bePrinter.id,
65+
getNetworkErrorBase64()
66+
)
67+
}
68+
}
5569
}
5670

5771
class PrinterPairing(val bePrinter: GetPrinterDto, val loPrinter: AbstractLocalPrinter)

src/main/kotlin/org/datepollsystems/waiterrobot/mediator/ws/MediatorWebSocketManager.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kotlinx.coroutines.channels.consumeEach
66
import kotlinx.coroutines.flow.MutableStateFlow
77
import kotlinx.coroutines.flow.StateFlow
88
import org.datepollsystems.waiterrobot.mediator.core.di.injectLoggerForClass
9+
import org.datepollsystems.waiterrobot.mediator.printer.service.PrinterService
910
import org.datepollsystems.waiterrobot.mediator.utils.SuspendingExponentialBackoff
1011
import org.datepollsystems.waiterrobot.mediator.ws.messages.AbstractWsMessage
1112
import org.datepollsystems.waiterrobot.mediator.ws.messages.WsMessageBody
@@ -14,6 +15,8 @@ import java.time.Duration
1415
import java.util.concurrent.atomic.AtomicBoolean
1516
import kotlin.reflect.KClass
1617

18+
private const val MAX_CONSECUTIVE_FAILS = 10
19+
1720
/**
1821
* Handles a websocket session and auto recovers on an exception in the session.
1922
* For auto recover an exponential backoff is used.
@@ -32,6 +35,9 @@ class MediatorWebSocketManager : KoinComponent {
3235
private val registerLock = Object()
3336
private val handlers: HandlerMap = mutableMapOf()
3437

38+
private var websocketExceptionCount = 0 // Counter for consecutive exceptions
39+
private var hasPrintedWebsocketError = false
40+
3541
@Suppress("MagicNumber")
3642
private val suspendingBackoff = SuspendingExponentialBackoff(
3743
initialDelay = Duration.ofMillis(500),
@@ -73,15 +79,18 @@ class MediatorWebSocketManager : KoinComponent {
7379
// This should only be triggered on Errors as ktor already handles connection loss internally
7480
if (!closedIntentional.get()) {
7581
logger.w(e) { "WebSocket session completed" }
82+
handleConsecutiveWebsocketErrors(e)
7683
suspendingBackoff.backoff(e)
7784
startWatching()
7885
} else {
7986
logger.d(e) { "WebSocket session completed" }
8087
}
8188
}
8289
setIsConnected(true)
90+
handleConsecutiveWebsocketErrors()
8391
} catch (e: Exception) {
8492
closeCurrentSession()
93+
handleConsecutiveWebsocketErrors(e)
8594
suspendingBackoff.backoff(e)
8695
return@launch startWatching()
8796
}
@@ -92,6 +101,22 @@ class MediatorWebSocketManager : KoinComponent {
92101
}
93102
}
94103

104+
private fun handleConsecutiveWebsocketErrors(e: Throwable? = null) {
105+
if (e != null) {
106+
if (!hasPrintedWebsocketError && websocketExceptionCount >= MAX_CONSECUTIVE_FAILS) {
107+
PrinterService.printNetworkDisconnect()
108+
hasPrintedWebsocketError = true
109+
110+
return
111+
}
112+
113+
websocketExceptionCount++
114+
} else {
115+
websocketExceptionCount = 0
116+
hasPrintedWebsocketError = false
117+
}
118+
}
119+
95120
fun close() {
96121
if (closed.getAndSet(true)) return
97122
closedIntentional.set(true)

0 commit comments

Comments
 (0)