自动重连
WebSocket 等实时通信中发生连接中断时,此功能会自动尝试重新连接。它基于一定的逻辑进行重新连接,并发出成功和失败事件。
autoReconnect
函数创建一个 AutoReconnect
类实例,以便使用重新连接功能。
导入
import { autoReconnect } from "@tai-kun/surrealdb";
语法
function autoReconnect( db: Client, options?: AutoReconnectOptions): AutoReconnect;
参数
db
Surreal
类的实例对象。
options
指定重新连接设置的选项。可以指定重新连接间隔、最大延迟时间和重新连接条件等。如果使用默认设置,则可以省略。
backoffLimit?: number
- 指定尝试重新连接的最大次数。默认值为
Infinity
。 initialDelay?: number
- 尝试第一次重新连接之前的延迟时间(毫秒)。默认值为
500
。 maxDelay?: number
- 重新连接延迟时间(毫秒)的最大值。随着指数退避的进行,延迟会增加,但此值是上限。默认值为
30_000
(30 秒)。 shouldReconnect?: { ping?: { threshold: number; perMillis: number }} | (error) => boolean
- 指定执行重新连接的条件。如果指定为函数,则根据错误事件的参数判断是否执行重新连接。
返回值
返回 AutoReconnect
类的实例。此实例可用于控制重新连接、获取状态和监视事件。
.getReconnectionInfo(): ReconnectionInfo
- 获取当前的重新连接信息(
.state
和.phase
)。它们分别表示: .state
:"waiting"
… 初始状态。尚未进行任何重新连接尝试。"running"
… 正在重新连接。"success"
… 重新连接成功。"failure"
… 重新连接失败。
.phase
:"waiting"
… 初始状态,尚未进行任何重新连接尝试。"pending"
… 重新连接已请求,正在等待一段时间后执行。"closing"
… 正在断开连接。"connecting"
… 正在连接中;即使断开连接失败,也会尝试连接。"succeeded"
… 重新连接成功。"failed"
… 重新连接失败。
state | phase |
---|---|
"waiting" | "waiting"|"pending" |
"running" | "closing"|"connecting" |
"success" | "pending"|"succeeded" |
"failure" | "pending"|"failed" |
.enable(): void
- 启用重新连接功能。调用此方法后,将执行重新连接。默认情况下已启用。
.disable(): void
- 禁用重新连接功能。调用此方法后,将禁用重新连接。
.reset(): void
- 重置重新连接计数器。这将初始化重新连接的指数退避逻辑。
.enabled: boolean
- 指示重新连接功能是否启用的布尔值。如果为
true
,则重新连接已启用。
例子
import { autoReconnect, Surreal } from "@tai-kun/surrealdb";
const db = new Surreal();const ar = autoReconnect(db, { initialDelay: 1000, maxDelay: 30000, backoffLimit: 5, shouldReconnect: { ping: { perMillis: 60000, // 1 分钟内, threshold: 3, // 3 次以上 ping 失败后,重新连接。 }, },});
ar.on("pending", (endpoint, duration) => { console.log(`${duration / 1000} 秒后将重新连接到 ${endpoint}...`);});
ar.on("success", (endpoint) => { console.log(`已成功重新连接到 ${endpoint} 🎉`);});
ar.on("failure", (endpoint, cause) => { console.error(`重新连接到 ${endpoint} 失败了 🤯`); console.error("原因:", cause);});
try { await db.connect("ws://127.0.0.1:8000");
// 长时间运行的各种处理
} finally { await db.close();}
注意
- 重新连接逻辑对于调整 WebSocket 连接的稳定性和连接恢复频率非常重要。应根据系统需求和用例调整选项设置。
autoReconnect
尝试恢复连接丢失,但不能保证在所有情况下都能完全恢复。