@tryterra/react-native 0.0.0-stage → 2.2.1
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 +142 -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 +557 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/LauncherSlots.kt +41 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/ReadConversions.kt +250 -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 +300 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridgeStreamsImpl.kt +50 -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 +582 -0
- package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeTypes.kt +1569 -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 +396 -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 +82672 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.package.swiftinterface +2186 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.private.swiftinterface +2186 -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 +2163 -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 +6594 -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 +82672 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.package.swiftinterface +2186 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +2186 -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 +2163 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.abi.json +82672 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.package.swiftinterface +2186 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +2186 -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 +2163 -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 +6595 -0
- package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/x86_64/TerraSDK.yml +6513 -0
- package/ios/TerraBridgeCore/BridgeBootstrap.swift +89 -0
- package/ios/TerraBridgeCore/BridgeHost.swift +13 -0
- package/ios/TerraBridgeCore/Conversions+Reads.swift +259 -0
- package/ios/TerraBridgeCore/Conversions.swift +594 -0
- package/ios/TerraBridgeCore/Generated/BridgeErrors.swift +179 -0
- package/ios/TerraBridgeCore/Generated/BridgeOps.swift +967 -0
- package/ios/TerraBridgeCore/Generated/BridgeTypes.swift +2050 -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 +318 -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 +223 -0
- package/lib/Terra.js +336 -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 +128 -0
- package/lib/generated/client.js +256 -0
- package/lib/generated/codecs.d.ts +219 -0
- package/lib/generated/codecs.js +2066 -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 +161 -0
- package/lib/generated/streams.d.ts +23 -0
- package/lib/generated/streams.js +58 -0
- package/lib/generated/types.d.ts +794 -0
- package/lib/generated/types.js +224 -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 +592 -0
- package/src/TerraError.ts +116 -0
- package/src/createTerra.ts +18 -0
- package/src/generated/client.ts +315 -0
- package/src/generated/codecs.ts +1989 -0
- package/src/generated/errors.ts +113 -0
- package/src/generated/ops.ts +233 -0
- package/src/generated/streams.ts +74 -0
- package/src/generated/types.ts +1222 -0
- package/src/index.ts +54 -0
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
/** Every code a rejected op can carry. */
|
|
5
|
+
export type TerraErrorCode =
|
|
6
|
+
| "health_data_unavailable" // ios+android
|
|
7
|
+
| "not_connected" // ios+android
|
|
8
|
+
| "route_awaiting_converter" // ios+android
|
|
9
|
+
| "token_unavailable" // ios+android
|
|
10
|
+
| "token_rejected" // ios+android
|
|
11
|
+
| "token_provider_failed" // ios+android
|
|
12
|
+
| "user_limit_reached" // ios+android
|
|
13
|
+
| "upgrade_required" // ios+android
|
|
14
|
+
| "platform" // ios+android
|
|
15
|
+
| "device_key_unavailable" // ios+android
|
|
16
|
+
| "signature_rejected" // ios+android
|
|
17
|
+
| "clock_skewed" // ios+android
|
|
18
|
+
| "link_revoked" // ios+android
|
|
19
|
+
| "dev_id_mismatch" // ios+android
|
|
20
|
+
| "link_conflict" // ios+android
|
|
21
|
+
| "sync_already_running" // ios+android
|
|
22
|
+
| "link_already_running" // ios+android
|
|
23
|
+
| "store_locked" // ios+android
|
|
24
|
+
| "store_unreadable" // ios+android
|
|
25
|
+
| "deadline_exceeded" // ios+android
|
|
26
|
+
| "read_quota_exceeded" // android
|
|
27
|
+
| "permission_denied" // ios+android
|
|
28
|
+
| "authorization_not_determined" // ios+android
|
|
29
|
+
| "sample_not_found" // ios+android
|
|
30
|
+
| "rollback_incomplete" // ios+android
|
|
31
|
+
| "distance_not_attributable" // ios+android
|
|
32
|
+
| "blood_pressure_incomplete" // ios+android
|
|
33
|
+
| "authorization_unavailable_in_extension" // ios+android
|
|
34
|
+
| "planned_workout_unnamed" // ios
|
|
35
|
+
| "network.transport" // ios+android
|
|
36
|
+
| "network.throttled" // ios+android
|
|
37
|
+
| "network.server_error" // ios+android
|
|
38
|
+
| "network.malformed_response" // ios+android
|
|
39
|
+
| "network.offline" // ios
|
|
40
|
+
| "network.timed_out" // ios
|
|
41
|
+
| "bridge.not_bootstrapped" // bridge
|
|
42
|
+
| "bridge.unsupported_on_platform" // bridge
|
|
43
|
+
| "bridge.no_activity" // bridge
|
|
44
|
+
| "bridge.permission_sheet_unavailable" // bridge
|
|
45
|
+
| "bridge.token_timeout" // bridge
|
|
46
|
+
| "bridge.invalid_payload"; // bridge
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Whether retrying the same call could succeed.
|
|
50
|
+
*
|
|
51
|
+
* `'carried'` means the answer depends on the instance, so the rejection's own `retryable` is
|
|
52
|
+
* the one to read. Only `network.server_error` is carried today.
|
|
53
|
+
*/
|
|
54
|
+
export const retryableByCode: Readonly<Record<TerraErrorCode, boolean | 'carried'>> = {
|
|
55
|
+
"health_data_unavailable": false,
|
|
56
|
+
"not_connected": false,
|
|
57
|
+
"route_awaiting_converter": false,
|
|
58
|
+
"token_unavailable": false,
|
|
59
|
+
"token_rejected": false,
|
|
60
|
+
"token_provider_failed": false,
|
|
61
|
+
"user_limit_reached": false,
|
|
62
|
+
"upgrade_required": false,
|
|
63
|
+
"platform": false,
|
|
64
|
+
"device_key_unavailable": false,
|
|
65
|
+
"signature_rejected": false,
|
|
66
|
+
"clock_skewed": false,
|
|
67
|
+
"link_revoked": false,
|
|
68
|
+
"dev_id_mismatch": false,
|
|
69
|
+
"link_conflict": true,
|
|
70
|
+
"sync_already_running": false,
|
|
71
|
+
"link_already_running": false,
|
|
72
|
+
"store_locked": true,
|
|
73
|
+
"store_unreadable": false,
|
|
74
|
+
"deadline_exceeded": true,
|
|
75
|
+
"read_quota_exceeded": true,
|
|
76
|
+
"permission_denied": false,
|
|
77
|
+
"authorization_not_determined": false,
|
|
78
|
+
"sample_not_found": false,
|
|
79
|
+
"rollback_incomplete": false,
|
|
80
|
+
"distance_not_attributable": false,
|
|
81
|
+
"blood_pressure_incomplete": false,
|
|
82
|
+
"authorization_unavailable_in_extension": false,
|
|
83
|
+
"planned_workout_unnamed": false,
|
|
84
|
+
"network.transport": true,
|
|
85
|
+
"network.throttled": true,
|
|
86
|
+
"network.server_error": "carried",
|
|
87
|
+
"network.malformed_response": false,
|
|
88
|
+
"network.offline": true,
|
|
89
|
+
"network.timed_out": true,
|
|
90
|
+
"bridge.not_bootstrapped": false,
|
|
91
|
+
"bridge.unsupported_on_platform": false,
|
|
92
|
+
"bridge.no_activity": true,
|
|
93
|
+
"bridge.permission_sheet_unavailable": true,
|
|
94
|
+
"bridge.token_timeout": false,
|
|
95
|
+
"bridge.invalid_payload": false,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/** Codes no native SDK raises. Their cause is always the host's setup or the bridge's own state. */
|
|
99
|
+
export const bridgeOwnedCodes: readonly TerraErrorCode[] = [
|
|
100
|
+
"bridge.not_bootstrapped",
|
|
101
|
+
"bridge.unsupported_on_platform",
|
|
102
|
+
"bridge.no_activity",
|
|
103
|
+
"bridge.permission_sheet_unavailable",
|
|
104
|
+
"bridge.token_timeout",
|
|
105
|
+
"bridge.invalid_payload",
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
/** Codes only one platform can raise, so that a caller can narrow rather than discover. */
|
|
109
|
+
export const platformOnlyCodes: Readonly<Record<string, readonly TerraErrorCode[]>> = {
|
|
110
|
+
ios: ["planned_workout_unnamed", "network.offline", "network.timed_out"],
|
|
111
|
+
android: ["read_quota_exceeded", "bridge.no_activity", "bridge.permission_sheet_unavailable"],
|
|
112
|
+
};
|
|
113
|
+
|
|
@@ -0,0 +1,233 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* The op table: the strings that travel, and where each one is implemented.
|
|
6
|
+
*
|
|
7
|
+
* `availableOn` is read by the availability test and by the facade, which is what makes an op
|
|
8
|
+
* missing from a platform a typed absence rather than a runtime surprise.
|
|
9
|
+
*/
|
|
10
|
+
export type OpId =
|
|
11
|
+
| "client.attach"
|
|
12
|
+
| "client.connect"
|
|
13
|
+
| "client.connections"
|
|
14
|
+
| "client.availability"
|
|
15
|
+
| "client.disconnect"
|
|
16
|
+
| "token.setProviderPresent"
|
|
17
|
+
| "token.resolve"
|
|
18
|
+
| "token.reject"
|
|
19
|
+
| "permissions.request"
|
|
20
|
+
| "permissions.status"
|
|
21
|
+
| "permissions.writeStatus"
|
|
22
|
+
| "permissions.requested"
|
|
23
|
+
| "permissions.statuses"
|
|
24
|
+
| "permissions.backgroundReadStatus"
|
|
25
|
+
| "permissions.historyReadStatus"
|
|
26
|
+
| "diagnostics.state"
|
|
27
|
+
| "diagnostics.lastDelivery"
|
|
28
|
+
| "diagnostics.report"
|
|
29
|
+
| "diagnostics.send"
|
|
30
|
+
| "background.isRegistered"
|
|
31
|
+
| "background.cancel"
|
|
32
|
+
| "body.heartRate"
|
|
33
|
+
| "body.restingHeartRate"
|
|
34
|
+
| "body.readings"
|
|
35
|
+
| "body.logHeartRate"
|
|
36
|
+
| "body.log"
|
|
37
|
+
| "body.delete"
|
|
38
|
+
| "daily.steps"
|
|
39
|
+
| "daily.totals"
|
|
40
|
+
| "daily.intraday"
|
|
41
|
+
| "daily.log"
|
|
42
|
+
| "daily.delete"
|
|
43
|
+
| "sleep.segments"
|
|
44
|
+
| "sleep.log"
|
|
45
|
+
| "sleep.delete"
|
|
46
|
+
| "activity.workouts"
|
|
47
|
+
| "activity.routes"
|
|
48
|
+
| "activity.intensity"
|
|
49
|
+
| "activity.log"
|
|
50
|
+
| "activity.delete"
|
|
51
|
+
| "nutrition.quantities"
|
|
52
|
+
| "nutrition.log"
|
|
53
|
+
| "nutrition.delete"
|
|
54
|
+
| "nutrition.hydration"
|
|
55
|
+
| "menstruation.flow"
|
|
56
|
+
| "menstruation.events"
|
|
57
|
+
| "athlete.profile"
|
|
58
|
+
| "plannedWorkouts.planned"
|
|
59
|
+
| "plannedWorkouts.markComplete"
|
|
60
|
+
| "plannedWorkouts.delete"
|
|
61
|
+
| "plannedWorkouts.schedulingStatus"
|
|
62
|
+
| "plannedWorkouts.requestScheduling"
|
|
63
|
+
;
|
|
64
|
+
|
|
65
|
+
export const opIds: readonly OpId[] = [
|
|
66
|
+
"client.attach",
|
|
67
|
+
"client.connect",
|
|
68
|
+
"client.connections",
|
|
69
|
+
"client.availability",
|
|
70
|
+
"client.disconnect",
|
|
71
|
+
"token.setProviderPresent",
|
|
72
|
+
"token.resolve",
|
|
73
|
+
"token.reject",
|
|
74
|
+
"permissions.request",
|
|
75
|
+
"permissions.status",
|
|
76
|
+
"permissions.writeStatus",
|
|
77
|
+
"permissions.requested",
|
|
78
|
+
"permissions.statuses",
|
|
79
|
+
"permissions.backgroundReadStatus",
|
|
80
|
+
"permissions.historyReadStatus",
|
|
81
|
+
"diagnostics.state",
|
|
82
|
+
"diagnostics.lastDelivery",
|
|
83
|
+
"diagnostics.report",
|
|
84
|
+
"diagnostics.send",
|
|
85
|
+
"background.isRegistered",
|
|
86
|
+
"background.cancel",
|
|
87
|
+
"body.heartRate",
|
|
88
|
+
"body.restingHeartRate",
|
|
89
|
+
"body.readings",
|
|
90
|
+
"body.logHeartRate",
|
|
91
|
+
"body.log",
|
|
92
|
+
"body.delete",
|
|
93
|
+
"daily.steps",
|
|
94
|
+
"daily.totals",
|
|
95
|
+
"daily.intraday",
|
|
96
|
+
"daily.log",
|
|
97
|
+
"daily.delete",
|
|
98
|
+
"sleep.segments",
|
|
99
|
+
"sleep.log",
|
|
100
|
+
"sleep.delete",
|
|
101
|
+
"activity.workouts",
|
|
102
|
+
"activity.routes",
|
|
103
|
+
"activity.intensity",
|
|
104
|
+
"activity.log",
|
|
105
|
+
"activity.delete",
|
|
106
|
+
"nutrition.quantities",
|
|
107
|
+
"nutrition.log",
|
|
108
|
+
"nutrition.delete",
|
|
109
|
+
"nutrition.hydration",
|
|
110
|
+
"menstruation.flow",
|
|
111
|
+
"menstruation.events",
|
|
112
|
+
"athlete.profile",
|
|
113
|
+
"plannedWorkouts.planned",
|
|
114
|
+
"plannedWorkouts.markComplete",
|
|
115
|
+
"plannedWorkouts.delete",
|
|
116
|
+
"plannedWorkouts.schedulingStatus",
|
|
117
|
+
"plannedWorkouts.requestScheduling",
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
export const availableOn: Readonly<Record<OpId, readonly string[]>> = {
|
|
121
|
+
"client.attach": ["ios", "android"],
|
|
122
|
+
"client.connect": ["ios", "android"],
|
|
123
|
+
"client.connections": ["ios", "android"],
|
|
124
|
+
"client.availability": ["ios", "android"],
|
|
125
|
+
"client.disconnect": ["ios", "android"],
|
|
126
|
+
"token.setProviderPresent": ["ios", "android"],
|
|
127
|
+
"token.resolve": ["ios", "android"],
|
|
128
|
+
"token.reject": ["ios", "android"],
|
|
129
|
+
"permissions.request": ["ios", "android"],
|
|
130
|
+
"permissions.status": ["ios", "android"],
|
|
131
|
+
"permissions.writeStatus": ["ios", "android"],
|
|
132
|
+
"permissions.requested": ["ios", "android"],
|
|
133
|
+
"permissions.statuses": ["android"],
|
|
134
|
+
"permissions.backgroundReadStatus": ["android"],
|
|
135
|
+
"permissions.historyReadStatus": ["android"],
|
|
136
|
+
"diagnostics.state": ["ios", "android"],
|
|
137
|
+
"diagnostics.lastDelivery": ["ios", "android"],
|
|
138
|
+
"diagnostics.report": ["ios", "android"],
|
|
139
|
+
"diagnostics.send": ["ios", "android"],
|
|
140
|
+
"background.isRegistered": ["ios", "android"],
|
|
141
|
+
"background.cancel": ["android"],
|
|
142
|
+
"body.heartRate": ["ios", "android"],
|
|
143
|
+
"body.restingHeartRate": ["ios", "android"],
|
|
144
|
+
"body.readings": ["ios", "android"],
|
|
145
|
+
"body.logHeartRate": ["ios", "android"],
|
|
146
|
+
"body.log": ["ios", "android"],
|
|
147
|
+
"body.delete": ["ios", "android"],
|
|
148
|
+
"daily.steps": ["ios", "android"],
|
|
149
|
+
"daily.totals": ["ios", "android"],
|
|
150
|
+
"daily.intraday": ["ios", "android"],
|
|
151
|
+
"daily.log": ["ios", "android"],
|
|
152
|
+
"daily.delete": ["ios", "android"],
|
|
153
|
+
"sleep.segments": ["ios", "android"],
|
|
154
|
+
"sleep.log": ["ios", "android"],
|
|
155
|
+
"sleep.delete": ["ios", "android"],
|
|
156
|
+
"activity.workouts": ["ios", "android"],
|
|
157
|
+
"activity.routes": ["ios", "android"],
|
|
158
|
+
"activity.intensity": ["ios", "android"],
|
|
159
|
+
"activity.log": ["ios", "android"],
|
|
160
|
+
"activity.delete": ["ios", "android"],
|
|
161
|
+
"nutrition.quantities": ["ios", "android"],
|
|
162
|
+
"nutrition.log": ["ios", "android"],
|
|
163
|
+
"nutrition.delete": ["ios", "android"],
|
|
164
|
+
"nutrition.hydration": ["ios", "android"],
|
|
165
|
+
"menstruation.flow": ["ios", "android"],
|
|
166
|
+
"menstruation.events": ["ios", "android"],
|
|
167
|
+
"athlete.profile": ["ios"],
|
|
168
|
+
"plannedWorkouts.planned": ["ios"],
|
|
169
|
+
"plannedWorkouts.markComplete": ["ios"],
|
|
170
|
+
"plannedWorkouts.delete": ["ios"],
|
|
171
|
+
"plannedWorkouts.schedulingStatus": ["ios"],
|
|
172
|
+
"plannedWorkouts.requestScheduling": ["ios"],
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
export type StreamId =
|
|
176
|
+
| "diagnostics.events"
|
|
177
|
+
| "body.changes"
|
|
178
|
+
| "daily.changes"
|
|
179
|
+
| "sleep.changes"
|
|
180
|
+
| "activity.changes"
|
|
181
|
+
| "bridge.tokenRequest"
|
|
182
|
+
;
|
|
183
|
+
|
|
184
|
+
export const streamIds: readonly StreamId[] = [
|
|
185
|
+
"diagnostics.events",
|
|
186
|
+
"body.changes",
|
|
187
|
+
"daily.changes",
|
|
188
|
+
"sleep.changes",
|
|
189
|
+
"activity.changes",
|
|
190
|
+
"bridge.tokenRequest",
|
|
191
|
+
];
|
|
192
|
+
|
|
193
|
+
/** Event kinds, and the platforms that can emit each. */
|
|
194
|
+
export const eventKinds: Readonly<Record<string, readonly string[]>> = {
|
|
195
|
+
"connected": ["ios", "android"],
|
|
196
|
+
"disconnected": ["ios", "android"],
|
|
197
|
+
"linkRevoked": ["ios", "android"],
|
|
198
|
+
"permissionResult": ["ios", "android"],
|
|
199
|
+
"backgroundWake": ["ios", "android"],
|
|
200
|
+
"backgroundRefreshUnscheduled": ["ios", "android"],
|
|
201
|
+
"uploadBatch": ["ios", "android"],
|
|
202
|
+
"uploadFailed": ["ios", "android"],
|
|
203
|
+
"retryScheduled": ["ios", "android"],
|
|
204
|
+
"backfillProgress": ["ios", "android"],
|
|
205
|
+
"serverBackfillQueued": ["ios", "android"],
|
|
206
|
+
"serverBackfillCompleted": ["ios", "android"],
|
|
207
|
+
"serverBackfillAbandoned": ["ios", "android"],
|
|
208
|
+
"serverBackfillRefused": ["ios", "android"],
|
|
209
|
+
"serverBackfillUnsupported": ["ios", "android"],
|
|
210
|
+
"serverBackfillPollFailed": ["ios", "android"],
|
|
211
|
+
"backgroundObservationUnavailable": ["ios", "android"],
|
|
212
|
+
"observationDropped": ["ios", "android"],
|
|
213
|
+
"samplesLogged": ["ios", "android"],
|
|
214
|
+
"sampleDeleted": ["ios", "android"],
|
|
215
|
+
"tokenRefreshed": ["ios", "android"],
|
|
216
|
+
"deviceKeyRevokeAnswered": ["ios", "android"],
|
|
217
|
+
"deviceKeyRevokeFailed": ["ios", "android"],
|
|
218
|
+
"diagnosticsReported": ["ios", "android"],
|
|
219
|
+
"backgroundWakeRefused": ["ios"],
|
|
220
|
+
"dailyDayTooLarge": ["ios"],
|
|
221
|
+
"plannedWorkoutUpdated": ["ios"],
|
|
222
|
+
"plannedWorkoutsScheduled": ["ios"],
|
|
223
|
+
"plannedWorkoutScheduleFailed": ["ios"],
|
|
224
|
+
"sleepWakeDateTooLarge": ["ios"],
|
|
225
|
+
"backgroundWorkGap": ["android"],
|
|
226
|
+
"backgroundWorkReset": ["android"],
|
|
227
|
+
"changeTokenExpired": ["android"],
|
|
228
|
+
"historyReadUnavailable": ["android"],
|
|
229
|
+
"processExitDecided": ["android"],
|
|
230
|
+
"readQuotaExceeded": ["android"],
|
|
231
|
+
"routeConsentRequired": ["android"],
|
|
232
|
+
};
|
|
233
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
import type { HealthChange, StreamMessage, TerraEvent, TokenRequest } from "./types";
|
|
5
|
+
import { decodeStreamMessage, decodeHealthChange, encodeHealthChange, decodeTerraEvent, encodeTerraEvent, decodeTokenRequest, encodeTokenRequest } from "./codecs";
|
|
6
|
+
import type { StreamId } from "./ops";
|
|
7
|
+
|
|
8
|
+
/** The element each stream delivers inside a data message. */
|
|
9
|
+
export interface StreamElements {
|
|
10
|
+
"diagnostics.events": TerraEvent;
|
|
11
|
+
"body.changes": HealthChange;
|
|
12
|
+
"daily.changes": HealthChange;
|
|
13
|
+
"sleep.changes": HealthChange;
|
|
14
|
+
"activity.changes": HealthChange;
|
|
15
|
+
"bridge.tokenRequest": TokenRequest;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Where each stream is published. */
|
|
19
|
+
export const streamAvailableOn: Readonly<Record<StreamId, readonly string[]>> = {
|
|
20
|
+
"diagnostics.events": ["ios", "android"],
|
|
21
|
+
"body.changes": ["ios", "android"],
|
|
22
|
+
"daily.changes": ["ios", "android"],
|
|
23
|
+
"sleep.changes": ["ios", "android"],
|
|
24
|
+
"activity.changes": ["ios", "android"],
|
|
25
|
+
"bridge.tokenRequest": ["ios", "android"],
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** One delivered message, with a data message's element typed as its stream's own. */
|
|
29
|
+
export type StreamDelivery<S extends StreamId> =
|
|
30
|
+
| { kind: "data"; element: StreamElements[S] }
|
|
31
|
+
| Exclude<StreamMessage, { kind: "data" }>;
|
|
32
|
+
|
|
33
|
+
export function decodeStreamElement<S extends StreamId>(stream: S, raw: unknown): StreamElements[S] {
|
|
34
|
+
switch (stream as StreamId) {
|
|
35
|
+
case "diagnostics.events":
|
|
36
|
+
return decodeTerraEvent(raw, "diagnostics.events") as StreamElements[S];
|
|
37
|
+
case "body.changes":
|
|
38
|
+
return decodeHealthChange(raw, "body.changes") as StreamElements[S];
|
|
39
|
+
case "daily.changes":
|
|
40
|
+
return decodeHealthChange(raw, "daily.changes") as StreamElements[S];
|
|
41
|
+
case "sleep.changes":
|
|
42
|
+
return decodeHealthChange(raw, "sleep.changes") as StreamElements[S];
|
|
43
|
+
case "activity.changes":
|
|
44
|
+
return decodeHealthChange(raw, "activity.changes") as StreamElements[S];
|
|
45
|
+
case "bridge.tokenRequest":
|
|
46
|
+
return decodeTokenRequest(raw, "bridge.tokenRequest") as StreamElements[S];
|
|
47
|
+
}
|
|
48
|
+
throw new TypeError(`unknown stream ${String(stream)}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function encodeStreamElement<S extends StreamId>(stream: S, value: StreamElements[S]): Record<string, unknown> {
|
|
52
|
+
switch (stream as StreamId) {
|
|
53
|
+
case "diagnostics.events":
|
|
54
|
+
return encodeTerraEvent(value as TerraEvent);
|
|
55
|
+
case "body.changes":
|
|
56
|
+
return encodeHealthChange(value as HealthChange);
|
|
57
|
+
case "daily.changes":
|
|
58
|
+
return encodeHealthChange(value as HealthChange);
|
|
59
|
+
case "sleep.changes":
|
|
60
|
+
return encodeHealthChange(value as HealthChange);
|
|
61
|
+
case "activity.changes":
|
|
62
|
+
return encodeHealthChange(value as HealthChange);
|
|
63
|
+
case "bridge.tokenRequest":
|
|
64
|
+
return encodeTokenRequest(value as TokenRequest);
|
|
65
|
+
}
|
|
66
|
+
throw new TypeError(`unknown stream ${String(stream)}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function decodeStreamDelivery<S extends StreamId>(stream: S, raw: unknown): StreamDelivery<S> {
|
|
70
|
+
const message = decodeStreamMessage(raw, "StreamMessage");
|
|
71
|
+
if (message.kind !== "data") return message;
|
|
72
|
+
return { kind: "data", element: decodeStreamElement(stream, message.element) };
|
|
73
|
+
}
|
|
74
|
+
|