タイムアウト機能¶
概要¶
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.events の SoraConnectionStateChangedEvent で接続状態イベントとして通知されます。 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('最大リトライ回数に達しました');
}
推奨タイムアウト値¶
設定項目 |
推奨値 |
備考 |
|---|---|---|
|
30-60 秒 |
ネットワーク遅延を考慮 |
|
10-15 秒 |
リソース解放時間を確保 |
|
5-10 秒 |
URL 試行時間を確保 |
タイムアウト値は環境やネットワーク状況に応じて調整してください。