Keep config snapshots and network diagnostics precise

This commit is contained in:
evgeny committed 2026-10-27 17:18:13 +01:00
1 parent 893e714422
commit 5382b686e9
3 files changed
+6 -5

No files matched your search

@@ -18,7 +18,7 @@ import kotlinx.coroutines.withContext
/**
* Единственная очередь файловых операций ConfigProvider, живёт вместе с Application.
* submit сразу фиксирует порядок запросов; ожидание Mutex приостанавливает coroutine, IO выполняется вне UI.
* Последовательные submit сохраняют порядок вызова; конкурирующие запросы сериализует Mutex. IO выполняется вне UI.
* Возвращённый Deferred принадлежит очереди: отмена coroutine, ожидающей await(), не отменяет принятую запись.
* Чтение, формирование снимка и replace выполняются внутри submit. Лог содержит метаданные, без текста/ключей.
*/
@@ -39,7 +39,7 @@ data class RadioCompressorSettings(val enabled: Boolean = true, val maxGainDb: I
/**
* Поставщик Application: getString/getInt остаются синхронным API для JNI.
* Файловые операции возвращают Deferred общей очереди; await не блокирует UI и не передаёт ожидающему владение запросом.
* Внутри операции настройки и keys.conf читаются один раз, чтение/запись utun.cfg сериализованы.
* При формировании конфига настройки и keys.conf читаются один раз; чтение/запись utun.cfg сериализованы.
*/
class ConfigProvider(private val context: Context) {
private val configFiles = ConfigFileStore { level, message -> LogManager.addLog(level, "CFG", message) }
@@ -732,7 +732,7 @@ class ConfigProvider(private val context: Context) {
val pubKey = stringValue("node.public_key", prefs, snapshot.keys) ?: ""
val privKey = stringValue("node.private_key", prefs, snapshot.keys) ?: ""
val nodeName = stringValue("node.name", prefs, snapshot.keys) ?: getDeviceName()
val dbDir = stringValue("db.path", prefs, snapshot.keys) ?: context.filesDir.absolutePath
val dbDir = snapshot.directory.path
return buildString {
appendLine("[global]")
if (nodeName.isNotBlank()) appendLine("my_node_name=$nodeName")
@@ -19,7 +19,7 @@ object NetworkChangeMonitor {
private var coreEpoch = Any()
private var updating = false
private var pending = false
private var lastInterfaces: List<Pair<String, String>>? = null // Последний снимок, переданный в JNI; не ACK применения.
private var lastInterfaces: List<Pair<String, String>>? = null // Наблюдавшиеся интерфейсы при подготовке; не ACK применения.
private const val DEBOUNCE_MS = 500L
private val handler = Handler(Looper.getMainLooper())
private val updateRunnable = Runnable { updateSockets() }
@@ -82,7 +82,8 @@ object NetworkChangeMonitor {
NativeLib.notifyNetworkActive()
if (NativeLib.updateSockets(text)) {
lastInterfaces = current
LogManager.addLog("INFO", "NET", "socket config handed to JNI: [$previous] -> [$next] chars=${text.length}")
LogManager.addLog("INFO", "NET", "socket config handed to JNI: chars=${text.length}; " +
"observed interfaces: [$previous] -> [$next]")
} else LogManager.addLog("ERROR", "NET", "socket update rejected by JNI")
} else if (text != null && current != null) {
LogManager.addLog("DEBUG", "NET", "prepared network config discarded: core not ready")