Skip to content

Commit b4f3b1d

Browse files
committed
Delegate fatal socket close code handling
Allow the socket delegate to decide if a close code is considered fatal and the socket should not attempt to reconnect.
1 parent fb89d71 commit b4f3b1d

File tree

2 files changed

+11
-2
lines changed

2 files changed

+11
-2
lines changed

src/buffered-socket.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {Socket, SocketDelegate, StableSocket} from './stable-socket'
2+
import {isFatal} from './stable-socket'
23

34
export class BufferedSocket implements Socket, SocketDelegate {
45
private buf: string[] = []
@@ -55,4 +56,8 @@ export class BufferedSocket implements Socket, SocketDelegate {
5556
socketDidReceiveMessage(socket: Socket, message: string): void {
5657
this.delegate.socketDidReceiveMessage(socket, message)
5758
}
59+
60+
socketShouldRetry(socket: Socket, code: number): boolean {
61+
return this.delegate.socketShouldRetry ? this.delegate.socketShouldRetry(socket, code) : !isFatal(code)
62+
}
5863
}

src/stable-socket.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface SocketDelegate {
1818
socketDidClose(socket: Socket, code?: number, reason?: string): void
1919
socketDidFinish(socket: Socket): void
2020
socketDidReceiveMessage(socket: Socket, message: string): void
21+
socketShouldRetry?(socket: Socket, code: number): boolean
2122
}
2223

2324
export class StableSocket implements Socket {
@@ -48,7 +49,10 @@ export class StableSocket implements Socket {
4849
this.socket.onclose = (event: CloseEvent) => {
4950
this.socket = null
5051
this.delegate.socketDidClose(this, event.code, event.reason)
51-
if (isFatal(event.code)) {
52+
const fatal = this.delegate.socketShouldRetry
53+
? !this.delegate.socketShouldRetry(this, event.code)
54+
: isFatal(event.code)
55+
if (fatal) {
5256
this.delegate.socketDidFinish(this)
5357
} else {
5458
setTimeout(() => this.open(), rand(100, 150))
@@ -88,7 +92,7 @@ function rand(min: number, max: number): number {
8892
return Math.random() * (max - min) + min
8993
}
9094

91-
function isFatal(code: number): boolean {
95+
export function isFatal(code: number): boolean {
9296
return code === POLICY_VIOLATION || code === INTERNAL_ERROR
9397
}
9498

0 commit comments

Comments
 (0)