@ovok/native 0.4.2 → 0.4.4

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 (354) hide show
  1. package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
  2. package/lib/commonjs/modules/bt-management/components/bt-provider.js.map +1 -1
  3. package/lib/commonjs/modules/bt-management/constants/custom-device-brand.js +12 -0
  4. package/lib/commonjs/modules/bt-management/constants/custom-device-brand.js.map +1 -0
  5. package/lib/commonjs/modules/bt-management/constants/measurement-field-catalog.js +111 -0
  6. package/lib/commonjs/modules/bt-management/constants/measurement-field-catalog.js.map +1 -0
  7. package/lib/commonjs/modules/bt-management/index.js +209 -0
  8. package/lib/commonjs/modules/bt-management/index.js.map +1 -1
  9. package/lib/commonjs/modules/bt-management/services/bt-manager.js.map +1 -1
  10. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-case.js +116 -0
  11. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-case.js.map +1 -0
  12. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-field.js +83 -0
  13. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-field.js.map +1 -0
  14. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-frame.js +64 -0
  15. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-frame.js.map +1 -0
  16. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-monitor.js +76 -0
  17. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-monitor.js.map +1 -0
  18. package/lib/commonjs/modules/bt-management/services/custom/custom-device-error.js +13 -0
  19. package/lib/commonjs/modules/bt-management/services/custom/custom-device-error.js.map +1 -0
  20. package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js +120 -0
  21. package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js.map +1 -0
  22. package/lib/commonjs/modules/bt-management/services/custom/normalize-ble-uuid.js +32 -0
  23. package/lib/commonjs/modules/bt-management/services/custom/normalize-ble-uuid.js.map +1 -0
  24. package/lib/commonjs/modules/bt-management/services/device-creator.js +52 -26
  25. package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
  26. package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js +22 -5
  27. package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
  28. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  29. package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js +103 -0
  30. package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js.map +1 -0
  31. package/lib/commonjs/modules/bt-management/types/accepted-device.js +6 -0
  32. package/lib/commonjs/modules/bt-management/types/accepted-device.js.map +1 -0
  33. package/lib/commonjs/modules/bt-management/types/compiled-custom-field.js +6 -0
  34. package/lib/commonjs/modules/bt-management/types/compiled-custom-field.js.map +1 -0
  35. package/lib/commonjs/modules/bt-management/types/custom-byte-order.js +2 -0
  36. package/lib/commonjs/modules/bt-management/types/custom-byte-order.js.map +1 -0
  37. package/lib/commonjs/modules/bt-management/types/custom-case-kind.js +2 -0
  38. package/lib/commonjs/modules/bt-management/types/custom-case-kind.js.map +1 -0
  39. package/lib/commonjs/modules/bt-management/types/custom-case-spec.js +6 -0
  40. package/lib/commonjs/modules/bt-management/types/custom-case-spec.js.map +1 -0
  41. package/lib/commonjs/modules/bt-management/types/custom-device-definition.js +4 -0
  42. package/lib/commonjs/modules/bt-management/types/custom-device-definition.js.map +1 -0
  43. package/lib/commonjs/modules/bt-management/types/custom-device-id.js +2 -0
  44. package/lib/commonjs/modules/bt-management/types/custom-device-id.js.map +1 -0
  45. package/lib/commonjs/modules/bt-management/types/custom-device-spec.js +6 -0
  46. package/lib/commonjs/modules/bt-management/types/custom-device-spec.js.map +1 -0
  47. package/lib/commonjs/modules/bt-management/types/custom-field-encoding.js +2 -0
  48. package/lib/commonjs/modules/bt-management/types/custom-field-encoding.js.map +1 -0
  49. package/lib/commonjs/modules/bt-management/types/custom-field-spec.js +6 -0
  50. package/lib/commonjs/modules/bt-management/types/custom-field-spec.js.map +1 -0
  51. package/lib/commonjs/modules/bt-management/types/custom-frame-spec.js +6 -0
  52. package/lib/commonjs/modules/bt-management/types/custom-frame-spec.js.map +1 -0
  53. package/lib/commonjs/modules/bt-management/types/custom-measurement.js +6 -0
  54. package/lib/commonjs/modules/bt-management/types/custom-measurement.js.map +1 -0
  55. package/lib/commonjs/modules/bt-management/types/custom-monitor-spec.js +6 -0
  56. package/lib/commonjs/modules/bt-management/types/custom-monitor-spec.js.map +1 -0
  57. package/lib/commonjs/modules/bt-management/types/custom-service-spec.js +6 -0
  58. package/lib/commonjs/modules/bt-management/types/custom-service-spec.js.map +1 -0
  59. package/lib/commonjs/modules/bt-management/types/device-key-of.js +6 -0
  60. package/lib/commonjs/modules/bt-management/types/device-key-of.js.map +1 -0
  61. package/lib/commonjs/modules/bt-management/types/device-key.js +6 -0
  62. package/lib/commonjs/modules/bt-management/types/device-key.js.map +1 -0
  63. package/lib/commonjs/modules/bt-management/types/device-measurement-map.js.map +1 -1
  64. package/lib/commonjs/modules/bt-management/utils/create-custom-field-parser.js +54 -0
  65. package/lib/commonjs/modules/bt-management/utils/create-custom-field-parser.js.map +1 -0
  66. package/lib/commonjs/modules/bt-management/utils/create-frame-validator.js +40 -0
  67. package/lib/commonjs/modules/bt-management/utils/create-frame-validator.js.map +1 -0
  68. package/lib/commonjs/modules/bt-management/utils/decode-medical-float.js +38 -0
  69. package/lib/commonjs/modules/bt-management/utils/decode-medical-float.js.map +1 -0
  70. package/lib/commonjs/modules/bt-management/utils/is-custom-device-definition.js +15 -0
  71. package/lib/commonjs/modules/bt-management/utils/is-custom-device-definition.js.map +1 -0
  72. package/lib/commonjs/modules/data-sync/components/android/android-health-sync.js +11 -1
  73. package/lib/commonjs/modules/data-sync/components/android/android-health-sync.js.map +1 -1
  74. package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js +33 -1
  75. package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
  76. package/lib/commonjs/modules/data-sync/services/base-health-sync-service.js +4 -0
  77. package/lib/commonjs/modules/data-sync/services/base-health-sync-service.js.map +1 -1
  78. package/lib/commonjs/modules/data-sync/services/managers/storage-manager.js +30 -2
  79. package/lib/commonjs/modules/data-sync/services/managers/storage-manager.js.map +1 -1
  80. package/lib/commonjs/modules/data-sync/services/managers/sync-state-manager.js +19 -0
  81. package/lib/commonjs/modules/data-sync/services/managers/sync-state-manager.js.map +1 -1
  82. package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
  83. package/lib/module/modules/bt-management/components/bt-provider.js.map +1 -1
  84. package/lib/module/modules/bt-management/constants/custom-device-brand.js +8 -0
  85. package/lib/module/modules/bt-management/constants/custom-device-brand.js.map +1 -0
  86. package/lib/module/modules/bt-management/constants/measurement-field-catalog.js +108 -0
  87. package/lib/module/modules/bt-management/constants/measurement-field-catalog.js.map +1 -0
  88. package/lib/module/modules/bt-management/index.js +19 -0
  89. package/lib/module/modules/bt-management/index.js.map +1 -1
  90. package/lib/module/modules/bt-management/services/bt-manager.js.map +1 -1
  91. package/lib/module/modules/bt-management/services/custom/compile-custom-case.js +112 -0
  92. package/lib/module/modules/bt-management/services/custom/compile-custom-case.js.map +1 -0
  93. package/lib/module/modules/bt-management/services/custom/compile-custom-field.js +78 -0
  94. package/lib/module/modules/bt-management/services/custom/compile-custom-field.js.map +1 -0
  95. package/lib/module/modules/bt-management/services/custom/compile-custom-frame.js +59 -0
  96. package/lib/module/modules/bt-management/services/custom/compile-custom-frame.js.map +1 -0
  97. package/lib/module/modules/bt-management/services/custom/compile-custom-monitor.js +71 -0
  98. package/lib/module/modules/bt-management/services/custom/compile-custom-monitor.js.map +1 -0
  99. package/lib/module/modules/bt-management/services/custom/custom-device-error.js +8 -0
  100. package/lib/module/modules/bt-management/services/custom/custom-device-error.js.map +1 -0
  101. package/lib/module/modules/bt-management/services/custom/define-custom-device.js +115 -0
  102. package/lib/module/modules/bt-management/services/custom/define-custom-device.js.map +1 -0
  103. package/lib/module/modules/bt-management/services/custom/normalize-ble-uuid.js +27 -0
  104. package/lib/module/modules/bt-management/services/custom/normalize-ble-uuid.js.map +1 -0
  105. package/lib/module/modules/bt-management/services/device-creator.js +52 -26
  106. package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
  107. package/lib/module/modules/bt-management/services/devices/bt-data-processor.js +22 -5
  108. package/lib/module/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
  109. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  110. package/lib/module/modules/bt-management/services/devices/custom/custom.device.js +98 -0
  111. package/lib/module/modules/bt-management/services/devices/custom/custom.device.js.map +1 -0
  112. package/lib/module/modules/bt-management/types/accepted-device.js +4 -0
  113. package/lib/module/modules/bt-management/types/accepted-device.js.map +1 -0
  114. package/lib/module/modules/bt-management/types/compiled-custom-field.js +4 -0
  115. package/lib/module/modules/bt-management/types/compiled-custom-field.js.map +1 -0
  116. package/lib/module/modules/bt-management/types/custom-byte-order.js +2 -0
  117. package/lib/module/modules/bt-management/types/custom-byte-order.js.map +1 -0
  118. package/lib/module/modules/bt-management/types/custom-case-kind.js +2 -0
  119. package/lib/module/modules/bt-management/types/custom-case-kind.js.map +1 -0
  120. package/lib/module/modules/bt-management/types/custom-case-spec.js +4 -0
  121. package/lib/module/modules/bt-management/types/custom-case-spec.js.map +1 -0
  122. package/lib/module/modules/bt-management/types/custom-device-definition.js +8 -0
  123. package/lib/module/modules/bt-management/types/custom-device-definition.js.map +1 -0
  124. package/lib/module/modules/bt-management/types/custom-device-id.js +2 -0
  125. package/lib/module/modules/bt-management/types/custom-device-id.js.map +1 -0
  126. package/lib/module/modules/bt-management/types/custom-device-spec.js +4 -0
  127. package/lib/module/modules/bt-management/types/custom-device-spec.js.map +1 -0
  128. package/lib/module/modules/bt-management/types/custom-field-encoding.js +2 -0
  129. package/lib/module/modules/bt-management/types/custom-field-encoding.js.map +1 -0
  130. package/lib/module/modules/bt-management/types/custom-field-spec.js +4 -0
  131. package/lib/module/modules/bt-management/types/custom-field-spec.js.map +1 -0
  132. package/lib/module/modules/bt-management/types/custom-frame-spec.js +4 -0
  133. package/lib/module/modules/bt-management/types/custom-frame-spec.js.map +1 -0
  134. package/lib/module/modules/bt-management/types/custom-measurement.js +4 -0
  135. package/lib/module/modules/bt-management/types/custom-measurement.js.map +1 -0
  136. package/lib/module/modules/bt-management/types/custom-monitor-spec.js +4 -0
  137. package/lib/module/modules/bt-management/types/custom-monitor-spec.js.map +1 -0
  138. package/lib/module/modules/bt-management/types/custom-service-spec.js +4 -0
  139. package/lib/module/modules/bt-management/types/custom-service-spec.js.map +1 -0
  140. package/lib/module/modules/bt-management/types/device-key-of.js +4 -0
  141. package/lib/module/modules/bt-management/types/device-key-of.js.map +1 -0
  142. package/lib/module/modules/bt-management/types/device-key.js +4 -0
  143. package/lib/module/modules/bt-management/types/device-key.js.map +1 -0
  144. package/lib/module/modules/bt-management/types/device-measurement-map.js +5 -0
  145. package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
  146. package/lib/module/modules/bt-management/utils/create-custom-field-parser.js +49 -0
  147. package/lib/module/modules/bt-management/utils/create-custom-field-parser.js.map +1 -0
  148. package/lib/module/modules/bt-management/utils/create-frame-validator.js +35 -0
  149. package/lib/module/modules/bt-management/utils/create-frame-validator.js.map +1 -0
  150. package/lib/module/modules/bt-management/utils/decode-medical-float.js +33 -0
  151. package/lib/module/modules/bt-management/utils/decode-medical-float.js.map +1 -0
  152. package/lib/module/modules/bt-management/utils/is-custom-device-definition.js +10 -0
  153. package/lib/module/modules/bt-management/utils/is-custom-device-definition.js.map +1 -0
  154. package/lib/module/modules/data-sync/components/android/android-health-sync.js +11 -1
  155. package/lib/module/modules/data-sync/components/android/android-health-sync.js.map +1 -1
  156. package/lib/module/modules/data-sync/components/apple/apple-health-sync.js +33 -1
  157. package/lib/module/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
  158. package/lib/module/modules/data-sync/services/base-health-sync-service.js +4 -0
  159. package/lib/module/modules/data-sync/services/base-health-sync-service.js.map +1 -1
  160. package/lib/module/modules/data-sync/services/managers/storage-manager.js +30 -2
  161. package/lib/module/modules/data-sync/services/managers/storage-manager.js.map +1 -1
  162. package/lib/module/modules/data-sync/services/managers/sync-state-manager.js +19 -0
  163. package/lib/module/modules/data-sync/services/managers/sync-state-manager.js.map +1 -1
  164. package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts +2 -2
  165. package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider.d.ts +2 -2
  167. package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider.d.ts.map +1 -1
  168. package/lib/typescript/commonjs/src/modules/bt-management/constants/custom-device-brand.d.ts +6 -0
  169. package/lib/typescript/commonjs/src/modules/bt-management/constants/custom-device-brand.d.ts.map +1 -0
  170. package/lib/typescript/commonjs/src/modules/bt-management/constants/measurement-field-catalog.d.ts +26 -0
  171. package/lib/typescript/commonjs/src/modules/bt-management/constants/measurement-field-catalog.d.ts.map +1 -0
  172. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts +19 -0
  173. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts.map +1 -1
  174. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts +5 -4
  175. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  176. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-case.d.ts +6 -0
  177. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-case.d.ts.map +1 -0
  178. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-field.d.ts +6 -0
  179. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-field.d.ts.map +1 -0
  180. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-frame.d.ts +13 -0
  181. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-frame.d.ts.map +1 -0
  182. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts +10 -0
  183. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts.map +1 -0
  184. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/custom-device-error.d.ts +6 -0
  185. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/custom-device-error.d.ts.map +1 -0
  186. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts +12 -0
  187. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -0
  188. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts +7 -0
  189. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts.map +1 -0
  190. package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts +12 -5
  191. package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  192. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts +12 -1
  193. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
  194. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -1
  195. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  196. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts +43 -0
  197. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -0
  198. package/lib/typescript/commonjs/src/modules/bt-management/types/accepted-device.d.ts +5 -0
  199. package/lib/typescript/commonjs/src/modules/bt-management/types/accepted-device.d.ts.map +1 -0
  200. package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-children-props.d.ts +5 -4
  201. package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-children-props.d.ts.map +1 -1
  202. package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-props.d.ts +2 -2
  203. package/lib/typescript/commonjs/src/modules/bt-management/types/btprovider-props.d.ts.map +1 -1
  204. package/lib/typescript/commonjs/src/modules/bt-management/types/compiled-custom-field.d.ts +16 -0
  205. package/lib/typescript/commonjs/src/modules/bt-management/types/compiled-custom-field.d.ts.map +1 -0
  206. package/lib/typescript/commonjs/src/modules/bt-management/types/create-device-params.d.ts +2 -2
  207. package/lib/typescript/commonjs/src/modules/bt-management/types/create-device-params.d.ts.map +1 -1
  208. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-byte-order.d.ts +6 -0
  209. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-byte-order.d.ts.map +1 -0
  210. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-kind.d.ts +12 -0
  211. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-kind.d.ts.map +1 -0
  212. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-spec.d.ts +18 -0
  213. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-case-spec.d.ts.map +1 -0
  214. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts +22 -0
  215. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -0
  216. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-id.d.ts +10 -0
  217. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-id.d.ts.map +1 -0
  218. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-spec.d.ts +12 -0
  219. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-spec.d.ts.map +1 -0
  220. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-encoding.d.ts +10 -0
  221. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-encoding.d.ts.map +1 -0
  222. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-spec.d.ts +33 -0
  223. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-field-spec.d.ts.map +1 -0
  224. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-frame-spec.d.ts +27 -0
  225. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-frame-spec.d.ts.map +1 -0
  226. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-measurement.d.ts +10 -0
  227. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-measurement.d.ts.map +1 -0
  228. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-monitor-spec.d.ts +14 -0
  229. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-monitor-spec.d.ts.map +1 -0
  230. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-service-spec.d.ts +15 -0
  231. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-service-spec.d.ts.map +1 -0
  232. package/lib/typescript/commonjs/src/modules/bt-management/types/device-data.d.ts +2 -2
  233. package/lib/typescript/commonjs/src/modules/bt-management/types/device-data.d.ts.map +1 -1
  234. package/lib/typescript/commonjs/src/modules/bt-management/types/device-key-of.d.ts +8 -0
  235. package/lib/typescript/commonjs/src/modules/bt-management/types/device-key-of.d.ts.map +1 -0
  236. package/lib/typescript/commonjs/src/modules/bt-management/types/device-key.d.ts +5 -0
  237. package/lib/typescript/commonjs/src/modules/bt-management/types/device-key.d.ts.map +1 -0
  238. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +10 -5
  239. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  240. package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts +2 -2
  241. package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
  242. package/lib/typescript/commonjs/src/modules/bt-management/utils/create-custom-field-parser.d.ts +12 -0
  243. package/lib/typescript/commonjs/src/modules/bt-management/utils/create-custom-field-parser.d.ts.map +1 -0
  244. package/lib/typescript/commonjs/src/modules/bt-management/utils/create-frame-validator.d.ts +10 -0
  245. package/lib/typescript/commonjs/src/modules/bt-management/utils/create-frame-validator.d.ts.map +1 -0
  246. package/lib/typescript/commonjs/src/modules/bt-management/utils/decode-medical-float.d.ts +9 -0
  247. package/lib/typescript/commonjs/src/modules/bt-management/utils/decode-medical-float.d.ts.map +1 -0
  248. package/lib/typescript/commonjs/src/modules/bt-management/utils/is-custom-device-definition.d.ts +9 -0
  249. package/lib/typescript/commonjs/src/modules/bt-management/utils/is-custom-device-definition.d.ts.map +1 -0
  250. package/lib/typescript/commonjs/src/modules/data-sync/components/android/android-health-sync.d.ts.map +1 -1
  251. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
  252. package/lib/typescript/commonjs/src/modules/data-sync/services/base-health-sync-service.d.ts +2 -0
  253. package/lib/typescript/commonjs/src/modules/data-sync/services/base-health-sync-service.d.ts.map +1 -1
  254. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/storage-manager.d.ts +20 -0
  255. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/storage-manager.d.ts.map +1 -1
  256. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-progress-manager.d.ts +1 -1
  257. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-state-manager.d.ts +13 -0
  258. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-state-manager.d.ts.map +1 -1
  259. package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts +2 -2
  260. package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
  261. package/lib/typescript/module/src/modules/bt-management/components/bt-provider.d.ts +2 -2
  262. package/lib/typescript/module/src/modules/bt-management/components/bt-provider.d.ts.map +1 -1
  263. package/lib/typescript/module/src/modules/bt-management/constants/custom-device-brand.d.ts +6 -0
  264. package/lib/typescript/module/src/modules/bt-management/constants/custom-device-brand.d.ts.map +1 -0
  265. package/lib/typescript/module/src/modules/bt-management/constants/measurement-field-catalog.d.ts +26 -0
  266. package/lib/typescript/module/src/modules/bt-management/constants/measurement-field-catalog.d.ts.map +1 -0
  267. package/lib/typescript/module/src/modules/bt-management/index.d.ts +19 -0
  268. package/lib/typescript/module/src/modules/bt-management/index.d.ts.map +1 -1
  269. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts +5 -4
  270. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  271. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-case.d.ts +6 -0
  272. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-case.d.ts.map +1 -0
  273. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-field.d.ts +6 -0
  274. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-field.d.ts.map +1 -0
  275. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-frame.d.ts +13 -0
  276. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-frame.d.ts.map +1 -0
  277. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts +10 -0
  278. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-monitor.d.ts.map +1 -0
  279. package/lib/typescript/module/src/modules/bt-management/services/custom/custom-device-error.d.ts +6 -0
  280. package/lib/typescript/module/src/modules/bt-management/services/custom/custom-device-error.d.ts.map +1 -0
  281. package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts +12 -0
  282. package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -0
  283. package/lib/typescript/module/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts +7 -0
  284. package/lib/typescript/module/src/modules/bt-management/services/custom/normalize-ble-uuid.d.ts.map +1 -0
  285. package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts +12 -5
  286. package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  287. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts +12 -1
  288. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
  289. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -1
  290. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  291. package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts +43 -0
  292. package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -0
  293. package/lib/typescript/module/src/modules/bt-management/types/accepted-device.d.ts +5 -0
  294. package/lib/typescript/module/src/modules/bt-management/types/accepted-device.d.ts.map +1 -0
  295. package/lib/typescript/module/src/modules/bt-management/types/btprovider-children-props.d.ts +5 -4
  296. package/lib/typescript/module/src/modules/bt-management/types/btprovider-children-props.d.ts.map +1 -1
  297. package/lib/typescript/module/src/modules/bt-management/types/btprovider-props.d.ts +2 -2
  298. package/lib/typescript/module/src/modules/bt-management/types/btprovider-props.d.ts.map +1 -1
  299. package/lib/typescript/module/src/modules/bt-management/types/compiled-custom-field.d.ts +16 -0
  300. package/lib/typescript/module/src/modules/bt-management/types/compiled-custom-field.d.ts.map +1 -0
  301. package/lib/typescript/module/src/modules/bt-management/types/create-device-params.d.ts +2 -2
  302. package/lib/typescript/module/src/modules/bt-management/types/create-device-params.d.ts.map +1 -1
  303. package/lib/typescript/module/src/modules/bt-management/types/custom-byte-order.d.ts +6 -0
  304. package/lib/typescript/module/src/modules/bt-management/types/custom-byte-order.d.ts.map +1 -0
  305. package/lib/typescript/module/src/modules/bt-management/types/custom-case-kind.d.ts +12 -0
  306. package/lib/typescript/module/src/modules/bt-management/types/custom-case-kind.d.ts.map +1 -0
  307. package/lib/typescript/module/src/modules/bt-management/types/custom-case-spec.d.ts +18 -0
  308. package/lib/typescript/module/src/modules/bt-management/types/custom-case-spec.d.ts.map +1 -0
  309. package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts +22 -0
  310. package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -0
  311. package/lib/typescript/module/src/modules/bt-management/types/custom-device-id.d.ts +10 -0
  312. package/lib/typescript/module/src/modules/bt-management/types/custom-device-id.d.ts.map +1 -0
  313. package/lib/typescript/module/src/modules/bt-management/types/custom-device-spec.d.ts +12 -0
  314. package/lib/typescript/module/src/modules/bt-management/types/custom-device-spec.d.ts.map +1 -0
  315. package/lib/typescript/module/src/modules/bt-management/types/custom-field-encoding.d.ts +10 -0
  316. package/lib/typescript/module/src/modules/bt-management/types/custom-field-encoding.d.ts.map +1 -0
  317. package/lib/typescript/module/src/modules/bt-management/types/custom-field-spec.d.ts +33 -0
  318. package/lib/typescript/module/src/modules/bt-management/types/custom-field-spec.d.ts.map +1 -0
  319. package/lib/typescript/module/src/modules/bt-management/types/custom-frame-spec.d.ts +27 -0
  320. package/lib/typescript/module/src/modules/bt-management/types/custom-frame-spec.d.ts.map +1 -0
  321. package/lib/typescript/module/src/modules/bt-management/types/custom-measurement.d.ts +10 -0
  322. package/lib/typescript/module/src/modules/bt-management/types/custom-measurement.d.ts.map +1 -0
  323. package/lib/typescript/module/src/modules/bt-management/types/custom-monitor-spec.d.ts +14 -0
  324. package/lib/typescript/module/src/modules/bt-management/types/custom-monitor-spec.d.ts.map +1 -0
  325. package/lib/typescript/module/src/modules/bt-management/types/custom-service-spec.d.ts +15 -0
  326. package/lib/typescript/module/src/modules/bt-management/types/custom-service-spec.d.ts.map +1 -0
  327. package/lib/typescript/module/src/modules/bt-management/types/device-data.d.ts +2 -2
  328. package/lib/typescript/module/src/modules/bt-management/types/device-data.d.ts.map +1 -1
  329. package/lib/typescript/module/src/modules/bt-management/types/device-key-of.d.ts +8 -0
  330. package/lib/typescript/module/src/modules/bt-management/types/device-key-of.d.ts.map +1 -0
  331. package/lib/typescript/module/src/modules/bt-management/types/device-key.d.ts +5 -0
  332. package/lib/typescript/module/src/modules/bt-management/types/device-key.d.ts.map +1 -0
  333. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +10 -5
  334. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  335. package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts +2 -2
  336. package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
  337. package/lib/typescript/module/src/modules/bt-management/utils/create-custom-field-parser.d.ts +12 -0
  338. package/lib/typescript/module/src/modules/bt-management/utils/create-custom-field-parser.d.ts.map +1 -0
  339. package/lib/typescript/module/src/modules/bt-management/utils/create-frame-validator.d.ts +10 -0
  340. package/lib/typescript/module/src/modules/bt-management/utils/create-frame-validator.d.ts.map +1 -0
  341. package/lib/typescript/module/src/modules/bt-management/utils/decode-medical-float.d.ts +9 -0
  342. package/lib/typescript/module/src/modules/bt-management/utils/decode-medical-float.d.ts.map +1 -0
  343. package/lib/typescript/module/src/modules/bt-management/utils/is-custom-device-definition.d.ts +9 -0
  344. package/lib/typescript/module/src/modules/bt-management/utils/is-custom-device-definition.d.ts.map +1 -0
  345. package/lib/typescript/module/src/modules/data-sync/components/android/android-health-sync.d.ts.map +1 -1
  346. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
  347. package/lib/typescript/module/src/modules/data-sync/services/base-health-sync-service.d.ts +2 -0
  348. package/lib/typescript/module/src/modules/data-sync/services/base-health-sync-service.d.ts.map +1 -1
  349. package/lib/typescript/module/src/modules/data-sync/services/managers/storage-manager.d.ts +20 -0
  350. package/lib/typescript/module/src/modules/data-sync/services/managers/storage-manager.d.ts.map +1 -1
  351. package/lib/typescript/module/src/modules/data-sync/services/managers/sync-progress-manager.d.ts +1 -1
  352. package/lib/typescript/module/src/modules/data-sync/services/managers/sync-state-manager.d.ts +13 -0
  353. package/lib/typescript/module/src/modules/data-sync/services/managers/sync-state-manager.d.ts.map +1 -1
  354. package/package.json +1 -1
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ import { measurementFieldCatalog } from "../../constants/measurement-field-catalog.js";
4
+ import { customDeviceError } from "./custom-device-error.js";
5
+ const MAX_INTEGER_BYTES = 6;
6
+ const WIDTHS = {
7
+ sfloat: 2,
8
+ float: 4
9
+ };
10
+ const assertByteIndexes = (id, path, field, minLengthBytes) => {
11
+ const indexes = field.byteIndexes;
12
+ if (!Array.isArray(indexes) || indexes.length === 0 || indexes.some(i => !Number.isInteger(i) || i < 0)) {
13
+ throw customDeviceError(id, `${path}.byteIndexes`, "must be a non-empty list of byte offsets that are integers of at least 0");
14
+ }
15
+ if (new Set(indexes).size !== indexes.length) {
16
+ throw customDeviceError(id, `${path}.byteIndexes`, "reads the same byte twice");
17
+ }
18
+ const encoding = field.encoding ?? "uint";
19
+ const required = WIDTHS[encoding];
20
+ if (required !== undefined && indexes.length !== required) {
21
+ throw customDeviceError(id, `${path}.encoding`, `"${encoding}" needs exactly ${required} bytes, but ${indexes.length} byte index(es) are declared`);
22
+ }
23
+ if (required === undefined && indexes.length > MAX_INTEGER_BYTES) {
24
+ throw customDeviceError(id, `${path}.byteIndexes`, `reads ${indexes.length} bytes; an integer field may read at most ${MAX_INTEGER_BYTES} bytes so the value stays exact in a JavaScript number`);
25
+ }
26
+ const outOfFrame = indexes.filter(i => i >= minLengthBytes);
27
+ if (outOfFrame.length > 0) {
28
+ throw customDeviceError(id, `${path}.byteIndexes`, `reads byte ${outOfFrame[0]}, which frame.minLengthBytes (${minLengthBytes}) does not guarantee is present`);
29
+ }
30
+ };
31
+ const assertArithmetic = (id, path, field) => {
32
+ const scale = field.scale ?? 1;
33
+ if (!Number.isFinite(scale) || scale === 0) {
34
+ throw customDeviceError(id, `${path}.scale`, "must be a finite, non-zero number");
35
+ }
36
+ if (!Number.isFinite(field.offset ?? 0)) {
37
+ throw customDeviceError(id, `${path}.offset`, "must be a finite number");
38
+ }
39
+ const decimals = field.decimals;
40
+ if (decimals !== undefined && (!Number.isInteger(decimals) || decimals < 0 || decimals > 6)) {
41
+ throw customDeviceError(id, `${path}.decimals`, "must be a whole number between 0 and 6");
42
+ }
43
+ };
44
+
45
+ /** Validates one declared field against the measurement catalog and resolves its defaults. */
46
+ export const compileCustomField = (id, path, field, measurementTypeKey, minLengthBytes) => {
47
+ const catalog = measurementFieldCatalog[measurementTypeKey];
48
+ const known = catalog?.[field.name];
49
+ if (!catalog || !known) {
50
+ throw customDeviceError(id, `${path}.name`, `"${field.name}" is not a property of ${measurementTypeKey}; expected one of ${Object.keys(catalog ?? {}).join(", ")}`);
51
+ }
52
+ if (field.unit !== known.unit) {
53
+ throw customDeviceError(id, `${path}.unit`, `is "${field.unit}"; expected "${known.unit}", the canonical unit of ${field.name}. Convert with scale instead of changing the unit`);
54
+ }
55
+ assertByteIndexes(id, path, field, minLengthBytes);
56
+ assertArithmetic(id, path, field);
57
+ const min = field.min ?? known.min;
58
+ const max = field.max ?? known.max;
59
+ if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) {
60
+ throw customDeviceError(id, `${path}`, `declares min ${min} and max ${max}; min must be below max`);
61
+ }
62
+ if (min < known.min || max > known.max) {
63
+ throw customDeviceError(id, `${path}`, `declares ${min}-${max} ${known.unit}, which is outside the accepted range for ${field.name} (${known.min}-${known.max} ${known.unit})`);
64
+ }
65
+ const indexes = [...field.byteIndexes];
66
+ return {
67
+ name: field.name,
68
+ byteIndexes: field.byteOrder === "little" ? indexes.reverse() : indexes,
69
+ encoding: field.encoding ?? "uint",
70
+ scale: field.scale ?? 1,
71
+ offset: field.offset ?? 0,
72
+ decimals: field.decimals,
73
+ unit: known.unit,
74
+ min,
75
+ max
76
+ };
77
+ };
78
+ //# sourceMappingURL=compile-custom-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["measurementFieldCatalog","customDeviceError","MAX_INTEGER_BYTES","WIDTHS","sfloat","float","assertByteIndexes","id","path","field","minLengthBytes","indexes","byteIndexes","Array","isArray","length","some","i","Number","isInteger","Set","size","encoding","required","undefined","outOfFrame","filter","assertArithmetic","scale","isFinite","offset","decimals","compileCustomField","measurementTypeKey","catalog","known","name","Object","keys","join","unit","min","max","byteOrder","reverse"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/compile-custom-field.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ import { customDeviceError } from "./custom-device-error.js";
4
+ const HEX_BYTE = /^[0-9a-f]{2}$/;
5
+
6
+ /**
7
+ * Checks that a frame declaration can actually recognise a complete package, and returns a
8
+ * frozen, lower-cased copy of it.
9
+ *
10
+ * The copy matters twice. The received buffer is always lower-case hex, so a header declared
11
+ * as ["AA","55"] would never match and the device would silently produce nothing until the
12
+ * stuck-data timeout. And the runtime must not read an object the caller still holds a
13
+ * reference to: mutating the declaration after registration would otherwise move byte offsets
14
+ * that were bounds-checked at registration.
15
+ */
16
+ export const compileCustomFrame = (id, path, frame) => {
17
+ const minLengthBytes = frame?.minLengthBytes;
18
+ if (!Number.isInteger(minLengthBytes) || minLengthBytes < 1) {
19
+ throw customDeviceError(id, `${path}.minLengthBytes`, "must be a whole number of at least 1");
20
+ }
21
+ const declaredHeader = frame.header ?? [];
22
+ if (!Array.isArray(declaredHeader)) {
23
+ throw customDeviceError(id, `${path}.header`, "must be a list of hex bytes");
24
+ }
25
+ const header = declaredHeader.map(byte => String(byte).toLowerCase());
26
+ if (header.some(byte => !HEX_BYTE.test(byte))) {
27
+ throw customDeviceError(id, `${path}.header`, 'must be a list of single hex bytes, e.g. ["aa", "55"]');
28
+ }
29
+ if (header.length > minLengthBytes) {
30
+ throw customDeviceError(id, `${path}.header`, `is ${header.length} bytes, which does not fit inside minLengthBytes (${minLengthBytes})`);
31
+ }
32
+ const length = frame.length;
33
+ if (!length) {
34
+ return Object.freeze({
35
+ header: Object.freeze(header),
36
+ minLengthBytes
37
+ });
38
+ }
39
+ if (!Number.isInteger(length.index) || length.index < 0) {
40
+ throw customDeviceError(id, `${path}.length.index`, "must be a byte offset of at least 0");
41
+ }
42
+ if (length.widthBytes !== 1 && length.widthBytes !== 2) {
43
+ throw customDeviceError(id, `${path}.length.widthBytes`, "must be 1 or 2");
44
+ }
45
+ if (!Number.isInteger(length.overheadBytes) || length.overheadBytes < 0) {
46
+ throw customDeviceError(id, `${path}.length.overheadBytes`, "must be a whole number of at least 0");
47
+ }
48
+ if (length.index + length.widthBytes > minLengthBytes) {
49
+ throw customDeviceError(id, `${path}.length`, `reads bytes ${length.index}-${length.index + length.widthBytes - 1}, which frame.minLengthBytes (${minLengthBytes}) does not guarantee are present`);
50
+ }
51
+ return Object.freeze({
52
+ header: Object.freeze(header),
53
+ minLengthBytes,
54
+ length: Object.freeze({
55
+ ...length
56
+ })
57
+ });
58
+ };
59
+ //# sourceMappingURL=compile-custom-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["customDeviceError","HEX_BYTE","compileCustomFrame","id","path","frame","minLengthBytes","Number","isInteger","declaredHeader","header","Array","isArray","map","byte","String","toLowerCase","some","test","length","Object","freeze","index","widthBytes","overheadBytes"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/compile-custom-frame.ts"],"mappings":";;AAEA,SAASA,iBAAiB,QAAQ,0BAAuB;AAEzD,MAAMC,QAAQ,GAAG,eAAe;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,GAAGA,CAChCC,EAAU,EACVC,IAAY,EACZC,KAAsB,KACF;EACpB,MAAMC,cAAc,GAAGD,KAAK,EAAEC,cAAc;EAE5C,IAAI,CAACC,MAAM,CAACC,SAAS,CAACF,cAAc,CAAC,IAAIA,cAAc,GAAG,CAAC,EAAE;IAC3D,MAAMN,iBAAiB,CACrBG,EAAE,EACF,GAAGC,IAAI,iBAAiB,EACxB,sCACF,CAAC;EACH;EAEA,MAAMK,cAAc,GAAGJ,KAAK,CAACK,MAAM,IAAI,EAAE;EAEzC,IAAI,CAACC,KAAK,CAACC,OAAO,CAACH,cAAc,CAAC,EAAE;IAClC,MAAMT,iBAAiB,CAACG,EAAE,EAAE,GAAGC,IAAI,SAAS,EAAE,6BAA6B,CAAC;EAC9E;EAEA,MAAMM,MAAM,GAAGD,cAAc,CAACI,GAAG,CAAEC,IAAI,IAAKC,MAAM,CAACD,IAAI,CAAC,CAACE,WAAW,CAAC,CAAC,CAAC;EAEvE,IAAIN,MAAM,CAACO,IAAI,CAAEH,IAAI,IAAK,CAACb,QAAQ,CAACiB,IAAI,CAACJ,IAAI,CAAC,CAAC,EAAE;IAC/C,MAAMd,iBAAiB,CACrBG,EAAE,EACF,GAAGC,IAAI,SAAS,EAChB,uDACF,CAAC;EACH;EAEA,IAAIM,MAAM,CAACS,MAAM,GAAGb,cAAc,EAAE;IAClC,MAAMN,iBAAiB,CACrBG,EAAE,EACF,GAAGC,IAAI,SAAS,EAChB,MAAMM,MAAM,CAACS,MAAM,qDAAqDb,cAAc,GACxF,CAAC;EACH;EAEA,MAAMa,MAAM,GAAGd,KAAK,CAACc,MAAM;EAE3B,IAAI,CAACA,MAAM,EAAE;IACX,OAAOC,MAAM,CAACC,MAAM,CAAC;MACnBX,MAAM,EAAEU,MAAM,CAACC,MAAM,CAACX,MAAM,CAAa;MACzCJ;IACF,CAAC,CAAC;EACJ;EAEA,IAAI,CAACC,MAAM,CAACC,SAAS,CAACW,MAAM,CAACG,KAAK,CAAC,IAAIH,MAAM,CAACG,KAAK,GAAG,CAAC,EAAE;IACvD,MAAMtB,iBAAiB,CACrBG,EAAE,EACF,GAAGC,IAAI,eAAe,EACtB,qCACF,CAAC;EACH;EAEA,IAAIe,MAAM,CAACI,UAAU,KAAK,CAAC,IAAIJ,MAAM,CAACI,UAAU,KAAK,CAAC,EAAE;IACtD,MAAMvB,iBAAiB,CAACG,EAAE,EAAE,GAAGC,IAAI,oBAAoB,EAAE,gBAAgB,CAAC;EAC5E;EAEA,IAAI,CAACG,MAAM,CAACC,SAAS,CAACW,MAAM,CAACK,aAAa,CAAC,IAAIL,MAAM,CAACK,aAAa,GAAG,CAAC,EAAE;IACvE,MAAMxB,iBAAiB,CACrBG,EAAE,EACF,GAAGC,IAAI,uBAAuB,EAC9B,sCACF,CAAC;EACH;EAEA,IAAIe,MAAM,CAACG,KAAK,GAAGH,MAAM,CAACI,UAAU,GAAGjB,cAAc,EAAE;IACrD,MAAMN,iBAAiB,CACrBG,EAAE,EACF,GAAGC,IAAI,SAAS,EAChB,eAAee,MAAM,CAACG,KAAK,IAAIH,MAAM,CAACG,KAAK,GAAGH,MAAM,CAACI,UAAU,GAAG,CAAC,iCAAiCjB,cAAc,kCACpH,CAAC;EACH;EAEA,OAAOc,MAAM,CAACC,MAAM,CAAC;IACnBX,MAAM,EAAEU,MAAM,CAACC,MAAM,CAACX,MAAM,CAAa;IACzCJ,cAAc;IACda,MAAM,EAAEC,MAAM,CAACC,MAAM,CAAC;MAAE,GAAGF;IAAO,CAAC;EACrC,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ import { compileCustomCase } from "./compile-custom-case.js";
4
+ import { compileCustomFrame } from "./compile-custom-frame.js";
5
+ import { customDeviceError } from "./custom-device-error.js";
6
+ import { normalizeBleUuid } from "./normalize-ble-uuid.js";
7
+ const HEX = /^[0-9a-f]*$/;
8
+ const assertSelectorBytes = (id, path, monitor, frame) => {
9
+ const selectorBytes = monitor.caseSelectorBytes;
10
+ if (selectorBytes === undefined) {
11
+ if (monitor.cases.length !== 1 || monitor.cases[0]?.selector !== "") {
12
+ throw customDeviceError(id, `${path}.caseSelectorBytes`, "is required unless the characteristic has exactly one case with an empty selector");
13
+ }
14
+ return [];
15
+ }
16
+ if (!Array.isArray(selectorBytes) || selectorBytes.length === 0 || selectorBytes.some(i => !Number.isInteger(i) || i < 0)) {
17
+ throw customDeviceError(id, `${path}.caseSelectorBytes`, "must be a non-empty list of byte offsets that are integers of at least 0");
18
+ }
19
+ const outOfFrame = selectorBytes.filter(i => i >= frame.minLengthBytes);
20
+ if (outOfFrame.length > 0) {
21
+ throw customDeviceError(id, `${path}.caseSelectorBytes`, `reads byte ${outOfFrame[0]}, which frame.minLengthBytes (${frame.minLengthBytes}) does not guarantee is present`);
22
+ }
23
+ return selectorBytes;
24
+ };
25
+ const assertSelector = (id, path, selector, selectorBytes, seen) => {
26
+ const value = String(selector ?? "").toLowerCase();
27
+ const expected = selectorBytes.length * 2;
28
+ if (!HEX.test(value)) {
29
+ throw customDeviceError(id, `${path}.selector`, `is "${selector}", which is not hex`);
30
+ }
31
+ if (value.length !== expected) {
32
+ throw customDeviceError(id, `${path}.selector`, `is ${value.length} hex digits but caseSelectorBytes declares ${selectorBytes.length} byte(s), so it must be ${expected}`);
33
+ }
34
+ if (seen.has(value)) {
35
+ throw customDeviceError(id, `${path}.selector`, `has the same selector "${value}" as an earlier case, which would silently shadow it`);
36
+ }
37
+ seen.add(value);
38
+ };
39
+
40
+ /** Validates one notify characteristic and turns it into a parsing model and a frame. */
41
+ export const compileCustomMonitor = (id, path, monitor, fields) => {
42
+ if (typeof monitor !== "object" || monitor === null) {
43
+ throw customDeviceError(id, path, "must be a monitor characteristic object");
44
+ }
45
+ const uuid = normalizeBleUuid(id, `${path}.uuid`, monitor.uuid);
46
+ const frame = compileCustomFrame(id, `${path}.frame`, monitor.frame);
47
+ if (!Array.isArray(monitor.cases) || monitor.cases.length === 0) {
48
+ throw customDeviceError(id, `${path}.cases`, "must declare at least one case");
49
+ }
50
+ const selectorBytes = assertSelectorBytes(id, path, monitor, frame);
51
+ const seen = new Set();
52
+ const cases = monitor.cases.map((caseSpec, index) => {
53
+ const casePath = `${path}.cases[${index}]`;
54
+ if (typeof caseSpec !== "object" || caseSpec === null) {
55
+ throw customDeviceError(id, casePath, "must be a case object");
56
+ }
57
+ assertSelector(id, casePath, caseSpec.selector, selectorBytes, seen);
58
+ return compileCustomCase(id, casePath, caseSpec, frame.minLengthBytes, fields);
59
+ });
60
+ return {
61
+ characteristic: {
62
+ uuid,
63
+ parsingModel: {
64
+ caseValuePosition: selectorBytes.length > 0 ? selectorBytes : undefined,
65
+ cases
66
+ }
67
+ },
68
+ frame
69
+ };
70
+ };
71
+ //# sourceMappingURL=compile-custom-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["compileCustomCase","compileCustomFrame","customDeviceError","normalizeBleUuid","HEX","assertSelectorBytes","id","path","monitor","frame","selectorBytes","caseSelectorBytes","undefined","cases","length","selector","Array","isArray","some","i","Number","isInteger","outOfFrame","filter","minLengthBytes","assertSelector","seen","value","String","toLowerCase","expected","test","has","add","compileCustomMonitor","fields","uuid","Set","map","caseSpec","index","casePath","characteristic","parsingModel","caseValuePosition"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/compile-custom-monitor.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Every registration failure names the exact position in the declaration, because the
5
+ * author is looking at a datasheet and needs to know which line of it is wrong.
6
+ */
7
+ export const customDeviceError = (id, path, message) => new Error(`Custom device "${id}": ${path} ${message}`);
8
+ //# sourceMappingURL=custom-device-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["customDeviceError","id","path","message","Error"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/custom-device-error.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA,OAAO,MAAMA,iBAAiB,GAAGA,CAC/BC,EAAU,EACVC,IAAY,EACZC,OAAe,KACL,IAAIC,KAAK,CAAC,kBAAkBH,EAAE,MAAMC,IAAI,IAAIC,OAAO,EAAE,CAAC","ignoreList":[]}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ import { CUSTOM_DEVICE_BRAND } from "../../constants/custom-device-brand.js";
4
+ import { IntegratedDevices } from "../../types/integrated-devices.js";
5
+ import { compileCustomMonitor } from "./compile-custom-monitor.js";
6
+ import { customDeviceError } from "./custom-device-error.js";
7
+ import { normalizeBleUuid } from "./normalize-ble-uuid.js";
8
+ const MIN_STUCK_TIMEOUT_MS = 1_000;
9
+
10
+ // The SDK's own F4 scale waits this long, because it sleeps while still connected.
11
+ const MAX_STUCK_TIMEOUT_MS = 6_000_000;
12
+ const HEX_BYTES = /^([0-9a-f]{2})+$/;
13
+ const assertIdentity = spec => {
14
+ const id = typeof spec?.id === "string" ? spec.id.trim() : "";
15
+ if (!id) {
16
+ throw customDeviceError(String(spec?.id), "id", "must not be empty");
17
+ }
18
+ const builtIn = Object.values(IntegratedDevices).find(name => name.toLowerCase() === id.toLowerCase());
19
+ if (builtIn) {
20
+ throw customDeviceError(id, "id", `collides with the built-in device "${builtIn}"`);
21
+ }
22
+ return id;
23
+ };
24
+ const compileNameMatch = (id, spec) => {
25
+ const nameMatch = spec.nameMatch;
26
+ if (nameMatch instanceof RegExp) {
27
+ if (nameMatch.global || nameMatch.sticky) {
28
+ throw customDeviceError(id, "nameMatch", `must not use the ${nameMatch.global ? "global" : "sticky"} flag, because it makes RegExp.test advance lastIndex and alternate between true and false across scan results`);
29
+ }
30
+ return nameMatch;
31
+ }
32
+ const exact = typeof nameMatch === "string" ? nameMatch.trim() : "";
33
+ if (!exact) {
34
+ throw customDeviceError(id, "nameMatch", "must not be empty");
35
+ }
36
+ return new RegExp(`^${exact.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`);
37
+ };
38
+ const assertStuckTimeout = (id, spec) => {
39
+ const timeout = spec.stuckDataTimeoutMs;
40
+ if (!Number.isInteger(timeout) || timeout < MIN_STUCK_TIMEOUT_MS || timeout > MAX_STUCK_TIMEOUT_MS) {
41
+ throw customDeviceError(id, "stuckDataTimeoutMs", `must be a whole number of milliseconds between ${MIN_STUCK_TIMEOUT_MS} and ${MAX_STUCK_TIMEOUT_MS}`);
42
+ }
43
+ return timeout;
44
+ };
45
+ const compileWrite = (id, path, write) => {
46
+ if (!write) {
47
+ return undefined;
48
+ }
49
+ const commandHex = String(write.commandHex ?? "").toLowerCase();
50
+ if (!HEX_BYTES.test(commandHex)) {
51
+ throw customDeviceError(id, `${path}.write.commandHex`, `is "${write.commandHex}"; it must be an even number of hex digits`);
52
+ }
53
+ return {
54
+ uuid: normalizeBleUuid(id, `${path}.write.uuid`, write.uuid),
55
+ mainCommandUuid: commandHex
56
+ };
57
+ };
58
+
59
+ /**
60
+ * Validates a declaration and compiles it into a runnable device.
61
+ *
62
+ * Every rule the declarative decoder relies on is checked here, at registration, because the
63
+ * alternative is a plausible wrong number at read time. Registration fails loudly - it
64
+ * throws, naming the exact position in the declaration - and a device that fails to compile
65
+ * is never scanned for.
66
+ */
67
+ export const defineCustomDevice = spec => {
68
+ const id = assertIdentity(spec);
69
+ const nameMatch = compileNameMatch(id, spec);
70
+ const stuckDataTimeout = assertStuckTimeout(id, spec);
71
+ if (!Array.isArray(spec.services) || spec.services.length === 0) {
72
+ throw customDeviceError(id, "services", "must declare at least one service");
73
+ }
74
+ const fields = new Map();
75
+ const frames = new Map();
76
+ const seenCharacteristics = new Set();
77
+ const mainServices = spec.services.map((service, serviceIndex) => {
78
+ const path = `services[${serviceIndex}]`;
79
+ if (typeof service !== "object" || service === null) {
80
+ throw customDeviceError(id, path, "must be a service object");
81
+ }
82
+ if (!Array.isArray(service.monitor) || service.monitor.length === 0) {
83
+ throw customDeviceError(id, `${path}.monitor`, "must declare at least one monitor characteristic");
84
+ }
85
+ const monitorUuids = service.monitor.map((monitor, monitorIndex) => {
86
+ const monitorPath = `${path}.monitor[${monitorIndex}]`;
87
+ const {
88
+ characteristic,
89
+ frame
90
+ } = compileCustomMonitor(id, monitorPath, monitor, fields);
91
+ if (seenCharacteristics.has(characteristic.uuid)) {
92
+ throw customDeviceError(id, `${monitorPath}.uuid`, `is declared twice; a characteristic may appear only once`);
93
+ }
94
+ seenCharacteristics.add(characteristic.uuid);
95
+ frames.set(characteristic.uuid, frame);
96
+ return characteristic;
97
+ });
98
+ return {
99
+ uuid: normalizeBleUuid(id, `${path}.uuid`, service.uuid),
100
+ monitorUuids,
101
+ writeUuid: compileWrite(id, path, service.write)
102
+ };
103
+ });
104
+ return {
105
+ [CUSTOM_DEVICE_BRAND]: true,
106
+ id: id,
107
+ spec,
108
+ nameMatch,
109
+ mainServices,
110
+ stuckDataTimeout,
111
+ fields,
112
+ frames
113
+ };
114
+ };
115
+ //# sourceMappingURL=define-custom-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CUSTOM_DEVICE_BRAND","IntegratedDevices","compileCustomMonitor","customDeviceError","normalizeBleUuid","MIN_STUCK_TIMEOUT_MS","MAX_STUCK_TIMEOUT_MS","HEX_BYTES","assertIdentity","spec","id","trim","String","builtIn","Object","values","find","name","toLowerCase","compileNameMatch","nameMatch","RegExp","global","sticky","exact","replace","assertStuckTimeout","timeout","stuckDataTimeoutMs","Number","isInteger","compileWrite","path","write","undefined","commandHex","test","uuid","mainCommandUuid","defineCustomDevice","stuckDataTimeout","Array","isArray","services","length","fields","Map","frames","seenCharacteristics","Set","mainServices","map","service","serviceIndex","monitor","monitorUuids","monitorIndex","monitorPath","characteristic","frame","has","add","set","writeUuid"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/define-custom-device.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ import { customDeviceError } from "./custom-device-error.js";
4
+ const BASE_UUID_SUFFIX = "-0000-1000-8000-00805f9b34fb";
5
+ const SHORT = /^[0-9a-f]{4}$/;
6
+ const MEDIUM = /^[0-9a-f]{8}$/;
7
+ const FULL = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
8
+
9
+ /**
10
+ * Accepts a 16-bit, 32-bit or 128-bit UUID and returns the 128-bit form, because that is
11
+ * what react-native-ble-plx reports back on a notification and what the parsing model is
12
+ * matched against.
13
+ */
14
+ export const normalizeBleUuid = (id, path, value) => {
15
+ const raw = typeof value === "string" ? value.trim().toLowerCase() : "";
16
+ if (SHORT.test(raw)) {
17
+ return `0000${raw}${BASE_UUID_SUFFIX}`;
18
+ }
19
+ if (MEDIUM.test(raw)) {
20
+ return `${raw}${BASE_UUID_SUFFIX}`;
21
+ }
22
+ if (FULL.test(raw)) {
23
+ return raw;
24
+ }
25
+ throw customDeviceError(id, path, `is "${String(value)}", which is not a 16-bit, 32-bit or 128-bit Bluetooth UUID`);
26
+ };
27
+ //# sourceMappingURL=normalize-ble-uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["customDeviceError","BASE_UUID_SUFFIX","SHORT","MEDIUM","FULL","normalizeBleUuid","id","path","value","raw","trim","toLowerCase","test","String"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/custom/normalize-ble-uuid.ts"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,0BAAuB;AAEzD,MAAMC,gBAAgB,GAAG,8BAA8B;AACvD,MAAMC,KAAK,GAAG,eAAe;AAC7B,MAAMC,MAAM,GAAG,eAAe;AAE9B,MAAMC,IAAI,GACR,gEAAgE;;AAElE;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAGA,CAC9BC,EAAU,EACVC,IAAY,EACZC,KAAc,KACH;EACX,MAAMC,GAAG,GAAG,OAAOD,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAG,EAAE;EAEvE,IAAIT,KAAK,CAACU,IAAI,CAACH,GAAG,CAAC,EAAE;IACnB,OAAO,OAAOA,GAAG,GAAGR,gBAAgB,EAAE;EACxC;EAEA,IAAIE,MAAM,CAACS,IAAI,CAACH,GAAG,CAAC,EAAE;IACpB,OAAO,GAAGA,GAAG,GAAGR,gBAAgB,EAAE;EACpC;EAEA,IAAIG,IAAI,CAACQ,IAAI,CAACH,GAAG,CAAC,EAAE;IAClB,OAAOA,GAAG;EACZ;EAEA,MAAMT,iBAAiB,CACrBM,EAAE,EACFC,IAAI,EACJ,OAAOM,MAAM,CAACL,KAAK,CAAC,4DACtB,CAAC;AACH,CAAC","ignoreList":[]}
@@ -2,28 +2,55 @@
2
2
 
