frindlymap/test/support/device.dart

86 lines
3.1 KiB
Dart

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<SyncEvent> events;
static final List<Device> _all = [];
/// 모든 시험 기기에서 처리 중인 받은 봉투가 끝나기를 기다린다.
static Future<void> settleAll() async {
for (final d in _all) {
await d.engine.idle();
}
}
static Future<Device> 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 = <SyncEvent>[];
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<String> engineCipherSeal(String peerKey, String context, String plain) =>
FakeCipher(key).seal(plain: plain, peerPublicKey: peerKey, context: context);
Future<Person> know(Device other) async =>
(await storage.people.register(other.phone, other.name, 2, publicKey: other.key))!;
Future<MyCard> 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<ShareRecord> 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<ChatRoom> addRoom(String id, String context, List<Person> 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<ShareRecord> 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;
}
}