@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.
- package/README.md +279 -0
- package/lib/commonjs/BotaClient.js +223 -0
- package/lib/commonjs/BotaClient.js.map +1 -0
- package/lib/commonjs/ble/BleManager.js +494 -0
- package/lib/commonjs/ble/BleManager.js.map +1 -0
- package/lib/commonjs/ble/constants.js +166 -0
- package/lib/commonjs/ble/constants.js.map +1 -0
- package/lib/commonjs/ble/index.js +54 -0
- package/lib/commonjs/ble/index.js.map +1 -0
- package/lib/commonjs/ble/parsers.js +345 -0
- package/lib/commonjs/ble/parsers.js.map +1 -0
- package/lib/commonjs/index.js +81 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/managers/DeviceManager.js +437 -0
- package/lib/commonjs/managers/DeviceManager.js.map +1 -0
- package/lib/commonjs/managers/OTAManager.js +227 -0
- package/lib/commonjs/managers/OTAManager.js.map +1 -0
- package/lib/commonjs/managers/RecordingManager.js +384 -0
- package/lib/commonjs/managers/RecordingManager.js.map +1 -0
- package/lib/commonjs/managers/index.js +27 -0
- package/lib/commonjs/managers/index.js.map +1 -0
- package/lib/commonjs/models/Device.js +2 -0
- package/lib/commonjs/models/Device.js.map +1 -0
- package/lib/commonjs/models/Recording.js +2 -0
- package/lib/commonjs/models/Recording.js.map +1 -0
- package/lib/commonjs/models/Status.js +6 -0
- package/lib/commonjs/models/Status.js.map +1 -0
- package/lib/commonjs/models/index.js +39 -0
- package/lib/commonjs/models/index.js.map +1 -0
- package/lib/commonjs/protocol/ProtocolHandler.js +343 -0
- package/lib/commonjs/protocol/ProtocolHandler.js.map +1 -0
- package/lib/commonjs/protocol/index.js +13 -0
- package/lib/commonjs/protocol/index.js.map +1 -0
- package/lib/commonjs/storage/StorageManager.js +333 -0
- package/lib/commonjs/storage/StorageManager.js.map +1 -0
- package/lib/commonjs/storage/index.js +19 -0
- package/lib/commonjs/storage/index.js.map +1 -0
- package/lib/commonjs/upload/S3Uploader.js +133 -0
- package/lib/commonjs/upload/S3Uploader.js.map +1 -0
- package/lib/commonjs/upload/UploadQueue.js +280 -0
- package/lib/commonjs/upload/UploadQueue.js.map +1 -0
- package/lib/commonjs/upload/index.js +20 -0
- package/lib/commonjs/upload/index.js.map +1 -0
- package/lib/commonjs/utils/errors.js +187 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/index.js +40 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/logger.js +135 -0
- package/lib/commonjs/utils/logger.js.map +1 -0
- package/lib/commonjs/utils/retry.js +160 -0
- package/lib/commonjs/utils/retry.js.map +1 -0
- package/lib/module/BotaClient.js +216 -0
- package/lib/module/BotaClient.js.map +1 -0
- package/lib/module/ble/BleManager.js +484 -0
- package/lib/module/ble/BleManager.js.map +1 -0
- package/lib/module/ble/constants.js +159 -0
- package/lib/module/ble/constants.js.map +1 -0
- package/lib/module/ble/index.js +8 -0
- package/lib/module/ble/index.js.map +1 -0
- package/lib/module/ble/parsers.js +328 -0
- package/lib/module/ble/parsers.js.map +1 -0
- package/lib/module/index.js +22 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/managers/DeviceManager.js +429 -0
- package/lib/module/managers/DeviceManager.js.map +1 -0
- package/lib/module/managers/OTAManager.js +219 -0
- package/lib/module/managers/OTAManager.js.map +1 -0
- package/lib/module/managers/RecordingManager.js +376 -0
- package/lib/module/managers/RecordingManager.js.map +1 -0
- package/lib/module/managers/index.js +8 -0
- package/lib/module/managers/index.js.map +1 -0
- package/lib/module/models/Device.js +2 -0
- package/lib/module/models/Device.js.map +1 -0
- package/lib/module/models/Recording.js +2 -0
- package/lib/module/models/Recording.js.map +1 -0
- package/lib/module/models/Status.js +2 -0
- package/lib/module/models/Status.js.map +1 -0
- package/lib/module/models/index.js +8 -0
- package/lib/module/models/index.js.map +1 -0
- package/lib/module/protocol/ProtocolHandler.js +336 -0
- package/lib/module/protocol/ProtocolHandler.js.map +1 -0
- package/lib/module/protocol/index.js +6 -0
- package/lib/module/protocol/index.js.map +1 -0
- package/lib/module/storage/StorageManager.js +324 -0
- package/lib/module/storage/StorageManager.js.map +1 -0
- package/lib/module/storage/index.js +6 -0
- package/lib/module/storage/index.js.map +1 -0
- package/lib/module/upload/S3Uploader.js +126 -0
- package/lib/module/upload/S3Uploader.js.map +1 -0
- package/lib/module/upload/UploadQueue.js +272 -0
- package/lib/module/upload/UploadQueue.js.map +1 -0
- package/lib/module/upload/index.js +7 -0
- package/lib/module/upload/index.js.map +1 -0
- package/lib/module/utils/errors.js +173 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/index.js +8 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/logger.js +129 -0
- package/lib/module/utils/logger.js.map +1 -0
- package/lib/module/utils/retry.js +149 -0
- package/lib/module/utils/retry.js.map +1 -0
- package/lib/typescript/src/BotaClient.d.ts +77 -0
- package/lib/typescript/src/BotaClient.d.ts.map +1 -0
- package/lib/typescript/src/ble/BleManager.d.ts +111 -0
- package/lib/typescript/src/ble/BleManager.d.ts.map +1 -0
- package/lib/typescript/src/ble/constants.d.ts +111 -0
- package/lib/typescript/src/ble/constants.d.ts.map +1 -0
- package/lib/typescript/src/ble/index.d.ts +7 -0
- package/lib/typescript/src/ble/index.d.ts.map +1 -0
- package/lib/typescript/src/ble/parsers.d.ts +100 -0
- package/lib/typescript/src/ble/parsers.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/managers/DeviceManager.d.ts +84 -0
- package/lib/typescript/src/managers/DeviceManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/OTAManager.d.ts +78 -0
- package/lib/typescript/src/managers/OTAManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/RecordingManager.d.ts +90 -0
- package/lib/typescript/src/managers/RecordingManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/index.d.ts +7 -0
- package/lib/typescript/src/managers/index.d.ts.map +1 -0
- package/lib/typescript/src/models/Device.d.ts +139 -0
- package/lib/typescript/src/models/Device.d.ts.map +1 -0
- package/lib/typescript/src/models/Recording.d.ts +110 -0
- package/lib/typescript/src/models/Recording.d.ts.map +1 -0
- package/lib/typescript/src/models/Status.d.ts +104 -0
- package/lib/typescript/src/models/Status.d.ts.map +1 -0
- package/lib/typescript/src/models/index.d.ts +7 -0
- package/lib/typescript/src/models/index.d.ts.map +1 -0
- package/lib/typescript/src/protocol/ProtocolHandler.d.ts +69 -0
- package/lib/typescript/src/protocol/ProtocolHandler.d.ts.map +1 -0
- package/lib/typescript/src/protocol/index.d.ts +5 -0
- package/lib/typescript/src/protocol/index.d.ts.map +1 -0
- package/lib/typescript/src/storage/StorageManager.d.ts +116 -0
- package/lib/typescript/src/storage/StorageManager.d.ts.map +1 -0
- package/lib/typescript/src/storage/index.d.ts +5 -0
- package/lib/typescript/src/storage/index.d.ts.map +1 -0
- package/lib/typescript/src/upload/S3Uploader.d.ts +38 -0
- package/lib/typescript/src/upload/S3Uploader.d.ts.map +1 -0
- package/lib/typescript/src/upload/UploadQueue.d.ts +95 -0
- package/lib/typescript/src/upload/UploadQueue.d.ts.map +1 -0
- package/lib/typescript/src/upload/index.d.ts +6 -0
- package/lib/typescript/src/upload/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/errors.d.ts +82 -0
- package/lib/typescript/src/utils/errors.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +7 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/logger.d.ts +68 -0
- package/lib/typescript/src/utils/logger.d.ts.map +1 -0
- package/lib/typescript/src/utils/retry.d.ts +53 -0
- package/lib/typescript/src/utils/retry.d.ts.map +1 -0
- package/package.json +95 -0
- package/src/BotaClient.ts +238 -0
- package/src/ble/BleManager.ts +573 -0
- package/src/ble/constants.ts +158 -0
- package/src/ble/index.ts +7 -0
- package/src/ble/parsers.ts +395 -0
- package/src/index.ts +64 -0
- package/src/managers/DeviceManager.ts +545 -0
- package/src/managers/OTAManager.ts +263 -0
- package/src/managers/RecordingManager.ts +434 -0
- package/src/managers/index.ts +12 -0
- package/src/models/Device.ts +164 -0
- package/src/models/Recording.ts +123 -0
- package/src/models/Status.ts +126 -0
- package/src/models/index.ts +7 -0
- package/src/protocol/ProtocolHandler.ts +459 -0
- package/src/protocol/index.ts +5 -0
- package/src/storage/StorageManager.ts +343 -0
- package/src/storage/index.ts +5 -0
- package/src/upload/S3Uploader.ts +164 -0
- package/src/upload/UploadQueue.ts +310 -0
- package/src/upload/index.ts +6 -0
- package/src/utils/errors.ts +310 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +137 -0
- package/src/utils/retry.ts +177 -0
package/README.md
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# @bota/react-native-sdk
|
|
2
|
+
|
|
3
|
+
Official React Native SDK for Bota wearable devices.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @bota/react-native-sdk react-native-ble-plx
|
|
9
|
+
# or
|
|
10
|
+
yarn add @bota/react-native-sdk react-native-ble-plx
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### iOS Setup
|
|
14
|
+
|
|
15
|
+
1. Add Bluetooth permissions to `ios/YourApp/Info.plist`:
|
|
16
|
+
|
|
17
|
+
```xml
|
|
18
|
+
<key>NSBluetoothAlwaysUsageDescription</key>
|
|
19
|
+
<string>This app uses Bluetooth to connect to Bota recording devices</string>
|
|
20
|
+
<key>UIBackgroundModes</key>
|
|
21
|
+
<array>
|
|
22
|
+
<string>bluetooth-central</string>
|
|
23
|
+
</array>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. Install pods:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
cd ios && pod install
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Android Setup
|
|
33
|
+
|
|
34
|
+
1. Add permissions to `android/app/src/main/AndroidManifest.xml`:
|
|
35
|
+
|
|
36
|
+
```xml
|
|
37
|
+
<uses-permission android:name="android.permission.BLUETOOTH" />
|
|
38
|
+
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
|
39
|
+
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
|
40
|
+
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
|
41
|
+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Quick Start
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { BotaClient } from '@bota/react-native-sdk';
|
|
48
|
+
|
|
49
|
+
// Initialize SDK
|
|
50
|
+
await BotaClient.configure({
|
|
51
|
+
environment: 'production',
|
|
52
|
+
logLevel: 'info',
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Wait for Bluetooth
|
|
56
|
+
await BotaClient.waitForBluetooth();
|
|
57
|
+
|
|
58
|
+
// Scan for devices
|
|
59
|
+
BotaClient.devices.on('deviceDiscovered', (device) => {
|
|
60
|
+
console.log('Found device:', device.name);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
BotaClient.devices.startScan();
|
|
64
|
+
|
|
65
|
+
// Connect to a device
|
|
66
|
+
const connectedDevice = await BotaClient.devices.connect(discoveredDevice);
|
|
67
|
+
|
|
68
|
+
// Provision with token from your backend
|
|
69
|
+
await BotaClient.devices.provision(connectedDevice, deviceToken, 'production');
|
|
70
|
+
|
|
71
|
+
// List recordings
|
|
72
|
+
const recordings = await BotaClient.recordings.listRecordings(connectedDevice);
|
|
73
|
+
|
|
74
|
+
// Sync a recording
|
|
75
|
+
for await (const progress of BotaClient.recordings.syncRecording(
|
|
76
|
+
connectedDevice,
|
|
77
|
+
recording,
|
|
78
|
+
uploadInfo // from your backend
|
|
79
|
+
)) {
|
|
80
|
+
console.log(`${progress.stage}: ${progress.progress * 100}%`);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## API Reference
|
|
85
|
+
|
|
86
|
+
### BotaClient
|
|
87
|
+
|
|
88
|
+
Main entry point for the SDK.
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Configure SDK
|
|
92
|
+
await BotaClient.configure({
|
|
93
|
+
environment: 'production' | 'sandbox',
|
|
94
|
+
backgroundSyncEnabled: boolean,
|
|
95
|
+
wifiOnlyUpload: boolean,
|
|
96
|
+
logLevel: 'debug' | 'info' | 'warn' | 'error' | 'none',
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Access managers
|
|
100
|
+
BotaClient.devices // DeviceManager
|
|
101
|
+
BotaClient.recordings // RecordingManager
|
|
102
|
+
BotaClient.ota // OTAManager
|
|
103
|
+
|
|
104
|
+
// State
|
|
105
|
+
BotaClient.state // 'uninitialized' | 'initializing' | 'ready' | 'error'
|
|
106
|
+
BotaClient.bluetoothState // 'unknown' | 'poweredOn' | 'poweredOff' | ...
|
|
107
|
+
BotaClient.isBluetoothReady
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### DeviceManager
|
|
111
|
+
|
|
112
|
+
Handles device discovery, connection, and provisioning.
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// Scanning
|
|
116
|
+
BotaClient.devices.startScan({ timeout: 30000, deviceTypes: ['bota_pin'] });
|
|
117
|
+
BotaClient.devices.stopScan();
|
|
118
|
+
BotaClient.devices.getDiscoveredDevices();
|
|
119
|
+
|
|
120
|
+
// Connection
|
|
121
|
+
const device = await BotaClient.devices.connect(discoveredDevice);
|
|
122
|
+
await BotaClient.devices.disconnect(device);
|
|
123
|
+
BotaClient.devices.isConnected(deviceId);
|
|
124
|
+
|
|
125
|
+
// Provisioning
|
|
126
|
+
await BotaClient.devices.provision(device, token, 'production');
|
|
127
|
+
await BotaClient.devices.isProvisioned(device);
|
|
128
|
+
|
|
129
|
+
// Status
|
|
130
|
+
const status = await BotaClient.devices.getStatus(device);
|
|
131
|
+
const unsubscribe = BotaClient.devices.subscribeToStatus(device, (status) => {});
|
|
132
|
+
|
|
133
|
+
// Events
|
|
134
|
+
BotaClient.devices.on('deviceDiscovered', (device) => {});
|
|
135
|
+
BotaClient.devices.on('deviceConnected', (device) => {});
|
|
136
|
+
BotaClient.devices.on('deviceDisconnected', (deviceId, error) => {});
|
|
137
|
+
BotaClient.devices.on('deviceStatusUpdated', (deviceId, status) => {});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### RecordingManager
|
|
141
|
+
|
|
142
|
+
Handles recording transfer and upload.
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
// List recordings on device
|
|
146
|
+
const recordings = await BotaClient.recordings.listRecordings(device);
|
|
147
|
+
|
|
148
|
+
// Sync a recording (transfer + upload)
|
|
149
|
+
for await (const progress of BotaClient.recordings.syncRecording(
|
|
150
|
+
device,
|
|
151
|
+
recording,
|
|
152
|
+
uploadInfo
|
|
153
|
+
)) {
|
|
154
|
+
// progress.stage: 'preparing' | 'transferring' | 'uploading' | 'completing' | 'completed' | 'failed'
|
|
155
|
+
// progress.progress: 0.0 - 1.0
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Sync all recordings
|
|
159
|
+
for await (const progress of BotaClient.recordings.syncAllRecordings(
|
|
160
|
+
device,
|
|
161
|
+
async (recording) => {
|
|
162
|
+
// Get upload info from your backend
|
|
163
|
+
return await yourBackend.getUploadInfo(device.serialNumber, recording);
|
|
164
|
+
}
|
|
165
|
+
)) {
|
|
166
|
+
console.log(`Recording ${progress.recordingIndex}/${progress.totalRecordings}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Upload queue management
|
|
170
|
+
BotaClient.recordings.getPendingUploads();
|
|
171
|
+
BotaClient.recordings.cancelUpload(taskId);
|
|
172
|
+
BotaClient.recordings.retryFailedUploads();
|
|
173
|
+
BotaClient.recordings.pauseUploads();
|
|
174
|
+
BotaClient.recordings.resumeUploads();
|
|
175
|
+
|
|
176
|
+
// Events
|
|
177
|
+
BotaClient.recordings.on('syncStarted', (uuid) => {});
|
|
178
|
+
BotaClient.recordings.on('syncCompleted', (uuid, recordingId) => {});
|
|
179
|
+
BotaClient.recordings.on('syncFailed', (uuid, error) => {});
|
|
180
|
+
BotaClient.recordings.on('uploadProgress', (taskId, progress) => {});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Types
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
interface DiscoveredDevice {
|
|
187
|
+
id: string;
|
|
188
|
+
name: string;
|
|
189
|
+
deviceType: 'bota_pin' | 'bota_pin_4g' | 'bota_note';
|
|
190
|
+
firmwareVersion: string;
|
|
191
|
+
pairingState: 'unpaired' | 'pairing' | 'paired' | 'error';
|
|
192
|
+
rssi: number;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
interface ConnectedDevice {
|
|
196
|
+
id: string;
|
|
197
|
+
serialNumber: string;
|
|
198
|
+
deviceType: DeviceType;
|
|
199
|
+
firmwareVersion: string;
|
|
200
|
+
isProvisioned: boolean;
|
|
201
|
+
connectionState: ConnectionState;
|
|
202
|
+
mtu: number;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
interface DeviceStatus {
|
|
206
|
+
batteryLevel: number;
|
|
207
|
+
storageUsedPercent: number;
|
|
208
|
+
state: DeviceState;
|
|
209
|
+
pendingRecordings: number;
|
|
210
|
+
lastSyncAt: Date | null;
|
|
211
|
+
flags: DeviceFlags;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
interface DeviceRecording {
|
|
215
|
+
uuid: string;
|
|
216
|
+
startedAt: Date;
|
|
217
|
+
durationMs: number;
|
|
218
|
+
fileSizeBytes: number;
|
|
219
|
+
codec: AudioCodec;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
interface UploadInfo {
|
|
223
|
+
uploadUrl: string; // Pre-signed S3 URL
|
|
224
|
+
uploadToken: string; // Upload token (up_*)
|
|
225
|
+
recordingId: string; // Recording ID (rec_*)
|
|
226
|
+
completeUrl: string; // URL to call when complete
|
|
227
|
+
expiresAt: Date;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
interface SyncProgress {
|
|
231
|
+
stage: SyncStage;
|
|
232
|
+
progress: number;
|
|
233
|
+
bytesTransferred?: number;
|
|
234
|
+
bytesUploaded?: number;
|
|
235
|
+
totalBytes?: number;
|
|
236
|
+
recordingId?: string;
|
|
237
|
+
error?: string;
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Error Handling
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
import {
|
|
245
|
+
BotaError,
|
|
246
|
+
BluetoothError,
|
|
247
|
+
DeviceError,
|
|
248
|
+
ProvisioningError,
|
|
249
|
+
TransferError,
|
|
250
|
+
UploadError,
|
|
251
|
+
} from '@bota/react-native-sdk';
|
|
252
|
+
|
|
253
|
+
try {
|
|
254
|
+
await BotaClient.devices.connect(device);
|
|
255
|
+
} catch (error) {
|
|
256
|
+
if (error instanceof BluetoothError) {
|
|
257
|
+
// Handle Bluetooth errors
|
|
258
|
+
} else if (error instanceof DeviceError) {
|
|
259
|
+
// Handle device errors (connection, not found, etc.)
|
|
260
|
+
} else if (error instanceof ProvisioningError) {
|
|
261
|
+
// Handle provisioning errors
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Integration with Your Backend
|
|
267
|
+
|
|
268
|
+
The SDK does not communicate directly with the Bota API. Your mobile app should:
|
|
269
|
+
|
|
270
|
+
1. Authenticate users through your own backend
|
|
271
|
+
2. Call your backend to register devices and get device tokens
|
|
272
|
+
3. Call your backend to create recordings and get upload URLs
|
|
273
|
+
4. The SDK uploads directly to S3 using the pre-signed URLs
|
|
274
|
+
|
|
275
|
+
See the [Bota API documentation](https://docs.bota.dev) for backend integration details.
|
|
276
|
+
|
|
277
|
+
## License
|
|
278
|
+
|
|
279
|
+
MIT
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BotaClient = void 0;
|
|
7
|
+
var _reactNativeBlePlx = require("react-native-ble-plx");
|
|
8
|
+
var _eventemitter = _interopRequireDefault(require("eventemitter3"));
|
|
9
|
+
var _BleManager = require("./ble/BleManager");
|
|
10
|
+
var _DeviceManager = require("./managers/DeviceManager");
|
|
11
|
+
var _RecordingManager = require("./managers/RecordingManager");
|
|
12
|
+
var _OTAManager = require("./managers/OTAManager");
|
|
13
|
+
var _errors = require("./utils/errors");
|
|
14
|
+
var _logger = require("./utils/logger");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
/**
|
|
17
|
+
* Bota Client - Main entry point for the Bota React Native SDK
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const log = _logger.logger.tag('BotaClient');
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Map react-native-ble-plx State to BluetoothState
|
|
24
|
+
*/
|
|
25
|
+
function mapBluetoothState(state) {
|
|
26
|
+
switch (state) {
|
|
27
|
+
case _reactNativeBlePlx.State.Unknown:
|
|
28
|
+
return 'unknown';
|
|
29
|
+
case _reactNativeBlePlx.State.Resetting:
|
|
30
|
+
return 'resetting';
|
|
31
|
+
case _reactNativeBlePlx.State.Unsupported:
|
|
32
|
+
return 'unsupported';
|
|
33
|
+
case _reactNativeBlePlx.State.Unauthorized:
|
|
34
|
+
return 'unauthorized';
|
|
35
|
+
case _reactNativeBlePlx.State.PoweredOff:
|
|
36
|
+
return 'poweredOff';
|
|
37
|
+
case _reactNativeBlePlx.State.PoweredOn:
|
|
38
|
+
return 'poweredOn';
|
|
39
|
+
default:
|
|
40
|
+
return 'unknown';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Bota Client class - singleton SDK entry point
|
|
46
|
+
*/
|
|
47
|
+
class BotaClientImpl extends _eventemitter.default {
|
|
48
|
+
_config = null;
|
|
49
|
+
_state = 'uninitialized';
|
|
50
|
+
_bluetoothState = 'unknown';
|
|
51
|
+
_bleManager = null;
|
|
52
|
+
_deviceManager = null;
|
|
53
|
+
_recordingManager = null;
|
|
54
|
+
_otaManager = null;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Get current SDK state
|
|
58
|
+
*/
|
|
59
|
+
get state() {
|
|
60
|
+
return this._state;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get current Bluetooth state
|
|
65
|
+
*/
|
|
66
|
+
get bluetoothState() {
|
|
67
|
+
return this._bluetoothState;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Check if Bluetooth is ready
|
|
72
|
+
*/
|
|
73
|
+
get isBluetoothReady() {
|
|
74
|
+
return this._bluetoothState === 'poweredOn';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Check if SDK is initialized
|
|
79
|
+
*/
|
|
80
|
+
get isInitialized() {
|
|
81
|
+
return this._state === 'ready';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get current configuration
|
|
86
|
+
*/
|
|
87
|
+
get config() {
|
|
88
|
+
return this._config;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get device manager
|
|
93
|
+
*/
|
|
94
|
+
get devices() {
|
|
95
|
+
if (!this._deviceManager) {
|
|
96
|
+
throw _errors.SdkError.notInitialized();
|
|
97
|
+
}
|
|
98
|
+
return this._deviceManager;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Get recording manager
|
|
103
|
+
*/
|
|
104
|
+
get recordings() {
|
|
105
|
+
if (!this._recordingManager) {
|
|
106
|
+
throw _errors.SdkError.notInitialized();
|
|
107
|
+
}
|
|
108
|
+
return this._recordingManager;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Get OTA manager
|
|
113
|
+
*/
|
|
114
|
+
get ota() {
|
|
115
|
+
if (!this._otaManager) {
|
|
116
|
+
throw _errors.SdkError.notInitialized();
|
|
117
|
+
}
|
|
118
|
+
return this._otaManager;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Configure and initialize the SDK
|
|
123
|
+
*/
|
|
124
|
+
async configure(config = {}) {
|
|
125
|
+
if (this._state === 'ready') {
|
|
126
|
+
log.warn('SDK already configured, reconfiguring');
|
|
127
|
+
await this.destroy();
|
|
128
|
+
}
|
|
129
|
+
log.info('Configuring SDK', config);
|
|
130
|
+
this._config = {
|
|
131
|
+
environment: config.environment ?? 'production',
|
|
132
|
+
backgroundSyncEnabled: config.backgroundSyncEnabled ?? true,
|
|
133
|
+
wifiOnlyUpload: config.wifiOnlyUpload ?? false,
|
|
134
|
+
logLevel: config.logLevel ?? 'warn',
|
|
135
|
+
debug: config.debug ?? false
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
// Set log level
|
|
139
|
+
_logger.logger.setLevel(this._config.logLevel);
|
|
140
|
+
this.setState('initializing');
|
|
141
|
+
try {
|
|
142
|
+
// Initialize BLE manager
|
|
143
|
+
this._bleManager = (0, _BleManager.getBleManager)();
|
|
144
|
+
|
|
145
|
+
// Set up Bluetooth state listener
|
|
146
|
+
this._bleManager.on('stateChange', state => {
|
|
147
|
+
const mappedState = mapBluetoothState(state);
|
|
148
|
+
if (mappedState !== this._bluetoothState) {
|
|
149
|
+
this._bluetoothState = mappedState;
|
|
150
|
+
this.emit('bluetoothStateChanged', mappedState);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// Get initial Bluetooth state
|
|
155
|
+
const initialState = await this._bleManager.getState();
|
|
156
|
+
this._bluetoothState = mapBluetoothState(initialState);
|
|
157
|
+
|
|
158
|
+
// Initialize managers
|
|
159
|
+
this._deviceManager = new _DeviceManager.DeviceManager();
|
|
160
|
+
this._deviceManager.initialize();
|
|
161
|
+
this._recordingManager = new _RecordingManager.RecordingManager();
|
|
162
|
+
await this._recordingManager.initialize();
|
|
163
|
+
this._otaManager = new _OTAManager.OTAManager();
|
|
164
|
+
this.setState('ready');
|
|
165
|
+
log.info('SDK configured successfully', {
|
|
166
|
+
environment: this._config.environment,
|
|
167
|
+
bluetoothState: this._bluetoothState
|
|
168
|
+
});
|
|
169
|
+
} catch (error) {
|
|
170
|
+
this.setState('error');
|
|
171
|
+
log.error('Failed to configure SDK', error);
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Wait for Bluetooth to be ready
|
|
178
|
+
*/
|
|
179
|
+
async waitForBluetooth(timeoutMs = 10000) {
|
|
180
|
+
if (!this._bleManager) {
|
|
181
|
+
throw _errors.SdkError.notInitialized();
|
|
182
|
+
}
|
|
183
|
+
await this._bleManager.waitForReady(timeoutMs);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Destroy the SDK and clean up resources
|
|
188
|
+
*/
|
|
189
|
+
async destroy() {
|
|
190
|
+
log.info('Destroying SDK');
|
|
191
|
+
this._deviceManager?.destroy();
|
|
192
|
+
this._recordingManager?.destroy();
|
|
193
|
+
this._otaManager?.destroy();
|
|
194
|
+
(0, _BleManager.resetBleManager)();
|
|
195
|
+
this._deviceManager = null;
|
|
196
|
+
this._recordingManager = null;
|
|
197
|
+
this._otaManager = null;
|
|
198
|
+
this._bleManager = null;
|
|
199
|
+
this._config = null;
|
|
200
|
+
this.setState('uninitialized');
|
|
201
|
+
this.removeAllListeners();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Set SDK state and emit event
|
|
206
|
+
*/
|
|
207
|
+
setState(state) {
|
|
208
|
+
if (state !== this._state) {
|
|
209
|
+
this._state = state;
|
|
210
|
+
this.emit('stateChanged', state);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Singleton instance
|
|
217
|
+
*/
|
|
218
|
+
const BotaClient = exports.BotaClient = new BotaClientImpl();
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Export types
|
|
222
|
+
*/
|
|
223
|
+
//# sourceMappingURL=BotaClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeBlePlx","require","_eventemitter","_interopRequireDefault","_BleManager","_DeviceManager","_RecordingManager","_OTAManager","_errors","_logger","e","__esModule","default","log","logger","tag","mapBluetoothState","state","State","Unknown","Resetting","Unsupported","Unauthorized","PoweredOff","PoweredOn","BotaClientImpl","EventEmitter","_config","_state","_bluetoothState","_bleManager","_deviceManager","_recordingManager","_otaManager","bluetoothState","isBluetoothReady","isInitialized","config","devices","SdkError","notInitialized","recordings","ota","configure","warn","destroy","info","environment","backgroundSyncEnabled","wifiOnlyUpload","logLevel","debug","setLevel","setState","getBleManager","on","mappedState","emit","initialState","getState","DeviceManager","initialize","RecordingManager","OTAManager","error","waitForBluetooth","timeoutMs","waitForReady","resetBleManager","removeAllListeners","BotaClient","exports"],"sourceRoot":"../../src","sources":["BotaClient.ts"],"mappings":"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","ignoreList":[]}
|