mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-24 22:45:19 +00:00
Perf: Add final to classes that are not inherited (#574)
This commit is contained in:
+3
-3
@@ -37,7 +37,7 @@ This three-message pattern provides:
|
|||||||
#### NoiseEncryptionService
|
#### NoiseEncryptionService
|
||||||
The main service managing all Noise operations:
|
The main service managing all Noise operations:
|
||||||
```swift
|
```swift
|
||||||
class NoiseEncryptionService {
|
final class NoiseEncryptionService {
|
||||||
private let staticIdentityKey: Curve25519.KeyAgreement.PrivateKey
|
private let staticIdentityKey: Curve25519.KeyAgreement.PrivateKey
|
||||||
private let sessionManager: NoiseSessionManager
|
private let sessionManager: NoiseSessionManager
|
||||||
private let channelEncryption = NoiseChannelEncryption()
|
private let channelEncryption = NoiseChannelEncryption()
|
||||||
@@ -47,7 +47,7 @@ class NoiseEncryptionService {
|
|||||||
#### NoiseSession
|
#### NoiseSession
|
||||||
Individual session state for each peer:
|
Individual session state for each peer:
|
||||||
```swift
|
```swift
|
||||||
class NoiseSession {
|
final class NoiseSession {
|
||||||
private var handshakeState: NoiseHandshakeState?
|
private var handshakeState: NoiseHandshakeState?
|
||||||
private var sendCipher: NoiseCipherState?
|
private var sendCipher: NoiseCipherState?
|
||||||
private var receiveCipher: NoiseCipherState?
|
private var receiveCipher: NoiseCipherState?
|
||||||
@@ -58,7 +58,7 @@ class NoiseSession {
|
|||||||
#### NoiseSessionManager
|
#### NoiseSessionManager
|
||||||
Thread-safe session management:
|
Thread-safe session management:
|
||||||
```swift
|
```swift
|
||||||
class NoiseSessionManager {
|
final class NoiseSessionManager {
|
||||||
private var sessions: [String: NoiseSession] = [:]
|
private var sessions: [String: NoiseSession] = [:]
|
||||||
private let sessionsQueue = DispatchQueue(label: "noise.sessions", attributes: .concurrent)
|
private let sessionsQueue = DispatchQueue(label: "noise.sessions", attributes: .concurrent)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ struct BitchatApp: App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
class AppDelegate: NSObject, UIApplicationDelegate {
|
final class AppDelegate: NSObject, UIApplicationDelegate {
|
||||||
weak var chatViewModel: ChatViewModel?
|
weak var chatViewModel: ChatViewModel?
|
||||||
|
|
||||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
|
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
|
||||||
@@ -175,7 +175,7 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
|||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
import AppKit
|
import AppKit
|
||||||
|
|
||||||
class MacAppDelegate: NSObject, NSApplicationDelegate {
|
final class MacAppDelegate: NSObject, NSApplicationDelegate {
|
||||||
weak var chatViewModel: ChatViewModel?
|
weak var chatViewModel: ChatViewModel?
|
||||||
|
|
||||||
func applicationWillTerminate(_ notification: Notification) {
|
func applicationWillTerminate(_ notification: Notification) {
|
||||||
@@ -188,7 +188,7 @@ class MacAppDelegate: NSObject, NSApplicationDelegate {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
|
final class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
|
||||||
static let shared = NotificationDelegate()
|
static let shared = NotificationDelegate()
|
||||||
weak var chatViewModel: ChatViewModel?
|
weak var chatViewModel: ChatViewModel?
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ import CryptoKit
|
|||||||
/// Singleton manager for secure identity state persistence and retrieval.
|
/// Singleton manager for secure identity state persistence and retrieval.
|
||||||
/// Provides thread-safe access to identity mappings with encryption at rest.
|
/// Provides thread-safe access to identity mappings with encryption at rest.
|
||||||
/// All identity data is stored encrypted in the device Keychain for security.
|
/// All identity data is stored encrypted in the device Keychain for security.
|
||||||
class SecureIdentityStateManager {
|
final class SecureIdentityStateManager {
|
||||||
static let shared = SecureIdentityStateManager()
|
static let shared = SecureIdentityStateManager()
|
||||||
|
|
||||||
private let keychain = KeychainManager.shared
|
private let keychain = KeychainManager.shared
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// Coordinates Noise handshakes to prevent race conditions and ensure reliable encryption establishment
|
/// Coordinates Noise handshakes to prevent race conditions and ensure reliable encryption establishment
|
||||||
class NoiseHandshakeCoordinator {
|
final class NoiseHandshakeCoordinator {
|
||||||
|
|
||||||
// MARK: - Handshake State
|
// MARK: - Handshake State
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ struct NoiseProtocolName {
|
|||||||
/// Handles ChaCha20-Poly1305 AEAD encryption with automatic nonce management
|
/// Handles ChaCha20-Poly1305 AEAD encryption with automatic nonce management
|
||||||
/// and replay protection using a sliding window algorithm.
|
/// and replay protection using a sliding window algorithm.
|
||||||
/// - Warning: Nonce reuse would be catastrophic for security
|
/// - Warning: Nonce reuse would be catastrophic for security
|
||||||
class NoiseCipherState {
|
final class NoiseCipherState {
|
||||||
// Constants for replay protection
|
// Constants for replay protection
|
||||||
private static let NONCE_SIZE_BYTES = 4
|
private static let NONCE_SIZE_BYTES = 4
|
||||||
private static let REPLAY_WINDOW_SIZE = 1024
|
private static let REPLAY_WINDOW_SIZE = 1024
|
||||||
@@ -384,7 +384,7 @@ class NoiseCipherState {
|
|||||||
/// Responsible for key derivation, protocol name hashing, and maintaining
|
/// Responsible for key derivation, protocol name hashing, and maintaining
|
||||||
/// the chaining key that provides key separation between handshake messages.
|
/// the chaining key that provides key separation between handshake messages.
|
||||||
/// - Note: This class implements the SymmetricState object from the Noise spec
|
/// - Note: This class implements the SymmetricState object from the Noise spec
|
||||||
class NoiseSymmetricState {
|
final class NoiseSymmetricState {
|
||||||
private var cipherState: NoiseCipherState
|
private var cipherState: NoiseCipherState
|
||||||
private var chainingKey: Data
|
private var chainingKey: Data
|
||||||
private var hash: Data
|
private var hash: Data
|
||||||
@@ -488,7 +488,7 @@ class NoiseSymmetricState {
|
|||||||
/// This is the main interface for establishing encrypted sessions between peers.
|
/// This is the main interface for establishing encrypted sessions between peers.
|
||||||
/// Manages the handshake state machine, message patterns, and key derivation.
|
/// Manages the handshake state machine, message patterns, and key derivation.
|
||||||
/// - Important: Each handshake instance should only be used once
|
/// - Important: Each handshake instance should only be used once
|
||||||
class NoiseHandshakeState {
|
final class NoiseHandshakeState {
|
||||||
private let role: NoiseRole
|
private let role: NoiseRole
|
||||||
private let pattern: NoisePattern
|
private let pattern: NoisePattern
|
||||||
private var symmetricState: NoiseSymmetricState
|
private var symmetricState: NoiseSymmetricState
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ struct NoiseSecurityValidator {
|
|||||||
|
|
||||||
// MARK: - Enhanced Noise Session with Security
|
// MARK: - Enhanced Noise Session with Security
|
||||||
|
|
||||||
class SecureNoiseSession: NoiseSession {
|
final class SecureNoiseSession: NoiseSession {
|
||||||
private(set) var messageCount: UInt64 = 0
|
private(set) var messageCount: UInt64 = 0
|
||||||
private let sessionStartTime = Date()
|
private let sessionStartTime = Date()
|
||||||
private(set) var lastActivityTime = Date()
|
private(set) var lastActivityTime = Date()
|
||||||
@@ -135,7 +135,7 @@ class SecureNoiseSession: NoiseSession {
|
|||||||
|
|
||||||
// MARK: - Rate Limiter
|
// MARK: - Rate Limiter
|
||||||
|
|
||||||
class NoiseRateLimiter {
|
final class NoiseRateLimiter {
|
||||||
private var handshakeTimestamps: [String: [Date]] = [:] // peerID -> timestamps
|
private var handshakeTimestamps: [String: [Date]] = [:] // peerID -> timestamps
|
||||||
private var messageTimestamps: [String: [Date]] = [:] // peerID -> timestamps
|
private var messageTimestamps: [String: [Date]] = [:] // peerID -> timestamps
|
||||||
|
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ class NoiseSession {
|
|||||||
|
|
||||||
// MARK: - Session Manager
|
// MARK: - Session Manager
|
||||||
|
|
||||||
class NoiseSessionManager {
|
final class NoiseSessionManager {
|
||||||
private var sessions: [String: NoiseSession] = [:]
|
private var sessions: [String: NoiseSession] = [:]
|
||||||
private let localStaticKey: Curve25519.KeyAgreement.PrivateKey
|
private let localStaticKey: Curve25519.KeyAgreement.PrivateKey
|
||||||
private let managerQueue = DispatchQueue(label: "chat.bitchat.noise.manager", attributes: .concurrent)
|
private let managerQueue = DispatchQueue(label: "chat.bitchat.noise.manager", attributes: .concurrent)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import Combine
|
|||||||
|
|
||||||
/// Manages WebSocket connections to Nostr relays
|
/// Manages WebSocket connections to Nostr relays
|
||||||
@MainActor
|
@MainActor
|
||||||
class NostrRelayManager: ObservableObject {
|
final class NostrRelayManager: ObservableObject {
|
||||||
static let shared = NostrRelayManager()
|
static let shared = NostrRelayManager()
|
||||||
// Track gift-wraps (kind 1059) we initiated so we can log OK acks at info
|
// Track gift-wraps (kind 1059) we initiated so we can log OK acks at info
|
||||||
private(set) static var pendingGiftWrapIDs = Set<String>()
|
private(set) static var pendingGiftWrapIDs = Set<String>()
|
||||||
|
|||||||
@@ -397,7 +397,7 @@ enum DeliveryStatus: Codable, Equatable {
|
|||||||
/// Handles both broadcast messages and private encrypted messages,
|
/// Handles both broadcast messages and private encrypted messages,
|
||||||
/// with support for mentions, replies, and delivery tracking.
|
/// with support for mentions, replies, and delivery tracking.
|
||||||
/// - Note: This is the primary data model for chat messages
|
/// - Note: This is the primary data model for chat messages
|
||||||
class BitchatMessage: Codable {
|
final class BitchatMessage: Codable {
|
||||||
let id: String
|
let id: String
|
||||||
let sender: String
|
let sender: String
|
||||||
let content: String
|
let content: String
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// Manages autocomplete functionality for chat
|
/// Manages autocomplete functionality for chat
|
||||||
class AutocompleteService {
|
final class AutocompleteService {
|
||||||
private let mentionRegex = try? NSRegularExpression(pattern: "@([\\p{L}0-9_]*)$", options: [])
|
private let mentionRegex = try? NSRegularExpression(pattern: "@([\\p{L}0-9_]*)$", options: [])
|
||||||
private let commandRegex = try? NSRegularExpression(pattern: "^/([a-z]*)$", options: [])
|
private let commandRegex = try? NSRegularExpression(pattern: "^/([a-z]*)$", options: [])
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ enum CommandResult {
|
|||||||
|
|
||||||
/// Processes chat commands in a focused, efficient way
|
/// Processes chat commands in a focused, efficient way
|
||||||
@MainActor
|
@MainActor
|
||||||
class CommandProcessor {
|
final class CommandProcessor {
|
||||||
weak var chatViewModel: ChatViewModel?
|
weak var chatViewModel: ChatViewModel?
|
||||||
weak var meshService: Transport?
|
weak var meshService: Transport?
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import Combine
|
|||||||
|
|
||||||
/// Manages persistent favorite relationships between peers
|
/// Manages persistent favorite relationships between peers
|
||||||
@MainActor
|
@MainActor
|
||||||
class FavoritesPersistenceService: ObservableObject {
|
final class FavoritesPersistenceService: ObservableObject {
|
||||||
|
|
||||||
struct FavoriteRelationship: Codable {
|
struct FavoriteRelationship: Codable {
|
||||||
let peerNoisePublicKey: Data
|
let peerNoisePublicKey: Data
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import Foundation
|
|||||||
import Security
|
import Security
|
||||||
import os.log
|
import os.log
|
||||||
|
|
||||||
class KeychainManager {
|
final class KeychainManager {
|
||||||
static let shared = KeychainManager()
|
static let shared = KeychainManager()
|
||||||
|
|
||||||
// Use consistent service name for all keychain items
|
// Use consistent service name for all keychain items
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ enum EncryptionStatus: Equatable {
|
|||||||
/// Provides a high-level API for establishing secure channels between peers,
|
/// Provides a high-level API for establishing secure channels between peers,
|
||||||
/// handling all cryptographic operations transparently.
|
/// handling all cryptographic operations transparently.
|
||||||
/// - Important: This service maintains the device's cryptographic identity
|
/// - Important: This service maintains the device's cryptographic identity
|
||||||
class NoiseEncryptionService {
|
final class NoiseEncryptionService {
|
||||||
// Static identity key (persistent across sessions)
|
// Static identity key (persistent across sessions)
|
||||||
private let staticIdentityKey: Curve25519.KeyAgreement.PrivateKey
|
private let staticIdentityKey: Curve25519.KeyAgreement.PrivateKey
|
||||||
public let staticIdentityPublicKey: Curve25519.KeyAgreement.PublicKey
|
public let staticIdentityPublicKey: Curve25519.KeyAgreement.PublicKey
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import UIKit
|
|||||||
import AppKit
|
import AppKit
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class NotificationService {
|
final class NotificationService {
|
||||||
static let shared = NotificationService()
|
static let shared = NotificationService()
|
||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import Foundation
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
/// Manages all private chat functionality
|
/// Manages all private chat functionality
|
||||||
class PrivateChatManager: ObservableObject {
|
final class PrivateChatManager: ObservableObject {
|
||||||
@Published var privateChats: [String: [BitchatMessage]] = [:]
|
@Published var privateChats: [String: [BitchatMessage]] = [:]
|
||||||
@Published var selectedPeer: String? = nil
|
@Published var selectedPeer: String? = nil
|
||||||
@Published var unreadMessages: Set<String> = []
|
@Published var unreadMessages: Set<String> = []
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import CryptoKit
|
|||||||
|
|
||||||
/// Single source of truth for peer state, combining mesh connectivity and favorites
|
/// Single source of truth for peer state, combining mesh connectivity and favorites
|
||||||
@MainActor
|
@MainActor
|
||||||
class UnifiedPeerService: ObservableObject, TransportPeerEventsDelegate {
|
final class UnifiedPeerService: ObservableObject, TransportPeerEventsDelegate {
|
||||||
|
|
||||||
// MARK: - Published Properties
|
// MARK: - Published Properties
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import os.log
|
|||||||
|
|
||||||
/// Centralized security-aware logging framework
|
/// Centralized security-aware logging framework
|
||||||
/// Provides safe logging that filters sensitive data and security events
|
/// Provides safe logging that filters sensitive data and security events
|
||||||
class SecureLogger {
|
final class SecureLogger {
|
||||||
|
|
||||||
// MARK: - Log Categories
|
// MARK: - Log Categories
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ import UIKit
|
|||||||
/// Manages the application state and business logic for BitChat.
|
/// Manages the application state and business logic for BitChat.
|
||||||
/// Acts as the primary coordinator between UI components and backend services,
|
/// Acts as the primary coordinator between UI components and backend services,
|
||||||
/// implementing the BitchatDelegate protocol to handle network events.
|
/// implementing the BitchatDelegate protocol to handle network events.
|
||||||
class ChatViewModel: ObservableObject, BitchatDelegate {
|
final class ChatViewModel: ObservableObject, BitchatDelegate {
|
||||||
// Precompiled regexes and detectors reused across formatting
|
// Precompiled regexes and detectors reused across formatting
|
||||||
private enum Regexes {
|
private enum Regexes {
|
||||||
static let hashtag: NSRegularExpression = {
|
static let hashtag: NSRegularExpression = {
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ final class BLEServiceTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - Mock Delegate Helper
|
// MARK: - Mock Delegate Helper
|
||||||
|
|
||||||
private class MockBitchatDelegate: BitchatDelegate {
|
private final class MockBitchatDelegate: BitchatDelegate {
|
||||||
private let messageHandler: (BitchatMessage) -> Void
|
private let messageHandler: (BitchatMessage) -> Void
|
||||||
|
|
||||||
init(_ handler: @escaping (BitchatMessage) -> Void) {
|
init(_ handler: @escaping (BitchatMessage) -> Void) {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import CoreBluetooth
|
|||||||
/// - `autoFloodEnabled` is disabled by default; Integration tests enable it in `setUp()` to
|
/// - `autoFloodEnabled` is disabled by default; Integration tests enable it in `setUp()` to
|
||||||
/// simulate broadcast propagation across the mesh. E2E tests keep it off and perform explicit
|
/// simulate broadcast propagation across the mesh. E2E tests keep it off and perform explicit
|
||||||
/// relays when needed.
|
/// relays when needed.
|
||||||
class MockBLEService: NSObject {
|
final class MockBLEService: NSObject {
|
||||||
// Enable automatic flooding for public messages in integration tests only
|
// Enable automatic flooding for public messages in integration tests only
|
||||||
static var autoFloodEnabled: Bool = false
|
static var autoFloodEnabled: Bool = false
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import Foundation
|
|||||||
import CryptoKit
|
import CryptoKit
|
||||||
@testable import bitchat
|
@testable import bitchat
|
||||||
|
|
||||||
class TestHelpers {
|
final class TestHelpers {
|
||||||
|
|
||||||
// MARK: - Key Generation
|
// MARK: - Key Generation
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user