@ovok/native 1.5.3 → 1.5.5

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 (168) hide show
  1. package/android/src/main/AndroidManifest.xml +1 -0
  2. package/android/src/main/java/com/ovok/sdk/backgroundsync/OvokBackgroundSyncModule.java +54 -0
  3. package/lib/commonjs/modules/background-sync/android-background-sync.js +20 -2
  4. package/lib/commonjs/modules/background-sync/android-background-sync.js.map +1 -1
  5. package/lib/commonjs/modules/background-sync/android-bluetooth-foreground-service.js +16 -9
  6. package/lib/commonjs/modules/background-sync/android-bluetooth-foreground-service.js.map +1 -1
  7. package/lib/commonjs/modules/background-sync/index.js +11 -0
  8. package/lib/commonjs/modules/background-sync/index.js.map +1 -1
  9. package/lib/commonjs/modules/background-sync/notifications.js +56 -0
  10. package/lib/commonjs/modules/background-sync/notifications.js.map +1 -0
  11. package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js +1 -0
  12. package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
  13. package/lib/commonjs/modules/bt-device/constants/device-list-items.js +6 -0
  14. package/lib/commonjs/modules/bt-device/constants/device-list-items.js.map +1 -1
  15. package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-assets.js +3 -1
  16. package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-assets.js.map +1 -1
  17. package/lib/commonjs/modules/bt-device/constants/supported-devices.js +16 -1
  18. package/lib/commonjs/modules/bt-device/constants/supported-devices.js.map +1 -1
  19. package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js +19 -2
  20. package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
  21. package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js +1 -1
  22. package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
  23. package/lib/commonjs/modules/bt-management/index.js +22 -0
  24. package/lib/commonjs/modules/bt-management/index.js.map +1 -1
  25. package/lib/commonjs/modules/bt-management/services/bt-manager.js +101 -38
  26. package/lib/commonjs/modules/bt-management/services/bt-manager.js.map +1 -1
  27. package/lib/commonjs/modules/bt-management/services/device-creator.js +3 -1
  28. package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
  29. package/lib/commonjs/modules/bt-management/services/devices/bt-device-information.js +38 -18
  30. package/lib/commonjs/modules/bt-management/services/devices/bt-device-information.js.map +1 -1
  31. package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js +55 -0
  32. package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js.map +1 -0
  33. package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js +202 -0
  34. package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js.map +1 -0
  35. package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.activity-device.js +54 -0
  36. package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.activity-device.js.map +1 -0
  37. package/lib/commonjs/modules/bt-management/types/integrated-devices.js +1 -0
  38. package/lib/commonjs/modules/bt-management/types/integrated-devices.js.map +1 -1
  39. package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-context.js +13 -0
  40. package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-context.js.map +1 -0
  41. package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-provider.js +22 -15
  42. package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-provider.js.map +1 -1
  43. package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js +35 -4
  44. package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
  45. package/lib/module/modules/background-sync/android-background-sync.js +17 -1
  46. package/lib/module/modules/background-sync/android-background-sync.js.map +1 -1
  47. package/lib/module/modules/background-sync/android-bluetooth-foreground-service.js +17 -10
  48. package/lib/module/modules/background-sync/android-bluetooth-foreground-service.js.map +1 -1
  49. package/lib/module/modules/background-sync/index.js +1 -0
  50. package/lib/module/modules/background-sync/index.js.map +1 -1
  51. package/lib/module/modules/background-sync/notifications.js +50 -0
  52. package/lib/module/modules/background-sync/notifications.js.map +1 -0
  53. package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js +1 -0
  54. package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
  55. package/lib/module/modules/bt-device/constants/device-list-items.js +6 -0
  56. package/lib/module/modules/bt-device/constants/device-list-items.js.map +1 -1
  57. package/lib/module/modules/bt-device/constants/supported-device-catalog-assets.js +3 -1
  58. package/lib/module/modules/bt-device/constants/supported-device-catalog-assets.js.map +1 -1
  59. package/lib/module/modules/bt-device/constants/supported-devices.js +17 -2
  60. package/lib/module/modules/bt-device/constants/supported-devices.js.map +1 -1
  61. package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js +20 -3
  62. package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
  63. package/lib/module/modules/bt-management/constants/integrated-devices-map.js +1 -1
  64. package/lib/module/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
  65. package/lib/module/modules/bt-management/index.js +2 -0
  66. package/lib/module/modules/bt-management/index.js.map +1 -1
  67. package/lib/module/modules/bt-management/services/bt-manager.js +101 -38
  68. package/lib/module/modules/bt-management/services/bt-manager.js.map +1 -1
  69. package/lib/module/modules/bt-management/services/device-creator.js +3 -1
  70. package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
  71. package/lib/module/modules/bt-management/services/devices/bt-device-information.js +38 -18
  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/veroval/veroval-activity-frame-reader.js +50 -0
  74. package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js.map +1 -0
  75. package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js +198 -0
  76. package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js.map +1 -0
  77. package/lib/module/modules/bt-management/services/devices/veroval/veroval.activity-device.js +49 -0
  78. package/lib/module/modules/bt-management/services/devices/veroval/veroval.activity-device.js.map +1 -0
  79. package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
  80. package/lib/module/modules/bt-management/types/integrated-devices.js +1 -0
  81. package/lib/module/modules/bt-management/types/integrated-devices.js.map +1 -1
  82. package/lib/module/modules/data-sync/components/apple/apple-health-authorization-context.js +8 -0
  83. package/lib/module/modules/data-sync/components/apple/apple-health-authorization-context.js.map +1 -0
  84. package/lib/module/modules/data-sync/components/apple/apple-health-authorization-provider.js +22 -15
  85. package/lib/module/modules/data-sync/components/apple/apple-health-authorization-provider.js.map +1 -1
  86. package/lib/module/modules/data-sync/components/apple/apple-health-sync.js +35 -4
  87. package/lib/module/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
  88. package/lib/typescript/commonjs/src/modules/background-sync/android-background-sync.d.ts +7 -1
  89. package/lib/typescript/commonjs/src/modules/background-sync/android-background-sync.d.ts.map +1 -1
  90. package/lib/typescript/commonjs/src/modules/background-sync/android-bluetooth-foreground-service.d.ts.map +1 -1
  91. package/lib/typescript/commonjs/src/modules/background-sync/index.d.ts +1 -0
  92. package/lib/typescript/commonjs/src/modules/background-sync/index.d.ts.map +1 -1
  93. package/lib/typescript/commonjs/src/modules/background-sync/notifications.d.ts +14 -0
  94. package/lib/typescript/commonjs/src/modules/background-sync/notifications.d.ts.map +1 -0
  95. package/lib/typescript/commonjs/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/src/modules/bt-device/constants/device-list-items.d.ts.map +1 -1
  97. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts +3 -1
  98. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts.map +1 -1
  99. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts +7 -0
  100. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
  101. package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
  102. package/lib/typescript/commonjs/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
  103. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts +2 -0
  104. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts.map +1 -1
  105. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts +7 -0
  106. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  107. package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-device-information.d.ts.map +1 -1
  109. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts +12 -0
  110. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts +47 -0
  112. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts +18 -0
  114. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/src/modules/bt-management/types/background-sync.d.ts +8 -0
  116. package/lib/typescript/commonjs/src/modules/bt-management/types/background-sync.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +12 -1
  118. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  119. package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts +2 -1
  120. package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
  121. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts +7 -0
  122. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts +1 -1
  124. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts.map +1 -1
  125. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-sync.d.ts +3 -1
  126. package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
  127. package/lib/typescript/commonjs/src/modules/data-sync/components/data-sync.d.ts +1 -1
  128. package/lib/typescript/module/src/modules/background-sync/android-background-sync.d.ts +7 -1
  129. package/lib/typescript/module/src/modules/background-sync/android-background-sync.d.ts.map +1 -1
  130. package/lib/typescript/module/src/modules/background-sync/android-bluetooth-foreground-service.d.ts.map +1 -1
  131. package/lib/typescript/module/src/modules/background-sync/index.d.ts +1 -0
  132. package/lib/typescript/module/src/modules/background-sync/index.d.ts.map +1 -1
  133. package/lib/typescript/module/src/modules/background-sync/notifications.d.ts +14 -0
  134. package/lib/typescript/module/src/modules/background-sync/notifications.d.ts.map +1 -0
  135. package/lib/typescript/module/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
  136. package/lib/typescript/module/src/modules/bt-device/constants/device-list-items.d.ts.map +1 -1
  137. package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts +3 -1
  138. package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts.map +1 -1
  139. package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts +7 -0
  140. package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
  141. package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
  142. package/lib/typescript/module/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
  143. package/lib/typescript/module/src/modules/bt-management/index.d.ts +2 -0
  144. package/lib/typescript/module/src/modules/bt-management/index.d.ts.map +1 -1
  145. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts +7 -0
  146. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  147. package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  148. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-device-information.d.ts.map +1 -1
  149. package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts +12 -0
  150. package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts.map +1 -0
  151. package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts +47 -0
  152. package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts.map +1 -0
  153. package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts +18 -0
  154. package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts.map +1 -0
  155. package/lib/typescript/module/src/modules/bt-management/types/background-sync.d.ts +8 -0
  156. package/lib/typescript/module/src/modules/bt-management/types/background-sync.d.ts.map +1 -1
  157. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +12 -1
  158. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  159. package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts +2 -1
  160. package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
  161. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts +7 -0
  162. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts.map +1 -0
  163. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts +1 -1
  164. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts.map +1 -1
  165. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-sync.d.ts +3 -1
  166. package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
  167. package/lib/typescript/module/src/modules/data-sync/components/data-sync.d.ts +1 -1
  168. package/package.json +3 -1
