@tryterra/react-native 0.0.0-stage → 2.1.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.
- package/LICENSE +21 -0
- package/README.md +111 -2
- package/TerraReactNative.podspec +48 -0
- package/android/build.gradle +87 -0
- package/android/src/bridgeCore/kotlin/README.md +1 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/BridgeBootstrap.kt +133 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/BridgeHost.kt +32 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/Conversions.kt +468 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/LauncherSlots.kt +41 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/Rejections.kt +150 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/StreamRegistry.kt +77 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridge.kt +86 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridgeOpsImpl.kt +258 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridgeStreamsImpl.kt +52 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TokenBroker.kt +198 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeErrors.kt +217 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeOps.kt +493 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeTypes.kt +897 -0
- package/android/src/healthConnectOnly/kotlin/co/tryterra/sdk/reactnative/TerraStores.kt +11 -0
- package/android/src/main/AndroidManifest.xml +24 -0
- package/android/src/main/java/co/tryterra/sdk/reactnative/TerraBridgeModule.kt +96 -0
- package/android/src/main/java/co/tryterra/sdk/reactnative/TerraReactNativePackage.kt +26 -0
- package/android/src/main/java/co/tryterra/sdk/reactnative/TerraStartup.kt +46 -0
- package/android/src/samsung/kotlin/co/tryterra/sdk/reactnative/TerraStores.kt +13 -0
- package/docs/availability.md +246 -0
- package/frameworks/TerraSDK.xcframework/Info.plist +48 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Info.plist +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.abi.json +81513 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.package.swiftinterface +2150 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.private.swiftinterface +2150 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.swiftinterface +2127 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/PrivacyInfo.xcprivacy +96 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/TerraSDK +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/dSYMs/TerraSDK.framework.dSYM/Contents/Info.plist +20 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/DWARF/TerraSDK +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/TerraSDK.yml +6473 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Info.plist +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.abi.json +81513 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.package.swiftinterface +2150 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +2150 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.swiftinterface +2127 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.abi.json +81513 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.package.swiftinterface +2150 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +2150 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +2127 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/PrivacyInfo.xcprivacy +96 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/TerraSDK +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/_CodeSignature/CodeResources +223 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Info.plist +20 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/DWARF/TerraSDK +0 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/TerraSDK.yml +6474 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/x86_64/TerraSDK.yml +6392 -0
- package/ios/TerraBridgeCore/BridgeBootstrap.swift +89 -0
- package/ios/TerraBridgeCore/BridgeHost.swift +13 -0
- package/ios/TerraBridgeCore/Conversions.swift +467 -0
- package/ios/TerraBridgeCore/Generated/BridgeErrors.swift +179 -0
- package/ios/TerraBridgeCore/Generated/BridgeOps.swift +795 -0
- package/ios/TerraBridgeCore/Generated/BridgeTypes.swift +1317 -0
- package/ios/TerraBridgeCore/Locked.swift +15 -0
- package/ios/TerraBridgeCore/README.md +1 -0
- package/ios/TerraBridgeCore/Rejections.swift +130 -0
- package/ios/TerraBridgeCore/RuntimeAttachment.swift +60 -0
- package/ios/TerraBridgeCore/StreamRegistry.swift +59 -0
- package/ios/TerraBridgeCore/TerraBridge.swift +122 -0
- package/ios/TerraBridgeCore/TerraBridgeOpsImpl.swift +254 -0
- package/ios/TerraBridgeCore/TerraBridgeStreamsImpl.swift +60 -0
- package/ios/TerraBridgeCore/TokenBroker.swift +147 -0
- package/ios/TerraBridgeModule.mm +79 -0
- package/ios/TerraBridgeModuleImpl.swift +49 -0
- package/ios/TerraReactNative.swift +19 -0
- package/lib/EndUser.d.ts +12 -0
- package/lib/EndUser.js +13 -0
- package/lib/NativeTerraBridge.d.ts +23 -0
- package/lib/NativeTerraBridge.js +13 -0
- package/lib/Terra.d.ts +154 -0
- package/lib/Terra.js +280 -0
- package/lib/TerraError.d.ts +42 -0
- package/lib/TerraError.js +95 -0
- package/lib/createTerra.d.ts +8 -0
- package/lib/createTerra.js +19 -0
- package/lib/generated/client.d.ts +92 -0
- package/lib/generated/client.js +196 -0
- package/lib/generated/codecs.d.ts +135 -0
- package/lib/generated/codecs.js +1358 -0
- package/lib/generated/errors.d.ts +13 -0
- package/lib/generated/errors.js +68 -0
- package/lib/generated/ops.d.ts +13 -0
- package/lib/generated/ops.js +137 -0
- package/lib/generated/streams.d.ts +23 -0
- package/lib/generated/streams.js +58 -0
- package/lib/generated/types.d.ts +481 -0
- package/lib/generated/types.js +92 -0
- package/lib/index.d.ts +29 -0
- package/lib/index.js +55 -0
- package/package.json +71 -4
- package/src/EndUser.ts +15 -0
- package/src/NativeTerraBridge.ts +27 -0
- package/src/Terra.ts +462 -0
- package/src/TerraError.ts +116 -0
- package/src/createTerra.ts +18 -0
- package/src/generated/client.ts +243 -0
- package/src/generated/codecs.ts +1287 -0
- package/src/generated/errors.ts +113 -0
- package/src/generated/ops.ts +197 -0
- package/src/generated/streams.ts +74 -0
- package/src/generated/types.ts +667 -0
- package/src/index.ts +52 -0
|
@@ -0,0 +1,667 @@
|
|
|
1
|
+
// Generated from surface/terra-surface.json by surface/gen. Do not edit by hand.
|
|
2
|
+
// Regenerate with: node surface/gen/src/cli.ts generate
|
|
3
|
+
|
|
4
|
+
/** A health store the SDK can link. One connection per source per device. */
|
|
5
|
+
export type Source =
|
|
6
|
+
| "health"
|
|
7
|
+
| "samsungHealth"; // android only
|
|
8
|
+
|
|
9
|
+
export const SourceValues: readonly Source[] = [
|
|
10
|
+
"health",
|
|
11
|
+
"samsungHealth",
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
/** The unit permissions are asked for and changes are reported against. */
|
|
15
|
+
export type DataCategory =
|
|
16
|
+
| "activity"
|
|
17
|
+
| "body"
|
|
18
|
+
| "daily"
|
|
19
|
+
| "sleep"
|
|
20
|
+
| "nutrition";
|
|
21
|
+
|
|
22
|
+
export const DataCategoryValues: readonly DataCategory[] = [
|
|
23
|
+
"activity",
|
|
24
|
+
"body",
|
|
25
|
+
"daily",
|
|
26
|
+
"sleep",
|
|
27
|
+
"nutrition",
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export type PermissionStatus =
|
|
31
|
+
| "granted"
|
|
32
|
+
| "denied"
|
|
33
|
+
| "notDetermined"
|
|
34
|
+
| "notDisclosed"
|
|
35
|
+
| "unsupported"
|
|
36
|
+
| "unavailable"; // ios only
|
|
37
|
+
|
|
38
|
+
export const PermissionStatusValues: readonly PermissionStatus[] = [
|
|
39
|
+
"granted",
|
|
40
|
+
"denied",
|
|
41
|
+
"notDetermined",
|
|
42
|
+
"notDisclosed",
|
|
43
|
+
"unsupported",
|
|
44
|
+
"unavailable",
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
export type MotionContext =
|
|
48
|
+
| "unknown"
|
|
49
|
+
| "sedentary"
|
|
50
|
+
| "active";
|
|
51
|
+
|
|
52
|
+
export const MotionContextValues: readonly MotionContext[] = [
|
|
53
|
+
"unknown",
|
|
54
|
+
"sedentary",
|
|
55
|
+
"active",
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Why background delivery is restricted. Android discloses which; Apple reports the state
|
|
60
|
+
* without a reason.
|
|
61
|
+
*
|
|
62
|
+
* Available on android only.
|
|
63
|
+
*/
|
|
64
|
+
export type BackgroundRestrictionReason =
|
|
65
|
+
| "oemRestricted" // android only
|
|
66
|
+
| "backgroundReadDenied" // android only
|
|
67
|
+
| "healthConnectFeatureUnavailable" // android only
|
|
68
|
+
| "storeFeatureUnavailable" // android only
|
|
69
|
+
| "ticksNotRunning"; // android only
|
|
70
|
+
|
|
71
|
+
export const BackgroundRestrictionReasonValues: readonly BackgroundRestrictionReason[] = [
|
|
72
|
+
"oemRestricted",
|
|
73
|
+
"backgroundReadDenied",
|
|
74
|
+
"healthConnectFeatureUnavailable",
|
|
75
|
+
"storeFeatureUnavailable",
|
|
76
|
+
"ticksNotRunning",
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
export type DiagnosticsReason =
|
|
80
|
+
| "uploadFailed"
|
|
81
|
+
| "backfillAbandoned"
|
|
82
|
+
| "backgroundObservationUnavailable"
|
|
83
|
+
| "backgroundRestricted"
|
|
84
|
+
| "backgroundRefreshUnscheduled"
|
|
85
|
+
| "quiet"
|
|
86
|
+
| "requested";
|
|
87
|
+
|
|
88
|
+
export const DiagnosticsReasonValues: readonly DiagnosticsReason[] = [
|
|
89
|
+
"uploadFailed",
|
|
90
|
+
"backfillAbandoned",
|
|
91
|
+
"backgroundObservationUnavailable",
|
|
92
|
+
"backgroundRestricted",
|
|
93
|
+
"backgroundRefreshUnscheduled",
|
|
94
|
+
"quiet",
|
|
95
|
+
"requested",
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
export type DeviceKeyRevokeOutcome =
|
|
99
|
+
| "revoked"
|
|
100
|
+
| "alreadyRevoked"
|
|
101
|
+
| "routeAbsent";
|
|
102
|
+
|
|
103
|
+
export const DeviceKeyRevokeOutcomeValues: readonly DeviceKeyRevokeOutcome[] = [
|
|
104
|
+
"revoked",
|
|
105
|
+
"alreadyRevoked",
|
|
106
|
+
"routeAbsent",
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The redacted error name an event carries. Deliberately not TerraErrorCode: an event names
|
|
111
|
+
* the failure without the detail bag, because a support report leaves the device.
|
|
112
|
+
*/
|
|
113
|
+
export type FailureCode =
|
|
114
|
+
| "healthDataUnavailable"
|
|
115
|
+
| "notConnected"
|
|
116
|
+
| "tokenUnavailable"
|
|
117
|
+
| "tokenRejected"
|
|
118
|
+
| "tokenProviderFailed"
|
|
119
|
+
| "offline"
|
|
120
|
+
| "timedOut"
|
|
121
|
+
| "serverError"
|
|
122
|
+
| "transport"
|
|
123
|
+
| "malformedResponse"
|
|
124
|
+
| "userLimitReached"
|
|
125
|
+
| "upgradeRequired"
|
|
126
|
+
| "platform"
|
|
127
|
+
| "deviceKeyUnavailable"
|
|
128
|
+
| "signatureRejected"
|
|
129
|
+
| "linkRevoked"
|
|
130
|
+
| "linkConflict"
|
|
131
|
+
| "clockSkewed"
|
|
132
|
+
| "devIDMismatch"
|
|
133
|
+
| "syncAlreadyRunning"
|
|
134
|
+
| "linkAlreadyRunning"
|
|
135
|
+
| "storeLocked"
|
|
136
|
+
| "storeUnreadable"
|
|
137
|
+
| "deadlineExceeded"
|
|
138
|
+
| "permissionDenied"
|
|
139
|
+
| "authorizationNotDetermined"
|
|
140
|
+
| "sampleNotFound"
|
|
141
|
+
| "rollbackIncomplete"
|
|
142
|
+
| "distanceNotAttributable"
|
|
143
|
+
| "bloodPressureIncomplete"
|
|
144
|
+
| "authorizationUnavailableInExtension"
|
|
145
|
+
| "routeAwaitingConverter"
|
|
146
|
+
| "readQuotaExceeded" // android only
|
|
147
|
+
| "plannedWorkoutUnnamed"; // ios only
|
|
148
|
+
|
|
149
|
+
export const FailureCodeValues: readonly FailureCode[] = [
|
|
150
|
+
"healthDataUnavailable",
|
|
151
|
+
"notConnected",
|
|
152
|
+
"tokenUnavailable",
|
|
153
|
+
"tokenRejected",
|
|
154
|
+
"tokenProviderFailed",
|
|
155
|
+
"offline",
|
|
156
|
+
"timedOut",
|
|
157
|
+
"serverError",
|
|
158
|
+
"transport",
|
|
159
|
+
"malformedResponse",
|
|
160
|
+
"userLimitReached",
|
|
161
|
+
"upgradeRequired",
|
|
162
|
+
"platform",
|
|
163
|
+
"deviceKeyUnavailable",
|
|
164
|
+
"signatureRejected",
|
|
165
|
+
"linkRevoked",
|
|
166
|
+
"linkConflict",
|
|
167
|
+
"clockSkewed",
|
|
168
|
+
"devIDMismatch",
|
|
169
|
+
"syncAlreadyRunning",
|
|
170
|
+
"linkAlreadyRunning",
|
|
171
|
+
"storeLocked",
|
|
172
|
+
"storeUnreadable",
|
|
173
|
+
"deadlineExceeded",
|
|
174
|
+
"permissionDenied",
|
|
175
|
+
"authorizationNotDetermined",
|
|
176
|
+
"sampleNotFound",
|
|
177
|
+
"rollbackIncomplete",
|
|
178
|
+
"distanceNotAttributable",
|
|
179
|
+
"bloodPressureIncomplete",
|
|
180
|
+
"authorizationUnavailableInExtension",
|
|
181
|
+
"routeAwaitingConverter",
|
|
182
|
+
"readQuotaExceeded",
|
|
183
|
+
"plannedWorkoutUnnamed",
|
|
184
|
+
];
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Whether Terra's plans can be put on the person's Apple Watch. unsupported before iOS 17 or
|
|
188
|
+
* where WorkoutKit cannot schedule.
|
|
189
|
+
*
|
|
190
|
+
* Available on ios only.
|
|
191
|
+
*/
|
|
192
|
+
export type WorkoutSchedulingStatus =
|
|
193
|
+
| "unsupported" // ios only
|
|
194
|
+
| "notDetermined" // ios only
|
|
195
|
+
| "denied" // ios only
|
|
196
|
+
| "authorized"; // ios only
|
|
197
|
+
|
|
198
|
+
export const WorkoutSchedulingStatusValues: readonly WorkoutSchedulingStatus[] = [
|
|
199
|
+
"unsupported",
|
|
200
|
+
"notDetermined",
|
|
201
|
+
"denied",
|
|
202
|
+
"authorized",
|
|
203
|
+
];
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* The person a connect is for. A stored link is restored only for the person it was made for;
|
|
207
|
+
* anybody else gets a fresh link. Never sent to Terra as identity.
|
|
208
|
+
*/
|
|
209
|
+
export type EndUser =
|
|
210
|
+
| { kind: "reference"; id: string }
|
|
211
|
+
| { kind: "anonymous" };
|
|
212
|
+
|
|
213
|
+
/** A half-open window [start, end). Resolved against the device's calendar natively. */
|
|
214
|
+
export type TimeRange =
|
|
215
|
+
| { kind: "lastHours"; hours: number }
|
|
216
|
+
| { kind: "lastDays"; days: number }
|
|
217
|
+
| { kind: "today" }
|
|
218
|
+
| { kind: "between"; start: Date; end: Date };
|
|
219
|
+
|
|
220
|
+
export type SleepStage =
|
|
221
|
+
| { kind: "inBed" }
|
|
222
|
+
| { kind: "awake" }
|
|
223
|
+
| { kind: "asleep" }
|
|
224
|
+
| { kind: "light" }
|
|
225
|
+
| { kind: "deep" }
|
|
226
|
+
| { kind: "rem" }
|
|
227
|
+
| { kind: "unknown"; raw: string };
|
|
228
|
+
|
|
229
|
+
export type WorkoutActivity =
|
|
230
|
+
| { kind: "running" }
|
|
231
|
+
| { kind: "walking" }
|
|
232
|
+
| { kind: "cycling" }
|
|
233
|
+
| { kind: "swimming" }
|
|
234
|
+
| { kind: "strengthTraining" }
|
|
235
|
+
| { kind: "other"; label: string };
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* What the SDK believes about delivery right now. Wire spelling matches DiagnosticsWire.state
|
|
239
|
+
* and Apple's DiagnosticsState Encodable.
|
|
240
|
+
*/
|
|
241
|
+
export type DiagnosticsState =
|
|
242
|
+
| { state: "healthy" }
|
|
243
|
+
| { state: "quiet"; since: Date }
|
|
244
|
+
| { state: "backgroundRestricted"; reason?: BackgroundRestrictionReason | undefined }
|
|
245
|
+
| { state: "backgroundRefreshUnscheduled" }
|
|
246
|
+
| { state: "pendingRetry" }
|
|
247
|
+
| { state: "linkRevoked" }
|
|
248
|
+
| { state: "devIDMismatch" };
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* What a subscription delivers. A stream can fail or finish, and without saying so the
|
|
252
|
+
* framework layer has to invent a convention for both - two of those, one per wrapper, is a
|
|
253
|
+
* contract nobody wrote down.
|
|
254
|
+
*/
|
|
255
|
+
export type StreamMessage =
|
|
256
|
+
| { kind: "data"; element: Record<string, unknown> }
|
|
257
|
+
| { kind: "error"; error: TerraErrorPayload }
|
|
258
|
+
| { kind: "complete" };
|
|
259
|
+
|
|
260
|
+
/** Who recorded a sample. The only stable handle an app has for filtering by app or device. */
|
|
261
|
+
export interface SampleSource {
|
|
262
|
+
readonly name: string;
|
|
263
|
+
readonly bundleId: string;
|
|
264
|
+
readonly productType?: string | undefined;
|
|
265
|
+
readonly deviceType?: string | undefined;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* A link record. A value, not a handle: Apple's Connection carries sync and disconnect
|
|
270
|
+
* methods, and an object with behaviour cannot cross the bridge, so those are ops on the
|
|
271
|
+
* client.
|
|
272
|
+
*/
|
|
273
|
+
export interface Connection {
|
|
274
|
+
readonly source: Source;
|
|
275
|
+
readonly userId: string;
|
|
276
|
+
/**
|
|
277
|
+
* Android's StoredConnection carries the store-side id. Apple's Connection does not.
|
|
278
|
+
*
|
|
279
|
+
* Available on android only.
|
|
280
|
+
*/
|
|
281
|
+
readonly providerUserId?: string | undefined;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export interface HeartRateSample {
|
|
285
|
+
readonly id: string;
|
|
286
|
+
readonly time: Date;
|
|
287
|
+
readonly beatsPerMinute: number;
|
|
288
|
+
readonly source: SampleSource;
|
|
289
|
+
readonly motionContext?: MotionContext | undefined;
|
|
290
|
+
readonly userEntered: boolean;
|
|
291
|
+
readonly timeZone?: string | undefined;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* A step total over an interval. Apple derives the id from the source and start; Android
|
|
296
|
+
* carries a RecordId when it has one, so the id is optional on the wire.
|
|
297
|
+
*/
|
|
298
|
+
export interface StepCount {
|
|
299
|
+
readonly id?: string | undefined;
|
|
300
|
+
readonly start: Date;
|
|
301
|
+
readonly end: Date;
|
|
302
|
+
readonly steps: number;
|
|
303
|
+
readonly source: SampleSource;
|
|
304
|
+
readonly userEntered: boolean;
|
|
305
|
+
readonly timeZone?: string | undefined;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export interface SleepSegment {
|
|
309
|
+
readonly id: string;
|
|
310
|
+
readonly start: Date;
|
|
311
|
+
readonly end: Date;
|
|
312
|
+
readonly stage: SleepStage;
|
|
313
|
+
readonly source: SampleSource;
|
|
314
|
+
readonly userEntered: boolean;
|
|
315
|
+
readonly timeZone?: string | undefined;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* indoor is optional because Health Connect does not always record it; Apple always has an
|
|
320
|
+
* answer.
|
|
321
|
+
*/
|
|
322
|
+
export interface Workout {
|
|
323
|
+
readonly id: string;
|
|
324
|
+
readonly start: Date;
|
|
325
|
+
readonly end: Date;
|
|
326
|
+
readonly activity: WorkoutActivity;
|
|
327
|
+
readonly activityTypeCode: number;
|
|
328
|
+
readonly indoor?: boolean | undefined;
|
|
329
|
+
readonly activeEnergyKilocalories?: number | undefined;
|
|
330
|
+
readonly distanceMeters?: number | undefined;
|
|
331
|
+
readonly source: SampleSource;
|
|
332
|
+
readonly userEntered: boolean;
|
|
333
|
+
readonly timeZone?: string | undefined;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** A day whose data changed. Carries no health value by construction. */
|
|
337
|
+
export interface HealthChange {
|
|
338
|
+
readonly category: DataCategory;
|
|
339
|
+
readonly day: string;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export interface WorkoutScope {
|
|
343
|
+
readonly activity: WorkoutActivity;
|
|
344
|
+
readonly energy: boolean;
|
|
345
|
+
readonly distance: boolean;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Lists rather than sets: JSON has no set, so the category lists are marked `set` and every
|
|
350
|
+
* generated codec de-duplicates and sorts them, so two orderings compare equal.
|
|
351
|
+
*/
|
|
352
|
+
export interface HealthAccess {
|
|
353
|
+
readonly read: readonly DataCategory[];
|
|
354
|
+
readonly write: readonly DataCategory[];
|
|
355
|
+
readonly workouts: readonly WorkoutScope[];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export interface HeartRateEntry {
|
|
359
|
+
readonly time: Date;
|
|
360
|
+
readonly beatsPerMinute: number;
|
|
361
|
+
readonly recordId?: string | undefined;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export interface StepEntry {
|
|
365
|
+
readonly start: Date;
|
|
366
|
+
readonly end: Date;
|
|
367
|
+
readonly steps: number;
|
|
368
|
+
readonly recordId?: string | undefined;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export interface SleepEntry {
|
|
372
|
+
readonly start: Date;
|
|
373
|
+
readonly end: Date;
|
|
374
|
+
readonly stage: SleepStage;
|
|
375
|
+
readonly recordId?: string | undefined;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export interface WorkoutEntry {
|
|
379
|
+
readonly start: Date;
|
|
380
|
+
readonly end: Date;
|
|
381
|
+
readonly activity: WorkoutActivity;
|
|
382
|
+
readonly totalEnergyKilocalories?: number | undefined;
|
|
383
|
+
readonly totalDistanceMeters?: number | undefined;
|
|
384
|
+
readonly recordId?: string | undefined;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export interface BodyEntry {
|
|
388
|
+
readonly time: Date;
|
|
389
|
+
readonly bodyMassKilograms?: number | undefined;
|
|
390
|
+
readonly bodyFatPercent?: number | undefined;
|
|
391
|
+
readonly bodyMassIndex?: number | undefined;
|
|
392
|
+
readonly heightMeters?: number | undefined;
|
|
393
|
+
readonly leanBodyMassKilograms?: number | undefined;
|
|
394
|
+
readonly bodyTemperatureCelsius?: number | undefined;
|
|
395
|
+
readonly oxygenSaturationPercent?: number | undefined;
|
|
396
|
+
readonly bloodGlucoseMilligramsPerDeciliter?: number | undefined;
|
|
397
|
+
readonly bloodPressureSystolicMillimetersOfMercury?: number | undefined;
|
|
398
|
+
readonly bloodPressureDiastolicMillimetersOfMercury?: number | undefined;
|
|
399
|
+
readonly recordId?: string | undefined;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Every field optional and every unit in the name, matching NutritionEntry.Nutrients on both
|
|
404
|
+
* platforms field for field.
|
|
405
|
+
*/
|
|
406
|
+
export interface Nutrients {
|
|
407
|
+
readonly energyKilocalories?: number | undefined;
|
|
408
|
+
readonly proteinGrams?: number | undefined;
|
|
409
|
+
readonly carbohydratesGrams?: number | undefined;
|
|
410
|
+
readonly fiberGrams?: number | undefined;
|
|
411
|
+
readonly sugarGrams?: number | undefined;
|
|
412
|
+
readonly fatTotalGrams?: number | undefined;
|
|
413
|
+
readonly fatSaturatedGrams?: number | undefined;
|
|
414
|
+
readonly fatMonounsaturatedGrams?: number | undefined;
|
|
415
|
+
readonly fatPolyunsaturatedGrams?: number | undefined;
|
|
416
|
+
readonly cholesterolMilligrams?: number | undefined;
|
|
417
|
+
readonly sodiumMilligrams?: number | undefined;
|
|
418
|
+
readonly potassiumMilligrams?: number | undefined;
|
|
419
|
+
readonly calciumMilligrams?: number | undefined;
|
|
420
|
+
readonly ironMilligrams?: number | undefined;
|
|
421
|
+
readonly magnesiumMilligrams?: number | undefined;
|
|
422
|
+
readonly zincMilligrams?: number | undefined;
|
|
423
|
+
readonly waterLiters?: number | undefined;
|
|
424
|
+
readonly caffeineMilligrams?: number | undefined;
|
|
425
|
+
readonly vitaminAMicrograms?: number | undefined;
|
|
426
|
+
readonly vitaminCMilligrams?: number | undefined;
|
|
427
|
+
readonly vitaminDMicrograms?: number | undefined;
|
|
428
|
+
readonly vitaminEMilligrams?: number | undefined;
|
|
429
|
+
readonly vitaminKMicrograms?: number | undefined;
|
|
430
|
+
readonly vitaminB6Milligrams?: number | undefined;
|
|
431
|
+
readonly vitaminB12Micrograms?: number | undefined;
|
|
432
|
+
readonly folateMicrograms?: number | undefined;
|
|
433
|
+
readonly thiaminMilligrams?: number | undefined;
|
|
434
|
+
readonly riboflavinMilligrams?: number | undefined;
|
|
435
|
+
readonly niacinMilligrams?: number | undefined;
|
|
436
|
+
readonly biotinMicrograms?: number | undefined;
|
|
437
|
+
readonly pantothenicAcidMilligrams?: number | undefined;
|
|
438
|
+
readonly phosphorusMilligrams?: number | undefined;
|
|
439
|
+
readonly iodineMicrograms?: number | undefined;
|
|
440
|
+
readonly chromiumMicrograms?: number | undefined;
|
|
441
|
+
readonly copperMilligrams?: number | undefined;
|
|
442
|
+
readonly manganeseMilligrams?: number | undefined;
|
|
443
|
+
readonly molybdenumMicrograms?: number | undefined;
|
|
444
|
+
readonly seleniumMicrograms?: number | undefined;
|
|
445
|
+
readonly chlorideMilligrams?: number | undefined;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
export interface NutritionEntry {
|
|
449
|
+
readonly start: Date;
|
|
450
|
+
readonly end: Date;
|
|
451
|
+
readonly name?: string | undefined;
|
|
452
|
+
readonly nutrients: Nutrients;
|
|
453
|
+
readonly recordId?: string | undefined;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* An error carried as a value rather than thrown, inside a sync result. The same shape the
|
|
458
|
+
* bridge rejects a promise with.
|
|
459
|
+
*/
|
|
460
|
+
export interface TerraErrorPayload {
|
|
461
|
+
readonly code: string;
|
|
462
|
+
readonly retryable: boolean;
|
|
463
|
+
readonly message: string;
|
|
464
|
+
readonly source?: Source | undefined;
|
|
465
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/** Available on ios only. */
|
|
469
|
+
export interface PlannedWorkout {
|
|
470
|
+
readonly id: string;
|
|
471
|
+
readonly plannedOn: string;
|
|
472
|
+
readonly activity: WorkoutActivity;
|
|
473
|
+
readonly title?: string | undefined;
|
|
474
|
+
readonly completedAt?: Date | undefined;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* The flat object both SDKs already emit: `at`, `event`, and whatever keys that kind carries.
|
|
479
|
+
* Carried through unchanged rather than reshaped, because reshaping it would be a hand-written
|
|
480
|
+
* second contract on each platform that no vector could pin - and the encoding it would be
|
|
481
|
+
* translating is one DiagnosticsWire and Apple's Encodable already agree on, and that
|
|
482
|
+
* EventPrivacyTest already guards against carrying a health value.
|
|
483
|
+
*/
|
|
484
|
+
export type TerraEvent = Record<string, unknown>;
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* The redacted report, carried as the wire object DiagnosticsWire.report and Apple's
|
|
488
|
+
* SupportReport.json already produce.
|
|
489
|
+
*/
|
|
490
|
+
export interface SupportReport {
|
|
491
|
+
readonly sdkVersion: string;
|
|
492
|
+
readonly generatedAt: Date;
|
|
493
|
+
readonly state: DiagnosticsState;
|
|
494
|
+
readonly lastDelivery?: Date | undefined;
|
|
495
|
+
readonly isConnected: boolean;
|
|
496
|
+
readonly requestedCategories: readonly string[];
|
|
497
|
+
readonly requestedWrites: readonly string[];
|
|
498
|
+
readonly requestedWorkouts: readonly string[];
|
|
499
|
+
readonly recentEvents: readonly TerraEvent[];
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* What the JS side needs to know about the native client it is attaching to. bootstrapped
|
|
504
|
+
* false is a host setup bug, and the wrapper says so with the exact line to add.
|
|
505
|
+
*/
|
|
506
|
+
export interface BootstrapState {
|
|
507
|
+
readonly bootstrapped: boolean;
|
|
508
|
+
readonly devId?: string | undefined;
|
|
509
|
+
readonly platform: string;
|
|
510
|
+
readonly sdkVersion: string;
|
|
511
|
+
readonly backgroundRegistered: boolean;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* The broker asking JS for a link token. Answered by token.resolve or token.reject with the
|
|
516
|
+
* same requestId.
|
|
517
|
+
*/
|
|
518
|
+
export interface TokenRequest {
|
|
519
|
+
readonly requestId: string;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/** No request fields, or no response value. */
|
|
523
|
+
export type Empty = Record<string, never>;
|
|
524
|
+
|
|
525
|
+
export interface SourceRequest {
|
|
526
|
+
readonly source?: Source | undefined;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export interface RangeRequest {
|
|
530
|
+
readonly range: TimeRange;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
export interface CategoryRequest {
|
|
534
|
+
readonly category: DataCategory;
|
|
535
|
+
readonly source?: Source | undefined;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
export interface RecordIdRequest {
|
|
539
|
+
readonly id: string;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
export interface ConnectRequest {
|
|
543
|
+
readonly source?: Source | undefined;
|
|
544
|
+
readonly endUser: EndUser;
|
|
545
|
+
/**
|
|
546
|
+
* A grant already in hand, from a QR code or a deep link. Absent means the token provider is
|
|
547
|
+
* asked.
|
|
548
|
+
*/
|
|
549
|
+
readonly token?: string | undefined;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
export interface PermissionRequest {
|
|
553
|
+
readonly read: readonly DataCategory[];
|
|
554
|
+
readonly write: readonly DataCategory[];
|
|
555
|
+
readonly workouts: readonly WorkoutScope[];
|
|
556
|
+
readonly source?: Source | undefined;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* What the sheet granted. Android answers with the access this call obtained; HealthKit will
|
|
561
|
+
* not report read grants, so Apple answers nothing at all.
|
|
562
|
+
*/
|
|
563
|
+
export interface PermissionGrant {
|
|
564
|
+
/** Available on android only. */
|
|
565
|
+
readonly granted?: HealthAccess | undefined;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export interface TokenResolveRequest {
|
|
569
|
+
readonly requestId: string;
|
|
570
|
+
readonly token: string;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
export interface TokenRejectRequest {
|
|
574
|
+
readonly requestId: string;
|
|
575
|
+
readonly message: string;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
export interface TokenProviderRequest {
|
|
579
|
+
readonly present: boolean;
|
|
580
|
+
readonly timeoutMs: number;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/** Available on ios only. */
|
|
584
|
+
export interface MarkCompleteRequest {
|
|
585
|
+
readonly id: string;
|
|
586
|
+
readonly at?: Date | undefined;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
export interface BoolResult {
|
|
590
|
+
readonly value: boolean;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
export interface StatusResult {
|
|
594
|
+
readonly status: PermissionStatus;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/** Available on android only. */
|
|
598
|
+
export interface StatusesResult {
|
|
599
|
+
readonly statuses: Partial<Record<DataCategory, PermissionStatus>>;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
export interface RecordIdList {
|
|
603
|
+
readonly ids: readonly string[];
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
export interface ConnectionList {
|
|
607
|
+
readonly connections: readonly Connection[];
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
export interface HeartRateList {
|
|
611
|
+
readonly samples: readonly HeartRateSample[];
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export interface StepCountList {
|
|
615
|
+
readonly samples: readonly StepCount[];
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
export interface SleepSegmentList {
|
|
619
|
+
readonly samples: readonly SleepSegment[];
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
export interface WorkoutList {
|
|
623
|
+
readonly samples: readonly Workout[];
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/** Available on ios only. */
|
|
627
|
+
export interface PlannedWorkoutList {
|
|
628
|
+
readonly workouts: readonly PlannedWorkout[];
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* Once authorized, every sync run keeps the Watch schedule in step with Terra.
|
|
633
|
+
*
|
|
634
|
+
* Available on ios only.
|
|
635
|
+
*/
|
|
636
|
+
export interface WorkoutScheduling {
|
|
637
|
+
readonly status: WorkoutSchedulingStatus;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
export interface LastDeliveryResult {
|
|
641
|
+
readonly at?: Date | undefined;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
export interface HeartRateEntryList {
|
|
645
|
+
readonly entries: readonly HeartRateEntry[];
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
export interface BodyEntryList {
|
|
649
|
+
readonly entries: readonly BodyEntry[];
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
export interface StepEntryList {
|
|
653
|
+
readonly entries: readonly StepEntry[];
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
export interface SleepEntryList {
|
|
657
|
+
readonly entries: readonly SleepEntry[];
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
export interface WorkoutEntryList {
|
|
661
|
+
readonly entries: readonly WorkoutEntry[];
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
export interface NutritionEntryList {
|
|
665
|
+
readonly entries: readonly NutritionEntry[];
|
|
666
|
+
}
|
|
667
|
+
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The package's public surface.
|
|
3
|
+
*
|
|
4
|
+
* Everything re-exported from `./generated` comes out of `surface/terra-surface.json`. The
|
|
5
|
+
* hand-written members are shapes rather than vocabulary - `Terra`, `TerraError`, `EndUser` and
|
|
6
|
+
* `createTerra` - and none of them names a data type, an op or a code of its own.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const terra = createTerra({ tokenProvider: () => api.terraToken() });
|
|
10
|
+
* await terra.connect("health", EndUser.reference(user.id));
|
|
11
|
+
* await terra.permissions.request({ read: ["body"] });
|
|
12
|
+
* const hr = await terra.body.heartRate({ kind: "lastHours", hours: 1 });
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export { createTerra } from "./createTerra";
|
|
17
|
+
export { Terra } from "./Terra";
|
|
18
|
+
export type {
|
|
19
|
+
ActivityMetrics,
|
|
20
|
+
Background,
|
|
21
|
+
BodyMetrics,
|
|
22
|
+
DailyMetrics,
|
|
23
|
+
Diagnostics,
|
|
24
|
+
NativeBridge,
|
|
25
|
+
NutritionMetrics,
|
|
26
|
+
Permissions,
|
|
27
|
+
PlannedWorkouts,
|
|
28
|
+
SleepMetrics,
|
|
29
|
+
StreamListener,
|
|
30
|
+
TerraOptions,
|
|
31
|
+
TokenProvider,
|
|
32
|
+
Unsubscribe,
|
|
33
|
+
} from "./Terra";
|
|
34
|
+
|
|
35
|
+
export { TerraError } from "./TerraError";
|
|
36
|
+
export type { TerraErrorJSON } from "./TerraError";
|
|
37
|
+
|
|
38
|
+
export { EndUser } from "./EndUser";
|
|
39
|
+
|
|
40
|
+
export { GeneratedClient } from "./generated/client";
|
|
41
|
+
export type { Invoker } from "./generated/client";
|
|
42
|
+
|
|
43
|
+
export type { TerraErrorCode } from "./generated/errors";
|
|
44
|
+
export { retryableByCode, bridgeOwnedCodes, platformOnlyCodes } from "./generated/errors";
|
|
45
|
+
|
|
46
|
+
export type { OpId, StreamId } from "./generated/ops";
|
|
47
|
+
export { opIds, streamIds, availableOn, eventKinds } from "./generated/ops";
|
|
48
|
+
|
|
49
|
+
export type { StreamElements, StreamDelivery } from "./generated/streams";
|
|
50
|
+
export { decodeStreamDelivery, decodeStreamElement, streamAvailableOn } from "./generated/streams";
|
|
51
|
+
|
|
52
|
+
export * from "./generated/types";
|