3
3
  import { integratedDevicesMap } from "../constants/integrated-devices-map.js";
4
4
  import { IntegratedDevices } from "../types/integrated-devices.js";
5
+ import { isCustomDeviceDefinition } from "../utils/is-custom-device-definition.js";
5
6
  import { BC01Device } from "./devices/bc01/bc01.device.js";
6
7
  import { BP2Device } from "./devices/bp2/bp2.device.js";
8
+ import { CustomDevice } from "./devices/custom/custom.device.js";
7
9
  import { F4Device } from "./devices/f4/f4.device.js";
8
10
  import { SPO2Device } from "./devices/spo/spo2.device.js";
11
+ const collectCustomDevices = acceptedDevices => {
12
+ const customDevices = new Map();
13
+ const matchers = new Set();
14
+ acceptedDevices.forEach((entry, index) => {
15
+ if (typeof entry === "string") {
16
+ return;
17
+ }
18
+ if (!isCustomDeviceDefinition(entry)) {
19
+ throw new Error(`acceptedDevices[${index}] is not a device registered with defineCustomDevice`);
20
+ }
21
+ if (customDevices.has(entry.id)) {
22
+ throw new Error(`acceptedDevices[${index}] registers the custom device "${entry.id}" twice`);
23
+ }
24
+ if (matchers.has(entry.nameMatch.source)) {
25
+ throw new Error(`acceptedDevices[${index}] ("${entry.id}") matches the same advertised name as an earlier custom device, so one would silently shadow the other`);
26
+ }
27
+ customDevices.set(entry.id, entry);
28
+ matchers.add(entry.nameMatch.source);
29
+ });
30
+ return customDevices;
31
+ };
9
32
  export class DeviceCreator {
10
33
  deviceNameCache = new Map();
11
34
  CACHE_MAX_SIZE = 100;
12
35
  constructor(acceptedDeviceNames) {
13
36
  this.acceptedDeviceNames = acceptedDeviceNames;
37
+ this.customDevices = collectCustomDevices(acceptedDeviceNames);
14
38
  }
15
39
  getDeviceName = foundName => {
16
- const deviceName = this.getIntegratedDeviceName(foundName);
17
- if (!deviceName) {
18
- return;
40
+ if (!foundName) {
41
+ return undefined;
19
42
  }
20
- if (!this.acceptedDeviceNames.some(name => name === deviceName)) {
21
- return;
43
+ if (this.deviceNameCache.has(foundName)) {
44
+ return this.deviceNameCache.get(foundName) ?? undefined;
22
45
  }
23
- return deviceName;
46
+ const matched = this.matchDeviceName(foundName);
47
+
48
+ // Cache the result (store null for non-matches to avoid repeated tests)
49
+ this.cacheDeviceName(foundName, matched ?? null);
50
+ return matched;
24
51
  };
25
52
  createDevice(params) {
26
- if (!params.deviceName.trim()) {
53
+ if (!String(params.deviceName ?? "").trim()) {
27
54
  throw new Error("Device name is required");
28
55
  }
29
56
  if (!params.device) {
@@ -35,6 +62,11 @@ export class DeviceCreator {
35
62
  if (!params.device.id) {
36
63
  throw new Error("Device ID is required");
37
64
  }
65
+ const custom = this.customDevices.get(params.deviceName);
66
+ if (custom) {
67
+ // @ts-expect-error - the caller asked for this custom device by its own id
68
+ return new CustomDevice(params.device, params, custom);
69
+ }
38
70
  const deviceMap = {
39
71
  [IntegratedDevices.BP2]: BP2Device,
40
72
  [IntegratedDevices.F4]: F4Device,
@@ -52,29 +84,23 @@ export class DeviceCreator {
52
84
  destroy = () => {
53
85
  this.deviceNameCache.clear();
54
86
  };
55
- getIntegratedDeviceName = deviceName => {
56
- if (!deviceName) {
57
- return undefined;
58
- }
59
-
60
- // Check cache first
61
- if (this.deviceNameCache.has(deviceName)) {
62
- const cached = this.deviceNameCache.get(deviceName);
63
- return cached ?? undefined;
64
- }
65
87
 
66
- // Not in cache - test regexes with early return
67
- let matchedDevice;
88
+ /**
89
+ * A built-in device always wins over a declaration: its decoder is compiled and tested,
90
+ * and a declaration that happens to match the same advertised name must not displace it.
91
+ */
92
+ matchDeviceName = deviceName => {
68
93
  for (const [regex, deviceType] of integratedDevicesMap) {
69
- if (regex.test(deviceName)) {
70
- matchedDevice = deviceType;
71
- break; // Early return!
94
+ if (regex.test(deviceName) && this.acceptedDeviceNames.some(name => name === deviceType)) {
95
+ return deviceType;
72
96
  }
73
97
  }
74
-
75
- // Cache result (store null for non-matches to avoid repeated tests)
76
- this.cacheDeviceName(deviceName, matchedDevice ?? null);
77
- return matchedDevice;
98
+ for (const custom of this.customDevices.values()) {
99
+ if (custom.nameMatch.test(deviceName)) {
100
+ return custom.id;
101
+ }
102
+ }
103
+ return undefined;
78
104
  };
79
105
  cacheDeviceName(deviceName, deviceType) {
80
106
  // Implement simple LRU by clearing oldest entries when cache is full
@@ -1 +1 @@
1
- {"version":3,"names":["integratedDevicesMap","IntegratedDevices","BC01Device","BP2Device","F4Device","SPO2Device","DeviceCreator","deviceNameCache","Map","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","deviceName","getIntegratedDeviceName","some","name","createDevice","params","trim","Error","device","id","deviceMap","BP2","F4","PC60WF","BC01","deviceClass","destroy","clear","undefined","has","cached","get","matchedDevice","regex","deviceType","test","cacheDeviceName","size","firstKey","keys","next","value","delete","set"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["integratedDevicesMap","IntegratedDevices","isCustomDeviceDefinition","BC01Device","BP2Device","CustomDevice","F4Device","SPO2Device","collectCustomDevices","acceptedDevices","customDevices","Map","matchers","Set","forEach","entry","index","Error","has","id","nameMatch","source","set","add","DeviceCreator","deviceNameCache","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","undefined","get","matched","matchDeviceName","cacheDeviceName","createDevice","params","String","deviceName","trim","device","name","custom","deviceMap","BP2","F4","PC60WF","BC01","deviceClass","destroy","clear","regex","deviceType","test","some","values","size","firstKey","keys","next","value","delete"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
@@ -4,7 +4,16 @@ import { CaseType } from "../../types/case-type.js";
4
4
  import { DeviceStatus } from "../../types/device-status.js";
5
5
  import { parseMeasurement } from "../../utils/parse-measurement.js";
6
6
  export class BTDataProcessor {
7
- collectedValues = [];
7
+ /**
8
+ * One buffer per characteristic.
9
+ *
10
+ * A frame that is still incomplete stays buffered until the rest of it arrives, so a
11
+ * shared buffer would prepend one characteristic's leftover bytes to the next
12
+ * characteristic's notification. Every declared byte offset is absolute, so that frame
13
+ * would then be decoded at a shifted offset - a plausible wrong reading rather than an
14
+ * error. Keeping the buffers apart makes that impossible.
15
+ */
16
+ buffers = new Map();
8
17
  isMeasuring = false;
9
18
  constructor(device, mainServices, stuckDataTimeoutDuration, callbacks) {
10
19
  this.device = device;
@@ -12,16 +21,24 @@ export class BTDataProcessor {
12
21
  this.stuckDataTimeoutDuration = stuckDataTimeoutDuration;
13
22
  this.callbacks = callbacks;
14
23
  }
24
+ get collectedValues() {
25
+ return this.buffers.get(this.currentUuid) ?? [];
26
+ }
27
+ currentUuid = "";
15
28
  destroy = () => {
16
- this.collectedValues = [];
29
+ this.buffers.clear();
30
+ this.currentUuid = "";
17
31
  this.isMeasuring = false;
18
32
  clearTimeout(this.stuckDataTimeout);
19
33
  this.stuckDataTimeout = undefined;
20
34
  };
21
35
  processData = (uuid, hexValue) => {
22
- this.collectedValues.push(...hexValue);
36
+ this.currentUuid = String(uuid ?? "").toLowerCase();
37
+ const buffer = this.buffers.get(this.currentUuid) ?? [];
38
+ buffer.push(...hexValue);
39
+ this.buffers.set(this.currentUuid, buffer);
23
40
  this.startStuckTimeout();
24
- const isValid = this.callbacks.validatePackage(this.collectedValues, uuid);
41
+ const isValid = this.callbacks.validatePackage(buffer, uuid);
25
42
  if (!isValid) {
26
43
  return;
27
44
  }
@@ -111,7 +128,7 @@ export class BTDataProcessor {
111
128
  }
112
129
  }
113
130
  resetDataAndSendCommandToDevice = () => {
114
- this.collectedValues = [];
131
+ this.buffers.set(this.currentUuid, []);
115
132
  this.callbacks.onSendCommandToDevice?.();
116
133
  };
117
134
  startStuckTimeout = () => {