Am I doing something wrong here? I'm trying to close a websocket immediately. Would prefer to have i

Am I doing something wrong here? I'm trying to close a websocket immediately. Would prefer to have instant closure.
#reject_websocket(code?: number, reason?: string) {
let { 0: webSocket, 1: server } = new WebSocketPair()

server.accept() // Always throws Error: Network connection lost. Uncatchable
// vs
this.ctx.acceptWebSocket(server) // Does not throw but causes ~2 second delay to close ws.

server.close(code, reason)

return new cf_global.Response(null, {
status: 101,
webSocket,
})
}
#reject_websocket(code?: number, reason?: string) {
let { 0: webSocket, 1: server } = new WebSocketPair()

server.accept() // Always throws Error: Network connection lost. Uncatchable
// vs
this.ctx.acceptWebSocket(server) // Does not throw but causes ~2 second delay to close ws.

server.close(code, reason)

return new cf_global.Response(null, {
status: 101,
webSocket,
})
}
14 Replies
Unknown User
Unknown User2mo ago
Message Not Public
Sign In & Join Server To View
Milan
Milan2mo ago
webSocketError() would run if something broke on the WebSocket, not if your application code threw an exception. If you're just calling a func/method that can throw and you want to handle exceptions you should wrap it in a try...catch
Unknown User
Unknown User2mo ago
Message Not Public
Sign In & Join Server To View
Milan
Milan2mo ago
No prob!
Avi
Avi2mo ago
>"The Durable Object's code has been updated, this version can no longer access storage." How can this happen if we dont deploy a new version? separate question: is there a suggested pattern for setting a TTL on durableobject storage? e.g. "clear after 1 hour?" alarms?
Isaac McFadyen
Isaac McFadyen2mo ago
Likely a runtime update (meaning the runtime, workerd, or the underlying storage that backs Durable Objects).
Chaika
Chaika2mo ago
could also be caused by tailing
euan
euan2mo ago
So Sqlite durable objects Vs D1. When does this change the decision matrix to use one or the other? JSON blobs?
Isaac McFadyen
Isaac McFadyen2mo ago
DO SQLite is more of a lower level primitive that you can use to build your own solution. It's missing most of the things that D1 does/will eventually bring like replication, any cross-DB querying, etc. If you wanted to build the next D1: use DO SQLite, but if you just want a database you can easily access and query from Workers or the Cloudflare API then use D1. Also DO SQLite has lower limits currently.
Chaika
Chaika2mo ago
also I think the big one rn is just DO KV is production ready stable / DO SQlite is not
Avi
Avi2mo ago
so to be clear, that error message could actually be triggered for reasons unrelated to what it says in the error message, right? like the "root cause" error would be a runtime update
Isaac McFadyen
Isaac McFadyen2mo ago
By "the code has been updated" it doesn't necessarily mean your code, just some code on the DO. So yes.
Avi
Avi2mo ago
got it that makes sense
Chaika
Chaika2mo ago
Sane retries are recommended from your worker calling the do, there's an example here: https://developers.cloudflare.com/durable-objects/best-practices/error-handling/
Cloudflare Docs
Error handling | Cloudflare Durable Objects docs
Review how to handle errors (exceptions) generated by both your own Durable Object code as well as exceptions thrown by Durable Objects’ infrastructure (such as overloads or network errors).
Want results from more Discord servers?
Add your server