@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 @@
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 };