@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAUjD;;GAEG;AACH,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAAe;IAE7B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B;;OAEG;IACH,QAAQ,IAAI,QAAQ;IAIpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,MAAM;IAUd;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9E;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;CAG/B;AAED;;GAEG;AACH,cAAM,YAAY;IAEd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;gBADH,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM;IAGrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAG/E;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,YAAY,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry utility with exponential backoff
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Retry configuration options
|
|
6
|
+
*/
|
|
7
|
+
export interface RetryOptions {
|
|
8
|
+
/** Maximum number of retry attempts (default: 6) */
|
|
9
|
+
maxAttempts?: number;
|
|
10
|
+
/** Base delay in milliseconds (default: 1000) */
|
|
11
|
+
baseDelayMs?: number;
|
|
12
|
+
/** Maximum delay in milliseconds (default: 14400000 = 4 hours) */
|
|
13
|
+
maxDelayMs?: number;
|
|
14
|
+
/** Backoff multiplier (default: 2) */
|
|
15
|
+
backoffMultiplier?: number;
|
|
16
|
+
/** Add jitter to delays (default: true) */
|
|
17
|
+
jitter?: boolean;
|
|
18
|
+
/** Callback for each retry attempt */
|
|
19
|
+
onRetry?: (attempt: number, error: Error, delayMs: number) => void;
|
|
20
|
+
/** Predicate to determine if error is retryable (default: all errors) */
|
|
21
|
+
isRetryable?: (error: Error) => boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Default retry delays based on Bota spec:
|
|
25
|
+
* Attempt 1: Immediate
|
|
26
|
+
* Attempt 2: 30 seconds
|
|
27
|
+
* Attempt 3: 2 minutes
|
|
28
|
+
* Attempt 4: 10 minutes
|
|
29
|
+
* Attempt 5: 1 hour
|
|
30
|
+
* Attempt 6: 4 hours
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_RETRY_DELAYS: number[];
|
|
33
|
+
/**
|
|
34
|
+
* Calculate delay for a retry attempt using exponential backoff
|
|
35
|
+
*/
|
|
36
|
+
export declare function calculateDelay(attempt: number, options?: RetryOptions): number;
|
|
37
|
+
/**
|
|
38
|
+
* Sleep for a specified duration
|
|
39
|
+
*/
|
|
40
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Execute a function with retry logic
|
|
43
|
+
*/
|
|
44
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a retryable wrapper for a function
|
|
47
|
+
*/
|
|
48
|
+
export declare function makeRetryable<T extends (...args: unknown[]) => Promise<unknown>>(fn: T, options?: RetryOptions): T;
|
|
49
|
+
/**
|
|
50
|
+
* Check if we should continue retrying based on total time elapsed
|
|
51
|
+
*/
|
|
52
|
+
export declare function shouldContinueRetrying(startTime: Date, maxDurationMs?: number): boolean;
|
|
53
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,yEAAyE;IACzE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,UAOhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA0DZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,EAC9E,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,YAAiB,GACzB,CAAC,CAIH;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,IAAI,EACf,aAAa,GAAE,MAA4B,GAC1C,OAAO,CAGT"}
|
package/package.json
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bota-dev/react-native-sdk",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "Bota React Native SDK for BLE device communication",
|
|
5
|
+
"main": "lib/commonjs/index.js",
|
|
6
|
+
"module": "lib/module/index.js",
|
|
7
|
+
"types": "lib/typescript/src/index.d.ts",
|
|
8
|
+
"react-native": "src/index.ts",
|
|
9
|
+
"source": "src/index.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"src",
|
|
12
|
+
"lib",
|
|
13
|
+
"!**/__tests__",
|
|
14
|
+
"!**/__fixtures__",
|
|
15
|
+
"!**/__mocks__"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "bob build",
|
|
19
|
+
"prepublishOnly": "npm run build",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
22
|
+
"test": "jest --passWithNoTests",
|
|
23
|
+
"clean": "rm -rf lib"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"react-native",
|
|
27
|
+
"ble",
|
|
28
|
+
"bluetooth",
|
|
29
|
+
"bota",
|
|
30
|
+
"audio",
|
|
31
|
+
"recording"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/bota-dev/react-native-sdk.git"
|
|
36
|
+
},
|
|
37
|
+
"author": "Qi Zhang <qi@bota.dev>",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/bota-dev/react-native-sdk/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://docs.bota.dev",
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"react": ">=18.0.0",
|
|
48
|
+
"react-native": ">=0.72.0",
|
|
49
|
+
"react-native-ble-plx": "^3.0.0",
|
|
50
|
+
"@react-native-async-storage/async-storage": "^1.21.0"
|
|
51
|
+
},
|
|
52
|
+
"peerDependenciesMeta": {
|
|
53
|
+
"react-native-ble-plx": {
|
|
54
|
+
"optional": false
|
|
55
|
+
},
|
|
56
|
+
"@react-native-async-storage/async-storage": {
|
|
57
|
+
"optional": false
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"buffer": "^6.0.3",
|
|
62
|
+
"eventemitter3": "^5.0.1"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@react-native-async-storage/async-storage": "^1.21.0",
|
|
66
|
+
"@types/jest": "^29.5.12",
|
|
67
|
+
"@types/react": "^18.2.0",
|
|
68
|
+
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
69
|
+
"@typescript-eslint/parser": "^7.0.0",
|
|
70
|
+
"eslint": "^8.57.0",
|
|
71
|
+
"jest": "^29.7.0",
|
|
72
|
+
"react": "18.2.0",
|
|
73
|
+
"react-native": "0.73.0",
|
|
74
|
+
"react-native-ble-plx": "^3.1.2",
|
|
75
|
+
"react-native-builder-bob": "^0.23.2",
|
|
76
|
+
"typescript": "^5.3.3"
|
|
77
|
+
},
|
|
78
|
+
"engines": {
|
|
79
|
+
"node": ">=18"
|
|
80
|
+
},
|
|
81
|
+
"react-native-builder-bob": {
|
|
82
|
+
"source": "src",
|
|
83
|
+
"output": "lib",
|
|
84
|
+
"targets": [
|
|
85
|
+
"commonjs",
|
|
86
|
+
"module",
|
|
87
|
+
[
|
|
88
|
+
"typescript",
|
|
89
|
+
{
|
|
90
|
+
"project": "tsconfig.build.json"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bota Client - Main entry point for the Bota React Native SDK
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { State } from 'react-native-ble-plx';
|
|
6
|
+
import EventEmitter from 'eventemitter3';
|
|
7
|
+
|
|
8
|
+
import { getBleManager, resetBleManager, BleManager } from './ble/BleManager';
|
|
9
|
+
import { DeviceManager } from './managers/DeviceManager';
|
|
10
|
+
import { RecordingManager } from './managers/RecordingManager';
|
|
11
|
+
import { OTAManager } from './managers/OTAManager';
|
|
12
|
+
import type {
|
|
13
|
+
BotaConfig,
|
|
14
|
+
SdkState,
|
|
15
|
+
BluetoothState,
|
|
16
|
+
BotaClientEvents,
|
|
17
|
+
} from './models/Status';
|
|
18
|
+
import { SdkError } from './utils/errors';
|
|
19
|
+
import { logger } from './utils/logger';
|
|
20
|
+
|
|
21
|
+
const log = logger.tag('BotaClient');
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Map react-native-ble-plx State to BluetoothState
|
|
25
|
+
*/
|
|
26
|
+
function mapBluetoothState(state: State): BluetoothState {
|
|
27
|
+
switch (state) {
|
|
28
|
+
case State.Unknown:
|
|
29
|
+
return 'unknown';
|
|
30
|
+
case State.Resetting:
|
|
31
|
+
return 'resetting';
|
|
32
|
+
case State.Unsupported:
|
|
33
|
+
return 'unsupported';
|
|
34
|
+
case State.Unauthorized:
|
|
35
|
+
return 'unauthorized';
|
|
36
|
+
case State.PoweredOff:
|
|
37
|
+
return 'poweredOff';
|
|
38
|
+
case State.PoweredOn:
|
|
39
|
+
return 'poweredOn';
|
|
40
|
+
default:
|
|
41
|
+
return 'unknown';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Bota Client class - singleton SDK entry point
|
|
47
|
+
*/
|
|
48
|
+
class BotaClientImpl extends EventEmitter<BotaClientEvents> {
|
|
49
|
+
private _config: BotaConfig | null = null;
|
|
50
|
+
private _state: SdkState = 'uninitialized';
|
|
51
|
+
private _bluetoothState: BluetoothState = 'unknown';
|
|
52
|
+
|
|
53
|
+
private _bleManager: BleManager | null = null;
|
|
54
|
+
private _deviceManager: DeviceManager | null = null;
|
|
55
|
+
private _recordingManager: RecordingManager | null = null;
|
|
56
|
+
private _otaManager: OTAManager | null = null;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Get current SDK state
|
|
60
|
+
*/
|
|
61
|
+
get state(): SdkState {
|
|
62
|
+
return this._state;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get current Bluetooth state
|
|
67
|
+
*/
|
|
68
|
+
get bluetoothState(): BluetoothState {
|
|
69
|
+
return this._bluetoothState;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Check if Bluetooth is ready
|
|
74
|
+
*/
|
|
75
|
+
get isBluetoothReady(): boolean {
|
|
76
|
+
return this._bluetoothState === 'poweredOn';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Check if SDK is initialized
|
|
81
|
+
*/
|
|
82
|
+
get isInitialized(): boolean {
|
|
83
|
+
return this._state === 'ready';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get current configuration
|
|
88
|
+
*/
|
|
89
|
+
get config(): BotaConfig | null {
|
|
90
|
+
return this._config;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get device manager
|
|
95
|
+
*/
|
|
96
|
+
get devices(): DeviceManager {
|
|
97
|
+
if (!this._deviceManager) {
|
|
98
|
+
throw SdkError.notInitialized();
|
|
99
|
+
}
|
|
100
|
+
return this._deviceManager;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Get recording manager
|
|
105
|
+
*/
|
|
106
|
+
get recordings(): RecordingManager {
|
|
107
|
+
if (!this._recordingManager) {
|
|
108
|
+
throw SdkError.notInitialized();
|
|
109
|
+
}
|
|
110
|
+
return this._recordingManager;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Get OTA manager
|
|
115
|
+
*/
|
|
116
|
+
get ota(): OTAManager {
|
|
117
|
+
if (!this._otaManager) {
|
|
118
|
+
throw SdkError.notInitialized();
|
|
119
|
+
}
|
|
120
|
+
return this._otaManager;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Configure and initialize the SDK
|
|
125
|
+
*/
|
|
126
|
+
async configure(config: BotaConfig = {}): Promise<void> {
|
|
127
|
+
if (this._state === 'ready') {
|
|
128
|
+
log.warn('SDK already configured, reconfiguring');
|
|
129
|
+
await this.destroy();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
log.info('Configuring SDK', config as Record<string, unknown>);
|
|
133
|
+
|
|
134
|
+
this._config = {
|
|
135
|
+
environment: config.environment ?? 'production',
|
|
136
|
+
backgroundSyncEnabled: config.backgroundSyncEnabled ?? true,
|
|
137
|
+
wifiOnlyUpload: config.wifiOnlyUpload ?? false,
|
|
138
|
+
logLevel: config.logLevel ?? 'warn',
|
|
139
|
+
debug: config.debug ?? false,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
// Set log level
|
|
143
|
+
logger.setLevel(this._config.logLevel!);
|
|
144
|
+
|
|
145
|
+
this.setState('initializing');
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
// Initialize BLE manager
|
|
149
|
+
this._bleManager = getBleManager();
|
|
150
|
+
|
|
151
|
+
// Set up Bluetooth state listener
|
|
152
|
+
this._bleManager.on('stateChange', (state) => {
|
|
153
|
+
const mappedState = mapBluetoothState(state);
|
|
154
|
+
if (mappedState !== this._bluetoothState) {
|
|
155
|
+
this._bluetoothState = mappedState;
|
|
156
|
+
this.emit('bluetoothStateChanged', mappedState);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Get initial Bluetooth state
|
|
161
|
+
const initialState = await this._bleManager.getState();
|
|
162
|
+
this._bluetoothState = mapBluetoothState(initialState);
|
|
163
|
+
|
|
164
|
+
// Initialize managers
|
|
165
|
+
this._deviceManager = new DeviceManager();
|
|
166
|
+
this._deviceManager.initialize();
|
|
167
|
+
|
|
168
|
+
this._recordingManager = new RecordingManager();
|
|
169
|
+
await this._recordingManager.initialize();
|
|
170
|
+
|
|
171
|
+
this._otaManager = new OTAManager();
|
|
172
|
+
|
|
173
|
+
this.setState('ready');
|
|
174
|
+
|
|
175
|
+
log.info('SDK configured successfully', {
|
|
176
|
+
environment: this._config.environment,
|
|
177
|
+
bluetoothState: this._bluetoothState,
|
|
178
|
+
});
|
|
179
|
+
} catch (error) {
|
|
180
|
+
this.setState('error');
|
|
181
|
+
log.error('Failed to configure SDK', error as Error);
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Wait for Bluetooth to be ready
|
|
188
|
+
*/
|
|
189
|
+
async waitForBluetooth(timeoutMs: number = 10000): Promise<void> {
|
|
190
|
+
if (!this._bleManager) {
|
|
191
|
+
throw SdkError.notInitialized();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
await this._bleManager.waitForReady(timeoutMs);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Destroy the SDK and clean up resources
|
|
199
|
+
*/
|
|
200
|
+
async destroy(): Promise<void> {
|
|
201
|
+
log.info('Destroying SDK');
|
|
202
|
+
|
|
203
|
+
this._deviceManager?.destroy();
|
|
204
|
+
this._recordingManager?.destroy();
|
|
205
|
+
this._otaManager?.destroy();
|
|
206
|
+
|
|
207
|
+
resetBleManager();
|
|
208
|
+
|
|
209
|
+
this._deviceManager = null;
|
|
210
|
+
this._recordingManager = null;
|
|
211
|
+
this._otaManager = null;
|
|
212
|
+
this._bleManager = null;
|
|
213
|
+
this._config = null;
|
|
214
|
+
|
|
215
|
+
this.setState('uninitialized');
|
|
216
|
+
this.removeAllListeners();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Set SDK state and emit event
|
|
221
|
+
*/
|
|
222
|
+
private setState(state: SdkState): void {
|
|
223
|
+
if (state !== this._state) {
|
|
224
|
+
this._state = state;
|
|
225
|
+
this.emit('stateChanged', state);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Singleton instance
|
|
232
|
+
*/
|
|
233
|
+
export const BotaClient = new BotaClientImpl();
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Export types
|
|
237
|
+
*/
|
|
238
|
+
export type { BotaConfig, SdkState, BluetoothState };
|