@ovok/native 1.16.1-dev.2133 → 1.16.1-dev.2139

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 (243) hide show
  1. package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js +1 -0
  2. package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
  3. package/lib/commonjs/modules/bt-management/hooks/runtime-context.js.map +1 -1
  4. package/lib/commonjs/modules/bt-management/index.js +12 -0
  5. package/lib/commonjs/modules/bt-management/index.js.map +1 -1
  6. package/lib/commonjs/modules/bt-management/services/bt-manager.js +50 -0
  7. package/lib/commonjs/modules/bt-management/services/bt-manager.js.map +1 -1
  8. package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js +3 -0
  9. package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js.map +1 -1
  10. package/lib/commonjs/modules/bt-management/services/devices/bt-command-writer.js +4 -2
  11. package/lib/commonjs/modules/bt-management/services/devices/bt-command-writer.js.map +1 -1
  12. package/lib/commonjs/modules/bt-management/services/devices/bt-connection-handler.js +97 -28
  13. package/lib/commonjs/modules/bt-management/services/devices/bt-connection-handler.js.map +1 -1
  14. package/lib/commonjs/modules/bt-management/services/devices/bt-current-time.js +59 -0
  15. package/lib/commonjs/modules/bt-management/services/devices/bt-current-time.js.map +1 -0
  16. package/lib/commonjs/modules/bt-management/services/devices/bt-device-information.js +18 -37
  17. package/lib/commonjs/modules/bt-management/services/devices/bt-device-information.js.map +1 -1
  18. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js +17 -1
  19. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  20. package/lib/commonjs/modules/bt-management/services/devices/bt-notification-readiness.js +68 -0
  21. package/lib/commonjs/modules/bt-management/services/devices/bt-notification-readiness.js.map +1 -0
  22. package/lib/commonjs/modules/bt-management/services/devices/bt-pairing-retry.js +70 -0
  23. package/lib/commonjs/modules/bt-management/services/devices/bt-pairing-retry.js.map +1 -0
  24. package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js +14 -0
  25. package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js.map +1 -1
  26. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.js +77 -0
  27. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.js.map +1 -0
  28. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.js +49 -0
  29. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.js.map +1 -0
  30. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.js +89 -0
  31. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.js.map +1 -0
  32. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose.js +35 -42
  33. package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose.js.map +1 -1
  34. package/lib/commonjs/modules/bt-management/services/record-cursor.js +70 -0
  35. package/lib/commonjs/modules/bt-management/services/record-cursor.js.map +1 -0
  36. package/lib/commonjs/modules/bt-management/testing/fake-ble-manager.js +8 -0
  37. package/lib/commonjs/modules/bt-management/testing/fake-ble-manager.js.map +1 -1
  38. package/lib/commonjs/modules/bt-management/types/glucose-record-details.js +2 -0
  39. package/lib/commonjs/modules/bt-management/types/glucose-record-details.js.map +1 -0
  40. package/lib/commonjs/modules/bt-management/utils/result-identity.js +26 -13
  41. package/lib/commonjs/modules/bt-management/utils/result-identity.js.map +1 -1
  42. package/lib/commonjs/modules/bt-management/utils/wait.js +10 -0
  43. package/lib/commonjs/modules/bt-management/utils/wait.js.map +1 -0
  44. package/lib/commonjs/modules/next/bluetooth/ble-plx/ble-link.js +41 -4
  45. package/lib/commonjs/modules/next/bluetooth/ble-plx/ble-link.js.map +1 -1
  46. package/lib/commonjs/modules/next/bluetooth/connections.js +4 -0
  47. package/lib/commonjs/modules/next/bluetooth/connections.js.map +1 -1
  48. package/lib/commonjs/modules/next/bluetooth/driver.js +6 -0
  49. package/lib/commonjs/modules/next/bluetooth/driver.js.map +1 -1
  50. package/lib/commonjs/modules/next/bluetooth/react-native/ovok-sink.js +12 -1
  51. package/lib/commonjs/modules/next/bluetooth/react-native/ovok-sink.js.map +1 -1
  52. package/lib/commonjs/modules/next/bluetooth/readings.js +2 -1
  53. package/lib/commonjs/modules/next/bluetooth/readings.js.map +1 -1
  54. package/lib/commonjs/modules/next/bluetooth/stable-hash.js +16 -7
  55. package/lib/commonjs/modules/next/bluetooth/stable-hash.js.map +1 -1
  56. package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js +1 -0
  57. package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
  58. package/lib/module/modules/bt-management/hooks/runtime-context.js.map +1 -1
  59. package/lib/module/modules/bt-management/index.js +1 -0
  60. package/lib/module/modules/bt-management/index.js.map +1 -1
  61. package/lib/module/modules/bt-management/services/bt-manager.js +50 -0
  62. package/lib/module/modules/bt-management/services/bt-manager.js.map +1 -1
  63. package/lib/module/modules/bt-management/services/custom/define-custom-device.js +3 -0
  64. package/lib/module/modules/bt-management/services/custom/define-custom-device.js.map +1 -1
  65. package/lib/module/modules/bt-management/services/devices/bt-command-writer.js +4 -2
  66. package/lib/module/modules/bt-management/services/devices/bt-command-writer.js.map +1 -1
  67. package/lib/module/modules/bt-management/services/devices/bt-connection-handler.js +97 -28
  68. package/lib/module/modules/bt-management/services/devices/bt-connection-handler.js.map +1 -1
  69. package/lib/module/modules/bt-management/services/devices/bt-current-time.js +55 -0
  70. package/lib/module/modules/bt-management/services/devices/bt-current-time.js.map +1 -0
  71. package/lib/module/modules/bt-management/services/devices/bt-device-information.js +18 -37
  72. package/lib/module/modules/bt-management/services/devices/bt-device-information.js.map +1 -1
  73. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js +19 -3
  74. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  75. package/lib/module/modules/bt-management/services/devices/bt-notification-readiness.js +65 -0
  76. package/lib/module/modules/bt-management/services/devices/bt-notification-readiness.js.map +1 -0
  77. package/lib/module/modules/bt-management/services/devices/bt-pairing-retry.js +65 -0
  78. package/lib/module/modules/bt-management/services/devices/bt-pairing-retry.js.map +1 -0
  79. package/lib/module/modules/bt-management/services/devices/custom/custom.device.js +14 -0
  80. package/lib/module/modules/bt-management/services/devices/custom/custom.device.js.map +1 -1
  81. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.js +72 -0
  82. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.js.map +1 -0
  83. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.js +40 -0
  84. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.js.map +1 -0
  85. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.js +85 -0
  86. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.js.map +1 -0
  87. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose.js +25 -32
  88. package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose.js.map +1 -1
  89. package/lib/module/modules/bt-management/services/record-cursor.js +66 -0
  90. package/lib/module/modules/bt-management/services/record-cursor.js.map +1 -0
  91. package/lib/module/modules/bt-management/testing/fake-ble-manager.js +8 -0
  92. package/lib/module/modules/bt-management/testing/fake-ble-manager.js.map +1 -1
  93. package/lib/module/modules/bt-management/types/custom-device-definition.js +4 -0
  94. package/lib/module/modules/bt-management/types/custom-device-definition.js.map +1 -1
  95. package/lib/module/modules/bt-management/types/glucose-record-details.js +2 -0
  96. package/lib/module/modules/bt-management/types/glucose-record-details.js.map +1 -0
  97. package/lib/module/modules/bt-management/utils/result-identity.js +24 -12
  98. package/lib/module/modules/bt-management/utils/result-identity.js.map +1 -1
  99. package/lib/module/modules/bt-management/utils/wait.js +5 -0
  100. package/lib/module/modules/bt-management/utils/wait.js.map +1 -0
  101. package/lib/module/modules/next/bluetooth/ble-plx/ble-link.js +41 -4
  102. package/lib/module/modules/next/bluetooth/ble-plx/ble-link.js.map +1 -1
  103. package/lib/module/modules/next/bluetooth/connections.js +4 -0
  104. package/lib/module/modules/next/bluetooth/connections.js.map +1 -1
  105. package/lib/module/modules/next/bluetooth/driver.js +6 -0
  106. package/lib/module/modules/next/bluetooth/driver.js.map +1 -1
  107. package/lib/module/modules/next/bluetooth/react-native/ovok-sink.js +12 -1
  108. package/lib/module/modules/next/bluetooth/react-native/ovok-sink.js.map +1 -1
  109. package/lib/module/modules/next/bluetooth/readings.js +2 -1
  110. package/lib/module/modules/next/bluetooth/readings.js.map +1 -1
  111. package/lib/module/modules/next/bluetooth/stable-hash.js +15 -6
  112. package/lib/module/modules/next/bluetooth/stable-hash.js.map +1 -1
  113. package/lib/typescript/commonjs/src/modules/auth/hooks/use-sign-in.d.ts +1 -1
  114. package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
  115. package/lib/typescript/commonjs/src/modules/bt-management/hooks/runtime-context.d.ts +1 -1
  116. package/lib/typescript/commonjs/src/modules/bt-management/hooks/runtime-context.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts +1 -0
  118. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts.map +1 -1
  119. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts +20 -0
  120. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  121. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts +2 -1
  122. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -1
  123. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-command-writer.d.ts +3 -1
  124. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-command-writer.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-connection-handler.d.ts +14 -1
  126. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-connection-handler.d.ts.map +1 -1
  127. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-current-time.d.ts +11 -0
  128. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-current-time.d.ts.map +1 -0
  129. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-device-information.d.ts +2 -1
  130. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-device-information.d.ts.map +1 -1
  131. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +9 -1
  132. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  133. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-notification-readiness.d.ts +15 -0
  134. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-notification-readiness.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-pairing-retry.d.ts +21 -0
  136. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-pairing-retry.d.ts.map +1 -0
  137. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts +2 -0
  138. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -1
  139. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.d.ts +7 -0
  140. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.d.ts.map +1 -0
  141. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.d.ts +16 -0
  142. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.d.ts.map +1 -0
  143. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.d.ts +8 -0
  144. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.d.ts.map +1 -0
  145. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose.d.ts.map +1 -1
  146. package/lib/typescript/commonjs/src/modules/bt-management/services/record-cursor.d.ts +21 -0
  147. package/lib/typescript/commonjs/src/modules/bt-management/services/record-cursor.d.ts.map +1 -0
  148. package/lib/typescript/commonjs/src/modules/bt-management/testing/fake-ble-manager.d.ts.map +1 -1
  149. package/lib/typescript/commonjs/src/modules/bt-management/types/command-sequencer.d.ts +6 -2
  150. package/lib/typescript/commonjs/src/modules/bt-management/types/command-sequencer.d.ts.map +1 -1
  151. package/lib/typescript/commonjs/src/modules/bt-management/types/create-device-params.d.ts +3 -0
  152. package/lib/typescript/commonjs/src/modules/bt-management/types/create-device-params.d.ts.map +1 -1
  153. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts +14 -1
  154. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -1
  155. package/lib/typescript/commonjs/src/modules/bt-management/types/glucose-record-details.d.ts +33 -0
  156. package/lib/typescript/commonjs/src/modules/bt-management/types/glucose-record-details.d.ts.map +1 -0
  157. package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts +2 -0
  158. package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
  159. package/lib/typescript/commonjs/src/modules/bt-management/utils/result-identity.d.ts +5 -4
  160. package/lib/typescript/commonjs/src/modules/bt-management/utils/result-identity.d.ts.map +1 -1
  161. package/lib/typescript/commonjs/src/modules/bt-management/utils/wait.d.ts +3 -0
  162. package/lib/typescript/commonjs/src/modules/bt-management/utils/wait.d.ts.map +1 -0
  163. package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-progress-manager.d.ts +1 -1
  164. package/lib/typescript/commonjs/src/modules/next/bluetooth/ble-plx/ble-link.d.ts +1 -1
  165. package/lib/typescript/commonjs/src/modules/next/bluetooth/ble-plx/ble-link.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/src/modules/next/bluetooth/connections.d.ts.map +1 -1
  167. package/lib/typescript/commonjs/src/modules/next/bluetooth/driver.d.ts +6 -1
  168. package/lib/typescript/commonjs/src/modules/next/bluetooth/driver.d.ts.map +1 -1
  169. package/lib/typescript/commonjs/src/modules/next/bluetooth/index.d.ts +1 -1
  170. package/lib/typescript/commonjs/src/modules/next/bluetooth/index.d.ts.map +1 -1
  171. package/lib/typescript/commonjs/src/modules/next/bluetooth/link.d.ts +12 -1
  172. package/lib/typescript/commonjs/src/modules/next/bluetooth/link.d.ts.map +1 -1
  173. package/lib/typescript/commonjs/src/modules/next/bluetooth/react-native/ovok-sink.d.ts.map +1 -1
  174. package/lib/typescript/commonjs/src/modules/next/bluetooth/snapshot.d.ts +4 -1
  175. package/lib/typescript/commonjs/src/modules/next/bluetooth/snapshot.d.ts.map +1 -1
  176. package/lib/typescript/commonjs/src/modules/next/bluetooth/stable-hash.d.ts +5 -2
  177. package/lib/typescript/commonjs/src/modules/next/bluetooth/stable-hash.d.ts.map +1 -1
  178. package/lib/typescript/module/src/modules/auth/hooks/use-sign-in.d.ts +1 -1
  179. package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
  180. package/lib/typescript/module/src/modules/bt-management/hooks/runtime-context.d.ts +1 -1
  181. package/lib/typescript/module/src/modules/bt-management/hooks/runtime-context.d.ts.map +1 -1
  182. package/lib/typescript/module/src/modules/bt-management/index.d.ts +1 -0
  183. package/lib/typescript/module/src/modules/bt-management/index.d.ts.map +1 -1
  184. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts +20 -0
  185. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  186. package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts +2 -1
  187. package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -1
  188. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-command-writer.d.ts +3 -1
  189. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-command-writer.d.ts.map +1 -1
  190. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-connection-handler.d.ts +14 -1
  191. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-connection-handler.d.ts.map +1 -1
  192. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-current-time.d.ts +11 -0
  193. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-current-time.d.ts.map +1 -0
  194. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-device-information.d.ts +2 -1
  195. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-device-information.d.ts.map +1 -1
  196. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +9 -1
  197. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  198. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-notification-readiness.d.ts +15 -0
  199. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-notification-readiness.d.ts.map +1 -0
  200. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-pairing-retry.d.ts +21 -0
  201. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-pairing-retry.d.ts.map +1 -0
  202. package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts +2 -0
  203. package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -1
  204. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.d.ts +7 -0
  205. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.d.ts.map +1 -0
  206. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.d.ts +16 -0
  207. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.d.ts.map +1 -0
  208. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.d.ts +8 -0
  209. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.d.ts.map +1 -0
  210. package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose.d.ts.map +1 -1
  211. package/lib/typescript/module/src/modules/bt-management/services/record-cursor.d.ts +21 -0
  212. package/lib/typescript/module/src/modules/bt-management/services/record-cursor.d.ts.map +1 -0
  213. package/lib/typescript/module/src/modules/bt-management/testing/fake-ble-manager.d.ts.map +1 -1
  214. package/lib/typescript/module/src/modules/bt-management/types/command-sequencer.d.ts +6 -2
  215. package/lib/typescript/module/src/modules/bt-management/types/command-sequencer.d.ts.map +1 -1
  216. package/lib/typescript/module/src/modules/bt-management/types/create-device-params.d.ts +3 -0
  217. package/lib/typescript/module/src/modules/bt-management/types/create-device-params.d.ts.map +1 -1
  218. package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts +14 -1
  219. package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -1
  220. package/lib/typescript/module/src/modules/bt-management/types/glucose-record-details.d.ts +33 -0
  221. package/lib/typescript/module/src/modules/bt-management/types/glucose-record-details.d.ts.map +1 -0
  222. package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts +2 -0
  223. package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
  224. package/lib/typescript/module/src/modules/bt-management/utils/result-identity.d.ts +5 -4
  225. package/lib/typescript/module/src/modules/bt-management/utils/result-identity.d.ts.map +1 -1
  226. package/lib/typescript/module/src/modules/bt-management/utils/wait.d.ts +3 -0
  227. package/lib/typescript/module/src/modules/bt-management/utils/wait.d.ts.map +1 -0
  228. package/lib/typescript/module/src/modules/data-sync/services/managers/sync-progress-manager.d.ts +1 -1
  229. package/lib/typescript/module/src/modules/next/bluetooth/ble-plx/ble-link.d.ts +1 -1
  230. package/lib/typescript/module/src/modules/next/bluetooth/ble-plx/ble-link.d.ts.map +1 -1
  231. package/lib/typescript/module/src/modules/next/bluetooth/connections.d.ts.map +1 -1
  232. package/lib/typescript/module/src/modules/next/bluetooth/driver.d.ts +6 -1
  233. package/lib/typescript/module/src/modules/next/bluetooth/driver.d.ts.map +1 -1
  234. package/lib/typescript/module/src/modules/next/bluetooth/index.d.ts +1 -1
  235. package/lib/typescript/module/src/modules/next/bluetooth/index.d.ts.map +1 -1
  236. package/lib/typescript/module/src/modules/next/bluetooth/link.d.ts +12 -1
  237. package/lib/typescript/module/src/modules/next/bluetooth/link.d.ts.map +1 -1
  238. package/lib/typescript/module/src/modules/next/bluetooth/react-native/ovok-sink.d.ts.map +1 -1
  239. package/lib/typescript/module/src/modules/next/bluetooth/snapshot.d.ts +4 -1
  240. package/lib/typescript/module/src/modules/next/bluetooth/snapshot.d.ts.map +1 -1
  241. package/lib/typescript/module/src/modules/next/bluetooth/stable-hash.d.ts +5 -2
  242. package/lib/typescript/module/src/modules/next/bluetooth/stable-hash.d.ts.map +1 -1
  243. package/package.json +1 -1
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ import { sentryLogger } from "../../../helpers/utils/sentry-logger.js";
4
+ import { toBluetoothError } from "../../types/bluetooth-error.js";
5
+ import { base64ToHex } from "../../utils/base-64-to-hex.js";
6
+ import { wait } from "../../utils/wait.js";
7
+
8
+ /** Client Characteristic Configuration descriptor, where a device keeps whether notifications are on. */
9
+ const CCCD_UUID = "00002902-0000-1000-8000-00805f9b34fb";
10
+
11
+ /** Bit 0 enables notifications and bit 1 indications. */
12
+ const NOTIFICATIONS_OR_INDICATIONS = 0x03;
13
+ const CCCD_POLL_ATTEMPTS = 10;
14
+ const CCCD_POLL_INTERVAL_MS = 100;
15
+
16
+ /** For platforms that cannot read the descriptor, which is how long the write usually takes. */
17
+ const UNREADABLE_CCCD_SETTLE_MS = 300;
18
+
19
+ /** A characteristic whose notifications were just requested. */
20
+
21
+ const isEnabled = cccdValue => {
22
+ const [firstByte] = cccdValue ? base64ToHex(cccdValue) : [];
23
+ return (Number.parseInt(firstByte ?? "", 16) & NOTIFICATIONS_OR_INDICATIONS) !== 0;
24
+ };
25
+ const isNotificationsEnabled = async (device, {
26
+ serviceUuid,
27
+ characteristicUuid
28
+ }) => {
29
+ for (let attempt = 1;; attempt += 1) {
30
+ const descriptor = await device.readDescriptorForService(serviceUuid, characteristicUuid, CCCD_UUID);
31
+ if (isEnabled(descriptor.value)) {
32
+ return true;
33
+ }
34
+ if (attempt === CCCD_POLL_ATTEMPTS) {
35
+ return false;
36
+ }
37
+ await wait(CCCD_POLL_INTERVAL_MS);
38
+ }
39
+ };
40
+
41
+ /**
42
+ * Resolves once the device reports notifications on for every characteristic, because
43
+ * `monitorCharacteristicForService` returns before its descriptor write completes.
44
+ * A platform that cannot read the descriptor gets a fixed settle time instead.
45
+ */
46
+ const awaitNotificationsEnabled = async (device, characteristics) => {
47
+ if (characteristics.length === 0 || typeof device.readDescriptorForService !== "function") {
48
+ return;
49
+ }
50
+ try {
51
+ const enabled = await Promise.all(characteristics.map(characteristic => isNotificationsEnabled(device, characteristic)));
52
+ if (!enabled.every(Boolean)) {
53
+ sentryLogger("info", "DEVICE: Notifications not confirmed before the first command", {
54
+ characteristics: characteristics.length
55
+ });
56
+ }
57
+ } catch (error) {
58
+ sentryLogger("info", "DEVICE: Notification state unreadable, waiting a fixed time", {
59
+ errorCode: toBluetoothError(error).code
60
+ });
61
+ await wait(UNREADABLE_CCCD_SETTLE_MS);
62
+ }
63
+ };
64
+ export { awaitNotificationsEnabled };
65
+ //# sourceMappingURL=bt-notification-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sentryLogger","toBluetoothError","base64ToHex","wait","CCCD_UUID","NOTIFICATIONS_OR_INDICATIONS","CCCD_POLL_ATTEMPTS","CCCD_POLL_INTERVAL_MS","UNREADABLE_CCCD_SETTLE_MS","isEnabled","cccdValue","firstByte","Number","parseInt","isNotificationsEnabled","device","serviceUuid","characteristicUuid","attempt","descriptor","readDescriptorForService","value","awaitNotificationsEnabled","characteristics","length","enabled","Promise","all","map","characteristic","every","Boolean","error","errorCode","code"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-notification-readiness.ts"],"mappings":";;AAEA,SAASA,YAAY,QAAQ,yCAAsC;AACnE,SAASC,gBAAgB,QAAQ,gCAA6B;AAC9D,SAASC,WAAW,QAAQ,+BAA4B;AACxD,SAASC,IAAI,QAAQ,qBAAkB;;AAEvC;AACA,MAAMC,SAAS,GAAG,sCAAsC;;AAExD;AACA,MAAMC,4BAA4B,GAAG,IAAI;AAEzC,MAAMC,kBAAkB,GAAG,EAAE;AAC7B,MAAMC,qBAAqB,GAAG,GAAG;;AAEjC;AACA,MAAMC,yBAAyB,GAAG,GAAG;;AAErC;;AAMA,MAAMC,SAAS,GAAIC,SAAoC,IAAc;EACnE,MAAM,CAACC,SAAS,CAAC,GAAGD,SAAS,GAAGR,WAAW,CAACQ,SAAS,CAAC,GAAG,EAAE;EAE3D,OAAO,CAACE,MAAM,CAACC,QAAQ,CAACF,SAAS,IAAI,EAAE,EAAE,EAAE,CAAC,GAAGN,4BAA4B,MAAM,CAAC;AACpF,CAAC;AAED,MAAMS,sBAAsB,GAAG,MAAAA,CAC7BC,MAAc,EACd;EAAEC,WAAW;EAAEC;AAA4C,CAAC,KACvC;EACrB,KAAK,IAAIC,OAAO,GAAG,CAAC,GAAIA,OAAO,IAAI,CAAC,EAAE;IACpC,MAAMC,UAAU,GAAG,MAAMJ,MAAM,CAACK,wBAAwB,CACtDJ,WAAW,EACXC,kBAAkB,EAClBb,SACF,CAAC;IAED,IAAIK,SAAS,CAACU,UAAU,CAACE,KAAK,CAAC,EAAE;MAC/B,OAAO,IAAI;IACb;IAEA,IAAIH,OAAO,KAAKZ,kBAAkB,EAAE;MAClC,OAAO,KAAK;IACd;IAEA,MAAMH,IAAI,CAACI,qBAAqB,CAAC;EACnC;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAMe,yBAAyB,GAAG,MAAAA,CAChCP,MAAc,EACdQ,eAAmD,KACjC;EAClB,IAAIA,eAAe,CAACC,MAAM,KAAK,CAAC,IAAI,OAAOT,MAAM,CAACK,wBAAwB,KAAK,UAAU,EAAE;IACzF;EACF;EAEA,IAAI;IACF,MAAMK,OAAO,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC/BJ,eAAe,CAACK,GAAG,CAAEC,cAAc,IAAKf,sBAAsB,CAACC,MAAM,EAAEc,cAAc,CAAC,CACxF,CAAC;IAED,IAAI,CAACJ,OAAO,CAACK,KAAK,CAACC,OAAO,CAAC,EAAE;MAC3B/B,YAAY,CAAC,MAAM,EAAE,8DAA8D,EAAE;QACnFuB,eAAe,EAAEA,eAAe,CAACC;MACnC,CAAC,CAAC;IACJ;EACF,CAAC,CAAC,OAAOQ,KAAK,EAAE;IACdhC,YAAY,CAAC,MAAM,EAAE,6DAA6D,EAAE;MAClFiC,SAAS,EAAEhC,gBAAgB,CAAC+B,KAAK,CAAC,CAACE;IACrC,CAAC,CAAC;IACF,MAAM/B,IAAI,CAACK,yBAAyB,CAAC;EACvC;AACF,CAAC;AAED,SAASc,yBAAyB","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ import { sentryLogger } from "../../../helpers/utils/sentry-logger.js";
4
+ import { BluetoothErrorCode, toBluetoothError } from "../../types/bluetooth-error.js";
5
+ import { wait } from "../../utils/wait.js";
6
+
7
+ /** How long the user has to finish the system pairing before the step is given up. */
8
+ const PAIRING_WINDOW_MS = 30_000;
9
+
10
+ /** ble-plx cannot report the bond state, so the step itself is tried again at this interval. */
11
+ const PAIRING_RETRY_INTERVAL_MS = 3_000;
12
+
13
+ /** Runs `operation`; when the device needs pairing for it, runs it again once the user has paired. */
14
+
15
+ const isPairingRequired = error => toBluetoothError(error).code === BluetoothErrorCode.PAIRING_REQUIRED;
16
+ const runOnce = operation => operation();
17
+
18
+ /**
19
+ * Keeps the link while the system pairing (raised by the encrypted access itself) runs,
20
+ * then retries the step that needed it. After a wait ran out, later steps fail at once.
21
+ */
22
+ class BTPairingRetry {
23
+ abandoned = false;
24
+ constructor(device, onPairingRequired) {
25
+ this.device = device;
26
+ this.onPairingRequired = onPairingRequired;
27
+ }
28
+ run = async operation => {
29
+ try {
30
+ return await operation();
31
+ } catch (error) {
32
+ if (this.abandoned || !isPairingRequired(error)) {
33
+ throw error;
34
+ }
35
+ this.onPairingRequired();
36
+ return this.retryUntilPaired(operation, error);
37
+ }
38
+ };
39
+ retryUntilPaired = async (operation, firstError) => {
40
+ const deadline = Date.now() + PAIRING_WINDOW_MS;
41
+ let lastError = firstError;
42
+ while (Date.now() < deadline) {
43
+ await wait(PAIRING_RETRY_INTERVAL_MS);
44
+ if (!(await this.stillConnected())) {
45
+ break;
46
+ }
47
+ try {
48
+ return await operation();
49
+ } catch (error) {
50
+ if (!isPairingRequired(error)) {
51
+ throw error;
52
+ }
53
+ lastError = error;
54
+ }
55
+ }
56
+ this.abandoned = true;
57
+ sentryLogger("info", "DEVICE: Pairing did not finish, giving up the step", {
58
+ errorCode: BluetoothErrorCode.PAIRING_REQUIRED
59
+ });
60
+ throw lastError;
61
+ };
62
+ stillConnected = () => this.device.isConnected().catch(() => false);
63
+ }
64
+ export { BTPairingRetry, isPairingRequired, runOnce };
65
+ //# sourceMappingURL=bt-pairing-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sentryLogger","BluetoothErrorCode","toBluetoothError","wait","PAIRING_WINDOW_MS","PAIRING_RETRY_INTERVAL_MS","isPairingRequired","error","code","PAIRING_REQUIRED","runOnce","operation","BTPairingRetry","abandoned","constructor","device","onPairingRequired","run","retryUntilPaired","firstError","deadline","Date","now","lastError","stillConnected","errorCode","isConnected","catch"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-pairing-retry.ts"],"mappings":";;AAEA,SAASA,YAAY,QAAQ,yCAAsC;AACnE,SAASC,kBAAkB,EAAEC,gBAAgB,QAAQ,gCAA6B;AAClF,SAASC,IAAI,QAAQ,qBAAkB;;AAEvC;AACA,MAAMC,iBAAiB,GAAG,MAAM;;AAEhC;AACA,MAAMC,yBAAyB,GAAG,KAAK;;AAEvC;;AAGA,MAAMC,iBAAiB,GAAIC,KAAc,IACvCL,gBAAgB,CAACK,KAAK,CAAC,CAACC,IAAI,KAAKP,kBAAkB,CAACQ,gBAAgB;AAEtE,MAAMC,OAAqB,GAAIC,SAAS,IAAKA,SAAS,CAAC,CAAC;;AAExD;AACA;AACA;AACA;AACA,MAAMC,cAAc,CAAC;EACXC,SAAS,GAAG,KAAK;EAElBC,WAAWA,CACCC,MAAc,EACdC,iBAA6B,EAC9C;IAAA,KAFiBD,MAAc,GAAdA,MAAc;IAAA,KACdC,iBAA6B,GAA7BA,iBAA6B;EAC7C;EAEIC,GAAG,GAAiB,MAAON,SAAS,IAAK;IAC9C,IAAI;MACF,OAAO,MAAMA,SAAS,CAAC,CAAC;IAC1B,CAAC,CAAC,OAAOJ,KAAK,EAAE;MACd,IAAI,IAAI,CAACM,SAAS,IAAI,CAACP,iBAAiB,CAACC,KAAK,CAAC,EAAE;QAC/C,MAAMA,KAAK;MACb;MAEA,IAAI,CAACS,iBAAiB,CAAC,CAAC;MAExB,OAAO,IAAI,CAACE,gBAAgB,CAACP,SAAS,EAAEJ,KAAK,CAAC;IAChD;EACF,CAAC;EAEOW,gBAAgB,GAAG,MAAAA,CACzBP,SAA2B,EAC3BQ,UAAmB,KACJ;IACf,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGlB,iBAAiB;IAC/C,IAAImB,SAAS,GAAGJ,UAAU;IAE1B,OAAOE,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGF,QAAQ,EAAE;MAC5B,MAAMjB,IAAI,CAACE,yBAAyB,CAAC;MAErC,IAAI,EAAE,MAAM,IAAI,CAACmB,cAAc,CAAC,CAAC,CAAC,EAAE;QAClC;MACF;MAEA,IAAI;QACF,OAAO,MAAMb,SAAS,CAAC,CAAC;MAC1B,CAAC,CAAC,OAAOJ,KAAK,EAAE;QACd,IAAI,CAACD,iBAAiB,CAACC,KAAK,CAAC,EAAE;UAC7B,MAAMA,KAAK;QACb;QAEAgB,SAAS,GAAGhB,KAAK;MACnB;IACF;IAEA,IAAI,CAACM,SAAS,GAAG,IAAI;IACrBb,YAAY,CAAC,MAAM,EAAE,oDAAoD,EAAE;MACzEyB,SAAS,EAAExB,kBAAkB,CAACQ;IAChC,CAAC,CAAC;IAEF,MAAMc,SAAS;EACjB,CAAC;EAEOC,cAAc,GAAGA,CAAA,KACvB,IAAI,CAACT,MAAM,CAACW,WAAW,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,KAAK,CAAC;AAChD;AAEA,SAASf,cAAc,EAAEN,iBAAiB,EAAEI,OAAO","ignoreList":[]}
@@ -44,16 +44,30 @@ export class CustomDevice extends BTManagedDevice {
44
44
  this.frameReader = definition.frameReader;
45
45
  this.stuckDataTimeout = definition.stuckDataTimeout;
46
46
  this.reportsBondedEvent = definition.reportsBondedEvent === true;
47
+ this.syncsCurrentTime = definition.clockSync === "unknown";
47
48
  if (definition.preferredMtu !== undefined) {
48
49
  this.preferredMtu = definition.preferredMtu;
49
50
  }
50
51
  this.declareLepuProtocol(definition, params.clockSync);
51
52
  this.declareTmbProtocol(definition, params.clockSync);
53
+ this.declareSequencerFactory(definition, params);
52
54
  definition.frames.forEach((frame, uuid) => {
53
55
  this.validators.set(uuid, createFrameValidator(frame));
54
56
  });
55
57
  }
