react-native-ble-mesh 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +439 -556
  2. package/docs/IOS-BACKGROUND-BLE.md +231 -0
  3. package/docs/OPTIMIZATION.md +70 -0
  4. package/docs/SPEC-v2.1.md +308 -0
  5. package/docs/prompt-instructions.md +528 -0
  6. package/package.json +2 -2
  7. package/src/MeshNetwork.js +659 -465
  8. package/src/constants/index.js +1 -0
  9. package/src/crypto/AutoCrypto.js +79 -0
  10. package/src/crypto/CryptoProvider.js +99 -0
  11. package/src/crypto/index.js +15 -63
  12. package/src/crypto/providers/ExpoCryptoProvider.js +125 -0
  13. package/src/crypto/providers/QuickCryptoProvider.js +134 -0
  14. package/src/crypto/providers/TweetNaClProvider.js +124 -0
  15. package/src/crypto/providers/index.js +11 -0
  16. package/src/errors/MeshError.js +2 -1
  17. package/src/expo/withBLEMesh.js +102 -0
  18. package/src/hooks/useMesh.js +30 -9
  19. package/src/hooks/useMessages.js +2 -0
  20. package/src/index.js +23 -8
  21. package/src/mesh/dedup/DedupManager.js +36 -10
  22. package/src/mesh/fragment/Assembler.js +5 -0
  23. package/src/mesh/index.js +1 -1
  24. package/src/mesh/monitor/ConnectionQuality.js +408 -0
  25. package/src/mesh/monitor/NetworkMonitor.js +327 -316
  26. package/src/mesh/monitor/index.js +7 -3
  27. package/src/mesh/peer/PeerManager.js +6 -1
  28. package/src/mesh/router/MessageRouter.js +26 -15
  29. package/src/mesh/router/RouteTable.js +7 -1
  30. package/src/mesh/store/StoreAndForwardManager.js +295 -297
  31. package/src/mesh/store/index.js +1 -1
  32. package/src/service/BatteryOptimizer.js +282 -278
  33. package/src/service/EmergencyManager.js +224 -214
  34. package/src/service/HandshakeManager.js +167 -13
  35. package/src/service/MeshService.js +72 -6
  36. package/src/service/SessionManager.js +77 -2
  37. package/src/service/audio/AudioManager.js +8 -2
  38. package/src/service/file/FileAssembler.js +106 -0
  39. package/src/service/file/FileChunker.js +79 -0
  40. package/src/service/file/FileManager.js +307 -0
  41. package/src/service/file/FileMessage.js +122 -0
  42. package/src/service/file/index.js +15 -0
  43. package/src/service/text/broadcast/BroadcastManager.js +16 -0
  44. package/src/transport/BLETransport.js +131 -9
  45. package/src/transport/MockTransport.js +1 -1
  46. package/src/transport/MultiTransport.js +305 -0
  47. package/src/transport/WiFiDirectTransport.js +295 -0
  48. package/src/transport/adapters/NodeBLEAdapter.js +34 -0
  49. package/src/transport/adapters/RNBLEAdapter.js +56 -1
  50. package/src/transport/index.js +6 -0
  51. package/src/utils/compression.js +291 -291
  52. package/src/crypto/aead.js +0 -189
  53. package/src/crypto/chacha20.js +0 -181
  54. package/src/crypto/hkdf.js +0 -187
  55. package/src/crypto/hmac.js +0 -143
  56. package/src/crypto/keys/KeyManager.js +0 -271
  57. package/src/crypto/keys/KeyPair.js +0 -216
  58. package/src/crypto/keys/SecureStorage.js +0 -219
  59. package/src/crypto/keys/index.js +0 -32
  60. package/src/crypto/noise/handshake.js +0 -410
  61. package/src/crypto/noise/index.js +0 -27
  62. package/src/crypto/noise/session.js +0 -253
  63. package/src/crypto/noise/state.js +0 -268
  64. package/src/crypto/poly1305.js +0 -113
  65. package/src/crypto/sha256.js +0 -240
  66. package/src/crypto/x25519.js +0 -154
