Ok i am fighting for 2 days with this, first i tough i broken some code but from what i see i did not, i tested created relatively minimal example, so when i run it on my pc it works no problem but when run on arm64 raspbery pi4 thats proxypassed to by nginx it crashes, posting code and error
#SO IT SHOUD ERROR BUT IN EXEPCTION AND APP SHOULD
#NOT TOTALY CLOSE LIKE WHEN RUN ON DESKTOP
{.experimental: "codeReordering".}
import asynchttpserver, asyncdispatch
import ws, os
type Player = ref object of RootObj
id*:int
conn*:WebSocket
var players:seq[Player] = @[]
players.add( Player( id:1, conn:nil ) )
players.add( Player( id:2, conn:nil ) )
var server = newAsyncHttpServer()
proc cb(req: Request) {.async, gcsafe.} =
if req.url.path == "/ws":
var ws = await newWebSocket(req)
await ws.send("Welcome to simple echo server")
if players[0].conn == nil:
players[0].conn = ws
elif players[1].conn == nil:
players[1].conn = ws
while ws.readyState == Open:
try:
let packet = await ws.receiveStrPacket()
await ws.send(packet)
except:
echo "incoming stream error"
else:
await req.respond(Http404, "Not found")
var num = 0;
proc spamMsg(){.async.}=
while true:
await sleepAsync(1000)
num = num + 1;
echo "sending fart " & $num
for p in players:
if p.conn != nil and p.conn.readyState == Open:
try:
await p.conn.send(" Fart " & $num)
except:
echo "error on send"
proc forceClose(){.async.}=
await sleepAsync(10000)
echo "Closing"
for p in players:
if p.conn != nil and p.conn.readyState == Open:
try:
p.conn.close()
#p.conn = nil
except:
echo "error on close"
echo "starting"
asyncCheck spamMsg()
asyncCheck forceClose()
waitFor server.serve(Port(9011), cb)
ERROR PART
starting
sending fart 1
sending fart 2
sending fart 3
sending fart 4
sending fart 5
sending fart 6
sending fart 7
sending fart 8
sending fart 9
Closing
incoming stream error
incoming stream error
/home/me/Documents/Projects/grammergame/src/minimal.nim(63) minimal
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1892) waitFor
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1582) poll
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1346) runOnce
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(210) processPendingCallbacks
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncmacro.nim(34) processRequestNimAsyncContinue
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asynchttpserver.nim(279) processRequestIter
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncnet.nim(695) close
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1276) closeSocket
[[reraised from:
/home/me/Documents/Projects/grammergame/src/minimal.nim(63) minimal
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1892) waitFor
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1582) poll
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1346) runOnce
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(210) processPendingCallbacks
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncmacro.nim(34) processClientNimAsyncContinue
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asynchttpserver.nim(292) processClientIter
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncfutures.nim(383) read
]]
[[reraised from:
/home/me/Documents/Projects/grammergame/src/minimal.nim(63) minimal
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1892) waitFor
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1582) poll
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1346) runOnce
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(210) processPendingCallbacks
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncfutures.nim(431) asyncCheckCallback
]]
Error: unhandled exception: File descriptor not registered.
Async traceback:
/home/me/Documents/Projects/grammergame/src/minimal.nim(63) minimal
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1892) waitFor
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1582) poll
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1346) runOnce
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(210) processPendingCallbacks
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncmacro.nim(34) processRequestNimAsyncContinue
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asynchttpserver.nim(279) processRequestIter
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncnet.nim(695) close
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1276) closeSocket
#[
/home/me/Documents/Projects/grammergame/src/minimal.nim(63) minimal
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1892) waitFor
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1582) poll
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(1346) runOnce
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncdispatch.nim(210) processPendingCallbacks
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncmacro.nim(34) processClientNimAsyncContinue
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asynchttpserver.nim(292) processClientIter
/home/me/.choosenim/toolchains/nim-1.2.6/lib/pure/asyncfutures.nim(383) read
]#
Exception message: File descriptor not registered.
Exception type: [ValueError]
atm will try to test without nginx tough dont think its related to that but better sure then sorry :)
Switching from standard try catch to yield fixed my crash, it still trows error but at least it does not escape and crash my app :)
Ty Rika :)