@@ -10,6 +10,10 @@ class BTManager {
10
10
  static MAX_DEVICES = 15; // Safety limit to prevent unbounded growth
11
11
  devices = new Map();
12
12
  eventSubscriptions = [];
13
+ scanGeneration = 0;
14
+ scanActive = false;
15
+ scanStarting = false;
16
+ destroyed = false;
13
17
  autoConnectCandidates = new Map();
14
18
  constructor(bleManager, acceptedDevices, options = {}) {
15
19
  this.bleManager = bleManager;
@@ -20,18 +24,13 @@ class BTManager {
20
24
  }
21
25
  destroy = () => {
22
26
  sentryLogger("info", "BT_MANAGER: Destroying BTManager");
27
+ this.destroyed = true;
23
28
  this.stopScan();
24
29
  if (this.autoConnectTimer) {
25
30
  clearTimeout(this.autoConnectTimer);
26
31
  this.autoConnectTimer = undefined;
27
32
  }
28
33
 
29
- // Remove state change listener
30
- if (this.stateChangeListener) {
31
- this.stateChangeListener.remove();
32
- this.stateChangeListener = undefined;
33
- }
34
-
35
34
  // Then clear all callbacks
36
35
  this.onErrorCallback = undefined;
37
36
  this.onDeviceFoundCallback = undefined;
@@ -44,35 +43,23 @@ class BTManager {
44
43
  this.deviceCreator.destroy();
45
44
  };
46
45
  startScan = () => {
47
- // Remove previous state change listener to prevent accumulation
48
- if (this.stateChangeListener) {
49
- this.stateChangeListener.remove();
50
- this.stateChangeListener = undefined;
46
+ if (this.destroyed || this.scanActive || this.scanStarting || this.stateChangeListener) {
47
+ return;
51
48
  }
52
- this.stateChangeListener = this.bleManager.onStateChange(state => {
49
+ const generation = ++this.scanGeneration;
50
+ let subscription;
51
+ let poweredOnBeforeSubscription = false;
52
+ const onStateChange = state => {
53
+ if (this.destroyed || generation !== this.scanGeneration) {
54
+ return;
55
+ }
53
56
  if (state === State.PoweredOn) {
54
- // Remove from tracking array before removing listener
55
- const index = this.eventSubscriptions.indexOf(this.stateChangeListener);
56
- if (index > -1) {
57
- this.eventSubscriptions.splice(index, 1);
58
- }
59
- this.stateChangeListener?.remove();
60
- this.stateChangeListener = undefined;
61
- const serviceUUIDs = this.options.serviceUUIDs ?? [];
62
- if (Platform.OS === "ios" && this.backgroundScanEnabled && !serviceUUIDs.length) {
63
- this.onErrorCallback?.({
64
- error: "Background Bluetooth sync on iOS requires at least one service UUID. Add serviceUUIDs for custom devices."
65
- });
66
- return;
57
+ if (subscription) {
58
+ this.removeStateChangeListener(subscription);
59
+ } else {
60
+ poweredOnBeforeSubscription = true;
67
61
  }
68
- void Promise.resolve(this.bleManager.startDeviceScan(this.backgroundScanEnabled ? [...serviceUUIDs] : null, {
69
- scanMode: this.backgroundScanEnabled ? ScanMode.LowPower : ScanMode.Balanced
70
- }, this.onScanResult)).catch(error => {
71
- this.onErrorCallback?.({
72
- error: error instanceof Error ? error : String(error)
73
- });
74
- });
75
- sentryLogger("info", "BT_MANAGER: Scan started (continuous mode)");
62
+ this.startDeviceScan(generation);
76
63
  return;
77
64
  }
78
65
  sentryLogger("warning", "BT_MANAGER: State is not PoweredOn, sending intent to enable Bluetooth");
@@ -85,20 +72,39 @@ class BTManager {
85
72
  return;
86
73
  }
87
74
  sentryLogger("warning", "BT_MANAGER: Bluetooth is off; on iOS the user must enable it from Settings");
88
- }, true);
89
-
90
- // Track subscription for proper cleanup
91
- if (this.stateChangeListener) {
92
- this.eventSubscriptions.push(this.stateChangeListener);
75
+ };
76
+ try {
77
+ subscription = this.bleManager.onStateChange(onStateChange, true);
78
+ } catch (error) {
79
+ this.onErrorCallback?.({
80
+ error: error instanceof Error ? error : String(error)
81
+ });
82
+ return;
83
+ }
84
+ if (poweredOnBeforeSubscription) {
85
+ this.removeStateChangeListener(subscription);
86
+ } else {
87
+ this.stateChangeListener = subscription;
88
+ this.eventSubscriptions.push(subscription);
93
89
  }
94
90
  };
95
91
 
96
92
  /** Switches only the scan policy; the app can keep a foreground scan broad. */
97
93
  setBackgroundScanEnabled = enabled => {
94
+ if (this.backgroundScanEnabled === enabled) {
95
+ return;
96
+ }
98
97
  this.backgroundScanEnabled = enabled;
98
+ if (this.scanActive || this.stateChangeListener) {
99
+ this.restartScan();
100
+ }
99
101
  };
100
102
  stopScan = () => {
101
103
  sentryLogger("info", "BT_MANAGER: Stopping scan");
104
+ this.scanGeneration += 1;
105
+ this.scanActive = false;
106
+ this.scanStarting = false;
107
+ this.removeStateChangeListener();
102
108
  this.bleManager.stopDeviceScan();
103
109
 
104
110
  // Remove all event subscriptions to prevent memory leaks
@@ -115,6 +121,64 @@ class BTManager {
115
121
  });
116
122
  this.devices.clear();
117
123
  };
124
+ restartScan = () => {
125
+ if (this.destroyed) {
126
+ return;
127
+ }
128
+ this.scanGeneration += 1;
129
+ this.scanActive = false;
130
+ this.scanStarting = false;
131
+ this.removeStateChangeListener();
132
+ this.bleManager.stopDeviceScan();
133
+ this.startScan();
134
+ };
135
+ removeStateChangeListener = (subscription = this.stateChangeListener) => {
136
+ if (!subscription) {
137
+ return;
138
+ }
139
+ subscription.remove();
140
+ if (this.stateChangeListener === subscription) {
141
+ this.stateChangeListener = undefined;
142
+ }
143
+ const index = this.eventSubscriptions.indexOf(subscription);
144
+ if (index > -1) {
145
+ this.eventSubscriptions.splice(index, 1);
146
+ }
147
+ };
148
+ startDeviceScan = generation => {
149
+ if (this.destroyed || generation !== this.scanGeneration || this.scanActive || this.scanStarting) {
150
+ return;
151
+ }
152
+ const serviceUUIDs = this.options.serviceUUIDs ?? [];
153
+ if (Platform.OS === "ios" && this.backgroundScanEnabled && !serviceUUIDs.length) {
154
+ this.onErrorCallback?.({
155
+ error: "Background Bluetooth sync on iOS requires at least one service UUID. Add serviceUUIDs for custom devices."
156
+ });
157
+ return;
158
+ }
159
+ this.scanStarting = true;
160
+ try {
161
+ this.bleManager.startDeviceScan(this.backgroundScanEnabled ? [...serviceUUIDs] : null, {
162
+ scanMode: this.backgroundScanEnabled ? ScanMode.LowPower : ScanMode.Balanced
163
+ }, (error, device) => {
164
+ if (generation !== this.scanGeneration) {
165
+ return;
166
+ }
167
+ if (error) {
168
+ this.scanActive = false;
169
+ }
170
+ this.onScanResult(error, device);
171
+ });
172
+ this.scanActive = true;
173
+ sentryLogger("info", "BT_MANAGER: Scan started (continuous mode)");
174
+ } catch (error) {
175
+ this.onErrorCallback?.({
176
+ error: error instanceof Error ? error : String(error)
177
+ });
178
+ } finally {
179
+ this.scanStarting = false;
180
+ }
181
+ };
118
182
  restoreDevices = devices => {
119
183
  devices.forEach(device => this.onScanResult(null, device));
120
184
  };
@@ -188,7 +252,6 @@ class BTManager {
188
252
  oneReadingPerConnection: this.options.oneReadingPerConnection,
189
253
  deliveredEcgFileNames: this.options.deliveredEcgFileNames,
190
254
  onDeviceDisconnected: () => {
191
- this.startScan();
192
255
  this.removeDeviceFromFoundedDevices?.bind(this)(device.id);
193
256
  }
194
257
  });
@@ -1 +1 @@
1
- {"version":3,"names":["Linking","Platform","ScanMode","State","slog","sentryLogger","DeviceCreator","BTManager","MAX_DEVICES","devices","Map","eventSubscriptions","autoConnectCandidates","constructor","bleManager","acceptedDevices","options","deviceCreator","backgroundScanEnabled","backgroundEnabled","destroy","stopScan","autoConnectTimer","clearTimeout","undefined","stateChangeListener","remove","onErrorCallback","onDeviceFoundCallback","onResultCallback","onDeviceStatusChangedCallback","forEach","device","clear","startScan","onStateChange","state","PoweredOn","index","indexOf","splice","serviceUUIDs","OS","length","error","Promise","resolve","startDeviceScan","scanMode","LowPower","Balanced","onScanResult","catch","Error","String","sendIntent","push","setBackgroundScanEnabled","enabled","stopDeviceScan","sub","restoreDevices","onDeviceFound","callback","onError","onDeviceStatusChanged","onResult","message","advertisedName","name","trim","localName","has","id","deviceName","getDeviceName","size","deviceId","currentSize","deviceClass","createDevice","bind","oneReadingPerConnection","deliveredEcgFileNames","onDeviceDisconnected","removeDeviceFromFoundedDevices","set","queueAutoConnect","autoConnect","setTimeout","values","connect","onDeviceSelectionRequired","select","selected","Math","max","autoConnectDelayMs","get","delete"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/bt-manager.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Linking","Platform","ScanMode","State","slog","sentryLogger","DeviceCreator","BTManager","MAX_DEVICES","devices","Map","eventSubscriptions","scanGeneration","scanActive","scanStarting","destroyed","autoConnectCandidates","constructor","bleManager","acceptedDevices","options","deviceCreator","backgroundScanEnabled","backgroundEnabled","destroy","stopScan","autoConnectTimer","clearTimeout","undefined","onErrorCallback","onDeviceFoundCallback","onResultCallback","onDeviceStatusChangedCallback","forEach","device","clear","startScan","stateChangeListener","generation","subscription","poweredOnBeforeSubscription","onStateChange","state","PoweredOn","removeStateChangeListener","startDeviceScan","OS","sendIntent","error","Error","String","push","setBackgroundScanEnabled","enabled","restartScan","stopDeviceScan","sub","remove","index","indexOf","splice","serviceUUIDs","length","scanMode","LowPower","Balanced","onScanResult","restoreDevices","onDeviceFound","callback","onError","onDeviceStatusChanged","onResult","message","advertisedName","name","trim","localName","has","id","deviceName","getDeviceName","size","deviceId","currentSize","deviceClass","createDevice","bind","oneReadingPerConnection","deliveredEcgFileNames","onDeviceDisconnected","removeDeviceFromFoundedDevices","set","queueAutoConnect","autoConnect","setTimeout","values","connect","onDeviceSelectionRequired","select","selected","Math","max","autoConnectDelayMs","get","delete"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/bt-manager.ts"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,7 @@ import { F4Device } from "./devices/f4/f4.device.js";
11
11
  import { OxyfitDevice } from "./devices/spo/oxyfit.device.js";
12
12
  import { SPO2Device } from "./devices/spo/spo2.device.js";
13
13
  import { MySenseDevice } from "./devices/uebe/mysense.device.js";
14
+ import { VerovalActivityDevice } from "./devices/veroval/veroval.activity-device.js";
14
15
  import { VerovalDuoControlDevice } from "./devices/veroval/veroval.duo-control-device.js";
15
16
  import { VerovalEcgDevice } from "./devices/veroval/veroval.ecg-device.js";
16
17
 
@@ -32,7 +33,8 @@ const DEVICE_CLASSES = {
32
33
  [IntegratedDevices.GLUCOCHECK]: BloodGlucoseDevice,
33
34
  [IntegratedDevices.BGM]: BloodGlucoseDevice,
34
35
  [IntegratedDevices.VEROVAL_DUO_CONTROL]: VerovalDuoControlDevice,
35
- [IntegratedDevices.VEROVAL_ECG]: VerovalEcgDevice
36
+ [IntegratedDevices.VEROVAL_ECG]: VerovalEcgDevice,
37
+ [IntegratedDevices.VEROVAL_ACTIVITY]: VerovalActivityDevice
36
38
  };
37
39
  const collectCustomDevices = acceptedDevices => {
38
40
  const customDevices = new Map();
@@ -1 +1 @@
1
- {"version":3,"names":["integratedDevicesMap","IntegratedDevices","isCustomDeviceDefinition","BC01Device","BloodGlucoseDevice","BP2Device","CustomDevice","F4Device","OxyfitDevice","SPO2Device","MySenseDevice","VerovalDuoControlDevice","VerovalEcgDevice","DEVICE_CLASSES","BP2","F4","PC60WF","SPO2","MYSENSE","BC01","TAIDOC_GLUCOSE","GLUCOCHECK","BGM","VEROVAL_DUO_CONTROL","VEROVAL_ECG","collectCustomDevices","acceptedDevices","customDevices","Map","matchers","Set","forEach","entry","index","Error","has","id","matchByService","nameMatch","source","set","add","DeviceCreator","deviceNameCache","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","serviceUUIDs","normalizedServices","map","uuid","toLowerCase","size","undefined","matchDeviceName","get","matched","cacheDeviceName","createDevice","params","String","deviceName","trim","device","name","localName","custom","deviceClass","Object","keys","join","destroy","clear","regex","deviceType","test","some","values","mainServices","service","firstKey","next","value","delete"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["integratedDevicesMap","IntegratedDevices","isCustomDeviceDefinition","BC01Device","BloodGlucoseDevice","BP2Device","CustomDevice","F4Device","OxyfitDevice","SPO2Device","MySenseDevice","VerovalActivityDevice","VerovalDuoControlDevice","VerovalEcgDevice","DEVICE_CLASSES","BP2","F4","PC60WF","SPO2","MYSENSE","BC01","TAIDOC_GLUCOSE","GLUCOCHECK","BGM","VEROVAL_DUO_CONTROL","VEROVAL_ECG","VEROVAL_ACTIVITY","collectCustomDevices","acceptedDevices","customDevices","Map","matchers","Set","forEach","entry","index","Error","has","id","matchByService","nameMatch","source","set","add","DeviceCreator","deviceNameCache","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","serviceUUIDs","normalizedServices","map","uuid","toLowerCase","size","undefined","matchDeviceName","get","matched","cacheDeviceName","createDevice","params","String","deviceName","trim","device","name","localName","custom","deviceClass","Object","keys","join","destroy","clear","regex","deviceType","test","some","values","mainServices","service","firstKey","next","value","delete"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ import { Buffer } from "buffer";
3
4
  import { sentryLogger } from "../../../helpers/utils/sentry-logger.js";
5
+ const MAX_PAIRING_RETRIES = 2;
6
+ const PAIRING_RETRY_DELAY_MS = 1_000;
7
+ const isPairingAuthenticationError = error => {
8
+ const text = error instanceof Error ? error.message : String(error);
9
+ return /(?:GATT_)?(?:INSUFFICIENT_AUTHENTICATION|AUTH_FAIL)|authentication|pairing|bond/i.test(text);
10
+ };
11
+ const wait = milliseconds => new Promise(resolve => setTimeout(resolve, milliseconds));
4
12
  const readDeviceInformation = async (device, onDeviceInfo) => {
5
13
  const read = device.readCharacteristicForService;
6
14
  if (typeof read !== "function") {
@@ -8,26 +16,38 @@ const readDeviceInformation = async (device, onDeviceInfo) => {
8
16
  }
9
17
  const info = {};
10
18
  const values = [["name", "00001800-0000-1000-8000-00805f9b34fb", "00002a00-0000-1000-8000-00805f9b34fb"], ["manufacturerName", "0000180a-0000-1000-8000-00805f9b34fb", "00002a29-0000-1000-8000-00805f9b34fb"], ["model", "0000180a-0000-1000-8000-00805f9b34fb", "00002a24-0000-1000-8000-00805f9b34fb"], ["serialNumber", "0000180a-0000-1000-8000-00805f9b34fb", "00002a25-0000-1000-8000-00805f9b34fb"]];
11
- for (const [key, serviceUuid, characteristicUuid] of values) {
12
- try {
13
- const characteristic = await read.call(device, serviceUuid, characteristicUuid);
14
- const value = characteristic?.value;
15
- if (!value) {
16
- continue;
17
- }
18
- const text = Buffer.from(value, "base64").toString("utf8").replace(/\0+$/, "").trim();
19
- if (text) {
20
- info[key] = text;
19
+ let pending = values;
20
+ for (let attempt = 0; attempt <= MAX_PAIRING_RETRIES; attempt += 1) {
21
+ const retry = [];
22
+ for (const [key, serviceUuid, characteristicUuid] of pending) {
23
+ try {
24
+ const characteristic = await read.call(device, serviceUuid, characteristicUuid);
25
+ const value = characteristic?.value;
26
+ if (!value) {
27
+ continue;
28
+ }
29
+ const text = Buffer.from(value, "base64").toString("utf8").replace(/\0+$/, "").trim();
30
+ if (text) {
31
+ info[key] = text;
32
+ }
33
+ } catch (error) {
34
+ // Optional GAP/Device Information characteristics are not present on every device.
35
+ sentryLogger("info", "DEVICE: Optional device information unavailable", {
36
+ deviceId: device.id,
37
+ deviceName: device.name,
38
+ characteristicUuid,
39
+ error: error instanceof Error ? error.message : String(error)
40
+ });
41
+ if (attempt < MAX_PAIRING_RETRIES && isPairingAuthenticationError(error)) {
42
+ retry.push([key, serviceUuid, characteristicUuid]);
43
+ }
21
44
  }
22
- } catch (error) {
23
- // Optional GAP/Device Information characteristics are not present on every device.
24
- sentryLogger("info", "DEVICE: Optional device information unavailable", {
25
- deviceId: device.id,
26
- deviceName: device.name,
27
- characteristicUuid,
28
- error: error instanceof Error ? error.message : String(error)
29
- });
30
45
  }
46
+ if (!retry.length) {
47
+ break;
48
+ }
49
+ await wait(PAIRING_RETRY_DELAY_MS * (attempt + 1));
50
+ pending = retry;
31
51
  }
32
52
  if (Object.keys(info).length > 0) {
33
53
  onDeviceInfo?.(info);
@@ -1 +1 @@
1
- {"version":3,"names":["sentryLogger","readDeviceInformation","device","onDeviceInfo","read","readCharacteristicForService","info","values","key","serviceUuid","characteristicUuid","characteristic","call","value","text","Buffer","from","toString","replace","trim","error","deviceId","id","deviceName","name","Error","message","String","Object","keys","length"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-device-information.ts"],"mappings":";;AAEA,SAASA,YAAY,QAAQ,yCAAsC;AASnE,MAAMC,qBAAqB,GAAG,MAAAA,CAC5BC,MAAc,EACdC,YAAkD,KAChC;EAClB,MAAMC,IAAI,GAAGF,MAAM,CAACG,4BAA4B;EAEhD,IAAI,OAAOD,IAAI,KAAK,UAAU,EAAE;IAC9B;EACF;EAEA,MAAME,IAAyB,GAAG,CAAC,CAAC;EAEpC,MAAMC,MAA8D,GAAG,CACrE,CAAC,MAAM,EAAE,sCAAsC,EAAE,sCAAsC,CAAC,EACxF,CAAC,kBAAkB,EAAE,sCAAsC,EAAE,sCAAsC,CAAC,EACpG,CAAC,OAAO,EAAE,sCAAsC,EAAE,sCAAsC,CAAC,EACzF,CAAC,cAAc,EAAE,sCAAsC,EAAE,sCAAsC,CAAC,CACjG;EAED,KAAK,MAAM,CAACC,GAAG,EAAEC,WAAW,EAAEC,kBAAkB,CAAC,IAAIH,MAAM,EAAE;IAC3D,IAAI;MACF,MAAMI,cAAc,GAAG,MAAMP,IAAI,CAACQ,IAAI,CACpCV,MAAM,EACNO,WAAW,EACXC,kBACF,CAAC;MAED,MAAMG,KAAK,GAAGF,cAAc,EAAEE,KAAK;MAEnC,IAAI,CAACA,KAAK,EAAE;QACV;MACF;MAEA,MAAMC,IAAI,GAAGC,MAAM,CAACC,IAAI,CAACH,KAAK,EAAE,QAAQ,CAAC,CACtCI,QAAQ,CAAC,MAAM,CAAC,CAChBC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CACnBC,IAAI,CAAC,CAAC;MAET,IAAIL,IAAI,EAAE;QACRR,IAAI,CAACE,GAAG,CAAC,GAAGM,IAAI;MAClB;IACF,CAAC,CAAC,OAAOM,KAAK,EAAE;MACd;MACApB,YAAY,CAAC,MAAM,EAAE,iDAAiD,EAAE;QACtEqB,QAAQ,EAAEnB,MAAM,CAACoB,EAAE;QACnBC,UAAU,EAAErB,MAAM,CAACsB,IAAI;QACvBd,kBAAkB;QAClBU,KAAK,EAAEA,KAAK,YAAYK,KAAK,GAAGL,KAAK,CAACM,OAAO,GAAGC,MAAM,CAACP,KAAK;MAC9D,CAAC,CAAC;IACJ;EACF;EAEA,IAAIQ,MAAM,CAACC,IAAI,CAACvB,IAAI,CAAC,CAACwB,MAAM,GAAG,CAAC,EAAE;IAChC3B,YAAY,GAAGG,IAAI,CAAC;EACtB;AACF,CAAC;AAED,SAASL,qBAAqB","ignoreList":[]}
1
+ {"version":3,"names":["Buffer","sentryLogger","MAX_PAIRING_RETRIES","PAIRING_RETRY_DELAY_MS","isPairingAuthenticationError","error","text","Error","message","String","test","wait","milliseconds","Promise","resolve","setTimeout","readDeviceInformation","device","onDeviceInfo","read","readCharacteristicForService","info","values","pending","attempt","retry","key","serviceUuid","characteristicUuid","characteristic","call","value","from","toString","replace","trim","deviceId","id","deviceName","name","push","length","Object","keys"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-device-information.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ import { FrameReadStatus } from "../../../types/frame-read-status.js";
4
+ const END = "ff";
5
+
6
+ /**
7
+ * The activity wristband sends one encrypted chunk per notification and ends a reply with
8
+ * `ff ff`. Keeping notification boundaries is important: the first four and subsequent two
9
+ * bytes of every chunk are transport headers used by the vendor cipher.
10
+ */
11
+ export class VerovalActivityFrameReader {
12
+ firstFrame = true;
13
+ readFrame(buffer) {
14
+ if (buffer.length === 0) {
15
+ return {
16
+ status: FrameReadStatus.INCOMPLETE,
17
+ consumedBytes: 0
18
+ };
19
+ }
20
+ if (this.firstFrame) {
21
+ this.firstFrame = false;
22
+ return {
23
+ status: FrameReadStatus.COMPLETE,
24
+ consumedBytes: buffer.length,
25
+ frame: [...buffer]
26
+ };
27
+ }
28
+ const end = buffer.findIndex((byte, index) => index > 0 && String(buffer[index - 1]).toLowerCase() === END && String(byte).toLowerCase() === END);
29
+ if (end >= 0) {
30
+ // Keep the terminator in the processor buffer when the payload and marker
31
+ // arrive in one notification. The sequencer needs to see the marker as a
32
+ // separate frame after decrypting the payload.
33
+ const payloadLength = end - 1;
34
+ return {
35
+ status: FrameReadStatus.COMPLETE,
36
+ consumedBytes: end === 1 ? end + 1 : payloadLength,
37
+ frame: end === 1 ? buffer : buffer.slice(0, payloadLength)
38
+ };
39
+ }
40
+
41
+ // A notification is one protocol chunk. The processor clears it immediately, so a
42
+ // later notification cannot accidentally be decrypted using the wrong header offset.
43
+ return {
44
+ status: FrameReadStatus.COMPLETE,
45
+ consumedBytes: buffer.length,
46
+ frame: [...buffer]
47
+ };
48
+ }
49
+ }
50
+ //# sourceMappingURL=veroval-activity-frame-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FrameReadStatus","END","VerovalActivityFrameReader","firstFrame","readFrame","buffer","length","status","INCOMPLETE","consumedBytes","COMPLETE","frame","end","findIndex","byte","index","String","toLowerCase","payloadLength","slice"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.ts"],"mappings":";;AACA,SAASA,eAAe,QAAQ,qCAAkC;AAGlE,MAAMC,GAAG,GAAG,IAAI;;AAEhB;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,0BAA0B,CAAwB;EACrDC,UAAU,GAAG,IAAI;EAElBC,SAASA,CAACC,MAAyB,EAAmB;IAC3D,IAAIA,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;MACvB,OAAO;QAAEC,MAAM,EAAEP,eAAe,CAACQ,UAAU;QAAEC,aAAa,EAAE;MAAE,CAAC;IACjE;IAEA,IAAI,IAAI,CAACN,UAAU,EAAE;MACnB,IAAI,CAACA,UAAU,GAAG,KAAK;MAEvB,OAAO;QACLI,MAAM,EAAEP,eAAe,CAACU,QAAQ;QAChCD,aAAa,EAAEJ,MAAM,CAACC,MAAM;QAC5BK,KAAK,EAAE,CAAC,GAAGN,MAAM;MACnB,CAAC;IACH;IAEA,MAAMO,GAAG,GAAGP,MAAM,CAACQ,SAAS,CAC1B,CAACC,IAAI,EAAEC,KAAK,KACVA,KAAK,GAAG,CAAC,IACTC,MAAM,CAACX,MAAM,CAACU,KAAK,GAAG,CAAC,CAAC,CAAC,CAACE,WAAW,CAAC,CAAC,KAAKhB,GAAG,IAC/Ce,MAAM,CAACF,IAAI,CAAC,CAACG,WAAW,CAAC,CAAC,KAAKhB,GACnC,CAAC;IAED,IAAIW,GAAG,IAAI,CAAC,EAAE;MACZ;MACA;MACA;MACA,MAAMM,aAAa,GAAGN,GAAG,GAAG,CAAC;MAE7B,OAAO;QACLL,MAAM,EAAEP,eAAe,CAACU,QAAQ;QAChCD,aAAa,EAAEG,GAAG,KAAK,CAAC,GAAGA,GAAG,GAAG,CAAC,GAAGM,aAAa;QAClDP,KAAK,EAAGC,GAAG,KAAK,CAAC,GAAGP,MAAM,GAAGA,MAAM,CAACc,KAAK,CAAC,CAAC,EAAED,aAAa;MAC5D,CAAC;IACH;;IAEA;IACA;IACA,OAAO;MACLX,MAAM,EAAEP,eAAe,CAACU,QAAQ;MAChCD,aAAa,EAAEJ,MAAM,CAACC,MAAM;MAC5BK,KAAK,EAAE,CAAC,GAAGN,MAAM;IACnB,CAAC;EACH;AACF","ignoreList":[]}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable max-lines */
4
+
5
+ import { MeasurementTypeKey } from "@ovok/core";
6
+ import { CaseType } from "../../../types/case-type.js";
7
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
8
+ const SERVICE = "2610fc00-494d-494c-4544-55544954414c";
9
+ const WRITE = "2610fc02-494d-494c-4544-55544954414c";
10
+ const TOKEN = 0x28;
11
+ const BOND = 0x1a;
12
+ const GET_MINUTE = 0x01;
13
+ const GET_DAILY = 0x03;
14
+ const TERMINATOR = [0xff, 0xff];
15
+ const MAX_MINUTES = 10_080;
16
+ const bytes = frame => frame.map(hexToByte);
17
+ const hex = value => (value & 0xff).toString(16).padStart(2, "0");
18
+ const command = (write, values) => ({
19
+ ...write,
20
+ frame: values.map(hex)
21
+ });
22
+ const encrypted = (values, key) => values.map((value, index) => value ^ (key[index % 4] ?? 0) >> Math.floor(index / 4));
23
+ const bit = (values, index) => (values[Math.floor(index / 8)] ?? 0) >> index % 8 & 1;
24
+ const bits = (values, from, to) => {
25
+ let result = 0;
26
+ for (let index = from; index <= to; index++) {
27
+ result |= bit(values, index) << index - from;
28
+ }
29
+ return result;
30
+ };
31
+ const uint32 = (values, from) => (values[from + 3] ?? 0) << 24 | (values[from + 2] ?? 0) << 16 | (values[from + 1] ?? 0) << 8 | (values[from] ?? 0);
32
+ const isTerminator = frame => {
33
+ const values = bytes(frame);
34
+ return values.length === 2 && values.every((value, index) => value === TERMINATOR[index]);
35
+ };
36
+
37
+ /** Drives the private history protocol used by the Veroval Activity wristband. */
38
+ class VerovalActivitySequencer {
39
+ phase = "token";
40
+ key = [];
41
+ summary = [];
42
+ daily = [];
43
+ minute = [];
44
+ dailyCount = 0;
45
+ minuteCount = 0;
46
+ chunkCount = 0;
47
+ constructor(params) {
48
+ this.params = params;
49
+ }
50
+ initialCommands = () => {
51
+ const n = [1, 2, 3, 4].map(() => Math.floor(Math.random() * 100) + 1);
52
+ const checksum = n[0] * 2 + n[1] * 3 + n[2] * 4 + n[3] * 5;
53
+ return [command(this.params.write, [TOKEN, ...n, checksum & 0xff, checksum >> 8 & 0xff, n[0] ^ n[2], n[1] ^ n[3]])];
54
+ };
55
+ nextCommand = frame => {
56
+ if (this.phase === "done") {
57
+ return undefined;
58
+ }
59
+ if (this.phase === "token") {
60
+ const response = bytes(frame);
61
+ if (response.length < 7) {
62
+ return this.stop("the token reply was too short");
63
+ }
64
+ this.key = [response[1], response[2], response[5], response[6]];
65
+ this.phase = "bond";
66
+ return [command({
67
+ serviceUuid: SERVICE,
68
+ characteristicUuid: WRITE
69
+ }, encrypted([BOND, 1, 0], this.key))];
70
+ }
71
+ if (this.phase === "bond") {
72
+ this.phase = "summary";
73
+ return [command(this.params.write, [0])];
74
+ }
75
+ if (isTerminator(frame)) {
76
+ return this.finishReply();
77
+ }
78
+ this.appendChunk(frame);
79
+ return undefined;
80
+ };
81
+ appendChunk = frame => {
82
+ const raw = bytes(frame);
83
+ const decrypted = encrypted(raw.slice(this.chunkCount === 0 ? 4 : 2), this.key);
84
+ this.chunkCount += 1;
85
+ if (this.phase === "summary") {
86
+ this.summary.push(...decrypted);
87
+ } else if (this.phase === "daily") {
88
+ this.daily.push(...decrypted);
89
+ } else if (this.phase === "minute") {
90
+ this.minute.push(...decrypted);
91
+ }
92
+ };
93
+ finishReply = () => {
94
+ if (this.phase === "summary") {
95
+ this.parseSummary();
96
+ this.daily = [];
97
+ this.chunkCount = 0;
98
+ if (this.dailyCount > 0) {
99
+ this.phase = "daily";
100
+ return [command(this.params.write, [GET_DAILY, this.dailyCount, 0])];
101
+ }
102
+ return this.startMinuteReply();
103
+ }
104
+ if (this.phase === "daily") {
105
+ this.parseDaily();
106
+ this.minute = [];
107
+ this.chunkCount = 0;
108
+ return this.startMinuteReply();
109
+ }
110
+ if (this.phase === "minute") {
111
+ this.parseMinute();
112
+ this.phase = "done";
113
+ }
114
+ return undefined;
115
+ };
116
+ startMinuteReply = () => {
117
+ if (this.minuteCount <= 0) {
118
+ this.phase = "done";
119
+ return undefined;
120
+ }
121
+ this.phase = "minute";
122
+ return [command(this.params.write, [GET_MINUTE, this.minuteCount & 0xff, this.minuteCount >> 8 & 0xff])];
123
+ };
124
+ parseSummary = () => {
125
+ if (this.summary.length < 15) {
126
+ this.stop("the summary reply was too short");
127
+ return;
128
+ }
129
+ const year = 2000 + this.summary[6];
130
+ const month = this.summary[7] - 1;
131
+ const day = this.summary[8];
132
+ this.latestAt = new Date(Date.UTC(year, month, day, this.summary[4], this.summary[3], this.summary[2]));
133
+ this.dailyCount = Math.max(0, this.summary[11] ?? 0);
134
+ this.minuteCount = Math.min(MAX_MINUTES, (this.summary[14] ?? 0) << 8 | (this.summary[13] ?? 0));
135
+ };
136
+ parseDaily = () => {
137
+ const recordBytes = 25;
138
+ for (let offset = 0; offset + recordBytes <= this.daily.length; offset += recordBytes) {
139
+ const record = this.daily.slice(offset, offset + recordBytes);
140
+ const stepCount = uint32(record, 8);
141
+ if (stepCount <= 0) {
142
+ continue;
143
+ }
144
+ const recordedAt = new Date(Date.UTC(2000 + record[0], (record[1] ?? 1) - 1, record[2] ?? 1));
145
+ this.params.onResult({
146
+ measurementTypeKey: MeasurementTypeKey.stepCount,
147
+ caseType: CaseType.RESULT,
148
+ stepCount,
149
+ start: recordedAt,
150
+ end: new Date(recordedAt.getTime() + 86_400_000)
151
+ });
152
+ }
153
+ };
154
+ parseMinute = () => {
155
+ if (!this.latestAt) {
156
+ return;
157
+ }
158
+ const recordBytes = 8;
159
+ let minute = 0;
160
+ for (let offset = 0; offset + recordBytes <= this.minute.length; offset += recordBytes) {
161
+ const record = this.minute.slice(offset, offset + recordBytes);
162
+
163
+ // A repeat record represents an unchanged previous minute and carries no new reading.
164
+ if (bit(record, 0) === 1) {
165
+ minute += bits(record, 1, 31);
166
+ continue;
167
+ }
168
+ const stepCount = bits(record, 23, 31);
169
+ const heartRate = bits(record, 32, 39);
170
+ const end = new Date(this.latestAt.getTime() - minute * 60_000);
171
+ const start = new Date(end.getTime() - 60_000);
172
+ if (stepCount > 0) {
173
+ this.params.onResult({
174
+ measurementTypeKey: MeasurementTypeKey.stepCount,
175
+ caseType: CaseType.RESULT,
176
+ stepCount,
177
+ start,
178
+ end
179
+ });
180
+ }
181
+ if (heartRate > 0) {
182
+ this.params.onResult({
183
+ measurementTypeKey: MeasurementTypeKey.heartRate,
184
+ caseType: CaseType.RESULT,
185
+ heartRate
186
+ });
187
+ }
188
+ minute += 1;
189
+ }
190
+ };
191
+ stop = reason => {
192
+ this.phase = "done";
193
+ this.params.onError(reason);
194
+ return undefined;
195
+ };
196
+ }
197
+ export { SERVICE as VEROVAL_ACTIVITY_SERVICE, WRITE as VEROVAL_ACTIVITY_WRITE, VerovalActivitySequencer };
198
+ //# sourceMappingURL=veroval-activity-sequencer.js.map