トラブルシューティング
繋ぎ屋でよくあるエラーと解決方法です。
テストがタイムアウトする
症状
テストが Deno.test のデフォルトタイムアウト(5秒)で失敗する。
原因と対策
1. pool.uninstall() の呼び忘れ
→ 必ず try/finally で囲む。
2. WebSocket の onclose が発火しない
Promise が resolve されず、テストが終了しない。
→ EOSE 受信後に ws.close() を呼ぶ。
3. レイテンシ設定が大きすぎる
→ テストでは小さい値を使う。速度テスト以外では latency: 0(デフォルト)。
4. streamEvents が止まらない
→ count を指定するか、テスト終了時に handle.stop() を呼ぶ。
5. Deno テストのタイムアウトを延長する
Deno.test({
name: "時間のかかるテスト",
fn: async () => {/* ... */},
sanitizeOps: false,
sanitizeResources: false,
});イベントが受信されない
症状
REQ を送信してもイベントが返ってこない。
原因と対策
1. relay.store() の呼び忘れ
→ テストデータを store() で登録する。
2. フィルターが合っていない
→ store したイベントの kind とフィルターの kinds が一致しているか確認する。
3. pool.install() の前に WebSocket を作成している
→ pool.install() を WebSocket 作成の前に呼ぶ。
4. onREQ ハンドラーが空配列を返している
→ onREQ を設定すると自動マッチングがスキップされる。ハンドラーからイベントを返すか、onREQ を使わずに store() を使う。
WebSocket 接続に失敗する
症状
接続時に onerror → onclose(code: 1006) が発火する。
原因と対策
1. URL が未登録
→ 接続先 URL を pool.relay() で登録する。
2. refuse() が呼ばれている
→ refuse() を呼ぶ前の接続か確認する。reset() でリセットできる。
3. connectionTimeout が短すぎる
→ タイムアウトの値を適切に設定する。
「MockPool is already installed」エラー
症状
Error: MockPool is already installed原因
pool.install() を2回呼んでいる。
「MockPool is not installed」エラー
症状
Error: MockPool is not installed原因
pool.uninstall() を install 前に呼んでいる、または2回呼んでいる。
「WebSocket is not open」エラー
症状
DOMException: WebSocket is not open原因
readyState が OPEN でないのに send() を呼んでいる。
デバッグ方法
コード例
タイムアウトの原因:uninstall 忘れ:
// ❌ uninstall忘れで次のテストが壊れる
pool.install();
// テスト...
// pool.uninstall() がない!
// ✅ 必ず try/finally で囲む
pool.install();
try {
// テスト
} finally {
pool.uninstall();
}WebSocket の close() を忘れるケース:
// ❌ EOSE後にclose()を呼んでいない
ws.onmessage = (e) => {
const msg = JSON.parse(e.data);
if (msg[0] === "EOSE") {
// ws.close() を忘れている
}
};
// ✅ EOSE受信後に close() を呼ぶ
ws.onmessage = (e) => {
const msg = JSON.parse(e.data);
if (msg[0] === "EOSE") {
ws.close();
}
};install前に WebSocket を作成してしまうケース:
// ❌ 実際の WebSocket が使われてしまう
const ws = new WebSocket("wss://relay.example.com");
pool.install(); // install が遅い
// ✅ install の後に WebSocket を作成する
pool.install();
const ws = new WebSocket("wss://relay.example.com");「MockPool is already installed」エラー:
// ❌ 二重install
pool.install();
pool.install(); // Error!
// ✅ installed プロパティで確認
if (!pool.installed) {
pool.install();
}「MockPool is not installed」エラー:
// ✅ installed プロパティで確認
if (pool.installed) {
pool.uninstall();
}「WebSocket is not open」エラー:
// ✅ onopen で送信する
ws.onopen = () => {
ws.send(JSON.stringify(["REQ", "s", { kinds: [1] }]));
};
// ❌ 即座に送信(まだCONNECTING状態)
const ws = new WebSocket("wss://relay.example.com");
ws.send(JSON.stringify(["REQ", "s", { kinds: [1] }])); // Error!デバッグ方法:ログの有効化:
pool.relay("wss://relay.example.com", { logging: true });カスタムログハンドラー:
const logs: LogEntry[] = [];
pool.relay("wss://relay.example.com", {
logging: (entry) => {
logs.push(entry);
console.log(JSON.stringify(entry, null, 2));
},
});received プロパティでの確認:
// テスト後に確認
console.log("受信メッセージ:", JSON.stringify(relay.received, null, 2));
console.log("REQ数:", relay.countREQs());
console.log("EVENT数:", relay.countEvents());connections プロパティでの確認:
console.log("アクティブ接続:", pool.connections);関連ドキュメント
- FAQ — よくある質問
- API リファレンス — 正しい API の使い方
- チュートリアル — 基本的な使い方