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