59 lines
1.4 KiB
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;
|
|
}
|
|
}
|