56
58
 
59
+ /** Gives a declaration that computes its commands at connect time the context it needs to do so. */
60
+ declareSequencerFactory(definition, params) {
61
+ const create = definition.createCommandSequencer;
62
+ if (!create) {
63
+ return;
64
+ }
65
+ this.createCommandSequencer = () => create({
66
+ deviceId: this.device.id,
67
+ recordCursorStorage: params.recordCursorStorage
68
+ });
69
+ }
70
+
57
71
  /** Gives a TMB declaration its length-prefixed reader and history command sequence. */
58
72
  declareTmbProtocol(definition, clockSync) {
59
73
  const tmb = definition.tmb;
@@ -1 +1 @@
1
- {"version":3,"names":["MeasurementTypeKey","CaseType","createFrameValidator","parseMeasurement","discardedReadingError","rejectCustomReading","decodeBP2File","BTManagedDevice","LepuCommandBuilder","LepuEcgTransferSequencer","LepuFrameReader","TmbCommandSequencer","TmbFrameReader","decodeViatomBp3File","decodeViatomEcgRecording","recordedAtFromViatomFileName","createLepuSequencer","recordLepuIdentity","selectLepu","CustomDevice","reportedHistoryIds","Set","validators","Map","sessionAggregates","constructor","device","params","definition","oneReadingPerConnection","frameHandler","createFrameHandler","sessionPolicy","deviceData","clockSync","deliveredFileNames","deliveredEcgFileNames","selectedLepu","lepu","manufacturerData","undefined","mainServices","manufacturerDataProtocol","filter","service","uuid","write","serviceUuid","frameReader","stuckDataTimeout","reportsBondedEvent","preferredMtu","declareLepuProtocol","declareTmbProtocol","frames","forEach","frame","set","tmb","createCommandSequencer","protocol","startBytes","fileTransfer","clear","characteristicUuid","builder","rejectEncryptionAtBytes","expectedDeviceTypes","onIdentified","onRefused","onIdentityRefused","onFile","reportViatomEcgFile","reportViatomBp2File","reportViatomBp3File","skipFiles","acceptFile","name","ecgFileDecoder","test","pollCommand","pollIntervalMs","afterTransfer","build","onError","reason","Error","onProgress","progress","onConnectionEvent","kind","current","receivedBytes","total","totalBytes","file","decoded","content","samples","length","onResult","measurementTypeKey","ecg","caseType","RESULT","diagramPoints","duration","recordedAt","recordingId","reportHistoryOnce","has","add","info","id","validatePackage","pkg","validate","get","String","toLowerCase","handleDependentResult","data","parsingCase","requiresStream","isMeasuring","OTHER","handleFrame","parsedData","handlerOnly","captureSessionSample","STREAM","shouldReportDependentResult","reportFrame","error","_data","handleSuccessResult","successResult","collectedValues","emit","reading","handleMeasurementEnd","policy","aggregates","values","sessionStartedAt","aggregate","count","minSamples","summary","sample","Object","fromEntries","sums","entries","map","sessionAverage","decorateReading","value","decimals","fields","Math","trunc","Number","toFixed","measurements","frameRecordedAt","Date","measurement","createMeasurement","rejection","measurementRejection","policyFor","key","existing","readingFields","fieldNames","recordOffset","decorate","repeated","repeatedRecords","report","records","floor","from","recordBytes","record","discard","reportMeasurement","parsedFields","find","message"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/custom/custom.device.ts"],"mappings":";;AAAA;AACA,SAASA,kBAAkB,QAAQ,iBAAiB;AAGpD,SAASC,QAAQ,QAAQ,6BAA0B;AAcnD,SAASC,oBAAoB,QAAQ,0CAAuC;AAC5E,SAASC,gBAAgB,QAAQ,qCAAkC;AACnE,SACEC,qBAAqB,EACrBC,mBAAmB,QACd,yCAAsC;AAC7C,SAASC,aAAa,QAAQ,qBAAkB;AAChD,SAASC,eAAe,QAAQ,yBAAsB;AACtD,SAASC,kBAAkB,QAAQ,iCAA8B;AAEjE,SAASC,wBAAwB,QAAQ,8BAA2B;AAEpE,SAASC,eAAe,QAAQ,8BAA2B;AAC3D,SAASC,mBAAmB,QAAQ,iCAA8B;AAClE,SAASC,cAAc,QAAQ,4BAAyB;AACxD,SAASC,mBAAmB,QAAQ,+BAA4B;AAChE,SACEC,wBAAwB,EACxBC,4BAA4B,QACvB,+BAA4B;AAEnC,SACEC,mBAAmB,EACnBC,kBAAkB,EAClBC,UAAU,QACL,4BAAyB;AAWhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,SAASZ,eAAe,CAAiB;EAOxDa,kBAAkB,GAAG,IAAIC,GAAG,CAAS,CAAC;EAC7BC,UAAU,GAAG,IAAIC,GAAG,CAAsC,CAAC;EAE3DC,iBAAiB,GAAG,IAAID,GAAG,CAA2B,CAAC;EAGxEE,WAAWA,CACTC,MAAc,EACdC,MAA0C,EAC1CC,UAAkC,EAClC;IACA,KAAK,CAACF,MAAM,EAAE;MACZ,GAAGC,MAAM;MACTE,uBAAuB,EACrBF,MAAM,CAACE,uBAAuB,IAAID,UAAU,CAACC;IACjD,CAAC,CAAC;IAEF,IAAI,CAACD,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACE,YAAY,GAAGF,UAAU,CAACG,kBAAkB,GAAG,CAAC;IACrD,IAAI,CAACC,aAAa,GAAGJ,UAAU,CAACI,aAAa;IAC7C,IAAI,CAACC,UAAU,CAACC,SAAS,GAAGN,UAAU,CAACM,SAAS;IAChD,IAAI,CAACC,kBAAkB,GAAG,IAAId,GAAG,CAAC,CAChC,IAAIM,MAAM,CAACS,qBAAqB,IAAI,EAAE,CAAC,EACvC,IAAIT,MAAM,CAACQ,kBAAkB,IAAI,EAAE,CAAC,CACrC,CAAC;IACF,MAAME,YAAY,GAAGT,UAAU,CAACU,IAAI,GAChCpB,UAAU,CAACU,UAAU,CAACU,IAAI,EAAEZ,MAAM,CAACa,gBAAgB,IAAIC,SAAS,CAAC,GACjEA,SAAS;IAEb,IAAI,CAACC,YAAY,GACfJ,YAAY,EAAEK,wBAAwB,KAAK,eAAe,GACtDd,UAAU,CAACa,YAAY,CAACE,MAAM,CAC3BC,OAAO,IAAKA,OAAO,CAACC,IAAI,KAAKR,YAAY,CAACS,KAAK,CAACC,WACnD,CAAC,GACDnB,UAAU,CAACa,YAAY;IAC7B,IAAI,CAACO,WAAW,GAAGpB,UAAU,CAACoB,WAAW;IACzC,IAAI,CAACC,gBAAgB,GAAGrB,UAAU,CAACqB,gBAAgB;IACnD,IAAI,CAACC,kBAAkB,GAAGtB,UAAU,CAACsB,kBAAkB,KAAK,IAAI;IAEhE,IAAItB,UAAU,CAACuB,YAAY,KAAKX,SAAS,EAAE;MACzC,IAAI,CAACW,YAAY,GAAGvB,UAAU,CAACuB,YAAY;IAC7C;IAEA,IAAI,CAACC,mBAAmB,CAACxB,UAAU,EAAED,MAAM,CAACO,SAAS,CAAC;IACtD,IAAI,CAACmB,kBAAkB,CAACzB,UAAU,EAAED,MAAM,CAACO,SAAS,CAAC;IAErDN,UAAU,CAAC0B,MAAM,CAACC,OAAO,CAAC,CAACC,KAAK,EAAEX,IAAI,KAAK;MACzC,IAAI,CAACvB,UAAU,CAACmC,GAAG,CAACZ,IAAI,EAAE3C,oBAAoB,CAACsD,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC;EACJ;;EAEA;EACQH,kBAAkBA,CACxBzB,UAAkC,EAClCM,SAA0D,EACpD;IACN,MAAMwB,GAAG,GAAG9B,UAAU,CAAC8B,GAAG;IAE1B,IAAI,CAACA,GAAG,EAAE;MACR;IACF;IAEA,IAAI,CAACV,WAAW,GAAG,IAAIpC,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC+C,sBAAsB,GAAG,MAC5B,IAAIhD,mBAAmB,CAAC;MACtBiD,QAAQ,EAAEF,GAAG;MACbxB;IACF,CAAC,CAAC;EACN;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACUkB,mBAAmBA,CACzBxB,UAAkC,EAClCM,SAA0D,EACpD;IACN,MAAMI,IAAI,GAAGV,UAAU,CAACU,IAAI;IAE5B,IAAI,CAACA,IAAI,EAAE;MACT;IACF;IAEA,IAAI,CAACU,WAAW,GAAG,IAAItC,eAAe,CAAC4B,IAAI,CAACuB,UAAU,CAAC;IAEvD,IAAI,CAACF,sBAAsB,GAAG,MAAM;MAClC,IAAIrB,IAAI,CAACwB,YAAY,KAAKtB,SAAS,EAAE;QACnC,IAAI,CAACpB,kBAAkB,CAAC2C,KAAK,CAAC,CAAC;QAE/B,OAAO,IAAItD,wBAAwB,CAAC;UAClCqC,KAAK,EAAE;YACLC,WAAW,EAAET,IAAI,CAACQ,KAAK,CAACC,WAAW;YACnCiB,kBAAkB,EAAE1B,IAAI,CAACQ,KAAK,CAACkB;UACjC,CAAC;UACDC,OAAO,EAAE,IAAIzD,kBAAkB,CAAC8B,IAAI,CAACuB,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;UAC3D3B,SAAS;UACTK,gBAAgB,EAAE,IAAI,CAACb,MAAM,CAACa,gBAAgB,IAAIC,SAAS;UAC3D0B,uBAAuB,EAAE5B,IAAI,CAAC4B,uBAAuB;UACrDC,mBAAmB,EAAE7B,IAAI,CAAC6B,mBAAmB;UAC7CC,YAAY,EAAE,IAAI,CAACA,YAAY;UAC/BC,SAAS,EAAE,IAAI,CAACC,iBAAiB;UACjCC,MAAM,EACJjC,IAAI,CAACwB,YAAY,KAAK,KAAK,GACvB,IAAI,CAACU,mBAAmB,GACxBlC,IAAI,CAACwB,YAAY,KAAK,KAAK,GACzB,IAAI,CAACW,mBAAmB,GACxB,IAAI,CAACC,mBAAmB;UAChCC,SAAS,EACPrC,IAAI,CAACwB,YAAY,KAAK,KAAK,GAAGtB,SAAS,GAAG,IAAI,CAACL,kBAAkB;UACnEyC,UAAU,EACRtC,IAAI,CAACwB,YAAY,KAAK,KAAK,GACtBe,IAAI,IACHvC,IAAI,CAACwC,cAAc,KAAK,WAAW,IAAI,KAAK,CAACC,IAAI,CAACF,IAAI,CAAC,GACzDvC,IAAI,CAACwB,YAAY,KAAK,KAAK,GACxBe,IAAI,IAAK,aAAa,CAACE,IAAI,CAACF,IAAI,CAAC,GAClCrC,SAAS;UACjBwC,WAAW,EACT1C,IAAI,CAACwB,YAAY,KAAK,KAAK,GAAGtB,SAAS,GAAGF,IAAI,CAAC0C,WAAW;UAC5DC,cAAc,EACZ3C,IAAI,CAACwB,YAAY,KAAK,KAAK,GAAGtB,SAAS,GAAGF,IAAI,CAAC2C,cAAc;UAC/DC,aAAa,EACX5C,IAAI,CAACwB,YAAY,KAAK,KAAK,IAAIxB,IAAI,CAAC0C,WAAW,GAC3C,MAAM,CACJ;YACEjC,WAAW,EAAET,IAAI,CAACQ,KAAK,CAACC,WAAW;YACnCiB,kBAAkB,EAAE1B,IAAI,CAACQ,KAAK,CAACkB,kBAAkB;YACjDR,KAAK,EAAE,IAAIhD,kBAAkB,CAC3B8B,IAAI,CAACuB,UAAU,CAAC,CAAC,CAAC,IAAI,IACxB,CAAC,CAACsB,KAAK,CAAC7C,IAAI,CAAC0C,WAAY;UAC3B,CAAC,CACF,GACDxC,SAAS;UACf4C,OAAO,EAAGC,MAAM,IACd,IAAI,CAACD,OAAO,GAAG,IAAIE,KAAK,CAAC,eAAeD,MAAM,EAAE,CAAC,CAAC;UACpDE,UAAU,EAAGC,QAAQ,IACnB,IAAI,CAACC,iBAAiB,GAAG;YACvBxD,UAAU,EAAE,IAAI,CAACA,UAAU;YAC3ByD,IAAI,EAAE,kBAAkB;YACxBF,QAAQ,EAAE;cACRG,OAAO,EAAEH,QAAQ,CAACI,aAAa;cAC/BC,KAAK,EAAEL,QAAQ,CAACM;YAClB;UACF,CAAC;QACL,CAAC,CAAC;MACJ;MAEA,OAAO9E,mBAAmB,CACxBsB,IAAI,EACJ;QACE8B,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BC,SAAS,EAAE,IAAI,CAACC;MAClB,CAAC,EACDpC,SAAS,EACT,IAAI,CAACR,MAAM,CAACa,gBAAgB,IAAIC,SAClC,CAAC;IACH,CAAC;EACH;EAEQgC,mBAAmB,GAAIuB,IAAc,IAAW;IACtD,MAAMC,OAAO,GAAGlF,wBAAwB,CAACiF,IAAI,CAACE,OAAO,CAAC;IAEtD,IAAID,OAAO,CAACE,OAAO,CAACC,MAAM,KAAK,CAAC,EAAE;MAChC,IAAI,CAACf,OAAO,GACV,IAAIE,KAAK,CAAC,qBAAqBS,IAAI,CAAClB,IAAI,mBAAmB,CAC7D,CAAC;MAED;IACF;IAEA,IAAI,CAACuB,QAAQ,GAAG;MACdC,kBAAkB,EAAErG,kBAAkB,CAACsG,GAAG;MAC1CC,QAAQ,EAAEtG,QAAQ,CAACuG,MAAM;MACzBC,aAAa,EAAET,OAAO,CAACE,OAAO;MAC9BQ,QAAQ,EAAEV,OAAO,CAACU,QAAQ;MAC1BC,UAAU,EAAE5F,4BAA4B,CAACgF,IAAI,CAAClB,IAAI,CAAC;MACnD+B,WAAW,EAAEb,IAAI,CAAClB;IACpB,CAA4B,CAAC;EAC/B,CAAC;EAEOJ,mBAAmB,GAAIsB,IAAc,IAAW;IACtD,MAAMC,OAAO,GAAG1F,aAAa,CAACyF,IAAI,CAAClB,IAAI,EAAEkB,IAAI,CAACE,OAAO,CAAC;IAEtD,IAAID,OAAO,EAAE;MACX,IAAI,CAACa,iBAAiB,CAACb,OAAO,CAAC;IACjC;EACF,CAAC;EAEOtB,mBAAmB,GAAIqB,IAAc,IAAW;IACtDlF,mBAAmB,CAACkF,IAAI,CAAClB,IAAI,EAAEkB,IAAI,CAACE,OAAO,CAAC,EAAE1C,OAAO,CAAEyC,OAAO,IAAK;MACjE,IAAI,CAAC,IAAI,CAAC7D,kBAAkB,CAAC2E,GAAG,CAACd,OAAO,CAACY,WAAW,CAAC,EAAE;QACrD,IAAI,CAACC,iBAAiB,CAACb,OAAO,CAAC;MACjC;IACF,CAAC,CAAC;EACJ,CAAC;;EAED;EACQa,iBAAiB,GAAIb,OAAgC,IAAW;IACtE,IAAI,IAAI,CAAC5E,kBAAkB,CAAC0F,GAAG,CAACd,OAAO,CAACY,WAAW,CAAC,EAAE;MACpD;IACF;IAEA,IAAI,CAACxF,kBAAkB,CAAC2F,GAAG,CAACf,OAAO,CAACY,WAAW,CAAC;IAChD,IAAI,CAACR,QAAQ,GAAG;MACd,GAAGJ,OAAO;MACVO,QAAQ,EAAEtG,QAAQ,CAACuG;IACrB,CAA4B,CAAC;EAC/B,CAAC;EAEOpC,YAAY,GAAI4C,IAAoB,IAC1C/F,kBAAkB,CAAC,IAAI,CAACgB,UAAU,EAAE+E,IAAI,CAAC;EAEnC1C,iBAAiB,GAAIe,MAAc,IAAW;IACpD,IAAI,CAACD,OAAO,GACV,IAAIE,KAAK,CACP,kBAAkB,IAAI,CAAC1D,UAAU,CAACqF,EAAE,wBAAwB5B,MAAM,GACpE,CACF,CAAC;EACH,CAAC;EAES6B,eAAe,GAAGA,CAACC,GAAa,EAAEtE,IAAY,KAAc;IACpE,MAAMuE,QAAQ,GAAG,IAAI,CAAC9F,UAAU,CAAC+F,GAAG,CAACC,MAAM,CAACzE,IAAI,IAAI,EAAE,CAAC,CAAC0E,WAAW,CAAC,CAAC,CAAC;IAEtE,IAAI,CAACH,QAAQ,EAAE;MACb,OAAO,KAAK;IACd;IAEA,OAAOA,QAAQ,CAACD,GAAG,CAAC;EACtB,CAAC;;EAED;AACF;AACA;AACA;AACA;EACYK,qBAAqB,GAC7BC,IAAuD,IACD;IACtD,IAAI;MACF,IAAIA,IAAI,CAACC,WAAW,CAACC,cAAc,IAAI,CAACF,IAAI,CAACG,WAAW,EAAE;QACxD,OAAO;UACL,GAAGH,IAAI;UACPC,WAAW,EAAE;YAAE,GAAGD,IAAI,CAACC,WAAW;YAAEnB,QAAQ,EAAEtG,QAAQ,CAAC4H;UAAM;QAC/D,CAAC;MACH;MAEA,IAAI,CAACC,WAAW,CACdL,IAAI,CAACM,UAAU,EACfN,IAAI,CAACC,WAAW,EAChBD,IAAI,CAACjE,KAAK,IAAI,EAAE,EAChBiE,IAAI,CAACG,WAAW,KAAK,IACvB,CAAC;MAED,IAAIH,IAAI,CAACC,WAAW,CAACM,WAAW,EAAE;QAChC,OAAO;UACL,GAAGP,IAAI;UACPC,WAAW,EAAE;YAAE,GAAGD,IAAI,CAACC,WAAW;YAAEnB,QAAQ,EAAEtG,QAAQ,CAAC4H;UAAM;QAC/D,CAAC;MACH;MAEA,IAAI,IAAI,CAAC7F,aAAa,EAAE;QACtB,IAAI,CAACiG,oBAAoB,CAACR,IAAI,CAAC;QAE/B,OAAO;UACL,GAAGA,IAAI;UACPC,WAAW,EAAE;YAAE,GAAGD,IAAI,CAACC,WAAW;YAAEnB,QAAQ,EAAEtG,QAAQ,CAACiI;UAAO;QAChE,CAAC;MACH;MAEA,IAAI,IAAI,CAACC,2BAA2B,CAACV,IAAI,CAAC,EAAE;QAC1C,IAAI,CAACW,WAAW,CAACX,IAAI,CAAC;MACxB;IACF,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,IAAI,CAACjD,OAAO,GAAGiD,KAAc,CAAC;IAChC;IAEA,OAAO;MACL,GAAGZ,IAAI;MACPC,WAAW,EAAE;QAAE,GAAGD,IAAI,CAACC,WAAW;QAAEnB,QAAQ,EAAEtG,QAAQ,CAAC4H;MAAM;IAC/D,CAAC;EACH,CAAC;;EAED;EACUM,2BAA2B,GACnCG,KAAwD,IAC5C,IAAI;;EAElB;AACF;AACA;AACA;EACYC,mBAAmBA,CAC3BC,aAA2B,EAC3BC,eAAyB,EACT;IAChB,IAAI,CAACX,WAAW,CAACU,aAAa,EAAEhG,SAAS,EAAEiG,eAAe,EAAE,IAAI,CAAC;IAEjE;EACF;EAEQX,WAAWA,CACjBC,UAAwB,EACxBL,WAAoC,EACpClE,KAAwB,EACxBoE,WAAoB,EACd;IACN,IAAI,CAAC9F,YAAY,GAAG;MAClBiG,UAAU;MACVL,WAAW;MACXlE,KAAK;MACLoE,WAAW;MACXc,IAAI,EAAGC,OAAO,IACZ,IAAI,CAACvC,QAAQ,GAAG;QACd,GAAGuC,OAAO;QACVpC,QAAQ,EAAEtG,QAAQ,CAACuG;MACrB,CAAiB;IACrB,CAAC,CAAC;EACJ;;EAEA;EACUoC,oBAAoBA,CAAA,EAAS;IACrC,MAAMC,MAAM,GAAG,IAAI,CAAC7G,aAAa;IAEjC,IAAI,CAAC6G,MAAM,EAAE;MACX;IACF;IAEA,MAAMC,UAAU,GAAG,CAAC,GAAG,IAAI,CAACtH,iBAAiB,CAACuH,MAAM,CAAC,CAAC,CAAC;IAEvD,IAAI,CAACvH,iBAAiB,CAACuC,KAAK,CAAC,CAAC;IAC9B,MAAM4C,UAAU,GAAG,IAAI,CAACqC,gBAAgB;IAExC,IAAI,CAACA,gBAAgB,GAAGxG,SAAS;IAEjC,IAAI,CAACmE,UAAU,IAAIkC,MAAM,CAACH,IAAI,KAAK,MAAM,EAAE;MACzC;IACF;IAEAI,UAAU,CAACvF,OAAO,CAAE0F,SAAS,IAAK;MAChC,IAAIA,SAAS,CAACC,KAAK,GAAGL,MAAM,CAACM,UAAU,EAAE;QACvC;MACF;MAEA,MAAMC,OAAO,GAAG;QACd,GAAGH,SAAS,CAACI,MAAM;QACnB,GAAGC,MAAM,CAACC,WAAW,CACnB,CAAC,GAAGN,SAAS,CAACO,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC7E,IAAI,EAAEgB,KAAK,CAAC,KAAK,CACnDhB,IAAI,EACJ,IAAI,CAAC8E,cAAc,CACjBV,SAAS,CAACI,MAAM,CAAChD,kBAAkB,EACnCxB,IAAI,EACJgB,KAAK,GAAGoD,SAAS,CAACC,KACpB,CAAC,CACF,CACH,CAAC;QACD3C,QAAQ,EAAEtG,QAAQ,CAACuG,MAAM;QACzBG;MACF,CAA4B;MAE5B,IAAI,CAAC+B,IAAI,CAAC,IAAI,CAACkB,eAAe,CAACR,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ;EAEQO,cAAcA,CACpBtD,kBAAsC,EACtCxB,IAAY,EACZgF,KAAa,EACL;IACR,MAAMC,QAAQ,GAAG,IAAI,CAAClI,UAAU,CAACmI,MAAM,CAAC1C,GAAG,CACzC,GAAGhB,kBAAkB,IAAIxB,IAAI,EAC/B,CAAC,EAAEiF,QAAQ;IAEX,OAAOA,QAAQ,KAAKtH,SAAS,GACzBwH,IAAI,CAACC,KAAK,CAACJ,KAAK,CAAC,GACjBK,MAAM,CAACL,KAAK,CAACM,OAAO,CAACL,QAAQ,CAAC,CAAC;EACrC;;EAEA;EACQ7B,oBAAoBA,CAC1BR,IAAuD,EACjD;IACN,MAAM2C,YAAY,GAAG3C,IAAI,CAACC,WAAW,CAAC0C,YAAY,IAAI,EAAE;IACxD,MAAMC,eAAe,GAAG,IAAI,CAACrB,gBAAgB,IAAI,IAAIsB,IAAI,CAAC,CAAC;IAE3DF,YAAY,CAAC7G,OAAO,CAAEgH,WAAW,IAAK;MACpC,MAAM5B,OAAO,GAAG,IAAI,CAAC6B,iBAAiB,CAAC/C,IAAI,CAACM,UAAU,EAAEwC,WAAW,CAAC;MACpE,MAAME,SAAS,GAAG,IAAI,CAACC,oBAAoB,CAAC/B,OAAO,EAAE4B,WAAW,CAAC;;MAEjE;MACA;MACA,IAAIE,SAAS,EAAE;QACb;MACF;;MAEA;MACA,IAAI,IAAI,CAACE,SAAS,CAACJ,WAAW,CAAClE,kBAAkB,CAAC,KAAK,QAAQ,EAAE;QAC/D,IAAI,CAACD,QAAQ,GAAGuC,OAAO,CAAC;QAExB;MACF;MAEA,MAAMiC,GAAG,GAAGtD,MAAM,CAACiD,WAAW,CAAClE,kBAAkB,CAAC;MAClD,MAAMwE,QAAQ,GAAG,IAAI,CAACrJ,iBAAiB,CAAC6F,GAAG,CAACuD,GAAG,CAAC;MAChD,MAAMpB,IAAI,GAAGqB,QAAQ,EAAErB,IAAI,IAAI,IAAIjI,GAAG,CAAiB,CAAC;MACxD,MAAMuJ,aAAa,GAAGnC,OAAiD;MAEvE4B,WAAW,CAACQ,UAAU,CAACxH,OAAO,CAAEsB,IAAI,IAAK;QACvC,MAAMgF,KAAK,GAAGiB,aAAa,CAACjG,IAAI,CAAC;QAEjC,IAAI,OAAOgF,KAAK,KAAK,QAAQ,EAAE;UAC7BL,IAAI,CAAC/F,GAAG,CAACoB,IAAI,EAAE,CAAC2E,IAAI,CAACnC,GAAG,CAACxC,IAAI,CAAC,IAAI,CAAC,IAAIgF,KAAK,CAAC;QAC/C;MACF,CAAC,CAAC;MAEF,IAAI,CAACrI,iBAAiB,CAACiC,GAAG,CAACmH,GAAG,EAAE;QAC9B1B,KAAK,EAAE,CAAC2B,QAAQ,EAAE3B,KAAK,IAAI,CAAC,IAAI,CAAC;QACjCG,MAAM,EAAEwB,QAAQ,EAAExB,MAAM,IAAIV,OAAO;QACnCa;MACF,CAAC,CAAC;MACF,IAAI,CAACR,gBAAgB,KAAKqB,eAAe;IAC3C,CAAC,CAAC;EACJ;;EAEA;EACUT,eAAe,GAAGA,CAC1BjB,OAAqB,EACrBnF,KAAyB,EACzBwH,YAAqB,KACG;IACxB,MAAMC,QAAQ,GAAG,IAAI,CAACrJ,UAAU,CAACgI,eAAe;IAEhD,OAAOqB,QAAQ,GACVA,QAAQ,CAACtC,OAAO,EAAEnF,KAAK,EAAEwH,YAAY,CAAC,GACvCrC,OAAO;EACb,CAAC;EAEOD,IAAIA,CAACC,OAA4B,EAAQ;IAC/C,IAAIA,OAAO,EAAE;MACX,IAAI,CAACvC,QAAQ,GAAGuC,OAAO,CAAC;IAC1B;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACUP,WAAWA,CAACX,IAAuD,EAAE;IAC3E,MAAMyD,QAAQ,GAAGzD,IAAI,CAACC,WAAW,CAACyD,eAAe;IAEjD,IAAI,CAACD,QAAQ,IAAI,CAACzD,IAAI,CAACjE,KAAK,EAAE;MAC5B,IAAI,CAAC4H,MAAM,CAAC3D,IAAI,CAACM,UAAU,EAAEN,IAAI,CAACC,WAAW,EAAED,IAAI,CAACjE,KAAK,CAAC;MAE1D;IACF;IAEA,MAAM6H,OAAO,GAAGrB,IAAI,CAACsB,KAAK,CACxB,CAAC7D,IAAI,CAACjE,KAAK,CAAC2C,MAAM,GAAG+E,QAAQ,CAACK,IAAI,IAAIL,QAAQ,CAACM,WACjD,CAAC;IAED,KAAK,IAAIC,MAAM,GAAG,CAAC,EAAEA,MAAM,GAAGJ,OAAO,EAAEI,MAAM,EAAE,EAAE;MAC/C,IAAI,CAACL,MAAM,CACTjL,gBAAgB,CACdsH,IAAI,CAACjE,KAAK,EACViE,IAAI,CAACC,WAAW,EAChBwD,QAAQ,CAACK,IAAI,GAAGE,MAAM,GAAGP,QAAQ,CAACM,WACpC,CAAC,EACD/D,IAAI,CAACC,WAAW,EAChBD,IAAI,CAACjE,KAAK,EACV0H,QAAQ,CAACK,IAAI,GAAGE,MAAM,GAAGP,QAAQ,CAACM,WACpC,CAAC;IACH;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACUJ,MAAMA,CACZrD,UAAwB,EACxBL,WAAwB,EACxBlE,KAAyB,EACzBwH,YAAqB,EACf;IACN,MAAMZ,YAAY,GAAG1C,WAAW,CAAC0C,YAAY,IAAI,EAAE;IAEnD,IAAIA,YAAY,CAACjE,MAAM,KAAK,CAAC,EAAE;MAC7B,IAAI,CAACuF,OAAO,CAAC,4CAA4C,EAAE3D,UAAU,CAAC;MAEtE;IACF;IAEAqC,YAAY,CAAC7G,OAAO,CAAEgH,WAAW,IAC/B,IAAI,CAACoB,iBAAiB,CAAC5D,UAAU,EAAEwC,WAAW,EAAE/G,KAAK,EAAEwH,YAAY,CACrE,CAAC;EACH;EAEQU,OAAOA,CAACrG,MAAc,EAAE0C,UAAwB,EAAQ;IAC9D,IAAI,CAAC3C,OAAO,GACVhF,qBAAqB,CAAC,IAAI,CAACwB,UAAU,CAACqF,EAAE,EAAE5B,MAAM,EAAE0C,UAAU,CAC9D,CAAC;EACH;EAEQ4D,iBAAiBA,CACvB5D,UAAwB,EACxBwC,WAA6B,EAC7B/G,KAAyB,EACzBwH,YAAqB,EACf;IACN,MAAMrC,OAAO,GAAG,IAAI,CAAC6B,iBAAiB,CAACzC,UAAU,EAAEwC,WAAW,CAAC;IAC/D,MAAME,SAAS,GAAG,IAAI,CAACC,oBAAoB,CAAC/B,OAAO,EAAE4B,WAAW,CAAC;IAEjE,IAAIE,SAAS,EAAE;MACb,IAAI,CAACiB,OAAO,CAACjB,SAAS,EAAE9B,OAAO,CAAC;MAEhC;IACF;IAEA,IAAI,CAACD,IAAI,CAAC,IAAI,CAACkB,eAAe,CAACjB,OAAO,EAAEnF,KAAK,EAAEwH,YAAY,CAAC,CAAC;EAC/D;EAEQR,iBAAiBA,CACvBzC,UAAwB,EACxBwC,WAA6B,EACf;IACd,MAAM5B,OAAO,GAAG;MACdpC,QAAQ,EAAEwB,UAAU,CAACxB,QAAQ;MAC7BF,kBAAkB,EAAEkE,WAAW,CAAClE;IAClC,CAAiB;IAEjB,MAAMyE,aAAa,GAAGnC,OAAiD;IACvE,MAAMiD,YAAY,GAAG7D,UAAoD;IAEzEwC,WAAW,CAACQ,UAAU,CAACxH,OAAO,CAAEsB,IAAI,IAAK;MACvCiG,aAAa,CAACjG,IAAI,CAAC,GAAG+G,YAAY,CAAC/G,IAAI,CAAC;IAC1C,CAAC,CAAC;IAEF,OAAO8D,OAAO;EAChB;EAEQ+B,oBAAoBA,CAC1B/B,OAAqB,EACrB4B,WAA6B,EACT;IACpB,OAAOA,WAAW,CAACQ,UAAU,CAC1BrB,GAAG,CAAE7E,IAAI,IACRxE,mBAAmB,CACjB,IAAI,CAACuB,UAAU,CAACmI,MAAM,EACtBQ,WAAW,CAAClE,kBAAkB,EAC9BxB,IAAI,EACH8D,OAAO,CAA4C9D,IAAI,CAC1D,CACF,CAAC,CACAgH,IAAI,CAAEC,OAAO,IAAKA,OAAO,KAAKtJ,SAAS,CAAC;EAC7C;AACF","ignoreList":[]}
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","createFrameValidator","parseMeasurement","discardedReadingError","rejectCustomReading","decodeBP2File","BTManagedDevice","LepuCommandBuilder","LepuEcgTransferSequencer","LepuFrameReader","TmbCommandSequencer","TmbFrameReader","decodeViatomBp3File","decodeViatomEcgRecording","recordedAtFromViatomFileName","createLepuSequencer","recordLepuIdentity","selectLepu","CustomDevice","reportedHistoryIds","Set","validators","Map","sessionAggregates","constructor","device","params","definition","oneReadingPerConnection","frameHandler","createFrameHandler","sessionPolicy","deviceData","clockSync","deliveredFileNames","deliveredEcgFileNames","selectedLepu","lepu","manufacturerData","undefined","mainServices","manufacturerDataProtocol","filter","service","uuid","write","serviceUuid","frameReader","stuckDataTimeout","reportsBondedEvent","syncsCurrentTime","preferredMtu","declareLepuProtocol","declareTmbProtocol","declareSequencerFactory","frames","forEach","frame","set","create","createCommandSequencer","deviceId","id","recordCursorStorage","tmb","protocol","startBytes","fileTransfer","clear","characteristicUuid","builder","rejectEncryptionAtBytes","expectedDeviceTypes","onIdentified","onRefused","onIdentityRefused","onFile","reportViatomEcgFile","reportViatomBp2File","reportViatomBp3File","skipFiles","acceptFile","name","ecgFileDecoder","test","pollCommand","pollIntervalMs","afterTransfer","build","onError","reason","Error","onProgress","progress","onConnectionEvent","kind","current","receivedBytes","total","totalBytes","file","decoded","content","samples","length","onResult","measurementTypeKey","ecg","caseType","RESULT","diagramPoints","duration","recordedAt","recordingId","reportHistoryOnce","has","add","info","validatePackage","pkg","validate","get","String","toLowerCase","handleDependentResult","data","parsingCase","requiresStream","isMeasuring","OTHER","handleFrame","parsedData","handlerOnly","captureSessionSample","STREAM","shouldReportDependentResult","reportFrame","error","_data","handleSuccessResult","successResult","collectedValues","emit","reading","handleMeasurementEnd","policy","aggregates","values","sessionStartedAt","aggregate","count","minSamples","summary","sample","Object","fromEntries","sums","entries","map","sessionAverage","decorateReading","value","decimals","fields","Math","trunc","Number","toFixed","measurements","frameRecordedAt","Date","measurement","createMeasurement","rejection","measurementRejection","policyFor","key","existing","readingFields","fieldNames","recordOffset","decorate","repeated","repeatedRecords","report","records","floor","from","recordBytes","record","discard","reportMeasurement","parsedFields","find","message"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/custom/custom.device.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ import { byte, FLAG_MOL_PER_L, hasFlag, sensorStatusFromGlucoseFrame, sequenceNumberFromGlucoseFrame, typeAndLocationFromGlucoseFrame } from "./standard-gatt.glucose-frame.js";
4
+ const NIBBLE_BITS = 4;
5
+ const NIBBLE_MASK = 0x0f;
6
+
7
+ /** Indexed by the specimen type code; 0, 10 (control solution) and 11-15 are not a patient sample. */
8
+ const SPECIMEN_TYPES = [undefined, "capillaryWholeBlood", "capillaryPlasma", "venousWholeBlood", "venousPlasma", "arterialWholeBlood", "arterialPlasma", "undeterminedWholeBlood", "undeterminedPlasma", "interstitialFluid"];
9
+
10
+ /** Indexed by the sample location code; 0, 4 (control solution), 5-14 and 15 (not available) say nothing. */
11
+ const SAMPLE_LOCATIONS = [undefined, "finger", "alternateSite", "earlobe"];
12
+ const STATUS_BATTERY_LOW = 0x0001;
13
+ const STATUS_SENSOR_MALFUNCTION = 0x0002;
14
+ const STATUS_SAMPLE_TOO_SMALL = 0x0004;
15
+ const STATUS_STRIP_INSERTION_ERROR = 0x0008;
16
+ const STATUS_STRIP_TYPE_INCORRECT = 0x0010;
17
+ const STATUS_RESULT_TOO_HIGH = 0x0020;
18
+ const STATUS_RESULT_TOO_LOW = 0x0040;
19
+ const STATUS_TEMPERATURE_TOO_HIGH = 0x0080;
20
+ const STATUS_TEMPERATURE_TOO_LOW = 0x0100;
21
+ const STATUS_READ_INTERRUPTED = 0x0200;
22
+ const STATUS_DEVICE_FAULT = 0x0400;
23
+ const STATUS_TIME_FAULT = 0x0800;
24
+
25
+ /** The test did not take place properly, so the concentration is not a patient's result. */
26
+ const UNUSABLE_STATUS = STATUS_SENSOR_MALFUNCTION | STATUS_SAMPLE_TOO_SMALL | STATUS_STRIP_INSERTION_ERROR | STATUS_STRIP_TYPE_INCORRECT | STATUS_READ_INTERRUPTED | STATUS_DEVICE_FAULT;
27
+ const SENSOR_WARNINGS = [[STATUS_BATTERY_LOW, "batteryLow"], [STATUS_TEMPERATURE_TOO_HIGH, "temperatureTooHigh"], [STATUS_TEMPERATURE_TOO_LOW, "temperatureTooLow"], [STATUS_TIME_FAULT, "timeFault"]];
28
+ const reportedUnit = frame => hasFlag(byte(frame, 0) ?? 0, FLAG_MOL_PER_L) ? "mmol/L" : "mg/dL";
29
+ const outOfRange = status => {
30
+ if (hasFlag(status, STATUS_RESULT_TOO_HIGH)) {
31
+ return "high";
32
+ }
33
+ return hasFlag(status, STATUS_RESULT_TOO_LOW) ? "low" : undefined;
34
+ };
35
+ const sensorWarnings = status => SENSOR_WARNINGS.filter(([flag]) => hasFlag(status, flag)).map(([, warning]) => warning);
36
+
37
+ /** Whether the meter flagged the record as a test that failed rather than a result. */
38
+ const hasUnusableSensorStatus = frame => {
39
+ const status = sensorStatusFromGlucoseFrame(frame);
40
+ return status !== undefined && hasFlag(status, UNUSABLE_STATUS);
41
+ };
42
+
43
+ /** What the record says about itself, beside its concentration. */
44
+ const glucoseRecordDetails = frame => {
45
+ const sequenceNumber = sequenceNumberFromGlucoseFrame(frame);
46
+ const typeAndLocation = typeAndLocationFromGlucoseFrame(frame);
47
+ const status = sensorStatusFromGlucoseFrame(frame);
48
+ const specimen = typeAndLocation === undefined ? undefined : SPECIMEN_TYPES[typeAndLocation & NIBBLE_MASK];
49
+ const sampleLocation = typeAndLocation === undefined ? undefined : SAMPLE_LOCATIONS[typeAndLocation >> NIBBLE_BITS];
50
+ const range = status === undefined ? undefined : outOfRange(status);
51
+ const warnings = status === undefined ? [] : sensorWarnings(status);
52
+ return {
53
+ reportedUnit: reportedUnit(frame),
54
+ ...(sequenceNumber !== undefined && {
55
+ sequenceNumber
56
+ }),
57
+ ...(specimen && {
58
+ specimen
59
+ }),
60
+ ...(sampleLocation && {
61
+ sampleLocation
62
+ }),
63
+ ...(range && {
64
+ outOfRange: range
65
+ }),
66
+ ...(warnings.length > 0 && {
67
+ sensorStatus: warnings
68
+ })
69
+ };
70
+ };
71
+ export { glucoseRecordDetails, hasUnusableSensorStatus };
72
+ //# sourceMappingURL=standard-gatt.glucose-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["byte","FLAG_MOL_PER_L","hasFlag","sensorStatusFromGlucoseFrame","sequenceNumberFromGlucoseFrame","typeAndLocationFromGlucoseFrame","NIBBLE_BITS","NIBBLE_MASK","SPECIMEN_TYPES","undefined","SAMPLE_LOCATIONS","STATUS_BATTERY_LOW","STATUS_SENSOR_MALFUNCTION","STATUS_SAMPLE_TOO_SMALL","STATUS_STRIP_INSERTION_ERROR","STATUS_STRIP_TYPE_INCORRECT","STATUS_RESULT_TOO_HIGH","STATUS_RESULT_TOO_LOW","STATUS_TEMPERATURE_TOO_HIGH","STATUS_TEMPERATURE_TOO_LOW","STATUS_READ_INTERRUPTED","STATUS_DEVICE_FAULT","STATUS_TIME_FAULT","UNUSABLE_STATUS","SENSOR_WARNINGS","reportedUnit","frame","outOfRange","status","sensorWarnings","filter","flag","map","warning","hasUnusableSensorStatus","glucoseRecordDetails","sequenceNumber","typeAndLocation","specimen","sampleLocation","range","warnings","length","sensorStatus"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-details.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ const FLAG_TIME_OFFSET = 0x01;
4
+ const FLAG_CONCENTRATION = 0x02;
5
+ const FLAG_MOL_PER_L = 0x04;
6
+ const FLAG_SENSOR_STATUS = 0x08;
7
+ const SEQUENCE_NUMBER_INDEX = 1;
8
+ const BASE_TIME_INDEX = 3;
9
+ const TIME_OFFSET_INDEX = 10;
10
+ const BYTE_BITS = 8;
11
+ const TYPE_AND_LOCATION_OFFSET = 2;
12
+ const SENSOR_STATUS_OFFSET = 3;
13
+ const hasFlag = (flags, flag) => (flags & flag) !== 0;
14
+ const concentrationIndex = flags => hasFlag(flags, FLAG_TIME_OFFSET) ? TIME_OFFSET_INDEX + 2 : TIME_OFFSET_INDEX;
15
+ const byte = (frame, index) => {
16
+ const value = Number.parseInt(frame[index] ?? "", 16);
17
+ return Number.isInteger(value) ? value : undefined;
18
+ };
19
+ const uint16 = (frame, index) => {
20
+ const low = byte(frame, index);
21
+ const high = byte(frame, index + 1);
22
+ return low === undefined || high === undefined ? undefined : low | high << BYTE_BITS;
23
+ };
24
+
25
+ /** The meter's number for the record, in bytes 1-2 of every Glucose Measurement. */
26
+ const sequenceNumberFromGlucoseFrame = frame => uint16(frame, SEQUENCE_NUMBER_INDEX);
27
+
28
+ /** Specimen type in the low nibble and sample location in the high one; only a record with a concentration has it. */
29
+ const typeAndLocationFromGlucoseFrame = frame => {
30
+ const flags = byte(frame, 0) ?? 0;
31
+ return hasFlag(flags, FLAG_CONCENTRATION) ? byte(frame, concentrationIndex(flags) + TYPE_AND_LOCATION_OFFSET) : undefined;
32
+ };
33
+
34
+ /** The Sensor Status Annunciation bits, which only a record that sets flag bit 3 carries. */
35
+ const sensorStatusFromGlucoseFrame = frame => {
36
+ const flags = byte(frame, 0) ?? 0;
37
+ return hasFlag(flags, FLAG_SENSOR_STATUS) && hasFlag(flags, FLAG_CONCENTRATION) ? uint16(frame, concentrationIndex(flags) + SENSOR_STATUS_OFFSET) : undefined;
38
+ };
39
+ export { BASE_TIME_INDEX, byte, concentrationIndex, FLAG_CONCENTRATION, FLAG_MOL_PER_L, FLAG_TIME_OFFSET, hasFlag, sensorStatusFromGlucoseFrame, sequenceNumberFromGlucoseFrame, TIME_OFFSET_INDEX, typeAndLocationFromGlucoseFrame };
40
+ //# sourceMappingURL=standard-gatt.glucose-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FLAG_TIME_OFFSET","FLAG_CONCENTRATION","FLAG_MOL_PER_L","FLAG_SENSOR_STATUS","SEQUENCE_NUMBER_INDEX","BASE_TIME_INDEX","TIME_OFFSET_INDEX","BYTE_BITS","TYPE_AND_LOCATION_OFFSET","SENSOR_STATUS_OFFSET","hasFlag","flags","flag","concentrationIndex","byte","frame","index","value","Number","parseInt","isInteger","undefined","uint16","low","high","sequenceNumberFromGlucoseFrame","typeAndLocationFromGlucoseFrame","sensorStatusFromGlucoseFrame"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-frame.ts"],"mappings":";;AAAA,MAAMA,gBAAgB,GAAG,IAAI;AAC7B,MAAMC,kBAAkB,GAAG,IAAI;AAC/B,MAAMC,cAAc,GAAG,IAAI;AAC3B,MAAMC,kBAAkB,GAAG,IAAI;AAE/B,MAAMC,qBAAqB,GAAG,CAAC;AAC/B,MAAMC,eAAe,GAAG,CAAC;AACzB,MAAMC,iBAAiB,GAAG,EAAE;AAE5B,MAAMC,SAAS,GAAG,CAAC;AACnB,MAAMC,wBAAwB,GAAG,CAAC;AAClC,MAAMC,oBAAoB,GAAG,CAAC;AAE9B,MAAMC,OAAO,GAAGA,CAACC,KAAa,EAAEC,IAAY,KAAc,CAACD,KAAK,GAAGC,IAAI,MAAM,CAAC;AAE9E,MAAMC,kBAAkB,GAAIF,KAAa,IACvCD,OAAO,CAACC,KAAK,EAAEX,gBAAgB,CAAC,GAAGM,iBAAiB,GAAG,CAAC,GAAGA,iBAAiB;AAE9E,MAAMQ,IAAI,GAAGA,CAACC,KAAwB,EAAEC,KAAa,KAAyB;EAC5E,MAAMC,KAAK,GAAGC,MAAM,CAACC,QAAQ,CAACJ,KAAK,CAACC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;EAErD,OAAOE,MAAM,CAACE,SAAS,CAACH,KAAK,CAAC,GAAGA,KAAK,GAAGI,SAAS;AACpD,CAAC;AAED,MAAMC,MAAM,GAAGA,CAACP,KAAwB,EAAEC,KAAa,KAAyB;EAC9E,MAAMO,GAAG,GAAGT,IAAI,CAACC,KAAK,EAAEC,KAAK,CAAC;EAC9B,MAAMQ,IAAI,GAAGV,IAAI,CAACC,KAAK,EAAEC,KAAK,GAAG,CAAC,CAAC;EAEnC,OAAOO,GAAG,KAAKF,SAAS,IAAIG,IAAI,KAAKH,SAAS,GAC1CA,SAAS,GACTE,GAAG,GAAIC,IAAI,IAAIjB,SAAU;AAC/B,CAAC;;AAED;AACA,MAAMkB,8BAA8B,GAClCV,KAAwB,IACDO,MAAM,CAACP,KAAK,EAAEX,qBAAqB,CAAC;;AAE7D;AACA,MAAMsB,+BAA+B,GACnCX,KAAwB,IACD;EACvB,MAAMJ,KAAK,GAAGG,IAAI,CAACC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;EAEjC,OAAOL,OAAO,CAACC,KAAK,EAAEV,kBAAkB,CAAC,GACrCa,IAAI,CAACC,KAAK,EAAEF,kBAAkB,CAACF,KAAK,CAAC,GAAGH,wBAAwB,CAAC,GACjEa,SAAS;AACf,CAAC;;AAED;AACA,MAAMM,4BAA4B,GAChCZ,KAAwB,IACD;EACvB,MAAMJ,KAAK,GAAGG,IAAI,CAACC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;EAEjC,OAAOL,OAAO,CAACC,KAAK,EAAER,kBAAkB,CAAC,IAAIO,OAAO,CAACC,KAAK,EAAEV,kBAAkB,CAAC,GAC3EqB,MAAM,CAACP,KAAK,EAAEF,kBAAkB,CAACF,KAAK,CAAC,GAAGF,oBAAoB,CAAC,GAC/DY,SAAS;AACf,CAAC;AAED,SACEhB,eAAe,EACfS,IAAI,EACJD,kBAAkB,EAClBZ,kBAAkB,EAClBC,cAAc,EACdF,gBAAgB,EAChBU,OAAO,EACPiB,4BAA4B,EAC5BF,8BAA8B,EAC9BnB,iBAAiB,EACjBoB,+BAA+B","ignoreList":[]}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ import { bytesToHex } from "../../../utils/bytes-to-hex.js";
4
+ import { sigUuid } from "../../../utils/sig-uuid.js";
5
+ import { RecordCursor } from "../../record-cursor.js";
6
+ import { byte, sequenceNumberFromGlucoseFrame } from "./standard-gatt.glucose-frame.js";
7
+ const GLUCOSE_SERVICE_UUID = sigUuid("1808");
8
+ const GLUCOSE_MEASUREMENT_UUID = sigUuid("2a18");
9
+ const RECORD_ACCESS_CONTROL_POINT_UUID = sigUuid("2a52");
10
+ const RACP_REPORT_STORED_RECORDS = 0x01;
11
+ const RACP_RESPONSE_CODE = 0x06;
12
+ const RACP_OPERATOR_ALL_RECORDS = 0x01;
13
+ const RACP_OPERATOR_GREATER_OR_EQUAL = 0x03;
14
+ const RACP_FILTER_SEQUENCE_NUMBER = 0x01;
15
+ const RESPONSE_OPCODE_INDEX = 0;
16
+ const RESPONSE_REQUEST_INDEX = 2;
17
+ const RESPONSE_RESULT_INDEX = 3;
18
+
19
+ /** Invalid operator, operator not supported, invalid operand and operand not supported. */
20
+ const FILTER_REFUSALS = new Set([0x03, 0x04, 0x05, 0x09]);
21
+ const BYTE_BITS = 8;
22
+ const MAX_SEQUENCE_NUMBER = 0xffff;
23
+ const CURSOR_KEY_PREFIX = "@ovok/native/glucose-sequence";
24
+ const reportAllRecords = () => bytesToHex([RACP_REPORT_STORED_RECORDS, RACP_OPERATOR_ALL_RECORDS]);
25
+ const reportRecordsFrom = sequenceNumber => bytesToHex([RACP_REPORT_STORED_RECORDS, RACP_OPERATOR_GREATER_OR_EQUAL, RACP_FILTER_SEQUENCE_NUMBER, sequenceNumber, sequenceNumber >> BYTE_BITS]);
26
+
27
+ /** The first number worth asking for, or nothing when none is known or the one after it cannot be written. */
28
+ const sequenceToAskFrom = newestStored => newestStored === undefined || newestStored >= MAX_SEQUENCE_NUMBER ? undefined : newestStored + 1;
29
+
30
+ /** Whether the meter answered "report stored records" by refusing the filter it was given. */
31
+ const refusesFilter = frame => {
32
+ const result = byte(frame, RESPONSE_RESULT_INDEX);
33
+ return byte(frame, RESPONSE_OPCODE_INDEX) === RACP_RESPONSE_CODE && byte(frame, RESPONSE_REQUEST_INDEX) === RACP_REPORT_STORED_RECORDS && result !== undefined && FILTER_REFUSALS.has(result);
34
+ };
35
+ const racpCommand = frame => ({
36
+ serviceUuid: GLUCOSE_SERVICE_UUID,
37
+ characteristicUuid: RECORD_ACCESS_CONTROL_POINT_UUID,
38
+ frame
39
+ });
40
+
41
+ /**
42
+ * Asks a glucose meter for the records stored after the newest one already read, and keeps
43
+ * count of the sequence numbers it sends. A meter that refuses the sequence-number filter is
44
+ * asked for every record instead, once.
45
+ *
46
+ * Every Glucose Measurement counts, usable or not: a record the SDK withholds is no reason to
47
+ * download it again.
48
+ */
49
+ class GlucoseRecordSequencer {
50
+ filtered = false;
51
+ constructor(cursor) {
52
+ this.cursor = cursor;
53
+ }
54
+ initialCommands = async () => {
55
+ const from = sequenceToAskFrom(await this.cursor.load());
56
+ this.filtered = from !== undefined;
57
+ return [racpCommand(from === undefined ? reportAllRecords() : reportRecordsFrom(from))];
58
+ };
59
+ nextCommand = (frame, characteristicUuid) => {
60
+ const uuid = characteristicUuid?.toLowerCase();
61
+ if (uuid === GLUCOSE_MEASUREMENT_UUID) {
62
+ this.countRecord(frame);
63
+ return undefined;
64
+ }
65
+ if (uuid === RECORD_ACCESS_CONTROL_POINT_UUID && this.filtered && refusesFilter(frame)) {
66
+ this.filtered = false;
67
+ return [racpCommand(reportAllRecords())];
68
+ }
69
+ return undefined;
70
+ };
71
+ countRecord(frame) {
72
+ const sequenceNumber = sequenceNumberFromGlucoseFrame(frame);
73
+ if (sequenceNumber !== undefined) {
74
+ this.cursor.advance(sequenceNumber);
75
+ }
76
+ }
77
+ }
78
+
79
+ /** Gives each connection to a glucose meter its own sequencer over that meter's stored cursor. */
80
+ const createGlucoseSequencer = ({
81
+ deviceId,
82
+ recordCursorStorage
83
+ }) => new GlucoseRecordSequencer(new RecordCursor(recordCursorStorage, `${CURSOR_KEY_PREFIX}/${deviceId}`));
84
+ export { createGlucoseSequencer, GLUCOSE_MEASUREMENT_UUID, GLUCOSE_SERVICE_UUID, RECORD_ACCESS_CONTROL_POINT_UUID };
85
+ //# sourceMappingURL=standard-gatt.glucose-racp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bytesToHex","sigUuid","RecordCursor","byte","sequenceNumberFromGlucoseFrame","GLUCOSE_SERVICE_UUID","GLUCOSE_MEASUREMENT_UUID","RECORD_ACCESS_CONTROL_POINT_UUID","RACP_REPORT_STORED_RECORDS","RACP_RESPONSE_CODE","RACP_OPERATOR_ALL_RECORDS","RACP_OPERATOR_GREATER_OR_EQUAL","RACP_FILTER_SEQUENCE_NUMBER","RESPONSE_OPCODE_INDEX","RESPONSE_REQUEST_INDEX","RESPONSE_RESULT_INDEX","FILTER_REFUSALS","Set","BYTE_BITS","MAX_SEQUENCE_NUMBER","CURSOR_KEY_PREFIX","reportAllRecords","reportRecordsFrom","sequenceNumber","sequenceToAskFrom","newestStored","undefined","refusesFilter","frame","result","has","racpCommand","serviceUuid","characteristicUuid","GlucoseRecordSequencer","filtered","constructor","cursor","initialCommands","from","load","nextCommand","uuid","toLowerCase","countRecord","advance","createGlucoseSequencer","deviceId","recordCursorStorage"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/standard-gatt/standard-gatt.glucose-racp.ts"],"mappings":"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","ignoreList":[]}
@@ -2,8 +2,10 @@
2
2
 
3
3
  import { MeasurementTypeKey } from "@ovok/core/next";
4
4
  import { byteToHex } from "../../../utils/bytes-to-hex.js";
5
- import { sigUuid } from "../../../utils/sig-uuid.js";
6
5
  import { defineCustomDevice } from "../../custom/define-custom-device.js";
6
+ import { glucoseRecordDetails, hasUnusableSensorStatus } from "./standard-gatt.glucose-details.js";
7
+ import { BASE_TIME_INDEX, byte, concentrationIndex, FLAG_CONCENTRATION, FLAG_MOL_PER_L, FLAG_TIME_OFFSET, TIME_OFFSET_INDEX, typeAndLocationFromGlucoseFrame } from "./standard-gatt.glucose-frame.js";
8
+ import { createGlucoseSequencer, GLUCOSE_MEASUREMENT_UUID, GLUCOSE_SERVICE_UUID, RECORD_ACCESS_CONTROL_POINT_UUID } from "./standard-gatt.glucose-racp.js";
7
9
  import { littleEndian } from "./standard-gatt.profile.js";
8
10
 
9
11
  /**
@@ -11,10 +13,11 @@ import { littleEndian } from "./standard-gatt.profile.js";
11
13
  * 0x2A52.
12
14
  *
13
15
  * A glucose meter does not push its readings. The collector enables indications on the
14
- * control point, writes "report all stored records" (`01 01`) once, and the meter answers
15
- * with one Glucose Measurement per stored record followed by a control-point response
16
- * (`06 00 01 xx`). Every record is reported; the SDK's stable result identity keeps a
17
- * record seen on an earlier connection from becoming a second reading.
16
+ * control point and writes a request for the stored records: those after the newest one it
17
+ * has read (`01 03 01 nn nn`) when the manager has a `recordCursorStorage`, otherwise all of
18
+ * them (`01 01`). The meter answers with one Glucose Measurement per record followed by a
19
+ * control-point response (`06 00 01 xx`). The SDK's stable result identity, which covers the
20
+ * record's sequence number, keeps a record seen twice from becoming a second reading.
18
21
  *
19
22
  * Glucose Measurement layout: flags, sequence number (2), base time (7), time offset (2,
20
23
  * flag bit 0), concentration SFLOAT (2) and type/sample-location (1) (bit 1), sensor status
@@ -24,17 +27,13 @@ const MG_PER_DL_PER_KG_PER_L = 100_000;
24
27
 
25
28
  /** One mol/L of glucose (180.16 g/mol) is 18,016 mg/dL. */
26
29
  const MG_PER_DL_PER_MOL_PER_L = 18_016;
27
- const FLAG_TIME_OFFSET = 0x01;
28
- const FLAG_CONCENTRATION = 0x02;
29
- const FLAG_MOL_PER_L = 0x04;
30
- const BASE_TIME_INDEX = 3;
31
- const TIME_OFFSET_INDEX = 10;
30
+
31
+ /** One decimal reads a mmol/L result (0.1 mmol/L is 1.8 mg/dL) back as the meter showed it. */
32
+ const MG_PER_DL_DECIMALS = 1;
32
33
 
33
34
  /** Type 0xA and sample location 0x4 both mean a control-solution test, not a patient sample. */
34
35
  const CONTROL_SOLUTION_TYPE = 0x0a;
35
36
  const CONTROL_SOLUTION_LOCATION = 0x04;
36
- const REPORT_ALL_STORED_RECORDS = "0101";
37
- const concentrationIndex = flags => flags & FLAG_TIME_OFFSET ? TIME_OFFSET_INDEX + 2 : TIME_OFFSET_INDEX;
38
37
 
39
38
  /** Bits 5-7 are reserved; a meter that sets one still sends a readable record. */
40
39
  const ALL_FLAGS = Array.from({
@@ -45,13 +44,9 @@ const glucoseField = flags => {
45
44
  return {
46
45
  ...littleEndian("bloodGlucose", [index, index + 1], "mg/dL", "sfloat"),
47
46
  scale: flags & FLAG_MOL_PER_L ? MG_PER_DL_PER_MOL_PER_L : MG_PER_DL_PER_KG_PER_L,
48
- decimals: 0
47
+ decimals: MG_PER_DL_DECIMALS
49
48
  };
50
49
  };
51
- const byte = (frame, index) => {
52
- const value = Number.parseInt(frame[index] ?? "", 16);
53
- return Number.isInteger(value) ? value : undefined;
54
- };
55
50
 
56
51
  /** The record's own time: the base time plus its offset in minutes, read as phone-local. */
57
52
  const recordedAtFromGlucoseFrame = frame => {
@@ -82,8 +77,7 @@ const recordedAtFromGlucoseFrame = frame => {
82
77
  return recordedAt;
83
78
  };
84
79
  const isControlSolution = frame => {
85
- const flags = byte(frame, 0) ?? 0;
86
- const typeAndLocation = byte(frame, concentrationIndex(flags) + 2);
80
+ const typeAndLocation = typeAndLocationFromGlucoseFrame(frame);
87
81
  return typeAndLocation !== undefined && ((typeAndLocation & 0x0f) === CONTROL_SOLUTION_TYPE || typeAndLocation >> 4 === CONTROL_SOLUTION_LOCATION);
88
82
  };
89
83
 
@@ -95,9 +89,9 @@ const standardGlucoseDevice = params => defineCustomDevice({
95
89
  oneReadingPerConnection: params.oneReadingPerConnection,
96
90
  stuckDataTimeoutMs: params.stuckDataTimeoutMs ?? 60_000,
97
91
  services: [{
98
- uuid: sigUuid("1808"),
92
+ uuid: GLUCOSE_SERVICE_UUID,
99
93
  monitor: [{
100
- uuid: sigUuid("2a18"),
94
+ uuid: GLUCOSE_MEASUREMENT_UUID,
101
95
  frame: {
102
96
  minLengthBytes: TIME_OFFSET_INDEX
103
97
  },
@@ -114,7 +108,7 @@ const standardGlucoseDevice = params => defineCustomDevice({
114
108
  description: "A record without a concentration"
115
109
  })
116
110
  }, {
117
- uuid: sigUuid("2a52"),
111
+ uuid: RECORD_ACCESS_CONTROL_POINT_UUID,
118
112
  frame: {
119
113
  minLengthBytes: 2
120
114
  },
@@ -128,23 +122,22 @@ const standardGlucoseDevice = params => defineCustomDevice({
128
122
  kind: "idle",
129
123
  description: "Record access response"
130
124
  }]
131
- }],
132
- write: {
133
- uuid: sigUuid("2a52"),
134
- commandHex: REPORT_ALL_STORED_RECORDS,
135
- when: "connect"
136
- }
125
+ }]
137
126
  }]
138
127
  }, {
128
+ createCommandSequencer: createGlucoseSequencer,
139
129
  decorateReading: (reading, frame, recordOffset) => {
140
- if (frame && isControlSolution(frame)) {
130
+ if (frame && (isControlSolution(frame) || hasUnusableSensorStatus(frame))) {
141
131
  return null;
142
132
  }
143
133
  const recordedAt = frame ? recordedAtFromGlucoseFrame(frame) : undefined;
144
- const decorated = recordedAt ? {
134
+ const decorated = {
145
135
  ...reading,
146
- recordedAt
147
- } : reading;
136
+ ...(frame && glucoseRecordDetails(frame)),
137
+ ...(recordedAt && {
138
+ recordedAt
139
+ })
140
+ };
148
141
  return params.decorateReading ? params.decorateReading(decorated, frame, recordOffset) : decorated;
149
142
  }
150
143
  });