mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 02:45:19 +00:00
* feat(tor): Tor-by-default scaffold and integration - Add TorManager with static/dlopen start, torrc generation, SOCKS probe - Add TorURLSession; route Nostr/Web fetches via SOCKS proxy - Add chat system messages for Tor status; show progress (macOS) and ready - Disable ControlPort bootstrap monitor on iOS; keep it on macOS - Make Tor waits non-blocking; avoid main-actor stalls on startup - Queue & flush Nostr subscriptions on relay connect; skip duplicates - Always rewrite torrc at launch to fix iOS container path mismatches - Link libz; add project wiring for tor-nolzma.xcframework - Minor fixes: SOCKS probe resumeOnce guard, entitlement for network.server (macOS) * iOS: deterministic Tor recovery + 100% gating; BLE-first; session rebuild - Restart/wake Tor on foreground via ControlPort (ACTIVE/SHUTDOWN), avoid restarts during bootstrap; add NWPathMonitor to trigger checks - Use NWConnection control polling for GETINFO; remove blocking CFStream readers to avoid QoS inversions; compute readiness from SOCKS + 100% - Rebuild TorURLSession on resume; reset Nostr connections to rebind - Gate all internet after full bootstrap; keep BLE mesh startup fast - Fix Swift 6 capture issues; hop UI updates to @MainActor - Remove Tor progress spam; persist initial "starting tor..." system message * UI: show Tor system messages only in geohash channels (not mesh) - Gate "starting tor..." and readiness/timeout messages to geohash view - Add helper addGeohashOnlySystemMessage() to avoid posting to mesh timeline - Persist system messages in geohash backing store via addPublicSystemMessage() * Relays: treat repeated -1011 handshake failures as permanent; skip reconnects - Classify NSURLErrorBadServerResponse as permanent and stop retrying - Filter permanently-failed relays from subscribe/connect attempts - Avoid reconnect scheduling for permanently failed relays * Embed Tor via tor_api; deterministic restart + Nostr gating; add Tor notifications - Run Tor via tor_api in a dedicated thread with OwningControllerFD - Cleanly stop Tor on background; restart on .active (single instance) - Avoid fallback to tor_main/dlopen; add is-running check to prevent duplicates - Fix argv lifetime in C glue to avoid strcmp crash on start - Gate Nostr connect/subscribe/send until Tor is fully ready - Rebuild URLSession + reset relays after Tor readiness (scene-based) - Remove TorDidBecomeReady double-reset and appDidBecomeActive resubscribe - Add TorWillRestart/TorDidBecomeReady notifications and chat system messages - Debounce path-change restarts; ACTIVE poke first; coalesce subs; cancel stale reconnect timers - Project: add CTorHost.c and TorNotifications.swift to targets; fix libz.tbd path * Defer Nostr setup logs until Tor is ready; fix subscribe coalescing and reconnect generation - Move "Connecting to Nostr relays" log after awaitReady() - Log "Queuing subscription" when Tor not ready; only coalesce when handler exists - Clear coalescer on unsubscribe - Cancel stale reconnect timers using connectionGeneration - Remove app-level TorDidBecomeReady reset to avoid duplicate reconnects - Debounce path-change restarts * Gate Nostr init/subscription logs until Tor is ready - ChatViewModel: await Tor readiness before initializing Nostr and logging - Only log GeoDM subscription when Tor is ready to avoid early noise * Make Nostr connect single-sourced; defer DM subscription until connected - Remove duplicate connect call from ChatViewModel; let scene-based flow connect - Setup DM subscription once on first connection via sink - Reduce early subscription send/cancel noise after Tor restarts * On launch, queue Nostr subscriptions without initiating connects; let centralized connect handle it - In subscribe(), if no connections exist, just list relays and queue subs - Avoids early send/cancel churn before connect() runs post-Tor-ready * Always queue subscriptions and flush on connection; avoid immediate sends - Prevents early send/cancel churn at launch and during reconnects - If relays are already connected, flush immediately; otherwise pending until connected * UI: scope Tor restart messages to geohash channels; skip initial foreground restart on cold launch to avoid confusing system message in #mesh * geo: disable background sampling + notifications\n- Gate sampling to foreground only (beginGeohashSampling, watchers)\n- Suppress geohash activity notifications unless app is active\n- Stop sampling explicitly on background scene phase * Update BitchatApp.swift Co-authored-by: asmo <asmogo@protonmail.com> * Update BitchatApp.swift Co-authored-by: asmo <asmogo@protonmail.com> * Update BitchatApp.swift Co-authored-by: asmo <asmogo@protonmail.com> * Update bitchat/BitchatApp.swift Co-authored-by: asmo <asmogo@protonmail.com> * Update bitchat/BitchatApp.swift Co-authored-by: asmo <asmogo@protonmail.com> * fix(iOS App): resolve merge artifacts in scenePhase handler\n- Remove duplicate didEnterBackground state\n- Fix switch/if braces and logic for foreground restart gating --------- Co-authored-by: jack <jackjackbits@users.noreply.github.com> Co-authored-by: asmo <asmogo@protonmail.com>
232 lines
7.1 KiB
YAML
232 lines
7.1 KiB
YAML
name: bitchat
|
|
options:
|
|
bundleIdPrefix: chat.bitchat
|
|
deploymentTarget:
|
|
iOS: 16.0
|
|
macOS: 13.0
|
|
createIntermediateGroups: true
|
|
|
|
settings:
|
|
MARKETING_VERSION: 1.0.0
|
|
CURRENT_PROJECT_VERSION: 1
|
|
|
|
packages:
|
|
P256K:
|
|
url: https://github.com/21-DOT-DEV/swift-secp256k1
|
|
majorVersion: 0.21.1
|
|
|
|
targets:
|
|
bitchat_iOS:
|
|
type: application
|
|
platform: iOS
|
|
sources:
|
|
- bitchat
|
|
resources:
|
|
- bitchat/Assets.xcassets
|
|
- bitchat/LaunchScreen.storyboard
|
|
info:
|
|
path: bitchat/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: bitchat
|
|
CFBundleShortVersionString: $(MARKETING_VERSION)
|
|
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
|
|
NSBluetoothAlwaysUsageDescription: bitchat uses Bluetooth to create a secure mesh network for chatting with nearby users.
|
|
NSBluetoothPeripheralUsageDescription: bitchat uses Bluetooth to discover and connect with other bitchat users nearby.
|
|
UIBackgroundModes:
|
|
- bluetooth-central
|
|
- bluetooth-peripheral
|
|
UILaunchStoryboardName: LaunchScreen
|
|
UISupportedInterfaceOrientations:
|
|
- UIInterfaceOrientationPortrait
|
|
UISupportedInterfaceOrientations~ipad:
|
|
- UIInterfaceOrientationPortrait
|
|
- UIInterfaceOrientationPortraitUpsideDown
|
|
- UIInterfaceOrientationLandscapeLeft
|
|
- UIInterfaceOrientationLandscapeRight
|
|
UIRequiresFullScreen: false
|
|
CFBundleURLTypes:
|
|
- CFBundleURLSchemes:
|
|
- bitchat
|
|
# xcodegen quirk: include some macOS properties in iOS target
|
|
LSMinimumSystemVersion: $(MACOSX_DEPLOYMENT_TARGET)
|
|
settings:
|
|
PRODUCT_BUNDLE_IDENTIFIER: chat.bitchat
|
|
PRODUCT_NAME: bitchat
|
|
INFOPLIST_FILE: bitchat/Info.plist
|
|
ENABLE_PREVIEWS: YES
|
|
SWIFT_VERSION: 5.0
|
|
IPHONEOS_DEPLOYMENT_TARGET: 16.0
|
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: YES
|
|
CODE_SIGN_STYLE: Automatic
|
|
CODE_SIGNING_REQUIRED: YES
|
|
CODE_SIGNING_ALLOWED: YES
|
|
DEVELOPMENT_TEAM: L3N5LHJD5Y
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS: YES
|
|
CODE_SIGN_ENTITLEMENTS: bitchat/bitchat.entitlements
|
|
dependencies:
|
|
- target: bitchatShareExtension
|
|
embed: true
|
|
- package: P256K
|
|
- framework: Frameworks/tor-nolzma.xcframework
|
|
embed: true
|
|
codeSign: true
|
|
- sdk: libz.tbd
|
|
|
|
bitchat_macOS:
|
|
type: application
|
|
platform: macOS
|
|
sources:
|
|
- bitchat
|
|
resources:
|
|
- bitchat/Assets.xcassets
|
|
info:
|
|
path: bitchat/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: bitchat
|
|
CFBundleShortVersionString: $(MARKETING_VERSION)
|
|
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
|
|
LSMinimumSystemVersion: $(MACOSX_DEPLOYMENT_TARGET)
|
|
NSBluetoothAlwaysUsageDescription: bitchat uses Bluetooth to create a secure mesh network for chatting with nearby users.
|
|
NSBluetoothPeripheralUsageDescription: bitchat uses Bluetooth to discover and connect with other bitchat users nearby.
|
|
CFBundleURLTypes:
|
|
- CFBundleURLSchemes:
|
|
- bitchat
|
|
# xcodegen quirk: include some iOS properties in macOS target
|
|
UIBackgroundModes:
|
|
- bluetooth-central
|
|
- bluetooth-peripheral
|
|
UILaunchStoryboardName: LaunchScreen
|
|
UISupportedInterfaceOrientations:
|
|
- UIInterfaceOrientationPortrait
|
|
UIRequiresFullScreen: true
|
|
settings:
|
|
PRODUCT_BUNDLE_IDENTIFIER: chat.bitchat
|
|
PRODUCT_NAME: bitchat
|
|
INFOPLIST_FILE: bitchat/Info.plist
|
|
ENABLE_PREVIEWS: NO
|
|
SWIFT_VERSION: 5.0
|
|
MACOSX_DEPLOYMENT_TARGET: 13.0
|
|
CODE_SIGN_STYLE: Automatic
|
|
CODE_SIGNING_REQUIRED: YES
|
|
CODE_SIGNING_ALLOWED: YES
|
|
DEVELOPMENT_TEAM: L3N5LHJD5Y
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS: YES
|
|
CODE_SIGN_ENTITLEMENTS: bitchat/bitchat-macOS.entitlements
|
|
dependencies:
|
|
- package: P256K
|
|
- framework: Frameworks/tor-nolzma.xcframework
|
|
embed: true
|
|
codeSign: true
|
|
- sdk: libz.tbd
|
|
|
|
bitchatShareExtension:
|
|
type: app-extension
|
|
platform: iOS
|
|
sources:
|
|
- bitchatShareExtension
|
|
info:
|
|
path: bitchatShareExtension/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: bitchat
|
|
CFBundleShortVersionString: $(MARKETING_VERSION)
|
|
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
|
|
NSExtension:
|
|
NSExtensionPointIdentifier: com.apple.share-services
|
|
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController
|
|
NSExtensionAttributes:
|
|
NSExtensionActivationRule:
|
|
NSExtensionActivationSupportsText: true
|
|
NSExtensionActivationSupportsWebURLWithMaxCount: 1
|
|
NSExtensionActivationSupportsImageWithMaxCount: 1
|
|
settings:
|
|
PRODUCT_BUNDLE_IDENTIFIER: chat.bitchat.ShareExtension
|
|
INFOPLIST_FILE: bitchatShareExtension/Info.plist
|
|
SWIFT_VERSION: 5.0
|
|
IPHONEOS_DEPLOYMENT_TARGET: 16.0
|
|
CODE_SIGN_STYLE: Automatic
|
|
CODE_SIGNING_REQUIRED: YES
|
|
CODE_SIGNING_ALLOWED: YES
|
|
DEVELOPMENT_TEAM: L3N5LHJD5Y
|
|
CODE_SIGN_ENTITLEMENTS: bitchatShareExtension/bitchatShareExtension.entitlements
|
|
CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION: YES
|
|
|
|
bitchatTests_iOS:
|
|
type: bundle.unit-test
|
|
platform: iOS
|
|
sources:
|
|
- bitchatTests
|
|
dependencies:
|
|
- target: bitchat_iOS
|
|
settings:
|
|
PRODUCT_BUNDLE_IDENTIFIER: chat.bitchat.tests
|
|
INFOPLIST_FILE: bitchatTests/Info.plist
|
|
SWIFT_VERSION: 5.0
|
|
IPHONEOS_DEPLOYMENT_TARGET: 16.0
|
|
TEST_HOST: $(BUILT_PRODUCTS_DIR)/bitchat.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/bitchat
|
|
BUNDLE_LOADER: $(TEST_HOST)
|
|
CODE_SIGN_STYLE: Automatic
|
|
CODE_SIGNING_REQUIRED: YES
|
|
CODE_SIGNING_ALLOWED: YES
|
|
DEVELOPMENT_TEAM: L3N5LHJD5Y
|
|
|
|
bitchatTests_macOS:
|
|
type: bundle.unit-test
|
|
platform: macOS
|
|
sources:
|
|
- bitchatTests
|
|
dependencies:
|
|
- target: bitchat_macOS
|
|
settings:
|
|
PRODUCT_BUNDLE_IDENTIFIER: chat.bitchat.tests
|
|
INFOPLIST_FILE: bitchatTests/Info.plist
|
|
SWIFT_VERSION: 5.0
|
|
MACOSX_DEPLOYMENT_TARGET: 13.0
|
|
TEST_HOST: $(BUILT_PRODUCTS_DIR)/bitchat.app/Contents/MacOS/bitchat
|
|
BUNDLE_LOADER: $(TEST_HOST)
|
|
CODE_SIGN_STYLE: Automatic
|
|
CODE_SIGNING_REQUIRED: YES
|
|
CODE_SIGNING_ALLOWED: YES
|
|
DEVELOPMENT_TEAM: L3N5LHJD5Y
|
|
|
|
schemes:
|
|
bitchat (iOS):
|
|
build:
|
|
targets:
|
|
bitchat_iOS: all
|
|
bitchatShareExtension: all
|
|
run:
|
|
config: Debug
|
|
executable: bitchat_iOS
|
|
test:
|
|
config: Debug
|
|
targets:
|
|
- bitchatTests_iOS
|
|
profile:
|
|
config: Release
|
|
executable: bitchat_iOS
|
|
analyze:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|
|
|
|
bitchat (macOS):
|
|
build:
|
|
targets:
|
|
bitchat_macOS: all
|
|
run:
|
|
config: Debug
|
|
executable: bitchat_macOS
|
|
test:
|
|
config: Debug
|
|
targets:
|
|
- bitchatTests_macOS
|
|
profile:
|
|
config: Release
|
|
executable: bitchat_macOS
|
|
analyze:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|