@timeback/sdk 0.1.4

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 (136) hide show
  1. package/README.md +612 -0
  2. package/dist/client/adapters/react/SignInButton.d.ts +60 -0
  3. package/dist/client/adapters/react/SignInButton.d.ts.map +1 -0
  4. package/dist/client/adapters/react/index.d.ts +47 -0
  5. package/dist/client/adapters/react/index.d.ts.map +1 -0
  6. package/dist/client/adapters/react/index.js +478 -0
  7. package/dist/client/adapters/react/provider.d.ts +78 -0
  8. package/dist/client/adapters/react/provider.d.ts.map +1 -0
  9. package/dist/client/adapters/solid/SignInButton.d.ts +52 -0
  10. package/dist/client/adapters/solid/SignInButton.d.ts.map +1 -0
  11. package/dist/client/adapters/solid/SignInButton.tsx +321 -0
  12. package/dist/client/adapters/solid/context.d.ts +73 -0
  13. package/dist/client/adapters/solid/context.d.ts.map +1 -0
  14. package/dist/client/adapters/solid/context.tsx +91 -0
  15. package/dist/client/adapters/solid/index.d.ts +46 -0
  16. package/dist/client/adapters/solid/index.d.ts.map +1 -0
  17. package/dist/client/adapters/solid/index.ts +50 -0
  18. package/dist/client/adapters/svelte/SignInButton.svelte +234 -0
  19. package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +24 -0
  20. package/dist/client/adapters/svelte/index.d.ts +37 -0
  21. package/dist/client/adapters/svelte/index.d.ts.map +1 -0
  22. package/dist/client/adapters/svelte/index.ts +42 -0
  23. package/dist/client/adapters/svelte/stores.d.ts +66 -0
  24. package/dist/client/adapters/svelte/stores.d.ts.map +1 -0
  25. package/dist/client/adapters/svelte/stores.ts +143 -0
  26. package/dist/client/adapters/vue/SignInButton.vue +260 -0
  27. package/dist/client/adapters/vue/SignInButton.vue.d.ts +53 -0
  28. package/dist/client/adapters/vue/index.d.ts +43 -0
  29. package/dist/client/adapters/vue/index.d.ts.map +1 -0
  30. package/dist/client/adapters/vue/index.ts +48 -0
  31. package/dist/client/adapters/vue/provider.d.ts +94 -0
  32. package/dist/client/adapters/vue/provider.d.ts.map +1 -0
  33. package/dist/client/adapters/vue/provider.ts +147 -0
  34. package/dist/client/index.d.ts +9 -0
  35. package/dist/client/index.d.ts.map +1 -0
  36. package/dist/client/lib/activity/activity.class.d.ts +73 -0
  37. package/dist/client/lib/activity/activity.class.d.ts.map +1 -0
  38. package/dist/client/lib/activity/activity.d.ts +16 -0
  39. package/dist/client/lib/activity/activity.d.ts.map +1 -0
  40. package/dist/client/lib/activity/index.d.ts +6 -0
  41. package/dist/client/lib/activity/index.d.ts.map +1 -0
  42. package/dist/client/lib/utils.d.ts +20 -0
  43. package/dist/client/lib/utils.d.ts.map +1 -0
  44. package/dist/client/namespaces/activity.d.ts +41 -0
  45. package/dist/client/namespaces/activity.d.ts.map +1 -0
  46. package/dist/client/namespaces/auth.d.ts +33 -0
  47. package/dist/client/namespaces/auth.d.ts.map +1 -0
  48. package/dist/client/namespaces/index.d.ts +7 -0
  49. package/dist/client/namespaces/index.d.ts.map +1 -0
  50. package/dist/client/namespaces/user.d.ts +29 -0
  51. package/dist/client/namespaces/user.d.ts.map +1 -0
  52. package/dist/client/timeback-client.class.d.ts +37 -0
  53. package/dist/client/timeback-client.class.d.ts.map +1 -0
  54. package/dist/client/timeback-client.d.ts +29 -0
  55. package/dist/client/timeback-client.d.ts.map +1 -0
  56. package/dist/client.d.ts +30 -0
  57. package/dist/client.d.ts.map +1 -0
  58. package/dist/client.js +198 -0
  59. package/dist/config.d.ts +20 -0
  60. package/dist/config.d.ts.map +1 -0
  61. package/dist/config.js +0 -0
  62. package/dist/edge.d.ts +13 -0
  63. package/dist/edge.d.ts.map +1 -0
  64. package/dist/edge.js +1149 -0
  65. package/dist/identity.d.ts +14 -0
  66. package/dist/identity.d.ts.map +1 -0
  67. package/dist/identity.js +1019 -0
  68. package/dist/index.d.ts +48 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +84921 -0
  71. package/dist/server/adapters/express.d.ts +66 -0
  72. package/dist/server/adapters/express.d.ts.map +1 -0
  73. package/dist/server/adapters/express.js +67332 -0
  74. package/dist/server/adapters/native.d.ts +47 -0
  75. package/dist/server/adapters/native.d.ts.map +1 -0
  76. package/dist/server/adapters/native.js +190 -0
  77. package/dist/server/adapters/nextjs.d.ts +32 -0
  78. package/dist/server/adapters/nextjs.d.ts.map +1 -0
  79. package/dist/server/adapters/nextjs.js +202 -0
  80. package/dist/server/adapters/nuxt.d.ts +98 -0
  81. package/dist/server/adapters/nuxt.d.ts.map +1 -0
  82. package/dist/server/adapters/nuxt.js +67401 -0
  83. package/dist/server/adapters/solid-start.d.ts +63 -0
  84. package/dist/server/adapters/solid-start.d.ts.map +1 -0
  85. package/dist/server/adapters/solid-start.js +67300 -0
  86. package/dist/server/adapters/svelte-kit.d.ts +84 -0
  87. package/dist/server/adapters/svelte-kit.d.ts.map +1 -0
  88. package/dist/server/adapters/svelte-kit.js +243 -0
  89. package/dist/server/adapters/tanstack-start.d.ts +42 -0
  90. package/dist/server/adapters/tanstack-start.d.ts.map +1 -0
  91. package/dist/server/adapters/tanstack-start.js +67278 -0
  92. package/dist/server/adapters/types.d.ts +294 -0
  93. package/dist/server/adapters/types.d.ts.map +1 -0
  94. package/dist/server/adapters/utils.d.ts +76 -0
  95. package/dist/server/adapters/utils.d.ts.map +1 -0
  96. package/dist/server/handlers/activity.d.ts +28 -0
  97. package/dist/server/handlers/activity.d.ts.map +1 -0
  98. package/dist/server/handlers/identity-full.d.ts +28 -0
  99. package/dist/server/handlers/identity-full.d.ts.map +1 -0
  100. package/dist/server/handlers/identity-only.d.ts +22 -0
  101. package/dist/server/handlers/identity-only.d.ts.map +1 -0
  102. package/dist/server/handlers/index.d.ts +9 -0
  103. package/dist/server/handlers/index.d.ts.map +1 -0
  104. package/dist/server/handlers/user.d.ts +31 -0
  105. package/dist/server/handlers/user.d.ts.map +1 -0
  106. package/dist/server/index.d.ts +9 -0
  107. package/dist/server/index.d.ts.map +1 -0
  108. package/dist/server/lib/build-activity-events.d.ts +39 -0
  109. package/dist/server/lib/build-activity-events.d.ts.map +1 -0
  110. package/dist/server/lib/build-user-profile.d.ts +62 -0
  111. package/dist/server/lib/build-user-profile.d.ts.map +1 -0
  112. package/dist/server/lib/index.d.ts +14 -0
  113. package/dist/server/lib/index.d.ts.map +1 -0
  114. package/dist/server/lib/logger.d.ts +21 -0
  115. package/dist/server/lib/logger.d.ts.map +1 -0
  116. package/dist/server/lib/oidc.d.ts +76 -0
  117. package/dist/server/lib/oidc.d.ts.map +1 -0
  118. package/dist/server/lib/resolve-activity-course.d.ts +22 -0
  119. package/dist/server/lib/resolve-activity-course.d.ts.map +1 -0
  120. package/dist/server/lib/resolve-timeback-id.d.ts +28 -0
  121. package/dist/server/lib/resolve-timeback-id.d.ts.map +1 -0
  122. package/dist/server/lib/resolve-timeback-user.d.ts +42 -0
  123. package/dist/server/lib/resolve-timeback-user.d.ts.map +1 -0
  124. package/dist/server/lib/utils.d.ts +54 -0
  125. package/dist/server/lib/utils.d.ts.map +1 -0
  126. package/dist/server/timeback-identity.d.ts +19 -0
  127. package/dist/server/timeback-identity.d.ts.map +1 -0
  128. package/dist/server/timeback.d.ts +68 -0
  129. package/dist/server/timeback.d.ts.map +1 -0
  130. package/dist/server/types.d.ts +421 -0
  131. package/dist/server/types.d.ts.map +1 -0
  132. package/dist/shared/constants.d.ts +18 -0
  133. package/dist/shared/constants.d.ts.map +1 -0
  134. package/dist/shared/types.d.ts +159 -0
  135. package/dist/shared/types.d.ts.map +1 -0
  136. package/package.json +119 -0
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Server Types
3
+ *
4
+ * Configuration and internal types for the server SDK.
5
+ */
6
+ import type { TimebackClient } from '@timeback/core';
7
+ import type { TimebackAuthUser, TimebackIdentity } from '../shared/types';
8
+ /**
9
+ * Environment configuration.
10
+ */
11
+ export type Environment = 'local' | 'staging' | 'production';
12
+ /**
13
+ * Error codes for Timeback user resolution failures.
14
+ */
15
+ export type TimebackUserResolutionErrorCode = 'missing_email' | 'timeback_user_not_found' | 'timeback_user_ambiguous' | 'timeback_user_lookup_failed';
16
+ /**
17
+ * API credentials for Timeback API calls.
18
+ */
19
+ export interface ApiCredentials {
20
+ clientId: string;
21
+ clientSecret: string;
22
+ }
23
+ /**
24
+ * OIDC tokens returned from the identity provider.
25
+ */
26
+ export interface OIDCTokens {
27
+ /** Access token for API calls */
28
+ access_token: string;
29
+ /** ID token containing user claims */
30
+ id_token?: string;
31
+ /** Refresh token for obtaining new access tokens */
32
+ refresh_token?: string;
33
+ /** Token type (usually "Bearer") */
34
+ token_type: string;
35
+ /** Token expiration in seconds */
36
+ expires_in?: number;
37
+ }
38
+ /**
39
+ * Identity provider link info (e.g., Google, Facebook).
40
+ */
41
+ export interface IdentityProviderLink {
42
+ /** When the identity was linked */
43
+ dateCreated: string;
44
+ /** User ID from the external provider */
45
+ userId: string;
46
+ /** Provider name (e.g., "Google", "Facebook") */
47
+ providerName: string;
48
+ /** Provider type */
49
+ providerType: string;
50
+ /** Issuer URL (if applicable) */
51
+ issuer: string | null;
52
+ /** Whether this is the primary identity */
53
+ primary: string;
54
+ }
55
+ /**
56
+ * User info claims from the identity provider.
57
+ */
58
+ export interface OIDCUserInfo {
59
+ /** Subject identifier (unique user ID from IdP) */
60
+ sub: string;
61
+ /** User's email address */
62
+ email?: string;
63
+ /** Whether email is verified */
64
+ email_verified?: boolean | string;
65
+ /** User's full name */
66
+ name?: string;
67
+ /** User's given/first name */
68
+ given_name?: string;
69
+ /** User's family/last name */
70
+ family_name?: string;
71
+ /** User's profile picture URL */
72
+ picture?: string;
73
+ /** Username in the IdP */
74
+ username?: string;
75
+ /** Linked identity providers (JSON string from Cognito) */
76
+ identities?: string | IdentityProviderLink[];
77
+ /** Additional claims */
78
+ [key: string]: unknown;
79
+ }
80
+ /**
81
+ * Context passed to buildState hook.
82
+ */
83
+ export interface BuildStateContext {
84
+ /** The incoming sign-in request */
85
+ req: Request;
86
+ /** Parsed URL for easy access to query params */
87
+ url: URL;
88
+ }
89
+ /**
90
+ * Raw identity provider data (tokens and user info claims).
91
+ */
92
+ export interface IdpData {
93
+ /** OIDC tokens from the identity provider */
94
+ tokens: OIDCTokens;
95
+ /** User info claims from the identity provider */
96
+ userInfo: OIDCUserInfo;
97
+ }
98
+ /**
99
+ * Context passed to onCallbackSuccess hook for full SDK (createTimeback).
100
+ *
101
+ * When using `createTimeback()` with SSO mode, the `user` field contains the
102
+ * enriched `TimebackAuthUser` with `timebackId` as the canonical identifier. Raw IdP
103
+ * data is available under `idp`.
104
+ */
105
+ export interface CallbackSuccessContext<TState = unknown> {
106
+ /** Authenticated user with Timeback profile and IdP claims */
107
+ user: TimebackAuthUser;
108
+ /** Raw identity provider data (tokens and user info) */
109
+ idp: IdpData;
110
+ /** State data from buildState (if provided) */
111
+ state: TState | undefined;
112
+ /** The incoming callback request */
113
+ req: Request;
114
+ /** Helper to create a redirect response */
115
+ redirect: (url: string, headers?: HeadersInit) => Response;
116
+ /** Helper to create a JSON response */
117
+ json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
118
+ }
119
+ /**
120
+ * Context passed to onCallbackSuccess hook for identity-only SDK (createTimebackIdentity).
121
+ *
122
+ * When using `createTimebackIdentity()`, the `user` field contains raw OIDC user info
123
+ * claims (no Timeback profile enrichment).
124
+ */
125
+ export interface IdentityOnlyCallbackSuccessContext<TState = unknown> {
126
+ /** OIDC tokens from the identity provider */
127
+ tokens: OIDCTokens;
128
+ /** User info claims from the identity provider */
129
+ user: OIDCUserInfo;
130
+ /** State data from buildState (if provided) */
131
+ state: TState | undefined;
132
+ /** The incoming callback request */
133
+ req: Request;
134
+ /** Helper to create a redirect response */
135
+ redirect: (url: string, headers?: HeadersInit) => Response;
136
+ /** Helper to create a JSON response */
137
+ json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
138
+ }
139
+ /**
140
+ * Context passed to onCallbackError hook.
141
+ */
142
+ export interface CallbackErrorContext<TState = unknown> {
143
+ /** The error that occurred */
144
+ error: Error;
145
+ /** Error code from OIDC provider (if available) */
146
+ errorCode?: string;
147
+ /** State data from buildState (if available) */
148
+ state: TState | undefined;
149
+ /** The incoming callback request */
150
+ req: Request;
151
+ /** Helper to create a redirect response */
152
+ redirect: (url: string, headers?: HeadersInit) => Response;
153
+ /** Helper to create a JSON response */
154
+ json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
155
+ }
156
+ /**
157
+ * Base SSO identity configuration fields (shared between full and identity-only).
158
+ */
159
+ interface BaseSsoIdentityConfig<TState = unknown> {
160
+ mode: 'sso';
161
+ /** OIDC client ID */
162
+ clientId: string;
163
+ /** OIDC client secret */
164
+ clientSecret: string;
165
+ /**
166
+ * Custom OIDC issuer URL.
167
+ *
168
+ * Override the default Timeback IdP URL. Useful for:
169
+ * - Local development with a mock OIDC server
170
+ * - Self-hosted Timeback instances
171
+ *
172
+ * @example 'http://localhost:3001/mock-oidc'
173
+ */
174
+ issuer?: string;
175
+ /**
176
+ * Custom OAuth redirect URI.
177
+ *
178
+ * Override the auto-computed callback URL. Use when your IdP has
179
+ * pre-configured callback URLs that differ from the SDK default.
180
+ *
181
+ * @example 'http://localhost:5174/api/auth/sso/callback/timeback'
182
+ */
183
+ redirectUri?: string;
184
+ /**
185
+ * Build custom state to pass through the OIDC flow.
186
+ *
187
+ * Use this to preserve data across the redirect (e.g., return URL, invite codes).
188
+ * State is encoded in the OIDC state parameter and returned in onCallbackSuccess.
189
+ *
190
+ * @param ctx - Context with request and parsed URL
191
+ * @returns State object (will be JSON serialized)
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * buildState: ({ url }) => ({
196
+ * returnTo: url.searchParams.get('returnTo') ?? '/dashboard',
197
+ * inviteId: url.searchParams.get('inviteId'),
198
+ * })
199
+ * ```
200
+ */
201
+ buildState?: (ctx: BuildStateContext) => TState;
202
+ /**
203
+ * Called when OIDC authentication fails.
204
+ *
205
+ * @param ctx - Context with error info and helpers
206
+ * @returns Response (typically a redirect to an error page)
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * onCallbackError: ({ error, redirect }) => {
211
+ * console.error('SSO failed:', error)
212
+ * return redirect('/login?error=sso_failed')
213
+ * }
214
+ * ```
215
+ */
216
+ onCallbackError?(ctx: CallbackErrorContext<TState>): Promise<Response> | Response;
217
+ /**
218
+ * Get the current user from the request.
219
+ *
220
+ * This is called by the activity handler to associate activities with users.
221
+ * Read your session cookie/JWT and return the user, or undefined if not authenticated.
222
+ *
223
+ * @param req - The incoming request
224
+ * @returns User object or undefined
225
+ *
226
+ * @example
227
+ * ```typescript
228
+ * // Async (with database/session lookup)
229
+ * getUser: async (req) => {
230
+ * const session = await getSession(req)
231
+ * if (!session) return undefined
232
+ * return { id: session.userId, email: session.email }
233
+ * }
234
+ *
235
+ * // Sync (already have user in memory)
236
+ * getUser: (req) => currentUser
237
+ * ```
238
+ */
239
+ getUser(req: Request): Promise<TimebackIdentity | undefined> | TimebackIdentity | undefined;
240
+ }
241
+ /**
242
+ * SSO identity configuration for full SDK (createTimeback).
243
+ *
244
+ * When using `createTimeback()`, the SSO callback provides an enriched `TimebackAuthUser`
245
+ * with `timebackId` as the canonical identifier. The SDK resolves the Timeback
246
+ * user by email using server API credentials.
247
+ */
248
+ export interface SsoIdentityConfig<TState = unknown, TSuccessContext = CallbackSuccessContext<TState>> extends BaseSsoIdentityConfig<TState> {
249
+ /**
250
+ * Called after successful OIDC authentication and Timeback user resolution.
251
+ *
252
+ * The `user` field contains the enriched `TimebackAuthUser` with:
253
+ * - `id`: Timeback user ID (canonical stable identifier)
254
+ * - `email`, `name`: User profile data
255
+ * - `claims`: Raw IdP claims (sub, firstName, lastName, pictureUrl)
256
+ *
257
+ * Raw IdP data (tokens, userInfo) is available under `idp`.
258
+ *
259
+ * @param ctx - Context with enriched user, IdP data, state, and helpers
260
+ * @returns Response (typically a redirect)
261
+ *
262
+ * @example
263
+ * ```typescript
264
+ * onCallbackSuccess: async ({ user, state, redirect }) => {
265
+ * // user.id is the timebackId (canonical identifier)
266
+ * await setSession({ id: user.id, email: user.email })
267
+ * return redirect(state.returnTo ?? '/')
268
+ * }
269
+ * ```
270
+ */
271
+ onCallbackSuccess(ctx: TSuccessContext): Promise<Response> | Response;
272
+ }
273
+ /**
274
+ * Custom identity configuration.
275
+ *
276
+ * Use when you have your own auth system (Clerk, Auth0, etc.).
277
+ */
278
+ export interface CustomIdentityConfig {
279
+ mode: 'custom';
280
+ /**
281
+ * Get the current user from the request.
282
+ *
283
+ * Read your session cookie/JWT and return the user, or undefined if not authenticated.
284
+ * Can return synchronously or as a Promise.
285
+ *
286
+ * @param req - The incoming request
287
+ * @returns User object or undefined (sync or async)
288
+ */
289
+ getUser(req: Request): Promise<TimebackIdentity | undefined> | TimebackIdentity | undefined;
290
+ }
291
+ /**
292
+ * Identity configuration (SSO or custom).
293
+ */
294
+ export type IdentityConfig<TState = unknown> = SsoIdentityConfig<TState> | CustomIdentityConfig;
295
+ /**
296
+ * Full Timeback SDK configuration.
297
+ */
298
+ export interface TimebackConfig<TState = unknown> {
299
+ /** Optional path to timeback.config.ts (auto-discovered if not provided) */
300
+ configPath?: string;
301
+ /** Environment */
302
+ env: Environment;
303
+ /** API credentials for Timeback API */
304
+ api: ApiCredentials;
305
+ /** Identity configuration */
306
+ identity: IdentityConfig<TState>;
307
+ }
308
+ /**
309
+ * Request handlers namespace.
310
+ */
311
+ export interface Handlers {
312
+ /** Activity submission handler */
313
+ activity: (req: Request) => Promise<Response>;
314
+ /** Identity-related handlers */
315
+ identity: {
316
+ /** Initiate sign-in (SSO only) */
317
+ signIn: (req: Request) => Promise<Response>;
318
+ /** Handle OAuth callback (SSO only) */
319
+ callback: (req: Request) => Promise<Response>;
320
+ /** Sign out user */
321
+ signOut: () => Response;
322
+ };
323
+ /** User profile handler */
324
+ user: {
325
+ /** Get current user profile */
326
+ me: (req: Request) => Promise<Response>;
327
+ };
328
+ }
329
+ /**
330
+ * App configuration from timeback.config.ts.
331
+ */
332
+ export interface AppConfig {
333
+ name: string;
334
+ sensors: string[];
335
+ courses: Array<{
336
+ subject: string;
337
+ grade: number;
338
+ courseCode?: string;
339
+ level?: string;
340
+ ids?: {
341
+ staging?: string;
342
+ production?: string;
343
+ } | null;
344
+ metadata?: {
345
+ goals?: {
346
+ dailyXp?: number;
347
+ dailyLessons?: number;
348
+ dailyActiveMinutes?: number;
349
+ dailyAccuracy?: number;
350
+ dailyMasteredUnits?: number;
351
+ };
352
+ };
353
+ }>;
354
+ }
355
+ /**
356
+ * Timeback SDK instance (framework-agnostic).
357
+ */
358
+ export interface TimebackInstance<TState = unknown> {
359
+ /** Configuration */
360
+ config: TimebackConfig<TState>;
361
+ /** Request handlers */
362
+ handle: Handlers;
363
+ /**
364
+ * Direct access to the Timeback API client.
365
+ *
366
+ * This is an escape hatch for advanced use cases that need to call Timeback
367
+ * services (OneRoster, Edubridge, Caliper, QTI) beyond what the SDK handlers
368
+ * provide. The client is created lazily on first access.
369
+ *
370
+ * Note: For `env: 'local'`, outbound API calls use `staging` environment.
371
+ *
372
+ * @example
373
+ * ```typescript
374
+ * // List users from OneRoster
375
+ * const { data: users } = await timeback.api.oneroster.users.list({ limit: 10 })
376
+ *
377
+ * // Send a Caliper event
378
+ * await timeback.api.caliper.emit(event)
379
+ * ```
380
+ */
381
+ api: TimebackClient;
382
+ }
383
+ /**
384
+ * Identity-only configuration.
385
+ *
386
+ * Use this when you only need SSO authentication without activity tracking
387
+ * or Timeback API integration.
388
+ */
389
+ export interface IdentityOnlyConfig<TState = unknown> {
390
+ /** Environment */
391
+ env: Environment;
392
+ /** Identity configuration (SSO mode required for identity-only) */
393
+ identity: SsoIdentityConfig<TState, IdentityOnlyCallbackSuccessContext<TState>>;
394
+ }
395
+ /**
396
+ * Identity-only handlers.
397
+ */
398
+ export interface IdentityOnlyHandlers {
399
+ /** Identity-related handlers */
400
+ identity: {
401
+ /** Initiate sign-in */
402
+ signIn: (req: Request) => Promise<Response>;
403
+ /** Handle OAuth callback */
404
+ callback: (req: Request) => Promise<Response>;
405
+ /** Sign out user */
406
+ signOut: () => Response;
407
+ };
408
+ }
409
+ /**
410
+ * Identity-only SDK instance.
411
+ *
412
+ * Returned by `createTimebackIdentity()` for SSO-only integrations.
413
+ */
414
+ export interface IdentityOnlyInstance<TState = unknown> {
415
+ /** Configuration */
416
+ config: IdentityOnlyConfig<TState>;
417
+ /** Request handlers (identity only) */
418
+ handle: IdentityOnlyHandlers;
419
+ }
420
+ export {};
421
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared Constants
3
+ */
4
+ /** Default base path for Timeback API routes */
5
+ export declare const DEFAULT_BASE_PATH = "/api/timeback";
6
+ /** API route paths */
7
+ export declare const ROUTES: {
8
+ readonly ACTIVITY: "/activity";
9
+ readonly IDENTITY: {
10
+ readonly SIGNIN: "/identity/signin";
11
+ readonly SIGNOUT: "/identity/signout";
12
+ readonly CALLBACK: "/identity/callback";
13
+ };
14
+ readonly USER: {
15
+ readonly ME: "/user/me";
16
+ };
17
+ };
18
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,sBAAsB;AACtB,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAA"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Shared Types
3
+ *
4
+ * Types shared between client and server.
5
+ */
6
+ import type { TimebackGrade, TimebackSubject } from '@timeback/types';
7
+ /**
8
+ * User identity returned from SSO.
9
+ */
10
+ export interface TimebackIdentity {
11
+ id: string;
12
+ email: string;
13
+ name?: string;
14
+ }
15
+ /**
16
+ * Timeback user profile with enriched data from the Timeback API.
17
+ */
18
+ export interface TimebackProfile {
19
+ /** Timeback user ID */
20
+ id: string;
21
+ /** User's email address */
22
+ email: string;
23
+ /** User's display name */
24
+ name?: string;
25
+ /** School information */
26
+ school?: {
27
+ id: string;
28
+ name: string;
29
+ };
30
+ /** Grade level */
31
+ grade?: number;
32
+ /** XP earned on this app */
33
+ xp?: {
34
+ /** XP earned today (UTC day range) */
35
+ today: number;
36
+ /** XP earned across all time (computed from analytics) */
37
+ all: number;
38
+ };
39
+ /** Enrolled courses */
40
+ courses?: Array<{
41
+ id: string;
42
+ code: string;
43
+ name: string;
44
+ }>;
45
+ /** Goals and progress */
46
+ goals?: {
47
+ dailyXp?: number;
48
+ dailyLessons?: number;
49
+ dailyActiveMinutes?: number;
50
+ };
51
+ }
52
+ /**
53
+ * Recommended minimal user payload to persist in a session.
54
+ *
55
+ * **User-facing note:** this type is part of the SDK’s developer experience.
56
+ * It exists to give you a “safe default” session shape that works well for
57
+ * cookie-based sessions (small payload) while still carrying enough Timeback
58
+ * context to power common UI affordances (e.g. showing a school name or grade).
59
+ *
60
+ * **What it is:** a minimal, serializable subset of `TimebackProfile`.
61
+ * **What it isn’t:** a guarantee that you’ll always have the full Timeback
62
+ * profile (courses, goals, xp, etc.) in-session. If you need richer data, fetch
63
+ * it from the API (e.g. `timeback.user.fetch()`) and cache/store it according
64
+ * to your app’s needs.
65
+ *
66
+ * **Stability:** this is still early and we’re actively iterating on identity
67
+ * and session ergonomics. We may rename, restructure, or remove this type from
68
+ * the public surface as the SDK evolves.
69
+ */
70
+ export type TimebackSessionUser = Pick<TimebackProfile, 'id' | 'email' | 'name' | 'school' | 'grade'>;
71
+ /**
72
+ * Claims from the identity provider (IdP).
73
+ *
74
+ * Normalized subset of OIDC UserInfo claims.
75
+ */
76
+ export interface IdentityClaims {
77
+ /** Subject identifier (unique user ID from IdP) */
78
+ sub: string;
79
+ /** User's email address */
80
+ email: string;
81
+ /** User's first/given name */
82
+ firstName?: string;
83
+ /** User's last/family name */
84
+ lastName?: string;
85
+ /** User's profile picture URL */
86
+ pictureUrl?: string;
87
+ }
88
+ /**
89
+ * Authenticated user with Timeback profile and IdP claims.
90
+ *
91
+ * This is the primary user object returned during SSO callback when using
92
+ * `createTimeback()`. The `id` field is the canonical `timebackId` (stable identifier).
93
+ */
94
+ export interface TimebackAuthUser extends TimebackProfile {
95
+ /** IdP claims (raw identity provider data) */
96
+ claims: IdentityClaims;
97
+ }
98
+ /**
99
+ * Course selector for activity tracking.
100
+ *
101
+ * This should correspond to a unique course entry in `timeback.config.ts`.
102
+ */
103
+ export interface ActivityCourseRef {
104
+ subject: TimebackSubject;
105
+ grade: TimebackGrade;
106
+ }
107
+ /**
108
+ * Activity start parameters.
109
+ */
110
+ export interface ActivityParams {
111
+ /** Unique identifier for the learning object */
112
+ id: string;
113
+ /** Display name of the activity */
114
+ name: string;
115
+ /** Course selector (must match a unique course in timeback.config.ts) */
116
+ course: ActivityCourseRef;
117
+ }
118
+ /**
119
+ * Activity metrics (optional performance data).
120
+ */
121
+ export interface ActivityMetrics {
122
+ /** Total questions attempted */
123
+ totalQuestions?: number;
124
+ /** Number of correct answers */
125
+ correctQuestions?: number;
126
+ /** XP earned from this activity */
127
+ xpEarned?: number;
128
+ /** Number of units mastered */
129
+ masteredUnits?: number;
130
+ }
131
+ /**
132
+ * Activity state sent to the server when ending.
133
+ */
134
+ export interface ActivityEndPayload {
135
+ /** Unique identifier for the learning object */
136
+ id: string;
137
+ /** Display name of the activity */
138
+ name: string;
139
+ /** Course selector (must match a unique course in timeback.config.ts) */
140
+ course: ActivityCourseRef;
141
+ /** ISO 8601 timestamp when activity started */
142
+ startedAt: string;
143
+ /** ISO 8601 timestamp when activity ended */
144
+ endedAt: string;
145
+ /** Active time in milliseconds (excluding paused time) */
146
+ elapsedMs: number;
147
+ /** Total paused time in milliseconds */
148
+ pausedMs: number;
149
+ /** Activity metrics */
150
+ metrics: ActivityMetrics;
151
+ }
152
+ /**
153
+ * Activity submission response.
154
+ */
155
+ export interface ActivityResponse {
156
+ success: boolean;
157
+ error?: string;
158
+ }
159
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}