From 744e87f92491b6c76ae15bb5fab2cefb3fcee480 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 26 Aug 2025 12:09:54 +0200 Subject: [PATCH] =?UTF-8?q?Announce=20cadence:=20faster=20discovery=20(4s)?= =?UTF-8?q?,=20sparse=2015=C2=B14s,=20dense=2030=C2=B18s;=20initial=200.6s?= =?UTF-8?q?;=20post-subscribe=2050ms;=20min-force=20150ms;=20maintenance?= =?UTF-8?q?=205s;=20proactive=20announces=20on=20handshake=20+=20recent-tr?= =?UTF-8?q?affic=20nudge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bitchat/Services/BLEService.swift | 14 ++++++++++++++ bitchat/Services/TransportConfig.swift | 18 +++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/bitchat/Services/BLEService.swift b/bitchat/Services/BLEService.swift index 95fd4680..8cf7f0f6 100644 --- a/bitchat/Services/BLEService.swift +++ b/bitchat/Services/BLEService.swift @@ -311,6 +311,10 @@ final class BLEService: NSObject { self?.sendPendingMessagesAfterHandshake(for: peerID) self?.sendPendingNoisePayloadsAfterHandshake(for: peerID) } + // Proactive presence nudge: announce immediately after handshake + self?.messageQueue.async { [weak self] in + self?.sendAnnounce(forceSend: true) + } } // Set up application state tracking (iOS only) @@ -1855,6 +1859,16 @@ final class BLEService: NSObject { let target = base + Double.random(in: -jitter...jitter) if elapsed >= target { sendAnnounce(forceSend: true) } } + + // Activity-driven quick-announce: if we've seen any packet in last 5s and it has + // been >=10s since the last announce, send a presence nudge. + let recentSeen = collectionsQueue.sync { () -> Bool in + let cutoff = now.addingTimeInterval(-5.0) + return recentPacketTimestamps.contains(where: { $0 >= cutoff }) + } + if recentSeen && elapsed >= 10.0 { + sendAnnounce(forceSend: true) + } // If we have no peers, ensure we're scanning and advertising if peers.isEmpty { diff --git a/bitchat/Services/TransportConfig.swift b/bitchat/Services/TransportConfig.swift index c0ead0c1..8508f10d 100644 --- a/bitchat/Services/TransportConfig.swift +++ b/bitchat/Services/TransportConfig.swift @@ -62,7 +62,7 @@ enum TransportConfig { static let uiRecentCutoffFiveMinutesSeconds: TimeInterval = 5 * 60 // BLE maintenance & thresholds - static let bleMaintenanceInterval: TimeInterval = 10.0 + static let bleMaintenanceInterval: TimeInterval = 5.0 static let bleMaintenanceLeewaySeconds: Int = 1 static let bleIsolationRelaxThresholdSeconds: TimeInterval = 60 static let bleRecentTimeoutWindowSeconds: TimeInterval = 60 @@ -84,13 +84,13 @@ enum TransportConfig { static let bleExpectedWritePerFragmentMs: Int = 8 static let bleExpectedWriteMaxMs: Int = 2000 static let bleFragmentSpacingMs: Int = 6 - static let bleAnnounceIntervalSeconds: TimeInterval = 10.0 + static let bleAnnounceIntervalSeconds: TimeInterval = 4.0 static let bleDutyOnDurationDense: TimeInterval = 3.0 static let bleDutyOffDurationDense: TimeInterval = 15.0 - static let bleConnectedAnnounceBaseSecondsDense: TimeInterval = 90.0 - static let bleConnectedAnnounceBaseSecondsSparse: TimeInterval = 45.0 - static let bleConnectedAnnounceJitterDense: TimeInterval = 20.0 - static let bleConnectedAnnounceJitterSparse: TimeInterval = 7.5 + static let bleConnectedAnnounceBaseSecondsDense: TimeInterval = 30.0 + static let bleConnectedAnnounceBaseSecondsSparse: TimeInterval = 15.0 + static let bleConnectedAnnounceJitterDense: TimeInterval = 8.0 + static let bleConnectedAnnounceJitterSparse: TimeInterval = 4.0 // Location static let locationDistanceFilterMeters: Double = 1000 @@ -129,12 +129,12 @@ enum TransportConfig { static let geoRelayFetchIntervalSeconds: TimeInterval = 60 * 60 * 24 // BLE operational delays - static let bleInitialAnnounceDelaySeconds: TimeInterval = 2.0 + static let bleInitialAnnounceDelaySeconds: TimeInterval = 0.6 static let bleConnectTimeoutSeconds: TimeInterval = 8.0 static let bleRestartScanDelaySeconds: TimeInterval = 0.1 - static let blePostSubscribeAnnounceDelaySeconds: TimeInterval = 0.1 + static let blePostSubscribeAnnounceDelaySeconds: TimeInterval = 0.05 static let blePostAnnounceDelaySeconds: TimeInterval = 0.4 - static let bleForceAnnounceMinIntervalSeconds: TimeInterval = 0.2 + static let bleForceAnnounceMinIntervalSeconds: TimeInterval = 0.15 // Content hashing / formatting static let contentKeyPrefixLength: Int = 256