コンテンツにスキップ
これは実験的な機能であり、API は頻繁に変更される可能性があります。

自動再接続

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" … 初期状態。再接続は 1 度も行われていません。
  • "running" … 再接続中です。
  • "success" … 再接続に成功しました。
  • "failure" … 再接続に失敗しました。
.phase:
  • "waiting" … 初期状態です。再接続は 1 度も行われていません。
  • "pending" … 再接続が要求され、実行するまで一定時間待機しているところです。
  • "disconnecting" … 切断中です。
  • "connecting" … 接続中です。切断に失敗しても接続しようとします。
  • "succeeded" … 再接続に成功しました。
  • "failed" … 再接続に失敗しました。
statephase
"waiting""waiting"|"pending"
"running""disconnecting"|"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.disconnect();
}

注意

  • 再接続のロジックは、WebSocket 接続の安定性や接続回復の頻度を適切に調整するために重要です。オプションの設定は、システムの要件や使用ケースに応じて調整する必要があります。
  • autoReconnect は接続が失われた際の回復を試みるものであり、すべてのケースで完全な回復が保証されるわけではありません。