@bota-dev/react-native-sdk 0.0.2

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 (177) hide show
  1. package/README.md +279 -0
  2. package/lib/commonjs/BotaClient.js +223 -0
  3. package/lib/commonjs/BotaClient.js.map +1 -0
  4. package/lib/commonjs/ble/BleManager.js +494 -0
  5. package/lib/commonjs/ble/BleManager.js.map +1 -0
  6. package/lib/commonjs/ble/constants.js +166 -0
  7. package/lib/commonjs/ble/constants.js.map +1 -0
  8. package/lib/commonjs/ble/index.js +54 -0
  9. package/lib/commonjs/ble/index.js.map +1 -0
  10. package/lib/commonjs/ble/parsers.js +345 -0
  11. package/lib/commonjs/ble/parsers.js.map +1 -0
  12. package/lib/commonjs/index.js +81 -0
  13. package/lib/commonjs/index.js.map +1 -0
  14. package/lib/commonjs/managers/DeviceManager.js +437 -0
  15. package/lib/commonjs/managers/DeviceManager.js.map +1 -0
  16. package/lib/commonjs/managers/OTAManager.js +227 -0
  17. package/lib/commonjs/managers/OTAManager.js.map +1 -0
  18. package/lib/commonjs/managers/RecordingManager.js +384 -0
  19. package/lib/commonjs/managers/RecordingManager.js.map +1 -0
  20. package/lib/commonjs/managers/index.js +27 -0
  21. package/lib/commonjs/managers/index.js.map +1 -0
  22. package/lib/commonjs/models/Device.js +2 -0
  23. package/lib/commonjs/models/Device.js.map +1 -0
  24. package/lib/commonjs/models/Recording.js +2 -0
  25. package/lib/commonjs/models/Recording.js.map +1 -0
  26. package/lib/commonjs/models/Status.js +6 -0
  27. package/lib/commonjs/models/Status.js.map +1 -0
  28. package/lib/commonjs/models/index.js +39 -0
  29. package/lib/commonjs/models/index.js.map +1 -0
  30. package/lib/commonjs/protocol/ProtocolHandler.js +343 -0
  31. package/lib/commonjs/protocol/ProtocolHandler.js.map +1 -0
  32. package/lib/commonjs/protocol/index.js +13 -0
  33. package/lib/commonjs/protocol/index.js.map +1 -0
  34. package/lib/commonjs/storage/StorageManager.js +333 -0
  35. package/lib/commonjs/storage/StorageManager.js.map +1 -0
  36. package/lib/commonjs/storage/index.js +19 -0
  37. package/lib/commonjs/storage/index.js.map +1 -0
  38. package/lib/commonjs/upload/S3Uploader.js +133 -0
  39. package/lib/commonjs/upload/S3Uploader.js.map +1 -0
  40. package/lib/commonjs/upload/UploadQueue.js +280 -0
  41. package/lib/commonjs/upload/UploadQueue.js.map +1 -0
  42. package/lib/commonjs/upload/index.js +20 -0
  43. package/lib/commonjs/upload/index.js.map +1 -0
  44. package/lib/commonjs/utils/errors.js +187 -0
  45. package/lib/commonjs/utils/errors.js.map +1 -0
  46. package/lib/commonjs/utils/index.js +40 -0
  47. package/lib/commonjs/utils/index.js.map +1 -0
  48. package/lib/commonjs/utils/logger.js +135 -0
  49. package/lib/commonjs/utils/logger.js.map +1 -0
  50. package/lib/commonjs/utils/retry.js +160 -0
  51. package/lib/commonjs/utils/retry.js.map +1 -0
  52. package/lib/module/BotaClient.js +216 -0
  53. package/lib/module/BotaClient.js.map +1 -0
  54. package/lib/module/ble/BleManager.js +484 -0
  55. package/lib/module/ble/BleManager.js.map +1 -0
  56. package/lib/module/ble/constants.js +159 -0
  57. package/lib/module/ble/constants.js.map +1 -0
  58. package/lib/module/ble/index.js +8 -0
  59. package/lib/module/ble/index.js.map +1 -0
  60. package/lib/module/ble/parsers.js +328 -0
  61. package/lib/module/ble/parsers.js.map +1 -0
  62. package/lib/module/index.js +22 -0
  63. package/lib/module/index.js.map +1 -0
  64. package/lib/module/managers/DeviceManager.js +429 -0
  65. package/lib/module/managers/DeviceManager.js.map +1 -0
  66. package/lib/module/managers/OTAManager.js +219 -0
  67. package/lib/module/managers/OTAManager.js.map +1 -0
  68. package/lib/module/managers/RecordingManager.js +376 -0
  69. package/lib/module/managers/RecordingManager.js.map +1 -0
  70. package/lib/module/managers/index.js +8 -0
  71. package/lib/module/managers/index.js.map +1 -0
  72. package/lib/module/models/Device.js +2 -0
  73. package/lib/module/models/Device.js.map +1 -0
  74. package/lib/module/models/Recording.js +2 -0
  75. package/lib/module/models/Recording.js.map +1 -0
  76. package/lib/module/models/Status.js +2 -0
  77. package/lib/module/models/Status.js.map +1 -0
  78. package/lib/module/models/index.js +8 -0
  79. package/lib/module/models/index.js.map +1 -0
  80. package/lib/module/protocol/ProtocolHandler.js +336 -0
  81. package/lib/module/protocol/ProtocolHandler.js.map +1 -0
  82. package/lib/module/protocol/index.js +6 -0
  83. package/lib/module/protocol/index.js.map +1 -0
  84. package/lib/module/storage/StorageManager.js +324 -0
  85. package/lib/module/storage/StorageManager.js.map +1 -0
  86. package/lib/module/storage/index.js +6 -0
  87. package/lib/module/storage/index.js.map +1 -0
  88. package/lib/module/upload/S3Uploader.js +126 -0
  89. package/lib/module/upload/S3Uploader.js.map +1 -0
  90. package/lib/module/upload/UploadQueue.js +272 -0
  91. package/lib/module/upload/UploadQueue.js.map +1 -0
  92. package/lib/module/upload/index.js +7 -0
  93. package/lib/module/upload/index.js.map +1 -0
  94. package/lib/module/utils/errors.js +173 -0
  95. package/lib/module/utils/errors.js.map +1 -0
  96. package/lib/module/utils/index.js +8 -0
  97. package/lib/module/utils/index.js.map +1 -0
  98. package/lib/module/utils/logger.js +129 -0
  99. package/lib/module/utils/logger.js.map +1 -0
  100. package/lib/module/utils/retry.js +149 -0
  101. package/lib/module/utils/retry.js.map +1 -0
  102. package/lib/typescript/src/BotaClient.d.ts +77 -0
  103. package/lib/typescript/src/BotaClient.d.ts.map +1 -0
  104. package/lib/typescript/src/ble/BleManager.d.ts +111 -0
  105. package/lib/typescript/src/ble/BleManager.d.ts.map +1 -0
  106. package/lib/typescript/src/ble/constants.d.ts +111 -0
  107. package/lib/typescript/src/ble/constants.d.ts.map +1 -0
  108. package/lib/typescript/src/ble/index.d.ts +7 -0
  109. package/lib/typescript/src/ble/index.d.ts.map +1 -0
  110. package/lib/typescript/src/ble/parsers.d.ts +100 -0
  111. package/lib/typescript/src/ble/parsers.d.ts.map +1 -0
  112. package/lib/typescript/src/index.d.ts +16 -0
  113. package/lib/typescript/src/index.d.ts.map +1 -0
  114. package/lib/typescript/src/managers/DeviceManager.d.ts +84 -0
  115. package/lib/typescript/src/managers/DeviceManager.d.ts.map +1 -0
  116. package/lib/typescript/src/managers/OTAManager.d.ts +78 -0
  117. package/lib/typescript/src/managers/OTAManager.d.ts.map +1 -0
  118. package/lib/typescript/src/managers/RecordingManager.d.ts +90 -0
  119. package/lib/typescript/src/managers/RecordingManager.d.ts.map +1 -0
  120. package/lib/typescript/src/managers/index.d.ts +7 -0
  121. package/lib/typescript/src/managers/index.d.ts.map +1 -0
  122. package/lib/typescript/src/models/Device.d.ts +139 -0
  123. package/lib/typescript/src/models/Device.d.ts.map +1 -0
  124. package/lib/typescript/src/models/Recording.d.ts +110 -0
  125. package/lib/typescript/src/models/Recording.d.ts.map +1 -0
  126. package/lib/typescript/src/models/Status.d.ts +104 -0
  127. package/lib/typescript/src/models/Status.d.ts.map +1 -0
  128. package/lib/typescript/src/models/index.d.ts +7 -0
  129. package/lib/typescript/src/models/index.d.ts.map +1 -0
  130. package/lib/typescript/src/protocol/ProtocolHandler.d.ts +69 -0
  131. package/lib/typescript/src/protocol/ProtocolHandler.d.ts.map +1 -0
  132. package/lib/typescript/src/protocol/index.d.ts +5 -0
  133. package/lib/typescript/src/protocol/index.d.ts.map +1 -0
  134. package/lib/typescript/src/storage/StorageManager.d.ts +116 -0
  135. package/lib/typescript/src/storage/StorageManager.d.ts.map +1 -0
  136. package/lib/typescript/src/storage/index.d.ts +5 -0
  137. package/lib/typescript/src/storage/index.d.ts.map +1 -0
  138. package/lib/typescript/src/upload/S3Uploader.d.ts +38 -0
  139. package/lib/typescript/src/upload/S3Uploader.d.ts.map +1 -0
  140. package/lib/typescript/src/upload/UploadQueue.d.ts +95 -0
  141. package/lib/typescript/src/upload/UploadQueue.d.ts.map +1 -0
  142. package/lib/typescript/src/upload/index.d.ts +6 -0
  143. package/lib/typescript/src/upload/index.d.ts.map +1 -0
  144. package/lib/typescript/src/utils/errors.d.ts +82 -0
  145. package/lib/typescript/src/utils/errors.d.ts.map +1 -0
  146. package/lib/typescript/src/utils/index.d.ts +7 -0
  147. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  148. package/lib/typescript/src/utils/logger.d.ts +68 -0
  149. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  150. package/lib/typescript/src/utils/retry.d.ts +53 -0
  151. package/lib/typescript/src/utils/retry.d.ts.map +1 -0
  152. package/package.json +95 -0
  153. package/src/BotaClient.ts +238 -0
  154. package/src/ble/BleManager.ts +573 -0
  155. package/src/ble/constants.ts +158 -0
  156. package/src/ble/index.ts +7 -0
  157. package/src/ble/parsers.ts +395 -0
  158. package/src/index.ts +64 -0
  159. package/src/managers/DeviceManager.ts +545 -0
  160. package/src/managers/OTAManager.ts +263 -0
  161. package/src/managers/RecordingManager.ts +434 -0
  162. package/src/managers/index.ts +12 -0
  163. package/src/models/Device.ts +164 -0
  164. package/src/models/Recording.ts +123 -0
  165. package/src/models/Status.ts +126 -0
  166. package/src/models/index.ts +7 -0
  167. package/src/protocol/ProtocolHandler.ts +459 -0
  168. package/src/protocol/index.ts +5 -0
  169. package/src/storage/StorageManager.ts +343 -0
  170. package/src/storage/index.ts +5 -0
  171. package/src/upload/S3Uploader.ts +164 -0
  172. package/src/upload/UploadQueue.ts +310 -0
  173. package/src/upload/index.ts +6 -0
  174. package/src/utils/errors.ts +310 -0
  175. package/src/utils/index.ts +7 -0
  176. package/src/utils/logger.ts +137 -0
  177. package/src/utils/retry.ts +177 -0
