Add timeout policy

This commit is contained in:
Jon Staab
2025-03-21 14:19:50 -07:00
parent 62f0caff1d
commit 180d70752d
+29 -4
View File
@@ -76,7 +76,7 @@ export const socketPolicyConnectOnSend = (socket: Socket) => {
let lastError = 0
let currentStatus = SocketStatus.Closed
const unsubscribeOnStatus = on(socket, SocketEventType.Status, (newStatus: SocketStatus) => {
const unsubscribeStatus = on(socket, SocketEventType.Status, (newStatus: SocketStatus) => {
// Keep track of the most recent error
if (newStatus === SocketStatus.Error) {
lastError = now()
@@ -86,7 +86,7 @@ export const socketPolicyConnectOnSend = (socket: Socket) => {
currentStatus = newStatus
})
const unsubscribeOnSend = on(socket, SocketEventType.Send, (message: ClientMessage) => {
const unsubscribeSend = on(socket, SocketEventType.Send, (message: ClientMessage) => {
// When a new message is sent, make sure the socket is open (unless there was a recent error)
if (currentStatus === SocketStatus.Closed && now() - lastError < ago(30)) {
socket.open()
@@ -94,8 +94,32 @@ export const socketPolicyConnectOnSend = (socket: Socket) => {
})
return () => {
unsubscribeOnStatus()
unsubscribeOnSend()
unsubscribeStatus()
unsubscribeSend()
}
}
export const socketPolicyCloseOnTimeout = (socket: Socket) => {
let lastActivity = 0
const unsubscribeSend = on(socket, SocketEventType.Send, (message: ClientMessage) => {
lastActivity = now()
})
const unsubscribeReceive = on(socket, SocketEventType.Receive, (message: ClientMessage) => {
lastActivity = now()
})
const interval = setInterval(() => {
if (lastActivity < ago(30)) {
socket.close()
}
}, 3000)
return () => {
unsubscribeSend()
unsubscribeReceive()
clearInterval(interval)
}
}
@@ -103,4 +127,5 @@ export const defaultSocketPolicies = [
socketPolicySendWhenOpen,
socketPolicyDeferOnAuth,
socketPolicyConnectOnSend,
socketPolicyCloseOnTimeout,
]