@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.
Files changed (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -2
  3. package/TerraReactNative.podspec +48 -0
  4. package/android/build.gradle +87 -0
  5. package/android/src/bridgeCore/kotlin/README.md +1 -0
  6. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/BridgeBootstrap.kt +133 -0
  7. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/BridgeHost.kt +32 -0
  8. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/Conversions.kt +468 -0
  9. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/LauncherSlots.kt +41 -0
  10. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/Rejections.kt +150 -0
  11. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/StreamRegistry.kt +77 -0
  12. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridge.kt +86 -0
  13. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridgeOpsImpl.kt +258 -0
  14. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TerraBridgeStreamsImpl.kt +52 -0
  15. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/TokenBroker.kt +198 -0
  16. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeErrors.kt +217 -0
  17. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeOps.kt +493 -0
  18. package/android/src/bridgeCore/kotlin/co/tryterra/sdk/bridge/generated/BridgeTypes.kt +897 -0
  19. package/android/src/healthConnectOnly/kotlin/co/tryterra/sdk/reactnative/TerraStores.kt +11 -0
  20. package/android/src/main/AndroidManifest.xml +24 -0
  21. package/android/src/main/java/co/tryterra/sdk/reactnative/TerraBridgeModule.kt +96 -0
  22. package/android/src/main/java/co/tryterra/sdk/reactnative/TerraReactNativePackage.kt +26 -0
  23. package/android/src/main/java/co/tryterra/sdk/reactnative/TerraStartup.kt +46 -0
  24. package/android/src/samsung/kotlin/co/tryterra/sdk/reactnative/TerraStores.kt +13 -0
  25. package/docs/availability.md +246 -0
  26. package/frameworks/TerraSDK.xcframework/Info.plist +48 -0
  27. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Info.plist +0 -0
  28. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.abi.json +81513 -0
  29. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.package.swiftinterface +2150 -0
  30. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.private.swiftinterface +2150 -0
  31. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  32. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios.swiftinterface +2127 -0
  33. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/PrivacyInfo.xcprivacy +96 -0
  34. package/frameworks/TerraSDK.xcframework/ios-arm64/TerraSDK.framework/TerraSDK +0 -0
  35. package/frameworks/TerraSDK.xcframework/ios-arm64/dSYMs/TerraSDK.framework.dSYM/Contents/Info.plist +20 -0
  36. package/frameworks/TerraSDK.xcframework/ios-arm64/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/DWARF/TerraSDK +0 -0
  37. package/frameworks/TerraSDK.xcframework/ios-arm64/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/TerraSDK.yml +6473 -0
  38. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Info.plist +0 -0
  39. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.abi.json +81513 -0
  40. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.package.swiftinterface +2150 -0
  41. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +2150 -0
  42. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  43. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/arm64-apple-ios-simulator.swiftinterface +2127 -0
  44. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.abi.json +81513 -0
  45. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.package.swiftinterface +2150 -0
  46. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +2150 -0
  47. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  48. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/Modules/TerraSDK.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +2127 -0
  49. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/PrivacyInfo.xcprivacy +96 -0
  50. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/TerraSDK +0 -0
  51. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/TerraSDK.framework/_CodeSignature/CodeResources +223 -0
  52. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Info.plist +20 -0
  53. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/DWARF/TerraSDK +0 -0
  54. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/aarch64/TerraSDK.yml +6474 -0
  55. package/frameworks/TerraSDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/TerraSDK.framework.dSYM/Contents/Resources/Relocations/x86_64/TerraSDK.yml +6392 -0
  56. package/ios/TerraBridgeCore/BridgeBootstrap.swift +89 -0
  57. package/ios/TerraBridgeCore/BridgeHost.swift +13 -0
  58. package/ios/TerraBridgeCore/Conversions.swift +467 -0
  59. package/ios/TerraBridgeCore/Generated/BridgeErrors.swift +179 -0
  60. package/ios/TerraBridgeCore/Generated/BridgeOps.swift +795 -0
  61. package/ios/TerraBridgeCore/Generated/BridgeTypes.swift +1317 -0
  62. package/ios/TerraBridgeCore/Locked.swift +15 -0
  63. package/ios/TerraBridgeCore/README.md +1 -0
  64. package/ios/TerraBridgeCore/Rejections.swift +130 -0
  65. package/ios/TerraBridgeCore/RuntimeAttachment.swift +60 -0
  66. package/ios/TerraBridgeCore/StreamRegistry.swift +59 -0
  67. package/ios/TerraBridgeCore/TerraBridge.swift +122 -0
  68. package/ios/TerraBridgeCore/TerraBridgeOpsImpl.swift +254 -0
  69. package/ios/TerraBridgeCore/TerraBridgeStreamsImpl.swift +60 -0
  70. package/ios/TerraBridgeCore/TokenBroker.swift +147 -0
  71. package/ios/TerraBridgeModule.mm +79 -0
  72. package/ios/TerraBridgeModuleImpl.swift +49 -0
  73. package/ios/TerraReactNative.swift +19 -0
  74. package/lib/EndUser.d.ts +12 -0
  75. package/lib/EndUser.js +13 -0
  76. package/lib/NativeTerraBridge.d.ts +23 -0
  77. package/lib/NativeTerraBridge.js +13 -0
  78. package/lib/Terra.d.ts +154 -0
  79. package/lib/Terra.js +280 -0
  80. package/lib/TerraError.d.ts +42 -0
  81. package/lib/TerraError.js +95 -0
  82. package/lib/createTerra.d.ts +8 -0
  83. package/lib/createTerra.js +19 -0
  84. package/lib/generated/client.d.ts +92 -0
  85. package/lib/generated/client.js +196 -0
  86. package/lib/generated/codecs.d.ts +135 -0
  87. package/lib/generated/codecs.js +1358 -0
  88. package/lib/generated/errors.d.ts +13 -0
  89. package/lib/generated/errors.js +68 -0
  90. package/lib/generated/ops.d.ts +13 -0
  91. package/lib/generated/ops.js +137 -0
  92. package/lib/generated/streams.d.ts +23 -0
  93. package/lib/generated/streams.js +58 -0
  94. package/lib/generated/types.d.ts +481 -0
  95. package/lib/generated/types.js +92 -0
  96. package/lib/index.d.ts +29 -0
  97. package/lib/index.js +55 -0
  98. package/package.json +71 -4
  99. package/src/EndUser.ts +15 -0
  100. package/src/NativeTerraBridge.ts +27 -0
  101. package/src/Terra.ts +462 -0
  102. package/src/TerraError.ts +116 -0
  103. package/src/createTerra.ts +18 -0
  104. package/src/generated/client.ts +243 -0
  105. package/src/generated/codecs.ts +1287 -0
  106. package/src/generated/errors.ts +113 -0
  107. package/src/generated/ops.ts +197 -0
  108. package/src/generated/streams.ts +74 -0
  109. package/src/generated/types.ts +667 -0
  110. package/src/index.ts +52 -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,197 @@
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.disconnect"
15
+ | "token.setProviderPresent"
16
+ | "token.resolve"
17
+ | "token.reject"
18
+ | "permissions.request"
19
+ | "permissions.status"
20
+ | "permissions.writeStatus"
21
+ | "permissions.requested"
22
+ | "permissions.statuses"
23
+ | "permissions.backgroundReadStatus"
24
+ | "permissions.historyReadStatus"
25
+ | "diagnostics.state"
26
+ | "diagnostics.lastDelivery"
27
+ | "diagnostics.report"
28
+ | "diagnostics.send"
29
+ | "background.isRegistered"
30
+ | "background.cancel"
31
+ | "body.heartRate"
32
+ | "body.logHeartRate"
33
+ | "body.log"
34
+ | "body.delete"
35
+ | "daily.steps"
36
+ | "daily.log"
37
+ | "daily.delete"
38
+ | "sleep.segments"
39
+ | "sleep.log"
40
+ | "sleep.delete"
41
+ | "activity.workouts"
42
+ | "activity.log"
43
+ | "activity.delete"
44
+ | "nutrition.log"
45
+ | "nutrition.delete"
46
+ | "plannedWorkouts.planned"
47
+ | "plannedWorkouts.markComplete"
48
+ | "plannedWorkouts.delete"
49
+ | "plannedWorkouts.schedulingStatus"
50
+ | "plannedWorkouts.requestScheduling"
51
+ ;
52
+
53
+ export const opIds: readonly OpId[] = [
54
+ "client.attach",
55
+ "client.connect",
56
+ "client.connections",
57
+ "client.disconnect",
58
+ "token.setProviderPresent",
59
+ "token.resolve",
60
+ "token.reject",
61
+ "permissions.request",
62
+ "permissions.status",
63
+ "permissions.writeStatus",
64
+ "permissions.requested",
65
+ "permissions.statuses",
66
+ "permissions.backgroundReadStatus",
67
+ "permissions.historyReadStatus",
68
+ "diagnostics.state",
69
+ "diagnostics.lastDelivery",
70
+ "diagnostics.report",
71
+ "diagnostics.send",
72
+ "background.isRegistered",
73
+ "background.cancel",
74
+ "body.heartRate",
75
+ "body.logHeartRate",
76
+ "body.log",
77
+ "body.delete",
78
+ "daily.steps",
79
+ "daily.log",
80
+ "daily.delete",
81
+ "sleep.segments",
82
+ "sleep.log",
83
+ "sleep.delete",
84
+ "activity.workouts",
85
+ "activity.log",
86
+ "activity.delete",
87
+ "nutrition.log",
88
+ "nutrition.delete",
89
+ "plannedWorkouts.planned",
90
+ "plannedWorkouts.markComplete",
91
+ "plannedWorkouts.delete",
92
+ "plannedWorkouts.schedulingStatus",
93
+ "plannedWorkouts.requestScheduling",
94
+ ];
95
+
96
+ export const availableOn: Readonly<Record<OpId, readonly string[]>> = {
97
+ "client.attach": ["ios", "android"],
98
+ "client.connect": ["ios", "android"],
99
+ "client.connections": ["ios", "android"],
100
+ "client.disconnect": ["ios", "android"],
101
+ "token.setProviderPresent": ["ios", "android"],
102
+ "token.resolve": ["ios", "android"],
103
+ "token.reject": ["ios", "android"],
104
+ "permissions.request": ["ios", "android"],
105
+ "permissions.status": ["ios", "android"],
106
+ "permissions.writeStatus": ["ios", "android"],
107
+ "permissions.requested": ["ios", "android"],
108
+ "permissions.statuses": ["android"],
109
+ "permissions.backgroundReadStatus": ["android"],
110
+ "permissions.historyReadStatus": ["android"],
111
+ "diagnostics.state": ["ios", "android"],
112
+ "diagnostics.lastDelivery": ["ios", "android"],
113
+ "diagnostics.report": ["ios", "android"],
114
+ "diagnostics.send": ["ios", "android"],
115
+ "background.isRegistered": ["ios", "android"],
116
+ "background.cancel": ["android"],
117
+ "body.heartRate": ["ios", "android"],
118
+ "body.logHeartRate": ["ios", "android"],
119
+ "body.log": ["ios", "android"],
120
+ "body.delete": ["ios", "android"],
121
+ "daily.steps": ["ios", "android"],
122
+ "daily.log": ["ios", "android"],
123
+ "daily.delete": ["ios", "android"],
124
+ "sleep.segments": ["ios", "android"],
125
+ "sleep.log": ["ios", "android"],
126
+ "sleep.delete": ["ios", "android"],
127
+ "activity.workouts": ["ios", "android"],
128
+ "activity.log": ["ios", "android"],
129
+ "activity.delete": ["ios", "android"],
130
+ "nutrition.log": ["ios", "android"],
131
+ "nutrition.delete": ["ios", "android"],
132
+ "plannedWorkouts.planned": ["ios"],
133
+ "plannedWorkouts.markComplete": ["ios"],
134
+ "plannedWorkouts.delete": ["ios"],
135
+ "plannedWorkouts.schedulingStatus": ["ios"],
136
+ "plannedWorkouts.requestScheduling": ["ios"],
137
+ };
138
+
139
+ export type StreamId =
140
+ | "diagnostics.events"
141
+ | "body.changes"
142
+ | "daily.changes"
143
+ | "sleep.changes"
144
+ | "activity.changes"
145
+ | "bridge.tokenRequest"
146
+ ;
147
+
148
+ export const streamIds: readonly StreamId[] = [
149
+ "diagnostics.events",
150
+ "body.changes",
151
+ "daily.changes",
152
+ "sleep.changes",
153
+ "activity.changes",
154
+ "bridge.tokenRequest",
155
+ ];
156
+
157
+ /** Event kinds, and the platforms that can emit each. */
158
+ export const eventKinds: Readonly<Record<string, readonly string[]>> = {
159
+ "connected": ["ios", "android"],
160
+ "disconnected": ["ios", "android"],
161
+ "linkRevoked": ["ios", "android"],
162
+ "permissionResult": ["ios", "android"],
163
+ "backgroundWake": ["ios", "android"],
164
+ "backgroundRefreshUnscheduled": ["ios", "android"],
165
+ "uploadBatch": ["ios", "android"],
166
+ "uploadFailed": ["ios", "android"],
167
+ "retryScheduled": ["ios", "android"],
168
+ "backfillProgress": ["ios", "android"],
169
+ "serverBackfillQueued": ["ios", "android"],
170
+ "serverBackfillCompleted": ["ios", "android"],
171
+ "serverBackfillAbandoned": ["ios", "android"],
172
+ "serverBackfillRefused": ["ios", "android"],
173
+ "serverBackfillUnsupported": ["ios", "android"],
174
+ "serverBackfillPollFailed": ["ios", "android"],
175
+ "backgroundObservationUnavailable": ["ios", "android"],
176
+ "observationDropped": ["ios", "android"],
177
+ "samplesLogged": ["ios", "android"],
178
+ "sampleDeleted": ["ios", "android"],
179
+ "tokenRefreshed": ["ios", "android"],
180
+ "deviceKeyRevokeAnswered": ["ios", "android"],
181
+ "deviceKeyRevokeFailed": ["ios", "android"],
182
+ "diagnosticsReported": ["ios", "android"],
183
+ "backgroundWakeRefused": ["ios"],
184
+ "dailyDayTooLarge": ["ios"],
185
+ "plannedWorkoutUpdated": ["ios"],
186
+ "plannedWorkoutsScheduled": ["ios"],
187
+ "plannedWorkoutScheduleFailed": ["ios"],
188
+ "sleepWakeDateTooLarge": ["ios"],
189
+ "backgroundWorkGap": ["android"],
190
+ "backgroundWorkReset": ["android"],
191
+ "changeTokenExpired": ["android"],
192
+ "historyReadUnavailable": ["android"],
193
+ "processExitDecided": ["android"],
194
+ "readQuotaExceeded": ["android"],
195
+ "routeConsentRequired": ["android"],
196
+ };
197
+
@@ -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
+