@tempivo/sensor-beacon 0.1.1 → 0.3.0

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 (73) hide show
  1. package/README.md +222 -78
  2. package/android/build.gradle +38 -2
  3. package/android/src/main/AndroidManifest.xml +10 -0
  4. package/android/src/main/java/expo/modules/tempivosensorbeacon/SensorBeaconNative.java +233 -0
  5. package/android/src/main/java/expo/modules/tempivosensorbeacon/TempivoSensorBeaconModule.kt +122 -0
  6. package/android-aar/build.gradle +4 -0
  7. package/{android → android-aar}/library/build.gradle +3 -0
  8. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/PartnerBleRules.kt +279 -0
  9. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/SensorBleRuntime.kt +168 -0
  10. package/{android → android-aar}/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorBeaconDecoder.kt +6 -23
  11. package/{android → android-aar}/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorBeaconScanner.kt +0 -2
  12. package/{android → android-aar}/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorBeaconTypes.kt +2 -4
  13. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorCalibration.kt +36 -0
  14. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorError.kt +18 -0
  15. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorProfile.kt +171 -0
  16. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorQr.kt +82 -0
  17. package/android-aar/library/src/main/java/com/tempivo/sensor/beacon/TempivoSensorSession.kt +127 -0
  18. package/{android → android-aar}/settings.gradle +1 -0
  19. package/app.plugin.cjs +142 -0
  20. package/dist/calibration.d.ts +7 -0
  21. package/dist/calibration.js +42 -0
  22. package/dist/decoder.js +4 -12
  23. package/dist/errors.d.ts +6 -0
  24. package/dist/errors.js +8 -0
  25. package/dist/expo-modules-core.web-stub.d.ts +5 -0
  26. package/dist/expo-modules-core.web-stub.js +9 -0
  27. package/dist/index.d.ts +8 -1
  28. package/dist/index.js +6 -1
  29. package/dist/native-bridge.d.ts +14 -0
  30. package/dist/native-bridge.js +51 -0
  31. package/dist/native-helpers.d.ts +5 -0
  32. package/dist/native-helpers.js +33 -0
  33. package/dist/native-module.d.ts +14 -0
  34. package/dist/native-module.js +104 -0
  35. package/dist/native-types.d.ts +41 -0
  36. package/dist/native-types.js +1 -0
  37. package/dist/profile.d.ts +10 -0
  38. package/dist/profile.js +226 -0
  39. package/dist/qr.d.ts +16 -0
  40. package/dist/qr.js +90 -0
  41. package/dist/react-native.d.ts +1 -0
  42. package/dist/react-native.js +1 -0
  43. package/dist/session-types.d.ts +64 -0
  44. package/dist/session-types.js +1 -0
  45. package/dist/tempivo-sensor-beacon.aar +0 -0
  46. package/dist/types.d.ts +3 -3
  47. package/expo-module.config.json +12 -0
  48. package/ios/Frameworks/TempivoSensorBridge.xcframework/Info.plist +43 -0
  49. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/Headers/TempivoSensorBridge.h +159 -0
  50. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/Info.plist +35 -0
  51. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/Modules/module.modulemap +8 -0
  52. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64/TempivoSensorBridge.framework/TempivoSensorBridge +0 -0
  53. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/Headers/TempivoSensorBridge.h +159 -0
  54. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/Info.plist +31 -0
  55. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/Modules/module.modulemap +8 -0
  56. package/ios/Frameworks/TempivoSensorBridge.xcframework/ios-arm64-simulator/TempivoSensorBridge.framework/TempivoSensorBridge +0 -0
  57. package/ios/Sources/TempivoSensorBeacon/TempivoSensorBeaconDecoder.swift +4 -8
  58. package/ios/Sources/TempivoSensorBeacon/TempivoSensorBeaconTypes.swift +3 -6
  59. package/ios/Sources/TempivoSensorBeacon/TempivoSensorCalibration.swift +22 -0
  60. package/ios/Sources/TempivoSensorBeacon/TempivoSensorError.swift +24 -0
  61. package/ios/Sources/TempivoSensorBeacon/TempivoSensorProfile.swift +123 -0
  62. package/ios/Sources/TempivoSensorBeacon/TempivoSensorQr.swift +78 -0
  63. package/ios/Sources/TempivoSensorBeacon/TempivoSensorSession.swift +161 -0
  64. package/ios/Sources/TempivoSensorBeacon/TempivoSensorSessionTypes.swift +93 -0
  65. package/ios/TempivoSensorBeacon.podspec +35 -0
  66. package/ios/TempivoSensorBeaconModule.swift +208 -0
  67. package/package.json +55 -7
  68. /package/{android → android-aar}/gradle/wrapper/gradle-wrapper.jar +0 -0
  69. /package/{android → android-aar}/gradle/wrapper/gradle-wrapper.properties +0 -0
  70. /package/{android → android-aar}/gradle.properties +0 -0
  71. /package/{android → android-aar}/gradlew +0 -0
  72. /package/{android → android-aar}/library/consumer-rules.pro +0 -0
  73. /package/{android → android-aar}/library/src/main/AndroidManifest.xml +0 -0