@@ -0,0 +1,484 @@
1
+ /**
2
+ * BLE Manager - Abstraction layer over react-native-ble-plx
3
+ */
4
+
5
+ import { BleManager as RNBleManager, State } from 'react-native-ble-plx';
6
+ import { Buffer } from 'buffer';
7
+ import EventEmitter from 'eventemitter3';
8
+ import { DEVICE_NAME_PREFIX, DEFAULT_MTU, MAX_MTU, CONNECTION_TIMEOUT, SCAN_TIMEOUT } from './constants';
9
+ import { BluetoothError, DeviceError } from '../utils/errors';
10
+ import { logger } from '../utils/logger';
11
+ import { parseDeviceType, parsePairingState, parseFirmwareVersion } from './parsers';
12
+ const log = logger.tag('BleManager');
13
+
14
+ /**
15
+ * Events emitted by BleManager
16
+ */
17
+
18
+ /**
19
+ * BLE Manager class - singleton wrapper around react-native-ble-plx
20
+ */
21
+ export class BleManager extends EventEmitter {
22
+ stateSubscription = null;
23
+ disconnectSubscriptions = new Map();
24
+ connectedDevices = new Map();
25
+ discoveredDevices = new Map();
26
+ isScanning = false;
27
+ cachedState = State.Unknown;
28
+ constructor() {
29
+ super();
30
+ this.manager = new RNBleManager();
31
+ this.setupStateListener();
32
+ }
33
+
34
+ /**
35
+ * Set up Bluetooth state change listener
36
+ */
37
+ setupStateListener() {
38
+ this.stateSubscription = this.manager.onStateChange(state => {
39
+ log.debug('Bluetooth state changed', {
40
+ state
41
+ });
42
+ this.cachedState = state;
43
+ this.emit('stateChange', state);
44
+ }, true);
45
+ }
46
+
47
+ /**
48
+ * Get current Bluetooth state
49
+ */
50
+ async getState() {
51
+ const state = await this.manager.state();
52
+ this.cachedState = state;
53
+ return state;
54
+ }
55
+
56
+ /**
57
+ * Get cached Bluetooth state (synchronous)
58
+ */
59
+ getCachedState() {
60
+ return this.cachedState;
61
+ }
62
+
63
+ /**
64
+ * Check if Bluetooth is ready for operations
65
+ */
66
+ async isReady() {
67
+ const state = await this.getState();
68
+ return state === State.PoweredOn;
69
+ }
70
+
71
+ /**
72
+ * Wait for Bluetooth to be ready
73
+ */
74
+ async waitForReady(timeoutMs = 10000) {
75
+ const startTime = Date.now();
76
+ while (Date.now() - startTime < timeoutMs) {
77
+ const state = await this.getState();
78
+ if (state === State.PoweredOn) {
79
+ return;
80
+ }
81
+ if (state === State.Unsupported) {
82
+ throw BluetoothError.unavailable();
83
+ }
84
+ if (state === State.Unauthorized) {
85
+ throw BluetoothError.unauthorized();
86
+ }
87
+ if (state === State.PoweredOff) {
88
+ throw BluetoothError.poweredOff();
89
+ }
90
+
91
+ // Wait a bit before checking again
92
+ await new Promise(resolve => setTimeout(resolve, 100));
93
+ }
94
+ throw new BluetoothError('Bluetooth did not become ready in time', 'TIMEOUT');
95
+ }
96
+
97
+ /**
98
+ * Start scanning for Bota devices
99
+ */
100
+ async startScan(options = {}) {
101
+ if (this.isScanning) {
102
+ log.warn('Scan already in progress');
103
+ return;
104
+ }
105
+ await this.waitForReady();
106
+ const {
107
+ timeout = SCAN_TIMEOUT,
108
+ deviceTypes,
109
+ pairingState,
110
+ minRssi,
111
+ allowDuplicates = false
112
+ } = options;
113
+ log.info('Starting BLE scan', {
114
+ timeout,
115
+ deviceTypes,
116
+ pairingState
117
+ });
118
+ this.discoveredDevices.clear();
119
+ this.isScanning = true;
120
+
121
+ // Set up timeout
122
+ const scanTimeout = setTimeout(() => {
123
+ this.stopScan();
124
+ }, timeout);
125
+
126
+ // Start scanning
127
+ this.manager.startDeviceScan(null,
128
+ // Scan all services
129
+ {
130
+ allowDuplicates
131
+ }, (error, device) => {
132
+ if (error) {
133
+ log.error('Scan error', error);
134
+ this.stopScan();
135
+ clearTimeout(scanTimeout);
136
+ return;
137
+ }
138
+ if (!device || !device.name?.startsWith(DEVICE_NAME_PREFIX)) {
139
+ return;
140
+ }
141
+
142
+ // Parse device information from advertisement
143
+ const discovered = this.parseDiscoveredDevice(device);
144
+ if (!discovered) {
145
+ return;
146
+ }
147
+
148
+ // Apply filters
149
+ if (deviceTypes && !deviceTypes.includes(discovered.deviceType)) {
150
+ return;
151
+ }
152
+ if (pairingState && discovered.pairingState !== pairingState) {
153
+ return;
154
+ }
155
+ if (minRssi !== undefined && discovered.rssi < minRssi) {
156
+ return;
157
+ }
158
+
159
+ // Check for duplicates
160
+ const existingDevice = this.discoveredDevices.get(device.id);
161
+ if (existingDevice && !allowDuplicates) {
162
+ // Update RSSI
163
+ existingDevice.rssi = discovered.rssi;
164
+ return;
165
+ }
166
+
167
+ // Store and emit
168
+ this.discoveredDevices.set(device.id, discovered);
169
+ log.debug('Device discovered', {
170
+ id: discovered.id,
171
+ name: discovered.name,
172
+ type: discovered.deviceType
173
+ });
174
+ this.emit('deviceDiscovered', discovered);
175
+ });
176
+ }
177
+
178
+ /**
179
+ * Stop scanning for devices
180
+ */
181
+ stopScan() {
182
+ if (!this.isScanning) {
183
+ return;
184
+ }
185
+ log.info('Stopping BLE scan');
186
+ this.manager.stopDeviceScan();
187
+ this.isScanning = false;
188
+ }
189
+
190
+ /**
191
+ * Get list of discovered devices
192
+ */
193
+ getDiscoveredDevices() {
194
+ return Array.from(this.discoveredDevices.values());
195
+ }
196
+
197
+ /**
198
+ * Parse a discovered device from BLE advertisement data
199
+ */
200
+ parseDiscoveredDevice(device) {
201
+ if (!device.name) {
202
+ return null;
203
+ }
204
+
205
+ // Parse manufacturer data if available
206
+ let deviceType = 'bota_pin';
207
+ let firmwareVersion = '0.0.0';
208
+ let pairingState = 'unpaired';
209
+ let manufacturerData;
210
+ if (device.manufacturerData) {
211
+ try {
212
+ manufacturerData = Buffer.from(device.manufacturerData, 'base64');
213
+ if (manufacturerData.length >= 4) {
214
+ deviceType = parseDeviceType(manufacturerData[0]);
215
+ firmwareVersion = parseFirmwareVersion(manufacturerData[1], manufacturerData[2]);
216
+ pairingState = parsePairingState(manufacturerData[3]);
217
+ }
218
+ } catch (e) {
219
+ log.warn('Failed to parse manufacturer data', {
220
+ deviceId: device.id
221
+ });
222
+ }
223
+ } else {
224
+ // Infer device type from name
225
+ if (device.name.includes('Pin4G')) {
226
+ deviceType = 'bota_pin_4g';
227
+ } else if (device.name.includes('Note')) {
228
+ deviceType = 'bota_note';
229
+ } else if (device.name.includes('Pin')) {
230
+ deviceType = 'bota_pin';
231
+ }
232
+ }
233
+ return {
234
+ id: device.id,
235
+ name: device.name,
236
+ deviceType,
237
+ firmwareVersion,
238
+ pairingState,
239
+ rssi: device.rssi ?? -100,
240
+ manufacturerData,
241
+ discoveredAt: new Date()
242
+ };
243
+ }
244
+
245
+ /**
246
+ * Connect to a device
247
+ */
248
+ async connect(deviceId) {
249
+ log.info('Connecting to device', {
250
+ deviceId
251
+ });
252
+
253
+ // Check if already connected
254
+ if (this.connectedDevices.has(deviceId)) {
255
+ log.debug('Device already connected', {
256
+ deviceId
257
+ });
258
+ return this.connectedDevices.get(deviceId);
259
+ }
260
+ try {
261
+ // Connect with timeout
262
+ const device = await this.manager.connectToDevice(deviceId, {
263
+ timeout: CONNECTION_TIMEOUT,
264
+ requestMTU: MAX_MTU
265
+ });
266
+ log.debug('Device connected, discovering services', {
267
+ deviceId
268
+ });
269
+
270
+ // Discover services and characteristics
271
+ await device.discoverAllServicesAndCharacteristics();
272
+
273
+ // Store connected device
274
+ this.connectedDevices.set(deviceId, device);
275
+
276
+ // Set up disconnect listener
277
+ const disconnectSub = device.onDisconnected((error, disconnectedDevice) => {
278
+ log.info('Device disconnected', {
279
+ deviceId: disconnectedDevice.id,
280
+ error: error?.message
281
+ });
282
+ this.connectedDevices.delete(disconnectedDevice.id);
283
+ this.disconnectSubscriptions.get(disconnectedDevice.id)?.remove();
284
+ this.disconnectSubscriptions.delete(disconnectedDevice.id);
285
+ this.emit('deviceDisconnected', disconnectedDevice.id, error ? new Error(error.message) : undefined);
286
+ });
287
+ this.disconnectSubscriptions.set(deviceId, disconnectSub);
288
+ this.emit('deviceConnected', deviceId);
289
+ return device;
290
+ } catch (error) {
291
+ const bleError = error;
292
+ log.error('Connection failed', new Error(bleError.message), {
293
+ deviceId
294
+ });
295
+ throw DeviceError.connectionFailed(deviceId, new Error(bleError.message));
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Disconnect from a device
301
+ */
302
+ async disconnect(deviceId) {
303
+ log.info('Disconnecting from device', {
304
+ deviceId
305
+ });
306
+ const device = this.connectedDevices.get(deviceId);
307
+ if (!device) {
308
+ log.warn('Device not found in connected devices', {
309
+ deviceId
310
+ });
311
+ return;
312
+ }
313
+ try {
314
+ await device.cancelConnection();
315
+ } catch (error) {
316
+ const bleError = error;
317
+ log.warn('Disconnect error (may be expected)', {
318
+ error: bleError.message
319
+ });
320
+ }
321
+ this.connectedDevices.delete(deviceId);
322
+ this.disconnectSubscriptions.get(deviceId)?.remove();
323
+ this.disconnectSubscriptions.delete(deviceId);
324
+ }
325
+
326
+ /**
327
+ * Check if a device is connected
328
+ */
329
+ isConnected(deviceId) {
330
+ return this.connectedDevices.has(deviceId);
331
+ }
332
+
333
+ /**
334
+ * Get a connected device
335
+ */
336
+ getConnectedDevice(deviceId) {
337
+ return this.connectedDevices.get(deviceId);
338
+ }
339
+
340
+ /**
341
+ * Get negotiated MTU for a device
342
+ */
343
+ async getMtu(deviceId) {
344
+ const device = this.connectedDevices.get(deviceId);
345
+ if (!device) {
346
+ return DEFAULT_MTU;
347
+ }
348
+ try {
349
+ // mtu is a property, not a method in react-native-ble-plx
350
+ return device.mtu ?? DEFAULT_MTU;
351
+ } catch {
352
+ return DEFAULT_MTU;
353
+ }
354
+ }
355
+
356
+ /**
357
+ * Read a characteristic value
358
+ */
359
+ async readCharacteristic(deviceId, serviceUuid, characteristicUuid) {
360
+ const device = this.connectedDevices.get(deviceId);
361
+ if (!device) {
362
+ throw DeviceError.notConnected(deviceId);
363
+ }
364
+ try {
365
+ const characteristic = await device.readCharacteristicForService(serviceUuid, characteristicUuid);
366
+ if (!characteristic.value) {
367
+ return Buffer.alloc(0);
368
+ }
369
+ return Buffer.from(characteristic.value, 'base64');
370
+ } catch (error) {
371
+ const bleError = error;
372
+ log.error('Read characteristic failed', new Error(bleError.message), {
373
+ deviceId,
374
+ serviceUuid,
375
+ characteristicUuid
376
+ });
377
+ throw new DeviceError(`Failed to read characteristic: ${bleError.message}`, 'READ_FAILED', deviceId, new Error(bleError.message));
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Write a characteristic value
383
+ */
384
+ async writeCharacteristic(deviceId, serviceUuid, characteristicUuid, data, withResponse = true) {
385
+ const device = this.connectedDevices.get(deviceId);
386
+ if (!device) {
387
+ throw DeviceError.notConnected(deviceId);
388
+ }
389
+ const base64Data = data.toString('base64');
390
+ try {
391
+ if (withResponse) {
392
+ await device.writeCharacteristicWithResponseForService(serviceUuid, characteristicUuid, base64Data);
393
+ } else {
394
+ await device.writeCharacteristicWithoutResponseForService(serviceUuid, characteristicUuid, base64Data);
395
+ }
396
+ } catch (error) {
397
+ const bleError = error;
398
+ log.error('Write characteristic failed', new Error(bleError.message), {
399
+ deviceId,
400
+ serviceUuid,
401
+ characteristicUuid
402
+ });
403
+ throw new DeviceError(`Failed to write characteristic: ${bleError.message}`, 'WRITE_FAILED', deviceId, new Error(bleError.message));
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Subscribe to characteristic notifications
409
+ */
410
+ subscribeToCharacteristic(deviceId, serviceUuid, characteristicUuid, onData, onError) {
411
+ const device = this.connectedDevices.get(deviceId);
412
+ if (!device) {
413
+ throw DeviceError.notConnected(deviceId);
414
+ }
415
+ return device.monitorCharacteristicForService(serviceUuid, characteristicUuid, (error, characteristic) => {
416
+ if (error) {
417
+ log.error('Notification error', new Error(error.message), {
418
+ deviceId,
419
+ characteristicUuid
420
+ });
421
+ onError?.(new Error(error.message));
422
+ return;
423
+ }
424
+ if (characteristic?.value) {
425
+ const data = Buffer.from(characteristic.value, 'base64');
426
+ onData(data);
427
+ }
428
+ });
429
+ }
430
+
431
+ /**
432
+ * Destroy the BLE manager and clean up resources
433
+ */
434
+ destroy() {
435
+ log.info('Destroying BLE manager');
436
+ this.stopScan();
437
+
438
+ // Remove all disconnect subscriptions
439
+ for (const sub of this.disconnectSubscriptions.values()) {
440
+ sub.remove();
441
+ }
442
+ this.disconnectSubscriptions.clear();
443
+
444
+ // Disconnect all devices
445
+ for (const deviceId of this.connectedDevices.keys()) {
446
+ this.disconnect(deviceId).catch(() => {});
447
+ }
448
+ this.connectedDevices.clear();
449
+
450
+ // Remove state subscription
451
+ this.stateSubscription?.remove();
452
+ this.stateSubscription = null;
453
+
454
+ // Destroy the manager
455
+ this.manager.destroy();
456
+ this.removeAllListeners();
457
+ }
458
+ }
459
+
460
+ /**
461
+ * Singleton instance
462
+ */
463
+ let instance = null;
464
+
465
+ /**
466
+ * Get or create the BLE manager singleton
467
+ */
468
+ export function getBleManager() {
469
+ if (!instance) {
470
+ instance = new BleManager();
471
+ }
472
+ return instance;
473
+ }
474
+
475
+ /**
476
+ * Reset the BLE manager singleton (for testing)
477
+ */
478
+ export function resetBleManager() {
479
+ if (instance) {
480
+ instance.destroy();
481
+ instance = null;
482
+ }
483
+ }
484
+ //# sourceMappingURL=BleManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BleManager","RNBleManager","State","Buffer","EventEmitter","DEVICE_NAME_PREFIX","DEFAULT_MTU","MAX_MTU","CONNECTION_TIMEOUT","SCAN_TIMEOUT","BluetoothError","DeviceError","logger","parseDeviceType","parsePairingState","parseFirmwareVersion","log","tag","stateSubscription","disconnectSubscriptions","Map","connectedDevices","discoveredDevices","isScanning","cachedState","Unknown","constructor","manager","setupStateListener","onStateChange","state","debug","emit","getState","getCachedState","isReady","PoweredOn","waitForReady","timeoutMs","startTime","Date","now","Unsupported","unavailable","Unauthorized","unauthorized","PoweredOff","poweredOff","Promise","resolve","setTimeout","startScan","options","warn","timeout","deviceTypes","pairingState","minRssi","allowDuplicates","info","clear","scanTimeout","stopScan","startDeviceScan","error","device","clearTimeout","name","startsWith","discovered","parseDiscoveredDevice","includes","deviceType","undefined","rssi","existingDevice","get","id","set","type","stopDeviceScan","getDiscoveredDevices","Array","from","values","firmwareVersion","manufacturerData","length","e","deviceId","discoveredAt","connect","has","connectToDevice","requestMTU","discoverAllServicesAndCharacteristics","disconnectSub","onDisconnected","disconnectedDevice","message","delete","remove","Error","bleError","connectionFailed","disconnect","cancelConnection","isConnected","getConnectedDevice","getMtu","mtu","readCharacteristic","serviceUuid","characteristicUuid","notConnected","characteristic","readCharacteristicForService","value","alloc","writeCharacteristic","data","withResponse","base64Data","toString","writeCharacteristicWithResponseForService","writeCharacteristicWithoutResponseForService","subscribeToCharacteristic","onData","onError","monitorCharacteristicForService","destroy","sub","keys","catch","removeAllListeners","instance","getBleManager","resetBleManager"],"sourceRoot":"../../../src","sources":["ble/BleManager.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * BLE Service and Characteristic UUIDs for Bota devices
3
+ * Based on Device-App Protocol specification
4
+ */
5
+
6
+ // Standard Bluetooth SIG Services
7
+ export const SERVICE_DEVICE_INFO = '180A';
8
+ export const SERVICE_BATTERY = '180F';
9
+ export const SERVICE_NORDIC_DFU = 'FE59';
10
+
11
+ // Bota Custom Services
12
+ export const SERVICE_BOTA_AUDIO = 'B07A0001-0000-1000-8000-00805F9B34FB';
13
+ export const SERVICE_BOTA_CONTROL = 'B07A0002-0000-1000-8000-00805F9B34FB';
14
+ export const SERVICE_BOTA_PROVISIONING = 'B07A0003-0000-1000-8000-00805F9B34FB';
15
+ export const SERVICE_BOTA_STORAGE = 'B07A0004-0000-1000-8000-00805F9B34FB';
16
+
17
+ // Device Information Service Characteristics (0x180A)
18
+ export const CHAR_MANUFACTURER_NAME = '2A29';
19
+ export const CHAR_MODEL_NUMBER = '2A24';
20
+ export const CHAR_SERIAL_NUMBER = '2A25';
21
+ export const CHAR_HARDWARE_REVISION = '2A27';
22
+ export const CHAR_FIRMWARE_REVISION = '2A26';
23
+
24
+ // Battery Service Characteristics (0x180F)
25
+ export const CHAR_BATTERY_LEVEL = '2A19';
26
+
27
+ // Bota Audio Service Characteristics (B07A0001)
28
+ export const CHAR_AUDIO_DATA = 'B07A0001-0001-1000-8000-00805F9B34FB';
29
+ export const CHAR_AUDIO_CODEC = 'B07A0001-0002-1000-8000-00805F9B34FB';
30
+ export const CHAR_AUDIO_CONTROL = 'B07A0001-0003-1000-8000-00805F9B34FB';
31
+
32
+ // Bota Control Service Characteristics (B07A0002)
33
+ export const CHAR_DEVICE_STATUS = 'B07A0002-0001-1000-8000-00805F9B34FB';
34
+ export const CHAR_RECORDING_CONTROL = 'B07A0002-0002-1000-8000-00805F9B34FB';
35
+ export const CHAR_RECORDING_STATUS = 'B07A0002-0003-1000-8000-00805F9B34FB';
36
+ export const CHAR_TIME_SYNC = 'B07A0002-0004-1000-8000-00805F9B34FB';
37
+ export const CHAR_DEVICE_COMMAND = 'B07A0002-0005-1000-8000-00805F9B34FB';
38
+
39
+ // Bota Provisioning Service Characteristics (B07A0003)
40
+ export const CHAR_PAIRING_STATE = 'B07A0003-0001-1000-8000-00805F9B34FB';
41
+ export const CHAR_DEVICE_TOKEN = 'B07A0003-0002-1000-8000-00805F9B34FB';
42
+ export const CHAR_API_ENDPOINT = 'B07A0003-0003-1000-8000-00805F9B34FB';
43
+ export const CHAR_WIFI_CONFIG = 'B07A0003-0004-1000-8000-00805F9B34FB';
44
+ export const CHAR_PROVISIONING_RESULT = 'B07A0003-0005-1000-8000-00805F9B34FB';
45
+
46
+ // Bota Storage Service Characteristics (B07A0004)
47
+ export const CHAR_STORAGE_INFO = 'B07A0004-0001-1000-8000-00805F9B34FB';
48
+ export const CHAR_RECORDING_LIST = 'B07A0004-0002-1000-8000-00805F9B34FB';
49
+ export const CHAR_RECORDING_TRANSFER = 'B07A0004-0003-1000-8000-00805F9B34FB';
50
+ export const CHAR_TRANSFER_CONTROL = 'B07A0004-0004-1000-8000-00805F9B34FB';
51
+ export const CHAR_TRANSFER_STATUS = 'B07A0004-0005-1000-8000-00805F9B34FB';
52
+
53
+ // Device name prefixes for scanning
54
+ export const DEVICE_NAME_PREFIX = 'Bota-';
55
+ export const DEVICE_NAME_PREFIX_PIN = 'Bota-Pin-';
56
+ export const DEVICE_NAME_PREFIX_PIN_4G = 'Bota-Pin4G-';
57
+ export const DEVICE_NAME_PREFIX_NOTE = 'Bota-Note-';
58
+
59
+ // Manufacturer data byte positions
60
+ export const MFG_DATA_DEVICE_TYPE = 0;
61
+ export const MFG_DATA_FW_MAJOR = 1;
62
+ export const MFG_DATA_FW_MINOR = 2;
63
+ export const MFG_DATA_PAIRING_STATE = 3;
64
+ export const MFG_DATA_BATTERY = 4;
65
+
66
+ // Device type values in manufacturer data
67
+ export const DEVICE_TYPE_PIN = 0x01;
68
+ export const DEVICE_TYPE_PIN_4G = 0x02;
69
+ export const DEVICE_TYPE_NOTE = 0x03;
70
+
71
+ // Pairing state values
72
+ export const PAIRING_STATE_UNPAIRED = 0x00;
73
+ export const PAIRING_STATE_PAIRING = 0x01;
74
+ export const PAIRING_STATE_PAIRED = 0x02;
75
+ export const PAIRING_STATE_ERROR = 0x03;
76
+
77
+ // Provisioning result codes
78
+ export const PROVISIONING_SUCCESS = 0x00;
79
+ export const PROVISIONING_INVALID_TOKEN = 0x01;
80
+ export const PROVISIONING_STORAGE_ERROR = 0x02;
81
+ export const PROVISIONING_CHUNK_ERROR = 0x03;
82
+
83
+ // API endpoint values
84
+ export const API_ENDPOINT_PRODUCTION = 0x00;
85
+ export const API_ENDPOINT_SANDBOX = 0x01;
86
+
87
+ // Transfer control commands
88
+ export const TRANSFER_CMD_LIST = 0x01;
89
+ export const TRANSFER_CMD_START = 0x02;
90
+ export const TRANSFER_CMD_CONFIRM_SYNC = 0x07;
91
+
92
+ // Transfer packet types (Device → App)
93
+ export const PACKET_TYPE_DATA = 0x01;
94
+ export const PACKET_TYPE_EOF = 0x02;
95
+ export const PACKET_TYPE_ERROR = 0xff;
96
+
97
+ // ACK types (App → Device)
98
+ export const ACK_TYPE_ACK = 0x10;
99
+ export const ACK_TYPE_NACK = 0x11;
100
+ export const ACK_TYPE_ABORT = 0x12;
101
+
102
+ // Device command values
103
+ export const DEVICE_CMD_ENTER_DFU = 0x03;
104
+
105
+ // Device state values (from status)
106
+ export const DEVICE_STATE_IDLE = 0x00;
107
+ export const DEVICE_STATE_RECORDING = 0x01;
108
+ export const DEVICE_STATE_SYNCING = 0x02;
109
+ export const DEVICE_STATE_UPLOADING = 0x03;
110
+ export const DEVICE_STATE_CHARGING = 0x04;
111
+ export const DEVICE_STATE_LOW_BATTERY = 0x05;
112
+ export const DEVICE_STATE_STORAGE_FULL = 0x06;
113
+ export const DEVICE_STATE_ERROR = 0xff;
114
+
115
+ // Device status flags (bitmask)
116
+ export const FLAG_CHARGING = 1 << 0;
117
+ export const FLAG_USB_CONNECTED = 1 << 1;
118
+ export const FLAG_LOW_BATTERY = 1 << 2;
119
+ export const FLAG_CRITICAL_BATTERY = 1 << 3;
120
+ export const FLAG_STORAGE_WARNING = 1 << 4;
121
+ export const FLAG_STORAGE_FULL = 1 << 5;
122
+ export const FLAG_CELLULAR_AVAILABLE = 1 << 6;
123
+ export const FLAG_CELLULAR_ROAMING = 1 << 7;
124
+ export const FLAG_WIFI_CONNECTED = 1 << 8;
125
+ export const FLAG_RECORDING_ACTIVE = 1 << 9;
126
+ export const FLAG_SYNC_REQUIRED = 1 << 10;
127
+ export const FLAG_UPDATE_AVAILABLE = 1 << 11;
128
+
129
+ // Audio codec values
130
+ export const CODEC_PCM_16K = 0x00;
131
+ export const CODEC_PCM_8K = 0x01;
132
+ export const CODEC_OPUS_16K = 0x10;
133
+ export const CODEC_OPUS_8K = 0x11;
134
+
135
+ // BLE error codes
136
+ export const BLE_ERROR_SUCCESS = 0x00;
137
+ export const BLE_ERROR_INVALID_COMMAND = 0x01;
138
+ export const BLE_ERROR_INVALID_STATE = 0x02;
139
+ export const BLE_ERROR_INVALID_PARAMETER = 0x03;
140
+ export const BLE_ERROR_STORAGE_FULL = 0x10;
141
+ export const BLE_ERROR_RECORDING_NOT_FOUND = 0x11;
142
+ export const BLE_ERROR_TRANSFER_FAILED = 0x12;
143
+ export const BLE_ERROR_TOKEN_INVALID = 0x20;
144
+ export const BLE_ERROR_TOKEN_EXPIRED = 0x21;
145
+ export const BLE_ERROR_NETWORK_ERROR = 0x30;
146
+ export const BLE_ERROR_UPLOAD_FAILED = 0x31;
147
+ export const BLE_ERROR_UNKNOWN = 0xff;
148
+
149
+ // Timeouts (ms)
150
+ export const SCAN_TIMEOUT = 30000;
151
+ export const CONNECTION_TIMEOUT = 30000;
152
+ export const OPERATION_TIMEOUT = 10000;
153
+ export const TRANSFER_PACKET_TIMEOUT = 2000;
154
+
155
+ // Transfer settings
156
+ export const TRANSFER_WINDOW_SIZE = 4;
157
+ export const DEFAULT_MTU = 23;
158
+ export const MAX_MTU = 512;
159
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SERVICE_DEVICE_INFO","SERVICE_BATTERY","SERVICE_NORDIC_DFU","SERVICE_BOTA_AUDIO","SERVICE_BOTA_CONTROL","SERVICE_BOTA_PROVISIONING","SERVICE_BOTA_STORAGE","CHAR_MANUFACTURER_NAME","CHAR_MODEL_NUMBER","CHAR_SERIAL_NUMBER","CHAR_HARDWARE_REVISION","CHAR_FIRMWARE_REVISION","CHAR_BATTERY_LEVEL","CHAR_AUDIO_DATA","CHAR_AUDIO_CODEC","CHAR_AUDIO_CONTROL","CHAR_DEVICE_STATUS","CHAR_RECORDING_CONTROL","CHAR_RECORDING_STATUS","CHAR_TIME_SYNC","CHAR_DEVICE_COMMAND","CHAR_PAIRING_STATE","CHAR_DEVICE_TOKEN","CHAR_API_ENDPOINT","CHAR_WIFI_CONFIG","CHAR_PROVISIONING_RESULT","CHAR_STORAGE_INFO","CHAR_RECORDING_LIST","CHAR_RECORDING_TRANSFER","CHAR_TRANSFER_CONTROL","CHAR_TRANSFER_STATUS","DEVICE_NAME_PREFIX","DEVICE_NAME_PREFIX_PIN","DEVICE_NAME_PREFIX_PIN_4G","DEVICE_NAME_PREFIX_NOTE","MFG_DATA_DEVICE_TYPE","MFG_DATA_FW_MAJOR","MFG_DATA_FW_MINOR","MFG_DATA_PAIRING_STATE","MFG_DATA_BATTERY","DEVICE_TYPE_PIN","DEVICE_TYPE_PIN_4G","DEVICE_TYPE_NOTE","PAIRING_STATE_UNPAIRED","PAIRING_STATE_PAIRING","PAIRING_STATE_PAIRED","PAIRING_STATE_ERROR","PROVISIONING_SUCCESS","PROVISIONING_INVALID_TOKEN","PROVISIONING_STORAGE_ERROR","PROVISIONING_CHUNK_ERROR","API_ENDPOINT_PRODUCTION","API_ENDPOINT_SANDBOX","TRANSFER_CMD_LIST","TRANSFER_CMD_START","TRANSFER_CMD_CONFIRM_SYNC","PACKET_TYPE_DATA","PACKET_TYPE_EOF","PACKET_TYPE_ERROR","ACK_TYPE_ACK","ACK_TYPE_NACK","ACK_TYPE_ABORT","DEVICE_CMD_ENTER_DFU","DEVICE_STATE_IDLE","DEVICE_STATE_RECORDING","DEVICE_STATE_SYNCING","DEVICE_STATE_UPLOADING","DEVICE_STATE_CHARGING","DEVICE_STATE_LOW_BATTERY","DEVICE_STATE_STORAGE_FULL","DEVICE_STATE_ERROR","FLAG_CHARGING","FLAG_USB_CONNECTED","FLAG_LOW_BATTERY","FLAG_CRITICAL_BATTERY","FLAG_STORAGE_WARNING","FLAG_STORAGE_FULL","FLAG_CELLULAR_AVAILABLE","FLAG_CELLULAR_ROAMING","FLAG_WIFI_CONNECTED","FLAG_RECORDING_ACTIVE","FLAG_SYNC_REQUIRED","FLAG_UPDATE_AVAILABLE","CODEC_PCM_16K","CODEC_PCM_8K","CODEC_OPUS_16K","CODEC_OPUS_8K","BLE_ERROR_SUCCESS","BLE_ERROR_INVALID_COMMAND","BLE_ERROR_INVALID_STATE","BLE_ERROR_INVALID_PARAMETER","BLE_ERROR_STORAGE_FULL","BLE_ERROR_RECORDING_NOT_FOUND","BLE_ERROR_TRANSFER_FAILED","BLE_ERROR_TOKEN_INVALID","BLE_ERROR_TOKEN_EXPIRED","BLE_ERROR_NETWORK_ERROR","BLE_ERROR_UPLOAD_FAILED","BLE_ERROR_UNKNOWN","SCAN_TIMEOUT","CONNECTION_TIMEOUT","OPERATION_TIMEOUT","TRANSFER_PACKET_TIMEOUT","TRANSFER_WINDOW_SIZE","DEFAULT_MTU","MAX_MTU"],"sourceRoot":"../../../src","sources":["ble/constants.ts"],"mappings":"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","ignoreList":[]}