@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.
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/ovok/sdk/backgroundsync/OvokBackgroundSyncModule.java +54 -0
- package/lib/commonjs/modules/background-sync/android-background-sync.js +20 -2
- package/lib/commonjs/modules/background-sync/android-background-sync.js.map +1 -1
- package/lib/commonjs/modules/background-sync/android-bluetooth-foreground-service.js +16 -9
- package/lib/commonjs/modules/background-sync/android-bluetooth-foreground-service.js.map +1 -1
- package/lib/commonjs/modules/background-sync/index.js +11 -0
- package/lib/commonjs/modules/background-sync/index.js.map +1 -1
- package/lib/commonjs/modules/background-sync/notifications.js +56 -0
- package/lib/commonjs/modules/background-sync/notifications.js.map +1 -0
- package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js +1 -0
- package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
- package/lib/commonjs/modules/bt-device/constants/device-list-items.js +6 -0
- package/lib/commonjs/modules/bt-device/constants/device-list-items.js.map +1 -1
- package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-assets.js +3 -1
- package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-assets.js.map +1 -1
- package/lib/commonjs/modules/bt-device/constants/supported-devices.js +16 -1
- package/lib/commonjs/modules/bt-device/constants/supported-devices.js.map +1 -1
- package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js +19 -2
- package/lib/commonjs/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
- package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js +1 -1
- package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
- package/lib/commonjs/modules/bt-management/index.js +22 -0
- package/lib/commonjs/modules/bt-management/index.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/bt-manager.js +101 -38
- package/lib/commonjs/modules/bt-management/services/bt-manager.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/device-creator.js +3 -1
- package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-device-information.js +38 -18
- package/lib/commonjs/modules/bt-management/services/devices/bt-device-information.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js +55 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js +202 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.activity-device.js +54 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.activity-device.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/integrated-devices.js +1 -0
- package/lib/commonjs/modules/bt-management/types/integrated-devices.js.map +1 -1
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-context.js +13 -0
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-context.js.map +1 -0
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-provider.js +22 -15
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-authorization-provider.js.map +1 -1
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js +35 -4
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
- package/lib/module/modules/background-sync/android-background-sync.js +17 -1
- package/lib/module/modules/background-sync/android-background-sync.js.map +1 -1
- package/lib/module/modules/background-sync/android-bluetooth-foreground-service.js +17 -10
- package/lib/module/modules/background-sync/android-bluetooth-foreground-service.js.map +1 -1
- package/lib/module/modules/background-sync/index.js +1 -0
- package/lib/module/modules/background-sync/index.js.map +1 -1
- package/lib/module/modules/background-sync/notifications.js +50 -0
- package/lib/module/modules/background-sync/notifications.js.map +1 -0
- package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js +1 -0
- package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
- package/lib/module/modules/bt-device/constants/device-list-items.js +6 -0
- package/lib/module/modules/bt-device/constants/device-list-items.js.map +1 -1
- package/lib/module/modules/bt-device/constants/supported-device-catalog-assets.js +3 -1
- package/lib/module/modules/bt-device/constants/supported-device-catalog-assets.js.map +1 -1
- package/lib/module/modules/bt-device/constants/supported-devices.js +17 -2
- package/lib/module/modules/bt-device/constants/supported-devices.js.map +1 -1
- package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js +20 -3
- package/lib/module/modules/bt-management/components/bt-provider-child-wrapper.js.map +1 -1
- package/lib/module/modules/bt-management/constants/integrated-devices-map.js +1 -1
- package/lib/module/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
- package/lib/module/modules/bt-management/index.js +2 -0
- package/lib/module/modules/bt-management/index.js.map +1 -1
- package/lib/module/modules/bt-management/services/bt-manager.js +101 -38
- package/lib/module/modules/bt-management/services/bt-manager.js.map +1 -1
- package/lib/module/modules/bt-management/services/device-creator.js +3 -1
- package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-device-information.js +38 -18
- package/lib/module/modules/bt-management/services/devices/bt-device-information.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js +50 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js +198 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.activity-device.js +49 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.activity-device.js.map +1 -0
- package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
- package/lib/module/modules/bt-management/types/integrated-devices.js +1 -0
- package/lib/module/modules/bt-management/types/integrated-devices.js.map +1 -1
- package/lib/module/modules/data-sync/components/apple/apple-health-authorization-context.js +8 -0
- package/lib/module/modules/data-sync/components/apple/apple-health-authorization-context.js.map +1 -0
- package/lib/module/modules/data-sync/components/apple/apple-health-authorization-provider.js +22 -15
- package/lib/module/modules/data-sync/components/apple/apple-health-authorization-provider.js.map +1 -1
- package/lib/module/modules/data-sync/components/apple/apple-health-sync.js +35 -4
- package/lib/module/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
- package/lib/typescript/commonjs/src/modules/background-sync/android-background-sync.d.ts +7 -1
- package/lib/typescript/commonjs/src/modules/background-sync/android-background-sync.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/background-sync/android-bluetooth-foreground-service.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/background-sync/index.d.ts +1 -0
- package/lib/typescript/commonjs/src/modules/background-sync/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/background-sync/notifications.d.ts +14 -0
- package/lib/typescript/commonjs/src/modules/background-sync/notifications.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-device/constants/device-list-items.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts +3 -1
- package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts +7 -0
- package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts +2 -0
- package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts +7 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-device-information.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts +12 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts +47 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts +18 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/background-sync.d.ts +8 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/background-sync.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +12 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts +2 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts +7 -0
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-sync.d.ts +3 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/data-sync.d.ts +1 -1
- package/lib/typescript/module/src/modules/background-sync/android-background-sync.d.ts +7 -1
- package/lib/typescript/module/src/modules/background-sync/android-background-sync.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/background-sync/android-bluetooth-foreground-service.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/background-sync/index.d.ts +1 -0
- package/lib/typescript/module/src/modules/background-sync/index.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/background-sync/notifications.d.ts +14 -0
- package/lib/typescript/module/src/modules/background-sync/notifications.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-device/constants/device-list-items.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts +3 -1
- package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-assets.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts +7 -0
- package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/components/bt-provider-child-wrapper.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/index.d.ts +2 -0
- package/lib/typescript/module/src/modules/bt-management/index.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts +7 -0
- package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-device-information.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts +12 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts +47 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts +18 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.activity-device.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/background-sync.d.ts +8 -0
- package/lib/typescript/module/src/modules/bt-management/types/background-sync.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +12 -1
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts +2 -1
- package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts +7 -0
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-context.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts +1 -1
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-authorization-provider.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-sync.d.ts +3 -1
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/components/data-sync.d.ts +1 -1
- 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
|
-
|
|
48
|
-
|
|
49
|
-
this.stateChangeListener.remove();
|
|
50
|
-
this.stateChangeListener = undefined;
|
|
46
|
+
if (this.destroyed || this.scanActive || this.scanStarting || this.stateChangeListener) {
|
|
47
|
+
return;
|
|
51
48
|
}
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
this.
|
|
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":";;AAAA,SAASA,oBAAoB,QAAQ,wCAAqC;AAM1E,SAASC,iBAAiB,QAAQ,gCAA6B;AAC/D,SAASC,wBAAwB,QAAQ,yCAAsC;AAE/E,SAASC,UAAU,QAAQ,+BAA4B;AACvD,SAASC,kBAAkB,QAAQ,iDAA8C;AACjF,SAASC,SAAS,QAAQ,6BAA0B;AAEpD,SAASC,YAAY,QAAQ,mCAAgC;AAC7D,SAASC,QAAQ,QAAQ,2BAAwB;AACjD,SAASC,YAAY,QAAQ,gCAA6B;AAC1D,SAASC,UAAU,QAAQ,8BAA2B;AACtD,SAASC,aAAa,QAAQ,kCAA+B;AAC7D,SAASC,uBAAuB,QAAQ,iDAA8C;AACtF,SAASC,gBAAgB,QAAQ,yCAAsC;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAc,GAAG;EACrB,
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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","
|
|
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":[]}
|
package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-frame-reader.js
ADDED
|
@@ -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":[]}
|
package/lib/module/modules/bt-management/services/devices/veroval/veroval-activity-sequencer.js
ADDED
|
@@ -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
|