@@ -0,0 +1,208 @@
1
+ import CoreBluetooth
2
+ import ExpoModulesCore
3
+
4
+ public class TempivoSensorBeaconModule: Module, TempivoSensorBeaconScannerDelegate {
5
+ private var scanner: TempivoSensorBeaconScanner?
6
+ private let session = TempivoSensorSession()
7
+
8
+ public func definition() -> ModuleDefinition {
9
+ Name("TempivoSensorBeacon")
10
+ Events("onDeviceFound")
11
+
12
+ AsyncFunction("requestPermissions") { () -> [String: Any] in
13
+ _ = self.requireScanner()
14
+ return self.permissionPayload()
15
+ }
16
+
17
+ AsyncFunction("startScan") {
18
+ self.requireScanner().startScanning()
19
+ }
20
+
21
+ Function("stopScan") {
22
+ self.scanner?.stopScanning()
23
+ }
24
+
25
+ Function("isScanning") { () -> Bool in
26
+ self.scanner?.scanning ?? false
27
+ }
28
+
29
+ AsyncFunction("connect") { (qrJson: String) -> [String: Any] in
30
+ do {
31
+ let qr = try TempivoSensorQrParser.parse(qrJson)
32
+ try self.session.connect(qr: qr)
33
+ return self.qrPayload(qr)
34
+ } catch {
35
+ throw self.mapError(error)
36
+ }
37
+ }
38
+
39
+ AsyncFunction("disconnect") {
40
+ self.session.disconnect()
41
+ }
42
+
43
+ AsyncFunction("getConfigurationJson") { () -> String in
44
+ do {
45
+ return try self.session.getConfigurationJson()
46
+ } catch {
47
+ throw self.mapError(error)
48
+ }
49
+ }
50
+
51
+ AsyncFunction("setConfigurationJson") { (json: String) in
52
+ do {
53
+ try self.session.setConfigurationJson(json)
54
+ } catch {
55
+ throw self.mapError(error)
56
+ }
57
+ }
58
+
59
+ AsyncFunction("triggerTransmission") { () -> [String: Any] in
60
+ do {
61
+ let result = try self.session.triggerTransmission()
62
+ return ["ok": result.ok, "supported": result.supported]
63
+ } catch {
64
+ throw self.mapError(error)
65
+ }
66
+ }
67
+
68
+ AsyncFunction("getCalibration") { () -> [String: Any] in
69
+ do {
70
+ let cal = try self.session.getCalibration()
71
+ var payload: [String: Any] = [:]
72
+ if let date = cal.laboratoryCalibrationDate {
73
+ payload["laboratoryCalibrationDate"] = date
74
+ }
75
+ if let ts = cal.laboratoryCalibrationTimestamp {
76
+ payload["laboratoryCalibrationTimestamp"] = Int(ts)
77
+ }
78
+ return payload
79
+ } catch {
80
+ throw self.mapError(error)
81
+ }
82
+ }
83
+
84
+ OnDestroy {
85
+ self.scanner?.stopScanning()
86
+ self.session.disconnect()
87
+ }
88
+ }
89
+
90
+ public func sensorBeaconScanner(
91
+ _ scanner: TempivoSensorBeaconScanner,
92
+ didDiscover discovery: SensorBeaconDiscovery
93
+ ) {
94
+ sendEvent("onDeviceFound", devicePayload(discovery))
95
+ }
96
+
97
+ private func requireScanner() -> TempivoSensorBeaconScanner {
98
+ if let scanner {
99
+ return scanner
100
+ }
101
+ let created = TempivoSensorBeaconScanner()
102
+ created.delegate = self
103
+ scanner = created
104
+ return created
105
+ }
106
+
107
+ private func permissionPayload() -> [String: Any] {
108
+ if #available(iOS 13.1, *) {
109
+ let status = CBManager.authorization
110
+ let granted = status == .allowedAlways
111
+ let statusName: String
112
+ switch status {
113
+ case .allowedAlways: statusName = "granted"
114
+ case .notDetermined: statusName = "undetermined"
115
+ default: statusName = "denied"
116
+ }
117
+ return [
118
+ "granted": granted,
119
+ "status": statusName,
120
+ "canAskAgain": status == .notDetermined,
121
+ "expires": "never",
122
+ ]
123
+ }
124
+ return [
125
+ "granted": true,
126
+ "status": "granted",
127
+ "canAskAgain": true,
128
+ "expires": "never",
129
+ ]
130
+ }
131
+
132
+ private func qrPayload(_ qr: TempivoSensorQr) -> [String: Any] {
133
+ var payload: [String: Any] = [
134
+ "serial": qr.serial,
135
+ "pin": qr.pin,
136
+ "sessionType": qr.sessionType.rawValue,
137
+ "bluetoothMac": qr.bluetoothMac,
138
+ ]
139
+ if let model = qr.model {
140
+ payload["model"] = model
141
+ }
142
+ return payload
143
+ }
144
+
145
+ private func devicePayload(_ discovery: SensorBeaconDiscovery) -> [String: Any] {
146
+ var payload: [String: Any] = [
147
+ "deviceId": discovery.deviceId,
148
+ "rssi": discovery.rssi,
149
+ ]
150
+ if let serial = discovery.serialNumber {
151
+ payload["serialNumber"] = serial
152
+ }
153
+ if let mac = discovery.bluetoothMacAddress {
154
+ payload["bluetoothMacAddress"] = mac
155
+ }
156
+ if let reading = discovery.reading {
157
+ payload["summary"] = reading.summary
158
+ payload["telemetry"] = telemetryPayload(reading)
159
+ }
160
+ return payload
161
+ }
162
+
163
+ private func telemetryPayload(_ reading: SensorBeaconReading) -> [String: Any] {
164
+ var payload: [String: Any] = [
165
+ "readingsCount": reading.readingsCount,
166
+ "summary": reading.summary,
167
+ "readings": reading.readings.map { slot in
168
+ [
169
+ "typeHex": slot.typeHex,
170
+ "raw24": slot.raw24,
171
+ "text": slot.text,
172
+ ] as [String: Any]
173
+ },
174
+ ]
175
+ if let firmware = reading.firmware { payload["firmware"] = firmware }
176
+ if let batteryOk = reading.batteryOk { payload["batteryOk"] = batteryOk }
177
+ if let encryptionEnabled = reading.encryptionEnabled { payload["encryptionEnabled"] = encryptionEnabled }
178
+ if let cellularStatus = reading.cellularStatus { payload["cellularStatus"] = cellularStatus }
179
+ if let measurementCounter = reading.measurementCounter { payload["measurementCounter"] = measurementCounter }
180
+ if let readingTimestampUnix = reading.readingTimestampUnix { payload["readingTimestampUnix"] = readingTimestampUnix }
181
+ if let readingTimestampIso = reading.readingTimestampIso { payload["readingTimestampIso"] = readingTimestampIso }
182
+ if let measurementIntervalSeconds = reading.measurementIntervalSeconds {
183
+ payload["measurementIntervalSeconds"] = measurementIntervalSeconds
184
+ }
185
+ return payload
186
+ }
187
+
188
+ private func mapError(_ error: Error) -> SensorBeaconException {
189
+ if let sensor = error as? TempivoSensorError {
190
+ return SensorBeaconException(code: sensor.code.rawValue, reason: sensor.message)
191
+ }
192
+ return SensorBeaconException(code: "unknown", reason: error.localizedDescription)
193
+ }
194
+ }
195
+
196
+ internal final class SensorBeaconException: Exception {
197
+ private let customCode: String
198
+ private let customReason: String
199
+
200
+ init(code: String, reason: String) {
201
+ self.customCode = code
202
+ self.customReason = reason
203
+ super.init()
204
+ }
205
+
206
+ override var code: String { customCode }
207
+ override var reason: String { customReason }
208
+ }
package/package.json CHANGED
@@ -1,20 +1,38 @@
1
1
  {
2
2
  "name": "@tempivo/sensor-beacon",
3
- "version": "0.1.1",
4
- "description": "Tempivo sensor BLE beacon SDK: TypeScript decoder plus iOS and Android scan libraries. Advertising only, no GATT.",
3
+ "version": "0.3.0",
4
+ "description": "Tempivo sensor BLE SDK for Expo, React Native, Android, iOS, and Node.",
5
5
  "homepage": "https://app.tempivo.com/integrations",
6
+ "author": "Tempivo",
6
7
  "type": "module",
7
8
  "main": "dist/index.js",
8
9
  "types": "dist/index.d.ts",
10
+ "react-native": "./dist/react-native.js",
9
11
  "exports": {
10
12
  ".": {
13
+ "react-native": {
14
+ "types": "./dist/react-native.d.ts",
15
+ "default": "./dist/react-native.js"
16
+ },
11
17
  "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js"
13
- }
18
+ "import": "./dist/index.js",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./react-native": {
22
+ "types": "./dist/react-native.d.ts",
23
+ "default": "./dist/react-native.js"
24
+ },
25
+ "./app.plugin": "./app.plugin.cjs",
26
+ "./app.plugin.js": "./app.plugin.cjs",
27
+ "./app.plugin.cjs": "./app.plugin.cjs",
28
+ "./package.json": "./package.json"
14
29
  },
