import 'dart:math'; import '../security/secret_store.dart'; /// A stable per-INSTALL device id, kept in the keystore. Distinct from the /// seed-derived CRDT node id (`rootSeedHex.substring(0,16)`), which is IDENTICAL /// across a user's devices — so it can't tell them apart. Device-to-device sync /// needs each device to own a separate record, hence a random per-install id. class DeviceIdStore { DeviceIdStore(this._store, {Random? random}) : _random = random ?? Random.secure(); final SecretStore _store; final Random _random; static const _key = 'tane.device.id'; Future? _cached; /// This install's device id, generated and persisted on first use. Future deviceId() => _cached ??= _readOrCreate(); Future _readOrCreate() async { final existing = await _store.read(_key); if (existing != null && existing.isNotEmpty) return existing; final id = _randomHex(8); // 64 bits — plenty to avoid device collisions await _store.write(_key, id); return id; } String _randomHex(int bytes) => [ for (var i = 0; i < bytes; i++) _random.nextInt(256).toRadixString(16).padLeft(2, '0'), ].join(); }