Skip to content

トラブルシューティング

繋ぎ屋でよくあるエラーと解決方法です。


テストがタイムアウトする

症状

テストが 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 テストのタイムアウトを延長する

typescript
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 接続に失敗する

症状

接続時に onerroronclose(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

原因

readyStateOPEN でないのに send() を呼んでいる。


デバッグ方法


コード例

タイムアウトの原因:uninstall 忘れ:

typescript
// ❌ uninstall忘れで次のテストが壊れる
pool.install();
// テスト...
// pool.uninstall() がない!

// ✅ 必ず try/finally で囲む
pool.install();
try {
  // テスト
} finally {
  pool.uninstall();
}

WebSocket の close() を忘れるケース:

typescript
// ❌ 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 を作成してしまうケース:

typescript
// ❌ 実際の 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」エラー:

typescript
// ❌ 二重install
pool.install();
pool.install(); // Error!

// ✅ installed プロパティで確認
if (!pool.installed) {
  pool.install();
}

「MockPool is not installed」エラー:

typescript
// ✅ installed プロパティで確認
if (pool.installed) {
  pool.uninstall();
}

「WebSocket is not open」エラー:

typescript
// ✅ 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!

デバッグ方法:ログの有効化:

typescript
pool.relay("wss://relay.example.com", { logging: true });

カスタムログハンドラー:

typescript
const logs: LogEntry[] = [];
pool.relay("wss://relay.example.com", {
  logging: (entry) => {
    logs.push(entry);
    console.log(JSON.stringify(entry, null, 2));
  },
});

received プロパティでの確認:

typescript
// テスト後に確認
console.log("受信メッセージ:", JSON.stringify(relay.received, null, 2));
console.log("REQ数:", relay.countREQs());
console.log("EVENT数:", relay.countEvents());

connections プロパティでの確認:

typescript
console.log("アクティブ接続:", pool.connections);

関連ドキュメント

MIT License