86 lines
3.1 KiB
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;
|
|
}
|
|
}
|