@ovok/native 1.16.1-dev.2131 → 1.16.1-dev.2135
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/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js +18 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.blood-pressure-status.js +4 -7
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.blood-pressure-status.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.js +106 -0
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.js +38 -31
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.js +41 -0
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.js +22 -24
- package/lib/commonjs/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.js.map +1 -1
- package/lib/commonjs/modules/bt-management/utils/device-user.js +22 -0
- package/lib/commonjs/modules/bt-management/utils/device-user.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/kpa-to-mmhg.js +9 -0
- package/lib/commonjs/modules/bt-management/utils/kpa-to-mmhg.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/result-identity.js +26 -13
- package/lib/commonjs/modules/bt-management/utils/result-identity.js.map +1 -1
- package/lib/commonjs/modules/bt-management/utils/rr-interval.js +16 -0
- package/lib/commonjs/modules/bt-management/utils/rr-interval.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/temperature-type.js +15 -0
- package/lib/commonjs/modules/bt-management/utils/temperature-type.js.map +1 -0
- package/lib/commonjs/modules/next/bluetooth/index.js +6 -0
- package/lib/commonjs/modules/next/bluetooth/index.js.map +1 -1
- package/lib/commonjs/modules/next/bluetooth/result-policy.js +10 -2
- package/lib/commonjs/modules/next/bluetooth/result-policy.js.map +1 -1
- package/lib/commonjs/modules/next/bluetooth/sig-profiles.js +46 -13
- package/lib/commonjs/modules/next/bluetooth/sig-profiles.js.map +1 -1
- package/lib/commonjs/modules/next/bluetooth/stable-hash.js +16 -7
- package/lib/commonjs/modules/next/bluetooth/stable-hash.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-managed-device.js +19 -2
- package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.blood-pressure-status.js +1 -4
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.blood-pressure-status.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.js +99 -0
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.js +38 -31
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.js +35 -0
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.js +18 -20
- package/lib/module/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.js.map +1 -1
- package/lib/module/modules/bt-management/utils/device-user.js +17 -0
- package/lib/module/modules/bt-management/utils/device-user.js.map +1 -0
- package/lib/module/modules/bt-management/utils/kpa-to-mmhg.js +6 -0
- package/lib/module/modules/bt-management/utils/kpa-to-mmhg.js.map +1 -0
- package/lib/module/modules/bt-management/utils/result-identity.js +24 -12
- package/lib/module/modules/bt-management/utils/result-identity.js.map +1 -1
- package/lib/module/modules/bt-management/utils/rr-interval.js +12 -0
- package/lib/module/modules/bt-management/utils/rr-interval.js.map +1 -0
- package/lib/module/modules/bt-management/utils/temperature-type.js +11 -0
- package/lib/module/modules/bt-management/utils/temperature-type.js.map +1 -0
- package/lib/module/modules/next/bluetooth/index.js +1 -1
- package/lib/module/modules/next/bluetooth/index.js.map +1 -1
- package/lib/module/modules/next/bluetooth/result-policy.js +8 -1
- package/lib/module/modules/next/bluetooth/result-policy.js.map +1 -1
- package/lib/module/modules/next/bluetooth/sig-profiles.js +44 -11
- package/lib/module/modules/next/bluetooth/sig-profiles.js.map +1 -1
- package/lib/module/modules/next/bluetooth/stable-hash.js +15 -6
- package/lib/module/modules/next/bluetooth/stable-hash.js.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.blood-pressure-status.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.d.ts +11 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.d.ts +5 -2
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.d.ts +2 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts +2 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/result-policy.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/result-policy.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/utils/device-user.d.ts +6 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/device-user.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/kpa-to-mmhg.d.ts +4 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/kpa-to-mmhg.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/result-identity.d.ts +5 -4
- package/lib/typescript/commonjs/src/modules/bt-management/utils/result-identity.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/utils/rr-interval.d.ts +4 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/rr-interval.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/temperature-type.d.ts +7 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/temperature-type.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/next/bluetooth/index.d.ts +1 -1
- package/lib/typescript/commonjs/src/modules/next/bluetooth/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/next/bluetooth/result-policy.d.ts +6 -1
- package/lib/typescript/commonjs/src/modules/next/bluetooth/result-policy.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/next/bluetooth/sig-profiles.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/next/bluetooth/stable-hash.d.ts +5 -2
- package/lib/typescript/commonjs/src/modules/next/bluetooth/stable-hash.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +2 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.blood-pressure-status.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.d.ts +11 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.decorators.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.d.ts +5 -2
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.devices.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.frame.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.d.ts +2 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts +2 -0
- package/lib/typescript/module/src/modules/bt-management/types/result-callback.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/result-policy.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/types/result-policy.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/utils/device-user.d.ts +6 -0
- package/lib/typescript/module/src/modules/bt-management/utils/device-user.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/kpa-to-mmhg.d.ts +4 -0
- package/lib/typescript/module/src/modules/bt-management/utils/kpa-to-mmhg.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/result-identity.d.ts +5 -4
- package/lib/typescript/module/src/modules/bt-management/utils/result-identity.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/utils/rr-interval.d.ts +4 -0
- package/lib/typescript/module/src/modules/bt-management/utils/rr-interval.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/temperature-type.d.ts +7 -0
- package/lib/typescript/module/src/modules/bt-management/utils/temperature-type.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/next/bluetooth/index.d.ts +1 -1
- package/lib/typescript/module/src/modules/next/bluetooth/index.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/next/bluetooth/result-policy.d.ts +6 -1
- package/lib/typescript/module/src/modules/next/bluetooth/result-policy.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/next/bluetooth/sig-profiles.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/next/bluetooth/stable-hash.d.ts +5 -2
- package/lib/typescript/module/src/modules/next/bluetooth/stable-hash.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_bloodPressureStates","require","_sigUuid","_defineCustomDevice","_standardGattBloodPressureStatus","SPOT_CHECK_TIMEOUT_MS","declareProfile","params","profile","defineCustomDevice","id","measurementTypeKey","nameMatch","matchByService","undefined","oneReadingPerConnection","stuckDataTimeoutMs","services","uuid","sigUuid","service","monitor","characteristic","
|
|
1
|
+
{"version":3,"names":["_bloodPressureStates","require","_deviceUser","_sigUuid","_defineCustomDevice","_standardGattBloodPressureStatus","_standardGattFrame","SPOT_CHECK_TIMEOUT_MS","chainDecorators","first","second","reading","frame","recordOffset","decorated","declareProfile","params","profile","defineCustomDevice","id","measurementTypeKey","nameMatch","matchByService","undefined","oneReadingPerConnection","stuckDataTimeoutMs","services","uuid","sigUuid","service","monitor","characteristic","minLengthBytes","caseSelectorBytes","cases","selectors","map","selector","optional","optionalFields","fields","fieldsBySelector","kind","decorateReading","exports","littleEndian","name","byteIndexes","unit","encoding","byteOrder","recordedAtFromBloodPressureFrame","offset","flags","byteAt","dateTimeAt","decorateBloodPressureReading","recordedAt","cursor","metadata","userId","memorySlot","memorySlotForDeviceUser","status","bloodPressureStatusFromFrame","BloodPressureStates","DISTURB_DETECTED","LOOSE_SLEEVE","REGULAR","irregularHeartbeat","Object","keys","length"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/standard-gatt/standard-gatt.profile.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.memorySlotForDeviceUser = exports.isFromAcceptedMemorySlot = void 0;
|
|
7
|
+
/** The Bluetooth SIG User Index that means the device does not know whose reading it is. */
|
|
8
|
+
const UNKNOWN_DEVICE_USER = 0xff;
|
|
9
|
+
|
|
10
|
+
/** The memory slot of a SIG device user: users count from 0, slots from 1; the unknown user has none. */
|
|
11
|
+
const memorySlotForDeviceUser = userId => userId === UNKNOWN_DEVICE_USER ? undefined : userId + 1;
|
|
12
|
+
|
|
13
|
+
/** Whether a reading is from one of the device users `slots`; a reading that names no device user is kept. */
|
|
14
|
+
exports.memorySlotForDeviceUser = memorySlotForDeviceUser;
|
|
15
|
+
const isFromAcceptedMemorySlot = (reading, slots) => {
|
|
16
|
+
const {
|
|
17
|
+
memorySlot
|
|
18
|
+
} = reading;
|
|
19
|
+
return typeof memorySlot !== "number" || slots.includes(memorySlot);
|
|
20
|
+
};
|
|
21
|
+
exports.isFromAcceptedMemorySlot = isFromAcceptedMemorySlot;
|
|
22
|
+
//# sourceMappingURL=device-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["UNKNOWN_DEVICE_USER","memorySlotForDeviceUser","userId","undefined","exports","isFromAcceptedMemorySlot","reading","slots","memorySlot","includes"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/device-user.ts"],"mappings":";;;;;;AAAA;AACA,MAAMA,mBAAmB,GAAG,IAAI;;AAEhC;AACA,MAAMC,uBAAuB,GAAIC,MAAc,IAC7CA,MAAM,KAAKF,mBAAmB,GAAGG,SAAS,GAAGD,MAAM,GAAG,CAAC;;AAEzD;AAAAE,OAAA,CAAAH,uBAAA,GAAAA,uBAAA;AACA,MAAMI,wBAAwB,GAAGA,CAC/BC,OAAe,EACfC,KAAwB,KACZ;EACZ,MAAM;IAAEC;EAAW,CAAC,GAAGF,OAAmC;EAE1D,OAAO,OAAOE,UAAU,KAAK,QAAQ,IAAID,KAAK,CAACE,QAAQ,CAACD,UAAU,CAAC;AACrE,CAAC;AAACJ,OAAA,CAAAC,wBAAA,GAAAA,wBAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["KPA_TO_MMHG","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/kpa-to-mmhg.ts"],"mappings":";;;;;;AAAA;AACA,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,OAAO","ignoreList":[]}
|
|
@@ -3,26 +3,39 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.reviveResultDates = exports.createStableResultId = void 0;
|
|
6
|
+
exports.reviveResultDates = exports.createStableResultId = exports.createLegacyResultId = void 0;
|
|
7
|
+
var _driver = require("../../next/bluetooth/driver.js");
|
|
7
8
|
var _stableHash = require("../../next/bluetooth/stable-hash.js");
|
|
8
9
|
/* eslint-disable import/group-exports */
|
|
9
10
|
|
|
11
|
+
/** Reading properties added after result ids were first issued; leaving them out keeps every earlier id. */
|
|
12
|
+
const ADDED_READING_PROPERTIES = new Set(["sequenceNumber", "specimen", "sampleLocation", "sensorStatus", "outOfRange", "meal", "reportedUnit", "temperatureType", "rrIntervals"]);
|
|
13
|
+
const identifyingData = data => Object.fromEntries(Object.entries(data).filter(([key]) => !ADDED_READING_PROPERTIES.has(key)));
|
|
14
|
+
const deviceIdentityOf = deviceData => deviceData.sn || deviceData.manufacturerData || deviceData.model || deviceData.name || deviceData.id;
|
|
15
|
+
|
|
10
16
|
/**
|
|
11
|
-
* Creates an identity that is stable when a device sends its stored history again.
|
|
12
|
-
*
|
|
13
|
-
* delivery metadata is deliberately not part of the key.
|
|
17
|
+
* Creates an identity that is stable when a device sends its stored history again, in any time zone. A reading
|
|
18
|
+
* without a time of its own is a new measurement each time, so it is told apart by when it arrived.
|
|
14
19
|
*/
|
|
15
|
-
const createStableResultId = (deviceData, data) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
}
|
|
20
|
+
const createStableResultId = (deviceData, data, receivedAt = new Date()) => `ovok:${(0, _stableHash.stableHash)({
|
|
21
|
+
device: deviceIdentityOf(deviceData),
|
|
22
|
+
name: deviceData.name,
|
|
23
|
+
data: identifyingData(data),
|
|
24
|
+
...((0, _driver.isTimestamped)(data) ? {} : {
|
|
25
|
+
receivedAt: receivedAt.toISOString()
|
|
26
|
+
})
|
|
27
|
+
})}`;
|
|
23
28
|
|
|
24
|
-
/**
|
|
29
|
+
/** The id SDKs before 1.16.1 gave the same reading, to find what they saved. */
|
|
25
30
|
exports.createStableResultId = createStableResultId;
|
|
31
|
+
const createLegacyResultId = (deviceData, data) => `ovok:${(0, _stableHash.instantStableHash)({
|
|
32
|
+
device: deviceIdentityOf(deviceData),
|
|
33
|
+
name: deviceData.name,
|
|
34
|
+
data: identifyingData(data)
|
|
35
|
+
})}`;
|
|
36
|
+
|
|
37
|
+
/** Converts the ISO date strings of `recordedAt`, `start` and `end` fields back to `Date`s, recursively. */
|
|
38
|
+
exports.createLegacyResultId = createLegacyResultId;
|
|
26
39
|
const reviveResultDates = value => {
|
|
27
40
|
const revive = (current, key) => {
|
|
28
41
|
if (typeof current === "string" && ["recordedAt", "start", "end"].includes(key ?? "")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_driver","require","_stableHash","ADDED_READING_PROPERTIES","Set","identifyingData","data","Object","fromEntries","entries","filter","key","has","deviceIdentityOf","deviceData","sn","manufacturerData","model","name","id","createStableResultId","receivedAt","Date","stableHash","device","isTimestamped","toISOString","exports","createLegacyResultId","instantStableHash","reviveResultDates","value","revive","current","includes","date","Number","isNaN","getTime","Array","isArray","map","item","childKey","childValue"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/result-identity.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.rrIntervalMilliseconds = void 0;
|
|
7
|
+
const MILLISECONDS_PER_SECOND = 1000;
|
|
8
|
+
|
|
9
|
+
/** The Bluetooth SIG heart-rate RR-Interval resolution: counts of 1/1024 s. */
|
|
10
|
+
const RR_COUNTS_PER_SECOND = 1024;
|
|
11
|
+
const RR_DECIMALS = 2;
|
|
12
|
+
|
|
13
|
+
/** An RR-Interval count from a Heart Rate Measurement, in milliseconds. */
|
|
14
|
+
const rrIntervalMilliseconds = counts => Number((counts * MILLISECONDS_PER_SECOND / RR_COUNTS_PER_SECOND).toFixed(RR_DECIMALS));
|
|
15
|
+
exports.rrIntervalMilliseconds = rrIntervalMilliseconds;
|
|
16
|
+
//# sourceMappingURL=rr-interval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MILLISECONDS_PER_SECOND","RR_COUNTS_PER_SECOND","RR_DECIMALS","rrIntervalMilliseconds","counts","Number","toFixed","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/rr-interval.ts"],"mappings":";;;;;;AAAA,MAAMA,uBAAuB,GAAG,IAAI;;AAEpC;AACA,MAAMC,oBAAoB,GAAG,IAAI;AAEjC,MAAMC,WAAW,GAAG,CAAC;;AAErB;AACA,MAAMC,sBAAsB,GAAIC,MAAc,IAC5CC,MAAM,CACJ,CAAED,MAAM,GAAGJ,uBAAuB,GAAIC,oBAAoB,EAAEK,OAAO,CACjEJ,WACF,CACF,CAAC;AAACK,OAAA,CAAAJ,sBAAA,GAAAA,sBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.temperatureTypeFromCode = void 0;
|
|
7
|
+
/** Where on the body a thermometer took its reading: the Bluetooth SIG Temperature Type. */
|
|
8
|
+
|
|
9
|
+
/** Indexed by the Temperature Type code, which starts at 1; code 0 is reserved. */
|
|
10
|
+
const TEMPERATURE_TYPES = ["armpit", "body", "ear", "finger", "gastrointestinal-tract", "mouth", "rectum", "toe", "tympanum"];
|
|
11
|
+
|
|
12
|
+
/** The body site for a Temperature Type code; undefined for a reserved or unknown code. */
|
|
13
|
+
const temperatureTypeFromCode = code => TEMPERATURE_TYPES[code - 1];
|
|
14
|
+
exports.temperatureTypeFromCode = temperatureTypeFromCode;
|
|
15
|
+
//# sourceMappingURL=temperature-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TEMPERATURE_TYPES","temperatureTypeFromCode","code","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/temperature-type.ts"],"mappings":";;;;;;AAAA;;AAYA;AACA,MAAMA,iBAA6C,GAAG,CACpD,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,wBAAwB,EACxB,OAAO,EACP,QAAQ,EACR,KAAK,EACL,UAAU,CACX;;AAED;AACA,MAAMC,uBAAuB,GAAIC,IAAY,IAC3CF,iBAAiB,CAACE,IAAI,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAF,uBAAA,GAAAA,uBAAA","ignoreList":[]}
|
|
@@ -39,6 +39,12 @@ Object.defineProperty(exports, "SIG_PROTOCOLS", {
|
|
|
39
39
|
return _sigProfiles.SIG_PROTOCOLS;
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
+
Object.defineProperty(exports, "acceptedMemorySlots", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _resultPolicy.acceptedMemorySlots;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
42
48
|
Object.defineProperty(exports, "bleManagerScanner", {
|
|
43
49
|
enumerable: true,
|
|
44
50
|
get: function () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_runtime","require","_errors","_devices","_resultPolicy","_sigProfiles","_bleScanner","_builtInDevices","_integratedDevices","_osPermissions","_ovokSink","_createBluetoothRuntime","_context","_hooks","_bluetoothDevicePicker"],"sourceRoot":"../../../../../src","sources":["modules/next/bluetooth/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_runtime","require","_errors","_devices","_resultPolicy","_sigProfiles","_bleScanner","_builtInDevices","_integratedDevices","_osPermissions","_ovokSink","_createBluetoothRuntime","_context","_hooks","_bluetoothDevicePicker"],"sourceRoot":"../../../../../src","sources":["modules/next/bluetooth/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAOA,IAAAE,QAAA,GAAAF,OAAA;AAIA,IAAAG,aAAA,GAAAH,OAAA;AASA,IAAAI,YAAA,GAAAJ,OAAA;AAEA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,eAAA,GAAAN,OAAA;AACA,IAAAO,kBAAA,GAAAP,OAAA;AAEA,IAAAQ,cAAA,GAAAR,OAAA;AACA,IAAAS,SAAA,GAAAT,OAAA;AACA,IAAAU,uBAAA,GAAAV,OAAA;AAGA,IAAAW,QAAA,GAAAX,OAAA;AAEA,IAAAY,MAAA,GAAAZ,OAAA;AASA,IAAAa,sBAAA,GAAAb,OAAA","ignoreList":[]}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.firstReadingPerKind = exports.everyReading = exports.dailyTotalsOnly = void 0;
|
|
6
|
+
exports.firstReadingPerKind = exports.everyReading = exports.dailyTotalsOnly = exports.acceptedMemorySlots = void 0;
|
|
7
7
|
exports.keepReadings = keepReadings;
|
|
8
8
|
exports.policyByKind = void 0;
|
|
9
|
+
var _deviceUser = require("../../bt-management/utils/device-user.js");
|
|
9
10
|
var _dailyTotalDay = require("./daily-total-day.js");
|
|
10
11
|
/** Makes, for each connection, the test of which readings to keep. */
|
|
11
12
|
|
|
@@ -45,8 +46,15 @@ const dailyTotalsOnly = () => {
|
|
|
45
46
|
};
|
|
46
47
|
};
|
|
47
48
|
|
|
48
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Keeps the readings of the device users in `slots` (a multi-user device reports its user as `memorySlot`, starting at
|
|
51
|
+
* 1), and drops the others. A reading that names no device user is kept.
|
|
52
|
+
*/
|
|
49
53
|
exports.dailyTotalsOnly = dailyTotalsOnly;
|
|
54
|
+
const acceptedMemorySlots = slots => () => reading => (0, _deviceUser.isFromAcceptedMemorySlot)(reading, slots);
|
|
55
|
+
|
|
56
|
+
/** Applies a policy per measurement type, and `fallback` to the other types. */
|
|
57
|
+
exports.acceptedMemorySlots = acceptedMemorySlots;
|
|
50
58
|
const policyByKind = (policies, fallback = everyReading) => () => {
|
|
51
59
|
const tests = new Map();
|
|
52
60
|
const fallbackTest = fallback();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_deviceUser","require","_dailyTotalDay","everyReading","exports","firstReadingPerKind","reported","Set","measurementTypeKey","has","add","dailyTotalsOnly","reading","day","dailyTotalDay","Date","now","undefined","key","acceptedMemorySlots","slots","isFromAcceptedMemorySlot","policyByKind","policies","fallback","tests","Map","fallbackTest","policy","test","get","set","keepReadings","events","keep","event","kind"],"sourceRoot":"../../../../../src","sources":["modules/next/bluetooth/result-policy.ts"],"mappings":";;;;;;;;AAEA,IAAAA,WAAA,GAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAD,OAAA;AAGA;;AAGA;AACA,MAAME,YAA0B,GAAGA,CAAA,KAAM,MAAM,IAAI;;AAEnD;AAAAC,OAAA,CAAAD,YAAA,GAAAA,YAAA;AACA,MAAME,mBAAiC,GAAGA,CAAA,KAAM;EAC9C,MAAMC,QAAQ,GAAG,IAAIC,GAAG,CAAqB,CAAC;EAE9C,OAAO,CAAC;IAAEC;EAAmB,CAAC,KAAK;IACjC,IAAIF,QAAQ,CAACG,GAAG,CAACD,kBAAkB,CAAC,EAAE;MACpC,OAAO,KAAK;IACd;IAEAF,QAAQ,CAACI,GAAG,CAACF,kBAAkB,CAAC;IAEhC,OAAO,IAAI;EACb,CAAC;AACH,CAAC;;AAED;AAAAJ,OAAA,CAAAC,mBAAA,GAAAA,mBAAA;AACA,MAAMM,eAA6B,GAAGA,CAAA,KAAM;EAC1C,MAAML,QAAQ,GAAG,IAAIC,GAAG,CAAS,CAAC;EAElC,OAAQK,OAAO,IAAK;IAClB,MAAMC,GAAG,GAAG,IAAAC,4BAAa,EAACF,OAAO,EAAEG,IAAI,CAACC,GAAG,CAAC,CAAC,CAAC;IAE9C,IAAIH,GAAG,KAAKI,SAAS,EAAE;MACrB,OAAO,IAAI;IACb;IAEA,MAAMC,GAAG,GAAG,GAAGN,OAAO,CAACJ,kBAAkB,IAAIK,GAAG,EAAE;IAElD,IAAIA,GAAG,KAAK,QAAQ,IAAIP,QAAQ,CAACG,GAAG,CAACS,GAAG,CAAC,EAAE;MACzC,OAAO,KAAK;IACd;IAEAZ,QAAQ,CAACI,GAAG,CAACQ,GAAG,CAAC;IAEjB,OAAO,IAAI;EACb,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AAHAd,OAAA,CAAAO,eAAA,GAAAA,eAAA;AAIA,MAAMQ,mBAAmB,GAAIC,KAAwB,IACnD,MAAOR,OAAO,IAAK,IAAAS,oCAAwB,EAACT,OAAO,EAAEQ,KAAK,CAAC;;AAE7D;AAAAhB,OAAA,CAAAe,mBAAA,GAAAA,mBAAA;AACA,MAAMG,YAAY,GAAGA,CACnBC,QAA2D,EAC3DC,QAAsB,GAAGrB,YAAY,KAErC,MAAM;EACJ,MAAMsB,KAAK,GAAG,IAAIC,GAAG,CAAwD,CAAC;EAC9E,MAAMC,YAAY,GAAGH,QAAQ,CAAC,CAAC;EAE/B,OAAQZ,OAAO,IAAK;IAClB,MAAMgB,MAAM,GAAGL,QAAQ,CAACX,OAAO,CAACJ,kBAAkB,CAAC;IAEnD,IAAI,CAACoB,MAAM,EAAE;MACX,OAAOD,YAAY,CAACf,OAAO,CAAC;IAC9B;IAEA,MAAMiB,IAAI,GAAGJ,KAAK,CAACK,GAAG,CAAClB,OAAO,CAACJ,kBAAkB,CAAC,IAAIoB,MAAM,CAAC,CAAC;IAE9DH,KAAK,CAACM,GAAG,CAACnB,OAAO,CAACJ,kBAAkB,EAAEqB,IAAI,CAAC;IAE3C,OAAOA,IAAI,CAACjB,OAAO,CAAC;EACtB,CAAC;AACH,CAAC;;AAEH;AAAAR,OAAA,CAAAkB,YAAA,GAAAA,YAAA;AACA,gBAAgBU,YAAYA,CAACC,MAAkC,EAAEL,MAAoB,EAA8B;EACjH,MAAMM,IAAI,GAAGN,MAAM,CAAC,CAAC;EAErB,WAAW,MAAMO,KAAK,IAAIF,MAAM,EAAE;IAChC,IAAIE,KAAK,CAACC,IAAI,KAAK,SAAS,IAAIF,IAAI,CAACC,KAAK,CAACvB,OAAO,CAAC,EAAE;MACnD,MAAMuB,KAAK;IACb;EACF;AACF","ignoreList":[]}
|
|
@@ -6,9 +6,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.temperature = exports.pulseOximetry = exports.heartRate = exports.bodyWeight = exports.bloodPressure = exports.SIG_PROTOCOLS = void 0;
|
|
7
7
|
var _next = require("@ovok/core/next");
|
|
8
8
|
var _bloodPressureStates = require("../../bt-management/types/blood-pressure-states.js");
|
|
9
|
+
var _deviceUser = require("../../bt-management/utils/device-user.js");
|
|
10
|
+
var _kpaToMmhg = require("../../bt-management/utils/kpa-to-mmhg.js");
|
|
11
|
+
var _rrInterval = require("../../bt-management/utils/rr-interval.js");
|
|
9
12
|
var _sigUuid = require("../../bt-management/utils/sig-uuid.js");
|
|
13
|
+
var _temperatureType = require("../../bt-management/utils/temperature-type.js");
|
|
10
14
|
var _sigValues = require("./sig-values.js");
|
|
11
|
-
const KPA_TO_MMHG = 7.50062;
|
|
12
15
|
const KG_PER_SI_COUNT = 0.005;
|
|
13
16
|
const KG_PER_IMPERIAL_COUNT = 0.01 * 0.45359237;
|
|
14
17
|
const WEIGHT_UNSUCCESSFUL = 0xffff;
|
|
@@ -23,15 +26,29 @@ const BP_LOOSE_CUFF = 0x02;
|
|
|
23
26
|
const BP_IRREGULAR_PULSE = 0x04;
|
|
24
27
|
const TEMPERATURE_FAHRENHEIT = 0x01;
|
|
25
28
|
const TEMPERATURE_TIMESTAMP = 0x02;
|
|
29
|
+
const TEMPERATURE_TYPE = 0x04;
|
|
30
|
+
const TEMPERATURE_TIMESTAMP_OFFSET = 5;
|
|
26
31
|
const WEIGHT_IMPERIAL = 0x01;
|
|
27
32
|
const WEIGHT_TIMESTAMP = 0x02;
|
|
33
|
+
const WEIGHT_USER = 0x04;
|
|
34
|
+
const WEIGHT_TIMESTAMP_OFFSET = 3;
|
|
28
35
|
const PLX_TIMESTAMP = 0x01;
|
|
29
36
|
const HEART_RATE_UINT16 = 0x01;
|
|
30
37
|
const HEART_RATE_CONTACT_BITS = 0x06;
|
|
31
38
|
const HEART_RATE_NO_CONTACT = 0x04;
|
|
39
|
+
const HEART_RATE_ENERGY_EXPENDED = 0x08;
|
|
40
|
+
const HEART_RATE_RR_INTERVALS = 0x10;
|
|
41
|
+
const UINT8_BYTES = 1;
|
|
42
|
+
const UINT16_BYTES = 2;
|
|
32
43
|
|
|
33
44
|
/** Core does not export its status enum; this one has the same values. */
|
|
34
45
|
|
|
46
|
+
/** Core's temperature has no body site, so it rides along on the reading as `memorySlot` does on blood pressure. */
|
|
47
|
+
|
|
48
|
+
/** The device user, carried the way blood pressure carries it. */
|
|
49
|
+
|
|
50
|
+
/** Core's heart rate has no RR intervals, so they ride along on the reading, in milliseconds. */
|
|
51
|
+
|
|
35
52
|
const bloodPressureStatus = status => {
|
|
36
53
|
if (status & BP_BODY_MOVEMENT) {
|
|
37
54
|
return _bloodPressureStates.BloodPressureStates.DISTURB_DETECTED;
|
|
@@ -52,8 +69,7 @@ const bloodPressureExtras = (view, flags) => {
|
|
|
52
69
|
offset += 2;
|
|
53
70
|
}
|
|
54
71
|
if (flags & BP_USER) {
|
|
55
|
-
|
|
56
|
-
extras.memorySlot = user < 2 ? user + 1 : undefined;
|
|
72
|
+
extras.memorySlot = (0, _deviceUser.memorySlotForDeviceUser)(view.getUint8(offset));
|
|
57
73
|
offset += 1;
|
|
58
74
|
}
|
|
59
75
|
if (flags & BP_STATUS) {
|
|
@@ -67,7 +83,7 @@ const bloodPressureExtras = (view, flags) => {
|
|
|
67
83
|
/** Blood Pressure Measurement 0x2A35, in mmHg. */
|
|
68
84
|
const bloodPressure = view => {
|
|
69
85
|
const flags = view.getUint8(0);
|
|
70
|
-
const pressure = value => flags & BP_KPA ? (0, _sigValues.roundTo)(value * KPA_TO_MMHG, 0) : value;
|
|
86
|
+
const pressure = value => flags & BP_KPA ? (0, _sigValues.roundTo)(value * _kpaToMmhg.KPA_TO_MMHG, 0) : value;
|
|
71
87
|
const [systolic, diastolic, mean] = [1, 3, 5].map(offset => (0, _sigValues.sfloatAt)(view, offset));
|
|
72
88
|
if (systolic === undefined || diastolic === undefined) {
|
|
73
89
|
return undefined;
|
|
@@ -91,13 +107,16 @@ const temperature = view => {
|
|
|
91
107
|
if (value === undefined) {
|
|
92
108
|
return undefined;
|
|
93
109
|
}
|
|
110
|
+
const hasTimestamp = Boolean(flags & TEMPERATURE_TIMESTAMP);
|
|
111
|
+
const typeOffset = TEMPERATURE_TIMESTAMP_OFFSET + (hasTimestamp ? DATE_TIME_BYTES : 0);
|
|
94
112
|
const reading = {
|
|
95
113
|
measurementTypeKey: _next.MeasurementTypeKey.temperature,
|
|
96
114
|
bodyTemp: flags & TEMPERATURE_FAHRENHEIT ? (0, _sigValues.roundTo)((value - 32) * 5 / 9, 2) : value
|
|
97
115
|
};
|
|
98
|
-
return
|
|
99
|
-
recordedAt: (0, _sigValues.dateTimeAt)(view,
|
|
100
|
-
|
|
116
|
+
return (0, _sigValues.withDefined)(reading, {
|
|
117
|
+
recordedAt: hasTimestamp ? (0, _sigValues.dateTimeAt)(view, TEMPERATURE_TIMESTAMP_OFFSET) : undefined,
|
|
118
|
+
temperatureType: flags & TEMPERATURE_TYPE ? (0, _temperatureType.temperatureTypeFromCode)(view.getUint8(typeOffset)) : undefined
|
|
119
|
+
});
|
|
101
120
|
};
|
|
102
121
|
|
|
103
122
|
/** Weight Measurement 0x2A9D, in kilograms. */
|
|
@@ -108,13 +127,16 @@ const bodyWeight = view => {
|
|
|
108
127
|
if (counts === WEIGHT_UNSUCCESSFUL) {
|
|
109
128
|
return undefined;
|
|
110
129
|
}
|
|
130
|
+
const hasTimestamp = Boolean(flags & WEIGHT_TIMESTAMP);
|
|
131
|
+
const userOffset = WEIGHT_TIMESTAMP_OFFSET + (hasTimestamp ? DATE_TIME_BYTES : 0);
|
|
111
132
|
const reading = {
|
|
112
133
|
measurementTypeKey: _next.MeasurementTypeKey.bodyWeight,
|
|
113
134
|
bodyWeight: (0, _sigValues.roundTo)(counts * (flags & WEIGHT_IMPERIAL ? KG_PER_IMPERIAL_COUNT : KG_PER_SI_COUNT), 3)
|
|
114
135
|
};
|
|
115
|
-
return
|
|
116
|
-
recordedAt: (0, _sigValues.dateTimeAt)(view,
|
|
117
|
-
|
|
136
|
+
return (0, _sigValues.withDefined)(reading, {
|
|
137
|
+
recordedAt: hasTimestamp ? (0, _sigValues.dateTimeAt)(view, WEIGHT_TIMESTAMP_OFFSET) : undefined,
|
|
138
|
+
memorySlot: flags & WEIGHT_USER ? (0, _deviceUser.memorySlotForDeviceUser)(view.getUint8(userOffset)) : undefined
|
|
139
|
+
});
|
|
118
140
|
};
|
|
119
141
|
|
|
120
142
|
/** PLX Spot-Check Measurement 0x2A5E. */
|
|
@@ -136,18 +158,29 @@ const pulseOximetry = view => {
|
|
|
136
158
|
}) : reading;
|
|
137
159
|
};
|
|
138
160
|
|
|
139
|
-
/**
|
|
161
|
+
/** The RR intervals from `offset` to the end of the frame, in milliseconds. */
|
|
140
162
|
exports.pulseOximetry = pulseOximetry;
|
|
163
|
+
const rrIntervalsFrom = (view, offset) => Array.from({
|
|
164
|
+
length: Math.floor((view.byteLength - offset) / UINT16_BYTES)
|
|
165
|
+
}, (_, index) => (0, _rrInterval.rrIntervalMilliseconds)(view.getUint16(offset + index * UINT16_BYTES, true)));
|
|
166
|
+
|
|
167
|
+
/** Heart Rate Measurement 0x2A37; a strap reporting no skin contact has no reading. */
|
|
141
168
|
const heartRate = view => {
|
|
142
169
|
const flags = view.getUint8(0);
|
|
143
170
|
if ((flags & HEART_RATE_CONTACT_BITS) === HEART_RATE_NO_CONTACT) {
|
|
144
171
|
return undefined;
|
|
145
172
|
}
|
|
173
|
+
const hasUint16 = Boolean(flags & HEART_RATE_UINT16);
|
|
174
|
+
const rrOffset = 1 + (hasUint16 ? UINT16_BYTES : UINT8_BYTES) + (flags & HEART_RATE_ENERGY_EXPENDED ? UINT16_BYTES : 0);
|
|
175
|
+
const rrIntervals = flags & HEART_RATE_RR_INTERVALS ? rrIntervalsFrom(view, rrOffset) : [];
|
|
146
176
|
const reading = {
|
|
147
177
|
measurementTypeKey: _next.MeasurementTypeKey.heartRate,
|
|
148
|
-
heartRate:
|
|
178
|
+
heartRate: hasUint16 ? view.getUint16(1, true) : view.getUint8(1)
|
|
149
179
|
};
|
|
150
|
-
return
|
|
180
|
+
return rrIntervals.length > 0 ? {
|
|
181
|
+
...reading,
|
|
182
|
+
rrIntervals
|
|
183
|
+
} : reading;
|
|
151
184
|
};
|
|
152
185
|
exports.heartRate = heartRate;
|
|
153
186
|
const subscribed = (service, characteristic, decode) => async function* (link) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_next","require","_bloodPressureStates","_sigUuid","
|
|
1
|
+
{"version":3,"names":["_next","require","_bloodPressureStates","_deviceUser","_kpaToMmhg","_rrInterval","_sigUuid","_temperatureType","_sigValues","KG_PER_SI_COUNT","KG_PER_IMPERIAL_COUNT","WEIGHT_UNSUCCESSFUL","DATE_TIME_BYTES","BP_KPA","BP_TIMESTAMP","BP_PULSE","BP_USER","BP_STATUS","BP_BODY_MOVEMENT","BP_LOOSE_CUFF","BP_IRREGULAR_PULSE","TEMPERATURE_FAHRENHEIT","TEMPERATURE_TIMESTAMP","TEMPERATURE_TYPE","TEMPERATURE_TIMESTAMP_OFFSET","WEIGHT_IMPERIAL","WEIGHT_TIMESTAMP","WEIGHT_USER","WEIGHT_TIMESTAMP_OFFSET","PLX_TIMESTAMP","HEART_RATE_UINT16","HEART_RATE_CONTACT_BITS","HEART_RATE_NO_CONTACT","HEART_RATE_ENERGY_EXPENDED","HEART_RATE_RR_INTERVALS","UINT8_BYTES","UINT16_BYTES","bloodPressureStatus","status","BloodPressureStates","DISTURB_DETECTED","LOOSE_SLEEVE","REGULAR","bloodPressureExtras","view","flags","offset","extras","recordedAt","dateTimeAt","heartRate","sfloatAt","memorySlot","memorySlotForDeviceUser","getUint8","getUint16","irregularHeartbeat","undefined","bloodPressure","pressure","value","roundTo","KPA_TO_MMHG","systolic","diastolic","mean","map","reading","measurementTypeKey","MeasurementTypeKey","withDefined","meanArterialPressure","exports","temperature","floatAt","hasTimestamp","Boolean","typeOffset","bodyTemp","temperatureType","temperatureTypeFromCode","bodyWeight","counts","userOffset","pulseOximetry","bloodOxygen","pulseRate","bloodOxygenPulseRate","rrIntervalsFrom","Array","from","length","Math","floor","byteLength","_","index","rrIntervalMilliseconds","hasUint16","rrOffset","rrIntervals","subscribed","service","characteristic","decode","link","frame","subscribe","sigUuid","decodeFrame","SIG_PROTOCOLS","Map"],"sourceRoot":"../../../../../src","sources":["modules/next/bluetooth/sig-profiles.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.stableHash = void 0;
|
|
7
|
-
const
|
|
6
|
+
exports.stableHash = exports.instantStableHash = void 0;
|
|
7
|
+
const padded = (value, digits = 2) => String(value).padStart(digits, "0");
|
|
8
|
+
|
|
9
|
+
/** The date as a clock on the wall reads it, which a device's stored record keeps in every time zone. */
|
|
10
|
+
const wallClock = date => `${date.getFullYear()}-${padded(date.getMonth() + 1)}-${padded(date.getDate())}T${padded(date.getHours())}:${padded(date.getMinutes())}:${padded(date.getSeconds())}.${padded(date.getMilliseconds(), 3)}`;
|
|
11
|
+
const instant = date => date.toISOString();
|
|
12
|
+
const canonicalize = (value, formatDate) => {
|
|
8
13
|
if (value instanceof Date) {
|
|
9
|
-
return value
|
|
14
|
+
return formatDate(value);
|
|
10
15
|
}
|
|
11
16
|
if (Array.isArray(value)) {
|
|
12
|
-
return value.map(canonicalize);
|
|
17
|
+
return value.map(item => canonicalize(item, formatDate));
|
|
13
18
|
}
|
|
14
19
|
if (value && typeof value === "object") {
|
|
15
|
-
return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, nested]) => [key, canonicalize(nested)]));
|
|
20
|
+
return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, nested]) => [key, canonicalize(nested, formatDate)]));
|
|
16
21
|
}
|
|
17
22
|
return value;
|
|
18
23
|
};
|
|
@@ -27,7 +32,11 @@ const hash = value => {
|
|
|
27
32
|
return `${(first >>> 0).toString(16).padStart(8, "0")}${(second >>> 0).toString(16).padStart(8, "0")}`;
|
|
28
33
|
};
|
|
29
34
|
|
|
30
|
-
/** A short hash of `value` that ignores key order
|
|
31
|
-
const stableHash = value => hash(JSON.stringify(canonicalize(value)));
|
|
35
|
+
/** A short hash of `value` that ignores key order, is the same on every run and reads dates by their wall clock. */
|
|
36
|
+
const stableHash = value => hash(JSON.stringify(canonicalize(value, wallClock)));
|
|
37
|
+
|
|
38
|
+
/** `stableHash` as SDKs before 1.16.1 computed it, reading dates as instants; for finding what they saved. */
|
|
32
39
|
exports.stableHash = stableHash;
|
|
40
|
+
const instantStableHash = value => hash(JSON.stringify(canonicalize(value, instant)));
|
|
41
|
+
exports.instantStableHash = instantStableHash;
|
|
33
42
|
//# sourceMappingURL=stable-hash.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["padded","value","digits","String","padStart","wallClock","date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","instant","toISOString","canonicalize","formatDate","Date","Array","isArray","map","item","Object","fromEntries","entries","sort","left","right","localeCompare","key","nested","hash","first","second","index","length","code","charCodeAt","Math","imul","toString","stableHash","JSON","stringify","exports","instantStableHash"],"sourceRoot":"../../../../../src","sources":["modules/next/bluetooth/stable-hash.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,8 +10,9 @@ import { findDeviceVariant } from "../../constants/device-variants.js";
|
|
|
10
10
|
import { toBluetoothError } from "../../types/bluetooth-error.js";
|
|
11
11
|
import { clockSyncCapabilityForDevice } from "../../types/clock-sync.js";
|
|
12
12
|
import { DeviceStatus } from "../../types/device-status.js";
|
|
13
|
+
import { isFromAcceptedMemorySlot } from "../../utils/device-user.js";
|
|
13
14
|
import { errorCallbackPayload } from "../../utils/error-callback-payload.js";
|
|
14
|
-
import { createStableResultId } from "../../utils/result-identity.js";
|
|
15
|
+
import { createLegacyResultId, createStableResultId } from "../../utils/result-identity.js";
|
|
15
16
|
import { supportedMeasurementTypeKeys } from "../../utils/supported-measurement-type-keys.js";
|
|
16
17
|
import { BTConnectionHandler } from "./bt-connection-handler.js";
|
|
17
18
|
import { BTDataProcessor } from "./bt-data-processor.js";
|
|
@@ -26,6 +27,9 @@ export class BTManagedDevice {
|
|
|
26
27
|
|
|
27
28
|
connected = false;
|
|
28
29
|
destroyed = false;
|
|
30
|
+
|
|
31
|
+
/** A policy that picks how results are delivered replaces `oneReadingPerConnection`; a user filter does not. */
|
|
32
|
+
|
|
29
33
|
resultReportedThisConnection = false;
|
|
30
34
|
historyTransferActive = false;
|
|
31
35
|
bondedEventReported = false;
|
|
@@ -131,6 +135,7 @@ export class BTManagedDevice {
|
|
|
131
135
|
this.device = device;
|
|
132
136
|
this.oneReadingPerConnection = oneReadingPerConnection === true;
|
|
133
137
|
this.resultPolicy = resultPolicy;
|
|
138
|
+
this.policyPicksDelivery = resultPolicy?.default !== undefined || resultPolicy?.byMeasurement !== undefined;
|
|
134
139
|
sentryLogger("info", "BT_MANAGER: Creating BTManagedDevice");
|
|
135
140
|
this.deviceData = {
|
|
136
141
|
id: device.id,
|
|
@@ -183,13 +188,20 @@ export class BTManagedDevice {
|
|
|
183
188
|
...data
|
|
184
189
|
}) => {
|
|
185
190
|
const measurementTypeKey = data.measurementTypeKey;
|
|
191
|
+
const acceptedMemorySlots = this.resultPolicy?.acceptedMemorySlots;
|
|
192
|
+
if (acceptedMemorySlots && !isFromAcceptedMemorySlot(data, acceptedMemorySlots)) {
|
|
193
|
+
sentryLogger("info", "BT_MANAGER: Dropping a reading of another device user", {
|
|
194
|
+
measurementTypeKey
|
|
195
|
+
});
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
186
198
|
const policy = this.policyFor(measurementTypeKey);
|
|
187
199
|
|
|
188
200
|
// A live value of a kind kept as a series goes to the series; a stored record is reported as it is.
|
|
189
201
|
if (policy === "series" && onSeriesValueCallback?.(this.deviceData, data)) {
|
|
190
202
|
return;
|
|
191
203
|
}
|
|
192
|
-
if (this.oneReadingPerConnection && !this.
|
|
204
|
+
if (this.oneReadingPerConnection && !this.policyPicksDelivery && this.resultReportedThisConnection) {
|
|
193
205
|
return;
|
|
194
206
|
}
|
|
195
207
|
if (policy === "first-reading-per-kind-per-connection") {
|
|
@@ -244,6 +256,11 @@ export class BTManagedDevice {
|
|
|
244
256
|
enumerable: true,
|
|
245
257
|
writable: false
|
|
246
258
|
});
|
|
259
|
+
Object.defineProperty(result, "legacyId", {
|
|
260
|
+
value: createLegacyResultId(this.deviceData, data),
|
|
261
|
+
enumerable: true,
|
|
262
|
+
writable: false
|
|
263
|
+
});
|
|
247
264
|
onResultCallback?.(result);
|
|
248
265
|
};
|
|
249
266
|
this.onDeviceDisconnected = onDeviceDisconnectedCallback;
|