import 'package:friendly_map/modules/storage/storage.dart'; import 'package:friendly_map/modules/sync/sync.dart'; import 'package:friendly_map/modules/transport/transport.dart'; import 'fake_cipher.dart'; /// 시험용 기기 하나: 저장소 + 연결 + 동기화 엔진. class Device { Device._(this.phone, this.name, this.key, this.storage, this.transport, this.engine, this.events); final String phone; final String name; final String key; final Storage storage; final MemoryTransport transport; final SyncEngine engine; final List events; static final List _all = []; /// 모든 시험 기기에서 처리 중인 받은 봉투가 끝나기를 기다린다. static Future settleAll() async { for (final d in _all) { await d.engine.idle(); } } static Future create(MemoryHub hub, String phone, String name, {bool start = true}) async { final storage = Storage.memory(); await storage.settings.saveProfile(MyProfile(phone: phone, name: name), 1); final t = MemoryTransport(phone, hub); final key = 'KEY-$name'; final engine = SyncEngine( storage: storage, transport: t, cipher: FakeCipher(key), identity: FakeIdentity(key), clock: Clock(), ); final events = []; engine.events.listen(events.add); final d = Device._(phone, name, key, storage, t, engine, events); _all.add(d); if (start) await engine.start(); return d; } /// 상대를 알고 있는 사이로 만든다 (키까지 교환 끝난 상태). /// 이 기기의 암호로 [peerKey] 에게 보낼 내용을 잠근다 (조작된 봉투 시험용). Future engineCipherSeal(String peerKey, String context, String plain) => FakeCipher(key).seal(plain: plain, peerPublicKey: peerKey, context: context); Future know(Device other) async => (await storage.people.register(other.phone, other.name, 2, publicKey: other.key))!; Future addCard(String kind, {String fields = '{"company":"한빛"}', String? id}) async { final c = MyCard(id: id ?? 'card-$kind-$name', kind: kind, title: kind, fieldsJson: fields, updatedAt: 5); await storage.myCards.put(c); return c; } Future shareCard(MyCard card, Person peer) async { final s = ShareRecord( id: 'sh-${card.id}-${peer.id}', unit: 'card', targetId: card.id, peerId: peer.id, startedAt: 10, snapshot: card.fieldsJson, sentVersion: card.updatedAt, updatedAt: 10); await storage.shares.put(s); return s; } Future addRoom(String id, String context, List members) async { final r = ChatRoom( id: id, title: '방 $id', kind: members.length > 1 ? 'group' : 'direct', contextKind: context, membersJson: '[${members.map((p) => '"${p.id}"').join(',')}]', updatedAt: 10); await storage.rooms.put(r); return r; } Future shareRoom(ChatRoom room, Person peer) async { final s = ShareRecord( id: 'sr-${room.id}-${peer.id}', unit: 'room', targetId: room.id, peerId: peer.id, startedAt: 10, updatedAt: 10); await storage.shares.put(s); return s; } }