15
30
  "files": [
31
+ "app.plugin.cjs",
16
32
  "dist",
17
33
  "android",
34
+ "android-aar",
35
+ "expo-module.config.json",
18
36
  "ios",
19
37
  "LICENSE",
20
38
  "README.md"
@@ -29,21 +47,51 @@
29
47
  "build": "npm run build:ts",
30
48
  "build:ts": "tsc",
31
49
  "build:android": "node scripts/build-aar.mjs",
50
+ "build:ios-bridge": "bash scripts/build-ios-bridge.sh && node scripts/copy-ios-bridge.mjs",
51
+ "copy:ios-bridge": "node scripts/copy-ios-bridge.mjs",
32
52
  "build:all": "npm run build:ts && npm run build:android",
33
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.mjs",
34
- "prepublishOnly": "npm run build:all"
53
+ "prepare": "npm run build:ts",
54
+ "test": "npm run test:all",
55
+ "test:unit": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.mjs",
56
+ "test:python": "PYTHONPATH=python python3 -m pytest python/tests -q",
57
+ "test:all": "npm run test:unit && npm run test:python",
58
+ "test:smoke": "node scripts/smoke-test.mjs",
59
+ "prepublishOnly": "npm run build:all && npm run copy:ios-bridge"
35
60
  },
36
61
  "keywords": [
37
62
  "tempivo",
38
63
  "ble",
39
64
  "bluetooth",
40
65
  "beacon",
66
+ "gatt",
41
67
  "sensor",
42
68
  "manufacturer-data",
43
69
  "android",
44
- "ios"
70
+ "ios",
71
+ "expo",
72
+ "react-native"
45
73
  ],
46
74
  "license": "MIT",
75
+ "peerDependencies": {
76
+ "expo": "*",
77
+ "expo-modules-core": "*",
78
+ "react": "*",
79
+ "react-native": "*"
80
+ },
81
+ "peerDependenciesMeta": {
82
+ "expo": {
83
+ "optional": true
84
+ },
85
+ "expo-modules-core": {
86
+ "optional": true
87
+ },
88
+ "react": {
89
+ "optional": true
90
+ },
91
+ "react-native": {
92
+ "optional": true
93
+ }
94
+ },
47
95
  "devDependencies": {
48
96
  "@types/jest": "^29.5.14",
49
97
  "jest": "^29.7.0",
File without changes
File without changes