@clipin/convex-wearables 0.0.2 → 0.0.3
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/dist/client/index.d.ts +9 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +50 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/backfillJobs.d.ts +11 -11
- package/dist/component/connections.d.ts +9 -9
- package/dist/component/connections.d.ts.map +1 -1
- package/dist/component/connections.js +2 -0
- package/dist/component/connections.js.map +1 -1
- package/dist/component/dataPoints.d.ts +5 -5
- package/dist/component/events.d.ts +13 -13
- package/dist/component/garminBackfill.d.ts +2 -2
- package/dist/component/garminWebhooks.d.ts +2 -2
- package/dist/component/garminWebhooks.d.ts.map +1 -1
- package/dist/component/garminWebhooks.js +2 -0
- package/dist/component/garminWebhooks.js.map +1 -1
- package/dist/component/lifecycle.d.ts +1 -1
- package/dist/component/lifecycle.d.ts.map +1 -1
- package/dist/component/lifecycle.js +2 -0
- package/dist/component/lifecycle.js.map +1 -1
- package/dist/component/oauthStates.d.ts +3 -3
- package/dist/component/schema.d.ts +26 -26
- package/dist/component/sdkPush.d.ts +11 -11
- package/dist/component/summaries.d.ts +4 -4
- package/dist/component/syncJobs.d.ts +23 -23
- package/dist/component/syncWorkflow.d.ts +2 -2
- package/dist/test.d.ts +421 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +17 -0
- package/dist/test.js.map +1 -0
- package/package.json +12 -2
- package/src/client/_generated/_ignore.ts +2 -0
- package/src/client/index.test.ts +52 -0
- package/src/client/index.ts +784 -0
- package/src/client/types.ts +533 -0
- package/src/component/_generated/_ignore.ts +2 -0
- package/src/component/_generated/api.ts +16 -0
- package/src/component/_generated/component.ts +74 -0
- package/src/component/_generated/dataModel.ts +40 -0
- package/src/component/_generated/server.ts +48 -0
- package/src/component/backfillJobs.test.ts +47 -0
- package/src/component/backfillJobs.ts +245 -0
- package/src/component/connections.test.ts +297 -0
- package/src/component/connections.ts +329 -0
- package/src/component/convex.config.ts +7 -0
- package/src/component/dataPoints.test.ts +282 -0
- package/src/component/dataPoints.ts +305 -0
- package/src/component/dataSources.test.ts +247 -0
- package/src/component/dataSources.ts +109 -0
- package/src/component/events.test.ts +380 -0
- package/src/component/events.ts +288 -0
- package/src/component/garminBackfill.ts +343 -0
- package/src/component/garminWebhooks.test.ts +609 -0
- package/src/component/garminWebhooks.ts +656 -0
- package/src/component/httpHandlers.ts +153 -0
- package/src/component/lifecycle.test.ts +179 -0
- package/src/component/lifecycle.ts +87 -0
- package/src/component/menstrualCycles.ts +124 -0
- package/src/component/oauthActions.ts +261 -0
- package/src/component/oauthStates.test.ts +170 -0
- package/src/component/oauthStates.ts +85 -0
- package/src/component/providerSettings.ts +66 -0
- package/src/component/providers/additionalProviders.test.ts +401 -0
- package/src/component/providers/garmin.ts +1169 -0
- package/src/component/providers/oauth.test.ts +174 -0
- package/src/component/providers/oauth.ts +246 -0
- package/src/component/providers/polar.ts +220 -0
- package/src/component/providers/registry.ts +37 -0
- package/src/component/providers/strava.test.ts +195 -0
- package/src/component/providers/strava.ts +253 -0
- package/src/component/providers/suunto.ts +592 -0
- package/src/component/providers/types.ts +189 -0
- package/src/component/providers/whoop.ts +600 -0
- package/src/component/schema.ts +339 -0
- package/src/component/sdkPush.test.ts +367 -0
- package/src/component/sdkPush.ts +440 -0
- package/src/component/summaries.test.ts +201 -0
- package/src/component/summaries.ts +143 -0
- package/src/component/syncJobs.test.ts +254 -0
- package/src/component/syncJobs.ts +140 -0
- package/src/component/syncWorkflow.test.ts +87 -0
- package/src/component/syncWorkflow.ts +739 -0
- package/src/component/test.setup.ts +6 -0
- package/src/component/workflowManager.ts +19 -0
- package/src/test.ts +25 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-level types shared across all provider implementations.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// OAuth configuration per provider
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
export interface OAuthEndpoints {
|
|
10
|
+
authorizeUrl: string;
|
|
11
|
+
tokenUrl: string;
|
|
12
|
+
apiBaseUrl: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type AuthMethod = "body" | "basic";
|
|
16
|
+
|
|
17
|
+
export interface OAuthProviderConfig {
|
|
18
|
+
endpoints: OAuthEndpoints;
|
|
19
|
+
clientId: string;
|
|
20
|
+
clientSecret: string;
|
|
21
|
+
defaultScope: string;
|
|
22
|
+
usePkce: boolean;
|
|
23
|
+
authMethod: AuthMethod;
|
|
24
|
+
/** Extra query params on the authorize URL (e.g. Suunto subscription key). */
|
|
25
|
+
extraAuthorizeParams?: Record<string, string>;
|
|
26
|
+
/** Extra headers to attach to provider API requests. */
|
|
27
|
+
defaultHeaders?: Record<string, string>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Token types
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
|
|
34
|
+
export interface OAuthTokenResponse {
|
|
35
|
+
access_token: string;
|
|
36
|
+
refresh_token?: string;
|
|
37
|
+
expires_in?: number;
|
|
38
|
+
token_type?: string;
|
|
39
|
+
scope?: string;
|
|
40
|
+
x_user_id?: number;
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface ProviderUserInfo {
|
|
45
|
+
providerUserId: string | null;
|
|
46
|
+
username: string | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ProviderCredentials {
|
|
50
|
+
clientId: string;
|
|
51
|
+
clientSecret: string;
|
|
52
|
+
subscriptionKey?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Normalized workout / event data from providers
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
export interface NormalizedEvent {
|
|
60
|
+
category: "workout" | "sleep";
|
|
61
|
+
type?: string;
|
|
62
|
+
sourceName?: string;
|
|
63
|
+
deviceModel?: string;
|
|
64
|
+
softwareVersion?: string;
|
|
65
|
+
source?: string;
|
|
66
|
+
deviceType?: string;
|
|
67
|
+
originalSourceName?: string;
|
|
68
|
+
durationSeconds?: number;
|
|
69
|
+
startDatetime: number; // unix ms
|
|
70
|
+
endDatetime?: number; // unix ms
|
|
71
|
+
externalId?: string;
|
|
72
|
+
|
|
73
|
+
// Workout fields
|
|
74
|
+
heartRateMin?: number;
|
|
75
|
+
heartRateMax?: number;
|
|
76
|
+
heartRateAvg?: number;
|
|
77
|
+
energyBurned?: number;
|
|
78
|
+
distance?: number;
|
|
79
|
+
stepsCount?: number;
|
|
80
|
+
maxSpeed?: number;
|
|
81
|
+
maxWatts?: number;
|
|
82
|
+
movingTimeSeconds?: number;
|
|
83
|
+
totalElevationGain?: number;
|
|
84
|
+
averageSpeed?: number;
|
|
85
|
+
averageWatts?: number;
|
|
86
|
+
elevHigh?: number;
|
|
87
|
+
elevLow?: number;
|
|
88
|
+
|
|
89
|
+
// Sleep fields
|
|
90
|
+
sleepTotalDurationMinutes?: number;
|
|
91
|
+
sleepTimeInBedMinutes?: number;
|
|
92
|
+
sleepEfficiencyScore?: number;
|
|
93
|
+
sleepDeepMinutes?: number;
|
|
94
|
+
sleepRemMinutes?: number;
|
|
95
|
+
sleepLightMinutes?: number;
|
|
96
|
+
sleepAwakeMinutes?: number;
|
|
97
|
+
isNap?: boolean;
|
|
98
|
+
sleepStages?: { stage: string; startTime: number; endTime: number }[];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface NormalizedDataPoint {
|
|
102
|
+
seriesType: string;
|
|
103
|
+
recordedAt: number;
|
|
104
|
+
value: number;
|
|
105
|
+
externalId?: string;
|
|
106
|
+
deviceModel?: string;
|
|
107
|
+
softwareVersion?: string;
|
|
108
|
+
source?: string;
|
|
109
|
+
deviceType?: string;
|
|
110
|
+
originalSourceName?: string;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface NormalizedDailySummary {
|
|
114
|
+
date: string;
|
|
115
|
+
category: string;
|
|
116
|
+
totalSteps?: number;
|
|
117
|
+
totalCalories?: number;
|
|
118
|
+
activeCalories?: number;
|
|
119
|
+
activeMinutes?: number;
|
|
120
|
+
totalDistance?: number;
|
|
121
|
+
floorsClimbed?: number;
|
|
122
|
+
avgHeartRate?: number;
|
|
123
|
+
maxHeartRate?: number;
|
|
124
|
+
minHeartRate?: number;
|
|
125
|
+
sleepDurationMinutes?: number;
|
|
126
|
+
sleepEfficiency?: number;
|
|
127
|
+
deepSleepMinutes?: number;
|
|
128
|
+
remSleepMinutes?: number;
|
|
129
|
+
lightSleepMinutes?: number;
|
|
130
|
+
awakeDuringMinutes?: number;
|
|
131
|
+
timeInBedMinutes?: number;
|
|
132
|
+
hrvAvg?: number;
|
|
133
|
+
hrvRmssd?: number;
|
|
134
|
+
restingHeartRate?: number;
|
|
135
|
+
recoveryScore?: number;
|
|
136
|
+
weight?: number;
|
|
137
|
+
bodyFatPercentage?: number;
|
|
138
|
+
bodyMassIndex?: number;
|
|
139
|
+
leanBodyMass?: number;
|
|
140
|
+
bodyTemperature?: number;
|
|
141
|
+
avgStressLevel?: number;
|
|
142
|
+
bodyBattery?: number;
|
|
143
|
+
spo2Avg?: number;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Provider interface
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
export interface ProviderAdapter {
|
|
151
|
+
name: string;
|
|
152
|
+
/** Build the OAuth config from provider credentials. */
|
|
153
|
+
oauthConfig(credentials: ProviderCredentials): OAuthProviderConfig;
|
|
154
|
+
/** Resolve the authenticated provider user. */
|
|
155
|
+
getUserInfo(
|
|
156
|
+
accessToken: string,
|
|
157
|
+
tokenResponse?: OAuthTokenResponse,
|
|
158
|
+
appUserId?: string,
|
|
159
|
+
credentials?: ProviderCredentials,
|
|
160
|
+
): Promise<ProviderUserInfo>;
|
|
161
|
+
/** Optional provider-specific action after token exchange. */
|
|
162
|
+
postConnect?(
|
|
163
|
+
accessToken: string,
|
|
164
|
+
tokenResponse: OAuthTokenResponse,
|
|
165
|
+
appUserId: string,
|
|
166
|
+
credentials?: ProviderCredentials,
|
|
167
|
+
): Promise<void>;
|
|
168
|
+
/** Fetch provider events (workouts, sleep). */
|
|
169
|
+
fetchEvents?(
|
|
170
|
+
accessToken: string,
|
|
171
|
+
startDate: number,
|
|
172
|
+
endDate: number,
|
|
173
|
+
credentials?: ProviderCredentials,
|
|
174
|
+
): Promise<NormalizedEvent[]>;
|
|
175
|
+
/** Fetch time-series provider data. */
|
|
176
|
+
fetchDataPoints?(
|
|
177
|
+
accessToken: string,
|
|
178
|
+
startDate: number,
|
|
179
|
+
endDate: number,
|
|
180
|
+
credentials?: ProviderCredentials,
|
|
181
|
+
): Promise<NormalizedDataPoint[]>;
|
|
182
|
+
/** Fetch daily summary provider data. */
|
|
183
|
+
fetchDailySummaries?(
|
|
184
|
+
accessToken: string,
|
|
185
|
+
startDate: number,
|
|
186
|
+
endDate: number,
|
|
187
|
+
credentials?: ProviderCredentials,
|
|
188
|
+
): Promise<NormalizedDailySummary[]>;
|
|
189
|
+
}
|