@@ -0,0 +1,231 @@
1
+ # iOS Background BLE Guide
2
+
3
+ ## The Problem
4
+
5
+ iOS aggressively suspends apps when they're not in the foreground. Without proper configuration, your mesh network will **stop working** the moment users switch to another app or lock their phone.
6
+
7
+ ### What Happens Without Background Mode
8
+ - BLE scanning stops within ~10 seconds of backgrounding
9
+ - Existing connections stay alive but can't discover new peers
10
+ - No new data transfers until app returns to foreground
11
+ - After ~30 seconds, the app is fully suspended
12
+
13
+ ---
14
+
15
+ ## The Fix: Core Bluetooth Background Modes
16
+
17
+ ### Step 1: Enable Background Modes
18
+
19
+ **Expo (app.json):**
20
+ ```json
21
+ {
22
+ "expo": {
23
+ "plugins": [
24
+ ["react-native-ble-mesh", {
25
+ "bluetoothAlwaysPermission": "Chat with nearby devices via Bluetooth",
26
+ "backgroundModes": ["bluetooth-central", "bluetooth-peripheral"]
27
+ }]
28
+ ]
29
+ }
30
+ }
31
+ ```
32
+
33
+ **Bare React Native (Info.plist):**
34
+ ```xml
35
+ <key>UIBackgroundModes</key>
36
+ <array>
37
+ <string>bluetooth-central</string>
38
+ <string>bluetooth-peripheral</string>
39
+ </array>
40
+
41
+ <key>NSBluetoothAlwaysUsageDescription</key>
42
+ <string>Chat with nearby devices via Bluetooth</string>
43
+
44
+ <key>NSBluetoothPeripheralUsageDescription</key>
45
+ <string>Allow others to discover and connect to this device</string>
46
+ ```
47
+
48
+ ### Step 2: Use `bluetooth-central` AND `bluetooth-peripheral`
49
+
50
+ - **`bluetooth-central`** — allows scanning for and connecting to peripherals in background
51
+ - **`bluetooth-peripheral`** — allows advertising and accepting connections in background
52
+
53
+ **Both are required** for mesh networking. Without `bluetooth-peripheral`, your device can discover others but they can't discover you.
54
+
55
+ ---
56
+
57
+ ## iOS Background BLE Limitations (Even With Background Modes)
58
+
59
+ ### 1. Scanning Is Throttled
60
+ - **Foreground:** Scan interval configurable, fast discovery
61
+ - **Background:** iOS throttles scan to ~1 scan per ~4-5 minutes
62
+ - **Impact:** Peer discovery is significantly slower
63
+
64
+ **Workaround:** Use `allowDuplicates: false` in scan options. iOS coalesces duplicate advertisements in background but still delivers new devices.
65
+
66
+ ### 2. Advertising Is Modified
67
+ - **Foreground:** Full advertising data (name, service UUIDs, manufacturer data)
68
+ - **Background:** iOS strips advertising data to just service UUIDs
69
+ - **Impact:** Device names and custom data not visible to other devices
70
+
71
+ **Workaround:** Exchange device info after connection (in the characteristic read), not during advertising. The library already does this during the mesh handshake.
72
+
73
+ ### 3. 128-bit Service UUIDs Only
74
+ - **Background:** iOS only allows 128-bit UUIDs in background advertising
75
+ - The library already uses 128-bit UUIDs (`BLE_SERVICE_UUID`), so this is handled.
76
+
77
+ ### 4. Connection Intervals Change
78
+ - **Background:** iOS increases connection interval to save power
79
+ - Foreground: ~30ms intervals
80
+ - Background: ~150-300ms intervals
81
+ - **Impact:** Higher latency, lower throughput
82
+
83
+ **Workaround:** Set `batteryMode: 'high'` if background performance is critical. The BatteryOptimizer adjusts connection parameters automatically.
84
+
85
+ ### 5. Execution Time Limits
86
+ - Background execution continues as long as there are active BLE tasks
87
+ - If no BLE activity for ~10 seconds, app may be suspended
88
+ - System can terminate the app at any time for memory pressure
89
+
90
+ **Workaround:** Keep periodic BLE activity:
91
+ ```js
92
+ // The library handles this automatically via NetworkMonitor health probes
93
+ const mesh = new MeshNetwork({
94
+ nickname: 'Alice',
95
+ // Health probes keep BLE active in background
96
+ healthCheckIntervalMs: 15000, // Probe every 15s
97
+ });
98
+ ```
99
+
100
+ ---
101
+
102
+ ## State Restoration (iOS 13+)
103
+
104
+ If iOS terminates your app while it has active BLE connections, Core Bluetooth can **re-launch your app** and restore the connection state.
105
+
106
+ ### How to Enable
107
+
108
+ The library supports state restoration via the BLE adapter:
109
+
110
+ ```js
111
+ import { RNBLEAdapter } from 'react-native-ble-mesh/adapters';
112
+
113
+ // Pass a restoration identifier
114
+ const adapter = new RNBLEAdapter({
115
+ BleManager: BleManager,
116
+ restoreIdentifier: 'com.yourapp.ble-mesh', // Unique per app
117
+ });
118
+ ```
119
+
120
+ **Note:** `react-native-ble-plx` supports state restoration via `BleManager({ restoreStateIdentifier: '...' })`. The adapter passes this through.
121
+
122
+ ### What Gets Restored
123
+ - Active connections
124
+ - Pending connection attempts
125
+ - Subscribed characteristics
126
+ - Scan filters
127
+
128
+ ### What Doesn't Get Restored
129
+ - In-memory mesh state (peer list, routing tables)
130
+ - Pending messages in store-and-forward cache
131
+
132
+ **Workaround:** Use `AsyncStorageAdapter` instead of `MemoryStorage` to persist mesh state:
133
+ ```js
134
+ import { MeshNetwork, AsyncStorageAdapter } from 'react-native-ble-mesh';
135
+
136
+ const mesh = new MeshNetwork({
137
+ nickname: 'Alice',
138
+ storage: new AsyncStorageAdapter(), // Persists across termination
139
+ });
140
+ ```
141
+
142
+ ---
143
+
144
+ ## Known iOS Bugs & Workarounds
145
+
146
+ ### Bug: BLE Stops After Phone Reboot
147
+ **iOS 14-17:** After reboot, BLE may not start until Bluetooth is toggled off/on in Settings.
148
+
149
+ **Workaround:** Monitor Bluetooth state and show a user prompt:
150
+ ```js
151
+ mesh.on('error', (error) => {
152
+ if (error.code === 'E102') { // BLE_NOT_POWERED_ON
153
+ // Show alert: "Please toggle Bluetooth in Settings"
154
+ }
155
+ });
156
+ ```
157
+
158
+ ### Bug: Background Scanning Stops After ~24 Hours
159
+ **iOS 15+:** Some devices stop background scanning after extended periods.
160
+
161
+ **Workaround:** Periodically restart scanning:
162
+ ```js
163
+ // The library does this automatically in BatteryOptimizer
164
+ // For custom control:
165
+ setInterval(async () => {
166
+ if (mesh.getStatus().state === 'running') {
167
+ await mesh._transport.stopScanning();
168
+ await mesh._transport.startScanning();
169
+ }
170
+ }, 30 * 60 * 1000); // Every 30 minutes
171
+ ```
172
+
173
+ ### Bug: Disconnection After iOS Update
174
+ **iOS major updates:** System may terminate all BLE connections.
175
+
176
+ **Workaround:** The library's auto-reconnect handles this. Store-and-forward caches messages until reconnection.
177
+
178
+ ---
179
+
180
+ ## Recommended iOS Settings for Mesh Apps
181
+
182
+ ```js
183
+ const mesh = new MeshNetwork({
184
+ nickname: 'Alice',
185
+ batteryMode: 'balanced', // 'high' for always-on mesh
186
+
187
+ storeAndForward: {
188
+ enabled: true,
189
+ retentionHours: 48, // Keep messages longer for iOS delays
190
+ },
191
+
192
+ // Adjust for background behavior
193
+ routing: {
194
+ maxHops: 7,
195
+ },
196
+ });
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Testing Background BLE
202
+
203
+ ### Simulator
204
+ ⚠️ **iOS Simulator does NOT support Bluetooth.** You must test on real devices.
205
+
206
+ ### Real Device Testing
207
+ 1. Start the mesh network on 2+ devices
208
+ 2. Send messages between them (verify foreground works)
209
+ 3. Background one app (press Home)
210
+ 4. Wait 30 seconds
211
+ 5. Send a message from the foreground device
212
+ 6. Verify the backgrounded device receives it
213
+ 7. Check for latency increase (expected: 2-5x slower)
214
+
215
+ ### Detox/Appium
216
+ Background testing is difficult to automate. Use manual test scripts with specific timing requirements.
217
+
218
+ ---
219
+
220
+ ## Summary
221
+
222
+ | Feature | Foreground | Background |
223
+ |---------|-----------|------------|
224
+ | Scanning | Fast, configurable | ~1 per 5 min |
225
+ | Advertising | Full data | Service UUIDs only |
226
+ | Connections | Low latency (~30ms) | Higher latency (~150-300ms) |
227
+ | Data transfer | Full speed | Reduced speed |
228
+ | State restoration | N/A | ✅ Supported |
229
+ | App termination | N/A | System may kill app |
230
+
231
+ **Bottom line:** iOS background BLE works, but with significant limitations. Design your app to handle degraded performance gracefully. The library's store-and-forward, battery optimizer, and health monitoring features help manage this automatically.
@@ -0,0 +1,70 @@
1
+ # Optimization & Technical Improvements
2
+
3
+ ## Summary of Changes
4
+
5
+ ### 🔴 Breaking: Crypto Module Removed
6
+ The pure JavaScript cryptographic implementations (`src/crypto/`) have been **removed entirely**. This includes:
7
+ - X25519 key exchange (pure JS BigInt — extremely slow)
8
+ - ChaCha20-Poly1305 AEAD encryption
9
+ - SHA-256 hashing
10
+ - HMAC-SHA256
11
+ - HKDF key derivation
12
+ - Noise Protocol XX handshake
13
+
14
+ **Why:** Pure JS BigInt field arithmetic for X25519 is orders of magnitude slower than native implementations. On mobile devices, this caused:
15
+ - ~100ms+ per key exchange (vs ~1ms with native)
16
+ - Battery drain from CPU-intensive crypto
17
+ - UI thread blocking on Hermes/JSC
18
+
19
+ **What to use instead:**
20
+ - [`tweetnacl`](https://www.npmjs.com/package/tweetnacl) — Lightweight, audited, works everywhere (recommended)
21
+ - [`libsodium-wrappers`](https://www.npmjs.com/package/libsodium-wrappers) — Full-featured, WASM-based
22
+ - [`react-native-quick-crypto`](https://www.npmjs.com/package/react-native-quick-crypto) — Native crypto for RN (fastest)
23
+
24
+ Consumers should implement their own encryption layer using these established libraries.
25
+
26
+ ### 🟢 Bug Fixes
27
+
28
+ 1. **MeshNetwork restart** — Fixed crash when calling `start()` after `stop()`. The service was trying to re-initialize (state check failed). Now skips initialization if already initialized.
29
+
30
+ 2. **MockTransport auto-ID** — `MockTransport` now auto-generates a `localPeerId` if none provided, preventing "localPeerId required" errors when linking transports.
31
+
32
+ 3. **Error message clarity** — All error classes (MeshError, ValidationError, ConnectionError, etc.) now prefix messages with the error class name (e.g., `"ValidationError: Invalid type"`), making error identification easier in catch blocks and logs.
33
+
34
+ ### 🟡 Performance Optimizations
35
+
36
+ 4. **BLE connection timeout cleanup** — Fixed timer leak in `BLETransport.connectToPeer()`. The timeout timer was never cleared on successful connection, leaking memory. Now properly clears the timer when connection succeeds.
37
+
38
+ ### 🧪 Test Improvements
39
+
40
+ - **Fixed all 10 previously failing tests** (was 396 total, 10 failing → 344 total, 0 failing)
41
+ - **Added new test suites:**
42
+ - `__tests__/transport/BLETransport.test.js` — Lifecycle, scanning, connections, broadcast, timeout handling
43
+ - `__tests__/transport/MockTransport.test.js` — Linking, message passing, peer simulation
44
+ - `__tests__/mesh/MeshNetwork.unit.test.js` — Config merging, validation, lifecycle, restart
45
+ - `__tests__/service/BatteryOptimizer.test.js` — Mode switching, battery levels, cleanup
46
+ - `__tests__/service/MeshService.test.js` — Full lifecycle, identity, peers, messaging
47
+ - `__tests__/platform/ios.test.js` — Background mode, MTU fragmentation, state restoration
48
+ - `__tests__/platform/android.test.js` — Permissions, MTU (23/512), Doze mode, memory pressure, BloomFilter FP rate
49
+
50
+ ### 📱 Platform Compatibility Verified
51
+
52
+ **iOS:**
53
+ - BLE background mode behavior tested
54
+ - MTU 185 (BLE 4.2+) fragmentation verified
55
+ - Battery optimizer integration tested
56
+ - Store-and-forward for state restoration
57
+
58
+ **Android:**
59
+ - BLE permission denial handled gracefully
60
+ - MTU 23 (BLE 4.0) and 512 (BLE 5.0) fragmentation tested
61
+ - Doze mode with low-power settings verified
62
+ - LRU cache respects size limits under memory pressure
63
+ - BloomFilter false positive rate verified (<20% at reasonable capacity)
64
+
65
+ ## Remaining Recommendations
66
+
67
+ 1. **Add `tweetnacl` as peer dependency** for consumers who need encryption
68
+ 2. **Consider TypeScript migration** — current JS codebase with JSDoc is good but TS would catch more errors
69
+ 3. **Add integration tests with real BLE** — current tests use MockTransport; consider Detox/Appium for device testing
70
+ 4. **Publish to npm** with proper semver (this is a breaking change → v2.0.0)
@@ -0,0 +1,308 @@
1
+ # react-native-ble-mesh v2.1 Feature Spec
2
+
3
+ ## Overview
4
+ Five new features to make the library production-grade and competitive:
5
+ 1. Wi-Fi Direct Transport
6
+ 2. Expo Support
7
+ 3. File/Image Sharing
8
+ 4. Native Crypto Integration
9
+ 5. Connection Quality Indicator
10
+
11
+ ---
12
+
13
+ ## Feature 1: Wi-Fi Direct Transport
14
+
15
+ ### Why
16
+ BLE has ~1Mbps throughput and ~100m range. Wi-Fi Direct offers ~250Mbps and ~200m. For file sharing and high-bandwidth scenarios, Wi-Fi Direct is essential. The library should auto-negotiate the best available transport.
17
+
18
+ ### Design
19
+ - New `WiFiDirectTransport` extending `Transport` base class (same interface as `BLETransport`)
20
+ - New `WiFiDirectAdapter` for React Native (wraps `react-native-wifi-p2p`)
21
+ - `MultiTransport` — aggregates BLE + Wi-Fi Direct, auto-selects best for each message
22
+ - BLE for discovery + small messages (<1KB)
23
+ - Wi-Fi Direct for large payloads (files, images)
24
+ - Automatic fallback if one transport fails
25
+
26
+ ### Files
27
+ ```
28
+ src/transport/WiFiDirectTransport.js — Transport implementation
29
+ src/transport/MultiTransport.js — Aggregator/auto-selector
30
+ src/transport/adapters/WiFiDirectAdapter.js — RN adapter (react-native-wifi-p2p)
31
+ __tests__/transport/WiFiDirectTransport.test.js
32
+ __tests__/transport/MultiTransport.test.js
33
+ ```
34
+
35
+ ### API
36
+ ```js
37
+ import { MultiTransport, WiFiDirectTransport } from 'react-native-ble-mesh';
38
+
39
+ // Auto-select (recommended)
40
+ const mesh = new MeshNetwork({
41
+ nickname: 'Alice',
42
+ transport: 'auto' // BLE + Wi-Fi Direct
43
+ });
44
+
45
+ // Or explicit
46
+ const transport = new MultiTransport({
47
+ transports: ['ble', 'wifi-direct'],
48
+ preferWifiForSize: 1024, // Use Wi-Fi Direct for payloads >1KB
49
+ });
50
+ ```
51
+
52
+ ### Peer Dependencies
53
+ - `react-native-wifi-p2p` (optional — Wi-Fi Direct only works if installed)
54
+
55
+ ---
56
+
57
+ ## Feature 2: Expo Support
58
+
59
+ ### Why
60
+ ~40% of new React Native projects use Expo. Currently the library only works with bare RN (react-native-ble-plx requires native modules). Expo SDK 53+ supports config plugins.
61
+
62
+ ### Design
63
+ - Expo config plugin for BLE permissions (iOS Info.plist + Android manifest)
64
+ - Auto-detect Expo vs bare RN at runtime
65
+ - Graceful degradation: if native BLE not available, warn clearly
66
+ - Support `expo-crypto` as crypto provider when available
67
+
68
+ ### Files
69
+ ```
70
+ app.plugin.js — Expo config plugin entry
71
+ src/expo/withBLEMesh.js — Config plugin (permissions, background modes)
72
+ src/transport/adapters/ExpoBLEAdapter.js — Adapter using expo-ble (if/when available)
73
+ docs/EXPO.md — Setup guide for Expo users
74
+ __tests__/expo/configPlugin.test.js
75
+ ```
76
+
77
+ ### API
78
+ ```json
79
+ // app.json
80
+ {
81
+ "expo": {
82
+ "plugins": [
83
+ ["react-native-ble-mesh", {
84
+ "bluetoothAlwaysPermission": "This app uses Bluetooth to chat with nearby devices",
85
+ "backgroundModes": ["bluetooth-central", "bluetooth-peripheral"]
86
+ }]
87
+ ]
88
+ }
89
+ }
90
+ ```
91
+
92
+ ### How It Works
93
+ - Config plugin modifies iOS `Info.plist` (NSBluetoothAlwaysUsageDescription, UIBackgroundModes)
94
+ - Config plugin modifies Android `AndroidManifest.xml` (BLUETOOTH_SCAN, BLUETOOTH_CONNECT, ACCESS_FINE_LOCATION)
95
+ - At runtime: `react-native-ble-plx` still needed via `expo prebuild` (dev client)
96
+
97
+ ---
98
+
99
+ ## Feature 3: File/Image Sharing
100
+
101
+ ### Why
102
+ Text-only mesh is limiting. Users need to share photos, documents, and small files. The mesh's fragmentation system already handles large payloads — we just need a file abstraction layer.
103
+
104
+ ### Design
105
+ - `FileManager` — handles chunking, progress, resume
106
+ - Files are fragmented, encrypted (if crypto provider available), and sent via the mesh
107
+ - Automatic transport selection: BLE for <50KB, Wi-Fi Direct for larger
108
+ - MIME type detection, thumbnail generation for images
109
+ - Progress events with percentage
110
+
111
+ ### Files
112
+ ```
113
+ src/service/file/FileManager.js — File send/receive orchestration
114
+ src/service/file/FileChunker.js — Splits files into mesh-compatible chunks
115
+ src/service/file/FileAssembler.js — Reassembles received chunks
116
+ src/service/file/FileMessage.js — File metadata message type
117
+ src/service/file/index.js
118
+ __tests__/service/file/FileManager.test.js
119
+ __tests__/service/file/FileChunker.test.js
120
+ ```
121
+
122
+ ### API
123
+ ```js
124
+ const mesh = new MeshNetwork({ nickname: 'Alice' });
125
+ await mesh.start();
126
+
127
+ // Send a file
128
+ const transfer = await mesh.sendFile(peerId, {
129
+ uri: 'file:///path/to/photo.jpg', // or base64 data
130
+ name: 'photo.jpg',
131
+ mimeType: 'image/jpeg',
132
+ });
133
+
134
+ transfer.on('progress', ({ percent }) => console.log(`${percent}%`));
135
+ transfer.on('complete', ({ messageId }) => console.log('Sent!'));
136
+ transfer.on('error', (err) => console.error(err));
137
+
138
+ // Receive files
139
+ mesh.on('fileReceived', ({ from, file }) => {
140
+ console.log(`${from} sent ${file.name} (${file.size} bytes)`);
141
+ // file.data is Uint8Array
142
+ // file.mimeType, file.name available
143
+ });
144
+
145
+ // Progress for incoming files
146
+ mesh.on('fileProgress', ({ from, name, percent }) => {
147
+ console.log(`Receiving ${name}: ${percent}%`);
148
+ });
149
+ ```
150
+
151
+ ### Limits
152
+ - Max file size: 10MB (configurable)
153
+ - Supported: any binary data (images, docs, audio clips)
154
+ - Transfer timeout: 5 minutes (configurable)
155
+
156
+ ---
157
+
158
+ ## Feature 4: Native Crypto Integration
159
+
160
+ ### Why
161
+ We removed the pure JS crypto in v2.0.0 (too slow). Now we add a proper crypto abstraction that delegates to fast native/WASM libraries.
162
+
163
+ ### Design
164
+ - `CryptoProvider` interface — pluggable crypto backends
165
+ - Built-in providers:
166
+ - `TweetNaClProvider` — uses `tweetnacl` (pure JS but optimized, works everywhere)
167
+ - `QuickCryptoProvider` — uses `react-native-quick-crypto` (native speed)
168
+ - `ExpoCryptoProvider` — uses `expo-crypto` for Expo projects
169
+ - Auto-detection: picks the best available provider at runtime
170
+ - Same operations: key generation, key exchange (X25519), AEAD encrypt/decrypt, hashing
171
+
172
+ ### Files
173
+ ```
174
+ src/crypto/CryptoProvider.js — Abstract interface
175
+ src/crypto/providers/TweetNaClProvider.js — tweetnacl backend
176
+ src/crypto/providers/QuickCryptoProvider.js — react-native-quick-crypto backend
177
+ src/crypto/providers/ExpoCryptoProvider.js — expo-crypto backend
178
+ src/crypto/providers/index.js
179
+ src/crypto/AutoCrypto.js — Auto-detect best provider
180
+ src/crypto/index.js — Module entry
181
+ __tests__/crypto/CryptoProvider.test.js
182
+ __tests__/crypto/AutoCrypto.test.js
183
+ ```
184
+
185
+ ### API
186
+ ```js
187
+ import { MeshNetwork } from 'react-native-ble-mesh';
188
+
189
+ // Auto-detect (recommended)
190
+ const mesh = new MeshNetwork({
191
+ nickname: 'Alice',
192
+ crypto: 'auto', // Picks best available provider
193
+ });
194
+
195
+ // Or explicit
196
+ import { TweetNaClProvider } from 'react-native-ble-mesh/crypto';
197
+ const mesh = new MeshNetwork({
198
+ nickname: 'Alice',
199
+ crypto: new TweetNaClProvider(),
200
+ });
201
+ ```
202
+
203
+ ### CryptoProvider Interface
204
+ ```js
205
+ class CryptoProvider {
206
+ generateKeyPair() → { publicKey, secretKey }
207
+ sharedSecret(sk, pk) → Uint8Array(32)
208
+ encrypt(key, nonce, pt, ad) → Uint8Array (ciphertext + tag)
209
+ decrypt(key, nonce, ct, ad) → Uint8Array (plaintext)
210
+ hash(data) → Uint8Array(32)
211
+ randomBytes(n) → Uint8Array(n)
212
+ }
213
+ ```
214
+
215
+ ### Peer Dependencies (all optional)
216
+ - `tweetnacl` — fallback, works everywhere
217
+ - `react-native-quick-crypto` — fastest on RN
218
+ - `expo-crypto` — for Expo projects
219
+
220
+ ---
221
+
222
+ ## Feature 5: Connection Quality Indicator
223
+
224
+ ### Why
225
+ Users and apps need to know connection quality to adapt UI (show signal bars, warn about poor connections, switch transports).
226
+
227
+ ### Design
228
+ - Extend `NetworkMonitor` with real-time quality metrics per peer
229
+ - Quality levels: EXCELLENT / GOOD / FAIR / POOR / DISCONNECTED
230
+ - Based on: RSSI, latency, packet loss, throughput
231
+ - Periodic quality probes (configurable interval)
232
+ - Events when quality changes
233
+
234
+ ### Files
235
+ ```
236
+ src/mesh/monitor/ConnectionQuality.js — Quality calculator
237
+ src/mesh/monitor/QualityProbe.js — Active probing
238
+ __tests__/mesh/monitor/ConnectionQuality.test.js
239
+ __tests__/mesh/monitor/QualityProbe.test.js
240
+ ```
241
+
242
+ ### API
243
+ ```js
244
+ const mesh = new MeshNetwork({ nickname: 'Alice' });
245
+ await mesh.start();
246
+
247
+ // Get quality for a specific peer
248
+ const quality = mesh.getConnectionQuality(peerId);
249
+ // {
250
+ // level: 'good', // excellent|good|fair|poor|disconnected
251
+ // rssi: -65, // Signal strength (dBm)
252
+ // latencyMs: 45, // Round-trip latency
253
+ // packetLoss: 0.02, // 2% loss
254
+ // throughputKbps: 120, // Estimated throughput
255
+ // transport: 'ble', // Which transport is active
256
+ // lastUpdated: 1708123456789,
257
+ // }
258
+
259
+ // Get quality for all peers
260
+ const allQuality = mesh.getAllConnectionQuality();
261
+
262
+ // Listen for quality changes
263
+ mesh.on('connectionQualityChanged', ({ peerId, quality }) => {
264
+ if (quality.level === 'poor') {
265
+ console.warn(`Connection to ${peerId} is degraded`);
266
+ }
267
+ });
268
+
269
+ // Quality thresholds (customizable)
270
+ const mesh = new MeshNetwork({
271
+ qualityConfig: {
272
+ probeIntervalMs: 10000, // Probe every 10s
273
+ rssiThresholds: { excellent: -50, good: -70, fair: -85 },
274
+ latencyThresholds: { excellent: 100, good: 300, fair: 1000 },
275
+ }
276
+ });
277
+ ```
278
+
279
+ ### Quality Calculation
280
+ ```
281
+ score = (rssiScore * 0.3) + (latencyScore * 0.3) + (packetLossScore * 0.25) + (throughputScore * 0.15)
282
+
283
+ EXCELLENT: score >= 0.8
284
+ GOOD: score >= 0.6
285
+ FAIR: score >= 0.4
286
+ POOR: score < 0.4
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Implementation Order
292
+
293
+ | # | Feature | Complexity | Dependencies |
294
+ |---|---------|-----------|--------------|
295
+ | 1 | Connection Quality Indicator | Low | None — extends existing NetworkMonitor |
296
+ | 2 | Native Crypto Integration | Medium | None — pluggable providers |
297
+ | 3 | File/Image Sharing | Medium | Uses fragmentation + optionally crypto |
298
+ | 4 | Expo Support | Low | Config plugin, no runtime deps |
299
+ | 5 | Wi-Fi Direct Transport | High | New transport + MultiTransport aggregator |
300
+
301
+ ---
302
+
303
+ ## Testing Strategy
304
+ - Unit tests for every new module
305
+ - Integration tests for multi-transport scenarios
306
+ - Platform tests (iOS + Android) for each feature
307
+ - Mock providers for crypto/transport to test without native modules
308
+ - Target: maintain 0 test failures