mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-06 16:13:44 +08:00
* feat: add a wrapper around sockette w/ error retry * chore: use import path alias * perf: reduce retry
40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import Sockette, { type SocketteOptions } from "sockette";
|
|
|
|
/**
|
|
* A wrapper of Sockette that will automatically reconnect up to `maxError` before emitting an error event.
|
|
*/
|
|
export const createSockette = (
|
|
url: string,
|
|
opt: SocketteOptions,
|
|
maxError = 10
|
|
) => {
|
|
let remainRetryCount = maxError;
|
|
|
|
return new Sockette(url, {
|
|
...opt,
|
|
// Sockette has a built-in reconnect when ECONNREFUSED feature
|
|
// Use maxError if opt.maxAttempts is not specified
|
|
maxAttempts: opt.maxAttempts ?? maxError,
|
|
onmessage(this: Sockette, ev) {
|
|
remainRetryCount = maxError; // reset counter
|
|
opt.onmessage?.call(this, ev);
|
|
},
|
|
onerror(this: Sockette, ev) {
|
|
remainRetryCount -= 1;
|
|
|
|
if (remainRetryCount >= 0) {
|
|
this.close();
|
|
this.reconnect();
|
|
} else {
|
|
opt.onerror?.call(this, ev);
|
|
}
|
|
},
|
|
onmaximum(this: Sockette, ev) {
|
|
opt.onmaximum?.call(this, ev);
|
|
// onmaximum will be fired when Sockette reaches built-in reconnect limit,
|
|
// We will also set remainRetryCount to 0 to prevent further reconnect.
|
|
remainRetryCount = 0;
|
|
},
|
|
});
|
|
};
|