frindlymap/lib/modules/transport/src/composite_transport.dart

59 lines
1.4 KiB
Dart

import 'dart:async';
import 'package:friendly_map/modules/core/core.dart';
/// 여러 연결 방식을 순서대로 시도하는 묶음 (예: 같은 네트워크 직접 연결 → 외부 보관함).
/// 앞의 방식으로 닿으면 거기서 멈춘다.
class CompositeTransport implements Transport {
CompositeTransport(this._parts);
final List<Transport> _parts;
final StreamController<Envelope> _in = StreamController<Envelope>.broadcast(sync: true);
final List<StreamSubscription<Envelope>> _subs = [];
@override
Stream<Envelope> get incoming => _in.stream;
@override
Future<void> start() async {
for (final p in _parts) {
_subs.add(p.incoming.listen(_in.add));
await p.start();
}
}
@override
Future<void> stop() async {
for (final s in _subs) {
await s.cancel();
}
_subs.clear();
for (final p in _parts) {
await p.stop();
}
}
@override
Future<bool> send(Envelope envelope) async {
for (final p in _parts) {
try {
if (await p.send(envelope)) return true;
} catch (_) {
// 이 방식이 실패하면 다음 방식으로 넘어간다.
}
}
return false;
}
@override
Future<int> fetchPending() async {
var total = 0;
for (final p in _parts) {
try {
total += await p.fetchPending();
} catch (_) {}
}
return total;
}
}