@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,494 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BleManager = void 0;
7
+ exports.getBleManager = getBleManager;
8
+ exports.resetBleManager = resetBleManager;
9
+ var _reactNativeBlePlx = require("react-native-ble-plx");
10
+ var _buffer = require("buffer");
11
+ var _eventemitter = _interopRequireDefault(require("eventemitter3"));
12
+ var _constants = require("./constants");
13
+ var _errors = require("../utils/errors");
14
+ var _logger = require("../utils/logger");
15
+ var _parsers = require("./parsers");
16
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ /**
18
+ * BLE Manager - Abstraction layer over react-native-ble-plx
19
+ */
20
+
21
+ const log = _logger.logger.tag('BleManager');
22
+
23
+ /**
24
+ * Events emitted by BleManager
25
+ */
26
+
27
+ /**
28
+ * BLE Manager class - singleton wrapper around react-native-ble-plx
29
+ */
30
+ class BleManager extends _eventemitter.default {
31
+ stateSubscription = null;
32
+ disconnectSubscriptions = new Map();
33
+ connectedDevices = new Map();
34
+ discoveredDevices = new Map();
35
+ isScanning = false;
36
+ cachedState = _reactNativeBlePlx.State.Unknown;
37
+ constructor() {
38
+ super();
39
+ this.manager = new _reactNativeBlePlx.BleManager();
40
+ this.setupStateListener();
41
+ }
42
+
43
+ /**
44
+ * Set up Bluetooth state change listener
45
+ */
46
+ setupStateListener() {
47
+ this.stateSubscription = this.manager.onStateChange(state => {
48
+ log.debug('Bluetooth state changed', {
49
+ state
50
+ });
51
+ this.cachedState = state;
52
+ this.emit('stateChange', state);
53
+ }, true);
54
+ }
55
+
56
+ /**
57
+ * Get current Bluetooth state
58
+ */
59
+ async getState() {
60
+ const state = await this.manager.state();
61
+ this.cachedState = state;
62
+ return state;
63
+ }
64
+
65
+ /**
66
+ * Get cached Bluetooth state (synchronous)
67
+ */
68
+ getCachedState() {
69
+ return this.cachedState;
70
+ }
71
+
72
+ /**
73
+ * Check if Bluetooth is ready for operations
74
+ */
75
+ async isReady() {
76
+ const state = await this.getState();
77
+ return state === _reactNativeBlePlx.State.PoweredOn;
78
+ }
79
+
80
+ /**
81
+ * Wait for Bluetooth to be ready
82
+ */
83
+ async waitForReady(timeoutMs = 10000) {
84
+ const startTime = Date.now();
85
+ while (Date.now() - startTime < timeoutMs) {
86
+ const state = await this.getState();
87
+ if (state === _reactNativeBlePlx.State.PoweredOn) {
88
+ return;
89
+ }
90
+ if (state === _reactNativeBlePlx.State.Unsupported) {
91
+ throw _errors.BluetoothError.unavailable();
92
+ }
93
+ if (state === _reactNativeBlePlx.State.Unauthorized) {
94
+ throw _errors.BluetoothError.unauthorized();
95
+ }
96
+ if (state === _reactNativeBlePlx.State.PoweredOff) {
97
+ throw _errors.BluetoothError.poweredOff();
98
+ }
99
+
100
+ // Wait a bit before checking again
101
+ await new Promise(resolve => setTimeout(resolve, 100));
102
+ }
103
+ throw new _errors.BluetoothError('Bluetooth did not become ready in time', 'TIMEOUT');
104
+ }
105
+
106
+ /**
107
+ * Start scanning for Bota devices
108
+ */
109
+ async startScan(options = {}) {
110
+ if (this.isScanning) {
111
+ log.warn('Scan already in progress');
112
+ return;
113
+ }
114
+ await this.waitForReady();
115
+ const {
116
+ timeout = _constants.SCAN_TIMEOUT,
117
+ deviceTypes,
118
+ pairingState,
119
+ minRssi,
120
+ allowDuplicates = false
121
+ } = options;
122
+ log.info('Starting BLE scan', {
123
+ timeout,
124
+ deviceTypes,
125
+ pairingState
126
+ });
127
+ this.discoveredDevices.clear();
128
+ this.isScanning = true;
129
+
130
+ // Set up timeout
131
+ const scanTimeout = setTimeout(() => {
132
+ this.stopScan();
133
+ }, timeout);
134
+
135
+ // Start scanning
136
+ this.manager.startDeviceScan(null,
137
+ // Scan all services
138
+ {
139
+ allowDuplicates
140
+ }, (error, device) => {
141
+ if (error) {
142
+ log.error('Scan error', error);
143
+ this.stopScan();
144
+ clearTimeout(scanTimeout);
145
+ return;
146
+ }
147
+ if (!device || !device.name?.startsWith(_constants.DEVICE_NAME_PREFIX)) {
148
+ return;
149
+ }
150
+
151
+ // Parse device information from advertisement
152
+ const discovered = this.parseDiscoveredDevice(device);
153
+ if (!discovered) {
154
+ return;
155
+ }
156
+
157
+ // Apply filters
158
+ if (deviceTypes && !deviceTypes.includes(discovered.deviceType)) {
159
+ return;
160
+ }
161
+ if (pairingState && discovered.pairingState !== pairingState) {
162
+ return;
163
+ }
164
+ if (minRssi !== undefined && discovered.rssi < minRssi) {
165
+ return;
166
+ }
167
+
168
+ // Check for duplicates
169
+ const existingDevice = this.discoveredDevices.get(device.id);
170
+ if (existingDevice && !allowDuplicates) {
171
+ // Update RSSI
172
+ existingDevice.rssi = discovered.rssi;
173
+ return;
174
+ }
175
+
176
+ // Store and emit
177
+ this.discoveredDevices.set(device.id, discovered);
178
+ log.debug('Device discovered', {
179
+ id: discovered.id,
180
+ name: discovered.name,
181
+ type: discovered.deviceType
182
+ });
183
+ this.emit('deviceDiscovered', discovered);
184
+ });
185
+ }
186
+
187
+ /**
188
+ * Stop scanning for devices
189
+ */
190
+ stopScan() {
191
+ if (!this.isScanning) {
192
+ return;
193
+ }
194
+ log.info('Stopping BLE scan');
195
+ this.manager.stopDeviceScan();
196
+ this.isScanning = false;
197
+ }
198
+
199
+ /**
200
+ * Get list of discovered devices
201
+ */
202
+ getDiscoveredDevices() {
203
+ return Array.from(this.discoveredDevices.values());
204
+ }
205
+
206
+ /**
207
+ * Parse a discovered device from BLE advertisement data
208
+ */
209
+ parseDiscoveredDevice(device) {
210
+ if (!device.name) {
211
+ return null;
212
+ }
213
+
214
+ // Parse manufacturer data if available
215
+ let deviceType = 'bota_pin';
216
+ let firmwareVersion = '0.0.0';
217
+ let pairingState = 'unpaired';
218
+ let manufacturerData;
219
+ if (device.manufacturerData) {
220
+ try {
221
+ manufacturerData = _buffer.Buffer.from(device.manufacturerData, 'base64');
222
+ if (manufacturerData.length >= 4) {
223
+ deviceType = (0, _parsers.parseDeviceType)(manufacturerData[0]);
224
+ firmwareVersion = (0, _parsers.parseFirmwareVersion)(manufacturerData[1], manufacturerData[2]);
225
+ pairingState = (0, _parsers.parsePairingState)(manufacturerData[3]);
226
+ }
227
+ } catch (e) {
228
+ log.warn('Failed to parse manufacturer data', {
229
+ deviceId: device.id
230
+ });
231
+ }
232
+ } else {
233
+ // Infer device type from name
234
+ if (device.name.includes('Pin4G')) {
235
+ deviceType = 'bota_pin_4g';
236
+ } else if (device.name.includes('Note')) {
237
+ deviceType = 'bota_note';
238
+ } else if (device.name.includes('Pin')) {
239
+ deviceType = 'bota_pin';
240
+ }
241
+ }
242
+ return {
243
+ id: device.id,
244
+ name: device.name,
245
+ deviceType,
246
+ firmwareVersion,
247
+ pairingState,
248
+ rssi: device.rssi ?? -100,
249
+ manufacturerData,
250
+ discoveredAt: new Date()
251
+ };
252
+ }
253
+
254
+ /**
255
+ * Connect to a device
256
+ */
257
+ async connect(deviceId) {
258
+ log.info('Connecting to device', {
259
+ deviceId
260
+ });
261
+
262
+ // Check if already connected
263
+ if (this.connectedDevices.has(deviceId)) {
264
+ log.debug('Device already connected', {
265
+ deviceId
266
+ });
267
+ return this.connectedDevices.get(deviceId);
268
+ }
269
+ try {
270
+ // Connect with timeout
271
+ const device = await this.manager.connectToDevice(deviceId, {
272
+ timeout: _constants.CONNECTION_TIMEOUT,
273
+ requestMTU: _constants.MAX_MTU
274
+ });
275
+ log.debug('Device connected, discovering services', {
276
+ deviceId
277
+ });
278
+
279
+ // Discover services and characteristics
280
+ await device.discoverAllServicesAndCharacteristics();
281
+
282
+ // Store connected device
283
+ this.connectedDevices.set(deviceId, device);
284
+
285
+ // Set up disconnect listener
286
+ const disconnectSub = device.onDisconnected((error, disconnectedDevice) => {
287
+ log.info('Device disconnected', {
288
+ deviceId: disconnectedDevice.id,
289
+ error: error?.message
290
+ });
291
+ this.connectedDevices.delete(disconnectedDevice.id);
292
+ this.disconnectSubscriptions.get(disconnectedDevice.id)?.remove();
293
+ this.disconnectSubscriptions.delete(disconnectedDevice.id);
294
+ this.emit('deviceDisconnected', disconnectedDevice.id, error ? new Error(error.message) : undefined);
295
+ });
296
+ this.disconnectSubscriptions.set(deviceId, disconnectSub);
297
+ this.emit('deviceConnected', deviceId);
298
+ return device;
299
+ } catch (error) {
300
+ const bleError = error;
301
+ log.error('Connection failed', new Error(bleError.message), {
302
+ deviceId
303
+ });
304
+ throw _errors.DeviceError.connectionFailed(deviceId, new Error(bleError.message));
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Disconnect from a device
310
+ */
311
+ async disconnect(deviceId) {
312
+ log.info('Disconnecting from device', {
313
+ deviceId
314
+ });
315
+ const device = this.connectedDevices.get(deviceId);
316
+ if (!device) {
317
+ log.warn('Device not found in connected devices', {
318
+ deviceId
319
+ });
320
+ return;
321
+ }
322
+ try {
323
+ await device.cancelConnection();
324
+ } catch (error) {
325
+ const bleError = error;
326
+ log.warn('Disconnect error (may be expected)', {
327
+ error: bleError.message
328
+ });
329
+ }
330
+ this.connectedDevices.delete(deviceId);
331
+ this.disconnectSubscriptions.get(deviceId)?.remove();
332
+ this.disconnectSubscriptions.delete(deviceId);
333
+ }
334
+
335
+ /**
336
+ * Check if a device is connected
337
+ */
338
+ isConnected(deviceId) {
339
+ return this.connectedDevices.has(deviceId);
340
+ }
341
+
342
+ /**
343
+ * Get a connected device
344
+ */
345
+ getConnectedDevice(deviceId) {
346
+ return this.connectedDevices.get(deviceId);
347
+ }
348
+
349
+ /**
350
+ * Get negotiated MTU for a device
351
+ */
352
+ async getMtu(deviceId) {
353
+ const device = this.connectedDevices.get(deviceId);
354
+ if (!device) {
355
+ return _constants.DEFAULT_MTU;
356
+ }
357
+ try {
358
+ // mtu is a property, not a method in react-native-ble-plx
359
+ return device.mtu ?? _constants.DEFAULT_MTU;
360
+ } catch {
361
+ return _constants.DEFAULT_MTU;
362
+ }
363
+ }
364
+
365
+ /**
366
+ * Read a characteristic value
367
+ */
368
+ async readCharacteristic(deviceId, serviceUuid, characteristicUuid) {
369
+ const device = this.connectedDevices.get(deviceId);
370
+ if (!device) {
371
+ throw _errors.DeviceError.notConnected(deviceId);
372
+ }
373
+ try {
374
+ const characteristic = await device.readCharacteristicForService(serviceUuid, characteristicUuid);
375
+ if (!characteristic.value) {
376
+ return _buffer.Buffer.alloc(0);
377
+ }
378
+ return _buffer.Buffer.from(characteristic.value, 'base64');
379
+ } catch (error) {
380
+ const bleError = error;
381
+ log.error('Read characteristic failed', new Error(bleError.message), {
382
+ deviceId,
383
+ serviceUuid,
384
+ characteristicUuid
385
+ });
386
+ throw new _errors.DeviceError(`Failed to read characteristic: ${bleError.message}`, 'READ_FAILED', deviceId, new Error(bleError.message));
387
+ }
388
+ }
389
+
390
+ /**
391
+ * Write a characteristic value
392
+ */
393
+ async writeCharacteristic(deviceId, serviceUuid, characteristicUuid, data, withResponse = true) {
394
+ const device = this.connectedDevices.get(deviceId);
395
+ if (!device) {
396
+ throw _errors.DeviceError.notConnected(deviceId);
397
+ }
398
+ const base64Data = data.toString('base64');
399
+ try {
400
+ if (withResponse) {
401
+ await device.writeCharacteristicWithResponseForService(serviceUuid, characteristicUuid, base64Data);
402
+ } else {
403
+ await device.writeCharacteristicWithoutResponseForService(serviceUuid, characteristicUuid, base64Data);
404
+ }
405
+ } catch (error) {
406
+ const bleError = error;
407
+ log.error('Write characteristic failed', new Error(bleError.message), {
408
+ deviceId,
409
+ serviceUuid,
410
+ characteristicUuid
411
+ });
412
+ throw new _errors.DeviceError(`Failed to write characteristic: ${bleError.message}`, 'WRITE_FAILED', deviceId, new Error(bleError.message));
413
+ }
414
+ }
415
+
416
+ /**
417
+ * Subscribe to characteristic notifications
418
+ */
419
+ subscribeToCharacteristic(deviceId, serviceUuid, characteristicUuid, onData, onError) {
420
+ const device = this.connectedDevices.get(deviceId);
421
+ if (!device) {
422
+ throw _errors.DeviceError.notConnected(deviceId);
423
+ }
424
+ return device.monitorCharacteristicForService(serviceUuid, characteristicUuid, (error, characteristic) => {
425
+ if (error) {
426
+ log.error('Notification error', new Error(error.message), {
427
+ deviceId,
428
+ characteristicUuid
429
+ });
430
+ onError?.(new Error(error.message));
431
+ return;
432
+ }
433
+ if (characteristic?.value) {
434
+ const data = _buffer.Buffer.from(characteristic.value, 'base64');
435
+ onData(data);
436
+ }
437
+ });
438
+ }
439
+
440
+ /**
441
+ * Destroy the BLE manager and clean up resources
442
+ */
443
+ destroy() {
444
+ log.info('Destroying BLE manager');
445
+ this.stopScan();
446
+
447
+ // Remove all disconnect subscriptions
448
+ for (const sub of this.disconnectSubscriptions.values()) {
449
+ sub.remove();
450
+ }
451
+ this.disconnectSubscriptions.clear();
452
+
453
+ // Disconnect all devices
454
+ for (const deviceId of this.connectedDevices.keys()) {
455
+ this.disconnect(deviceId).catch(() => {});
456
+ }
457
+ this.connectedDevices.clear();
458
+
459
+ // Remove state subscription
460
+ this.stateSubscription?.remove();
461
+ this.stateSubscription = null;
462
+
463
+ // Destroy the manager
464
+ this.manager.destroy();
465
+ this.removeAllListeners();
466
+ }
467
+ }
468
+
469
+ /**
470
+ * Singleton instance
471
+ */
472
+ exports.BleManager = BleManager;
473
+ let instance = null;
474
+
475
+ /**
476
+ * Get or create the BLE manager singleton
477
+ */
478
+ function getBleManager() {
479
+ if (!instance) {
480
+ instance = new BleManager();
481
+ }
482
+ return instance;
483
+ }
484
+
485
+ /**
486
+ * Reset the BLE manager singleton (for testing)
487
+ */
488
+ function resetBleManager() {
489
+ if (instance) {
490
+ instance.destroy();
491
+ instance = null;
492
+ }
493
+ }
494
+ //# sourceMappingURL=BleManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeBlePlx","require","_buffer","_eventemitter","_interopRequireDefault","_constants","_errors","_logger","_parsers","e","__esModule","default","log","logger","tag","BleManager","EventEmitter","stateSubscription","disconnectSubscriptions","Map","connectedDevices","discoveredDevices","isScanning","cachedState","State","Unknown","constructor","manager","RNBleManager","setupStateListener","onStateChange","state","debug","emit","getState","getCachedState","isReady","PoweredOn","waitForReady","timeoutMs","startTime","Date","now","Unsupported","BluetoothError","unavailable","Unauthorized","unauthorized","PoweredOff","poweredOff","Promise","resolve","setTimeout","startScan","options","warn","timeout","SCAN_TIMEOUT","deviceTypes","pairingState","minRssi","allowDuplicates","info","clear","scanTimeout","stopScan","startDeviceScan","error","device","clearTimeout","name","startsWith","DEVICE_NAME_PREFIX","discovered","parseDiscoveredDevice","includes","deviceType","undefined","rssi","existingDevice","get","id","set","type","stopDeviceScan","getDiscoveredDevices","Array","from","values","firmwareVersion","manufacturerData","Buffer","length","parseDeviceType","parseFirmwareVersion","parsePairingState","deviceId","discoveredAt","connect","has","connectToDevice","CONNECTION_TIMEOUT","requestMTU","MAX_MTU","discoverAllServicesAndCharacteristics","disconnectSub","onDisconnected","disconnectedDevice","message","delete","remove","Error","bleError","DeviceError","connectionFailed","disconnect","cancelConnection","isConnected","getConnectedDevice","getMtu","DEFAULT_MTU","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","exports","instance","getBleManager","resetBleManager"],"sourceRoot":"../../../src","sources":["ble/BleManager.ts"],"mappings":"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","ignoreList":[]}