タイムアウト機能

概要

Sora Flutter SDK は WebRTC 接続のライフサイクル各段階でタイムアウト機能を提供します。これにより、無限待機を防ぎ、より堅牢なアプリケーションを構築できます。

対応するタイムアウト

connectionTimeout - 接続タイムアウト

WebRTC 接続確立までの制限時間です。WebSocket 接続からピア接続の確立完了まで、この時間内に接続が確立されない場合は接続処理が中止されます。

デフォルト値: 30 秒

disconnectWaitTimeout - 切断待機タイムアウト

切断処理待機中の制限時間です。 disconnect() メソッド実行時にリソース解放が完了するまでの制限時間で、この時間を超過した場合は強制的にリソースが解放されます。

デフォルト値: 10 秒

signalingCandidateTimeout - シグナリング候補タイムアウト

シグナリング候補 URL への接続確立までの制限時間です。複数のシグナリング URL が指定されている場合、各 URL への接続確立がこの時間内に完了しない場合は次の URL への接続を試行します。

デフォルト値: 5 秒

使用方法

1. デフォルトのタイムアウト値を使用する

final config = SoraConnectionConfig(
  signalingUrls: ['wss://example.com/signaling'],
  channelId: 'channel-id',
  role: SoraRole.sendrecv,
);

2. カスタムタイムアウト値を設定する

final config = SoraConnectionConfig(
  signalingUrls: ['wss://example.com/signaling'],
  channelId: 'channel-id',
  role: SoraRole.sendrecv,
  timeoutOptions: SoraTimeoutOptions(
    connectionTimeout: Duration(seconds: 60),
    disconnectWaitTimeout: Duration(seconds: 15),
    signalingCandidateTimeout: Duration(seconds: 10),
  ),
);

エラーハンドリング

タイムアウトが発生した場合は、 client.eventsSoraConnectionStateChangedEvent で接続状態イベントとして通知されます。 SoraTimeoutEvent は WebSocket の close reason が TIMEOUT の場合に別途通知されます。

タイムアウトエラーコード

  • connection_timeout - 接続タイムアウト発生
  • disconnect_timeout - 切断タイムアウト発生
  • signaling_candidate_timeout - シグナリング候補タイムアウト発生

サンプルコード

final client = await Sora.createConnection(config);

client.events.listen((event) {
  if (event case SoraConnectionErrorEvent(:final code, :final message)) {
    switch (code) {
      case 'connection_timeout':
        print('接続タイムアウト: ${message ?? ''}');
      case 'disconnect_timeout':
        print('切断タイムアウト: ${message ?? ''}');
      case 'signaling_candidate_timeout':
        print('シグナリング接続タイムアウト: ${message ?? ''}');
    }
  }
});

リトライロジック

タイムアウトが発生した場合のリトライ処理例:

Future<void> connectWithRetry(
  SoraConnectionConfig config,
  int maxRetries,
) async {
  int retries = 0;
  while (retries < maxRetries) {
    try {
      final client = await Sora.createConnection(config);
      await client.connect();
      print('接続成功');
      return;
    } on TimeoutException catch (_) {
      retries++;
      print('接続タイムアウト (リトライ $retries/$maxRetries)');
      if (retries < maxRetries) {
        await Future.delayed(Duration(seconds: 2));
      }
    } catch (e) {
      print('接続エラー: $e');
      return;
    }
  }
  print('最大リトライ回数に達しました');
}

推奨タイムアウト値

設定項目

推奨値

備考

connectionTimeout

30-60 秒

ネットワーク遅延を考慮

disconnectWaitTimeout

10-15 秒

リソース解放時間を確保

signalingCandidateTimeout

5-10 秒

URL 試行時間を確保

タイムアウト値は環境やネットワーク状況に応じて調整してください。