@timeback/sdk 0.1.5 → 0.1.7

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 (123) hide show
  1. package/README.md +21 -22
  2. package/dist/client/adapters/react/hooks/types.d.ts +15 -0
  3. package/dist/client/adapters/react/hooks/types.d.ts.map +1 -0
  4. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts +18 -0
  5. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -0
  6. package/dist/client/adapters/react/index.d.ts +2 -0
  7. package/dist/client/adapters/react/index.d.ts.map +1 -1
  8. package/dist/client/adapters/react/index.js +139 -9
  9. package/dist/client/auth/bearer.d.ts +17 -0
  10. package/dist/client/auth/bearer.d.ts.map +1 -0
  11. package/dist/client/auth/index.d.ts +3 -0
  12. package/dist/client/auth/index.d.ts.map +1 -0
  13. package/dist/client/auth/types.d.ts +39 -0
  14. package/dist/client/auth/types.d.ts.map +1 -0
  15. package/dist/client/index.d.ts +2 -0
  16. package/dist/client/index.d.ts.map +1 -1
  17. package/dist/client/lib/fetch.d.ts +19 -0
  18. package/dist/client/lib/fetch.d.ts.map +1 -0
  19. package/dist/client/namespaces/user.d.ts +25 -2
  20. package/dist/client/namespaces/user.d.ts.map +1 -1
  21. package/dist/client/timeback-client.class.d.ts +15 -0
  22. package/dist/client/timeback-client.class.d.ts.map +1 -1
  23. package/dist/client/timeback-client.d.ts +3 -0
  24. package/dist/client/timeback-client.d.ts.map +1 -1
  25. package/dist/client.d.ts +2 -1
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +69 -6
  28. package/dist/edge.d.ts +1 -1
  29. package/dist/edge.js +85291 -169
  30. package/dist/identity.js +85186 -74
  31. package/dist/index.js +1289 -840
  32. package/dist/server/adapters/express.d.ts.map +1 -1
  33. package/dist/server/adapters/express.js +489 -388
  34. package/dist/server/adapters/native.d.ts.map +1 -1
  35. package/dist/server/adapters/native.js +32 -1
  36. package/dist/server/adapters/nextjs.js +32 -1
  37. package/dist/server/adapters/nuxt.d.ts.map +1 -1
  38. package/dist/server/adapters/nuxt.js +493 -388
  39. package/dist/server/adapters/solid-start.d.ts.map +1 -1
  40. package/dist/server/adapters/solid-start.js +493 -388
  41. package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
  42. package/dist/server/adapters/svelte-kit.js +37 -1
  43. package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
  44. package/dist/server/adapters/tanstack-start.js +488 -388
  45. package/dist/server/adapters/utils.d.ts +1 -1
  46. package/dist/server/adapters/utils.d.ts.map +1 -1
  47. package/dist/server/{lib/build-activity-events.d.ts → handlers/activity/caliper.d.ts} +29 -4
  48. package/dist/server/handlers/activity/caliper.d.ts.map +1 -0
  49. package/dist/server/handlers/activity/gradebook.d.ts +56 -0
  50. package/dist/server/handlers/activity/gradebook.d.ts.map +1 -0
  51. package/dist/server/handlers/activity/handler.d.ts +15 -0
  52. package/dist/server/handlers/activity/handler.d.ts.map +1 -0
  53. package/dist/server/handlers/activity/index.d.ts +9 -0
  54. package/dist/server/handlers/activity/index.d.ts.map +1 -0
  55. package/dist/server/handlers/activity/resolve.d.ts +39 -0
  56. package/dist/server/handlers/activity/resolve.d.ts.map +1 -0
  57. package/dist/server/handlers/activity/schema.d.ts +52 -0
  58. package/dist/server/handlers/activity/schema.d.ts.map +1 -0
  59. package/dist/server/handlers/activity/types.d.ts +52 -0
  60. package/dist/server/handlers/activity/types.d.ts.map +1 -0
  61. package/dist/server/handlers/identity/handler.d.ts +14 -0
  62. package/dist/server/handlers/identity/handler.d.ts.map +1 -0
  63. package/dist/server/handlers/identity/index.d.ts +8 -0
  64. package/dist/server/handlers/identity/index.d.ts.map +1 -0
  65. package/dist/server/handlers/identity/oidc.d.ts +43 -0
  66. package/dist/server/handlers/identity/oidc.d.ts.map +1 -0
  67. package/dist/server/handlers/identity/types.d.ts +24 -0
  68. package/dist/server/handlers/identity/types.d.ts.map +1 -0
  69. package/dist/server/handlers/identity-only/handler.d.ts +15 -0
  70. package/dist/server/handlers/identity-only/handler.d.ts.map +1 -0
  71. package/dist/server/handlers/identity-only/index.d.ts +8 -0
  72. package/dist/server/handlers/identity-only/index.d.ts.map +1 -0
  73. package/dist/server/handlers/identity-only/oidc.d.ts +26 -0
  74. package/dist/server/handlers/identity-only/oidc.d.ts.map +1 -0
  75. package/dist/server/handlers/identity-only/types.d.ts +19 -0
  76. package/dist/server/handlers/identity-only/types.d.ts.map +1 -0
  77. package/dist/server/handlers/index.d.ts +5 -2
  78. package/dist/server/handlers/index.d.ts.map +1 -1
  79. package/dist/server/{lib/build-user-profile.d.ts → handlers/user/enrollments.d.ts} +7 -2
  80. package/dist/server/handlers/user/enrollments.d.ts.map +1 -0
  81. package/dist/server/handlers/user/handler.d.ts +17 -0
  82. package/dist/server/handlers/user/handler.d.ts.map +1 -0
  83. package/dist/server/handlers/user/index.d.ts +10 -0
  84. package/dist/server/handlers/user/index.d.ts.map +1 -0
  85. package/dist/server/handlers/user/profile.d.ts +22 -0
  86. package/dist/server/handlers/user/profile.d.ts.map +1 -0
  87. package/dist/server/handlers/user/types.d.ts +35 -0
  88. package/dist/server/handlers/user/types.d.ts.map +1 -0
  89. package/dist/server/handlers/user/verify.d.ts +25 -0
  90. package/dist/server/handlers/user/verify.d.ts.map +1 -0
  91. package/dist/server/index.d.ts +1 -1
  92. package/dist/server/index.d.ts.map +1 -1
  93. package/dist/server/lib/index.d.ts +4 -5
  94. package/dist/server/lib/index.d.ts.map +1 -1
  95. package/dist/server/lib/resolve.d.ts +4 -42
  96. package/dist/server/lib/resolve.d.ts.map +1 -1
  97. package/dist/server/lib/sso.d.ts +86 -0
  98. package/dist/server/lib/sso.d.ts.map +1 -0
  99. package/dist/server/lib/utils.d.ts +32 -1
  100. package/dist/server/lib/utils.d.ts.map +1 -1
  101. package/dist/server/timeback-identity.d.ts +2 -2
  102. package/dist/server/timeback-identity.d.ts.map +1 -1
  103. package/dist/server/timeback.d.ts.map +1 -1
  104. package/dist/server/types.d.ts +19 -12
  105. package/dist/server/types.d.ts.map +1 -1
  106. package/dist/shared/constants.d.ts +1 -0
  107. package/dist/shared/constants.d.ts.map +1 -1
  108. package/dist/shared/types.d.ts +18 -3
  109. package/dist/shared/types.d.ts.map +1 -1
  110. package/package.json +7 -7
  111. package/dist/config.d.ts +0 -20
  112. package/dist/config.d.ts.map +0 -1
  113. package/dist/config.js +0 -0
  114. package/dist/server/handlers/activity.d.ts +0 -25
  115. package/dist/server/handlers/activity.d.ts.map +0 -1
  116. package/dist/server/handlers/identity-full.d.ts +0 -28
  117. package/dist/server/handlers/identity-full.d.ts.map +0 -1
  118. package/dist/server/handlers/identity-only.d.ts +0 -22
  119. package/dist/server/handlers/identity-only.d.ts.map +0 -1
  120. package/dist/server/handlers/user.d.ts +0 -31
  121. package/dist/server/handlers/user.d.ts.map +0 -1
  122. package/dist/server/lib/build-activity-events.d.ts.map +0 -1
  123. package/dist/server/lib/build-user-profile.d.ts.map +0 -1
@@ -12,7 +12,7 @@ type AnyHandlers = Handlers | IdentityOnlyHandlers;
12
12
  /**
13
13
  * A canonical route identifier for Timeback's built-in endpoints.
14
14
  */
15
- type TimebackRouteId = 'identity.signIn' | 'identity.callback' | 'identity.signOut' | 'user.me' | 'activity';
15
+ type TimebackRouteId = 'identity.signIn' | 'identity.callback' | 'identity.signOut' | 'user.me' | 'user.verify' | 'activity';
16
16
  /**
17
17
  * Normalize a path-like string to a pathname only (no query string).
18
18
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C;;GAEG;AACH,KAAK,WAAW,GAAG,QAAQ,GAAG,oBAAoB,CAAA;AAElD;;GAEG;AACH,KAAK,eAAe,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,SAAS,GACT,UAAU,CAAA;AAEb;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBtD;AA8BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,eAAe,GAAG,IAAI,CAsDzB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAE9E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAE1E"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C;;GAEG;AACH,KAAK,WAAW,GAAG,QAAQ,GAAG,oBAAoB,CAAA;AAElD;;GAEG;AACH,KAAK,eAAe,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,SAAS,GACT,aAAa,GACb,UAAU,CAAA;AAEb;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBtD;AA8BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,eAAe,GAAG,IAAI,CAwDzB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAE9E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,IAAI,QAAQ,CAE1E"}
@@ -1,7 +1,13 @@
1
1
  import type { ActivityCompletedEvent, TimebackActivityContext, TimebackActivityMetric, TimeSpentEvent, TimeSpentMetric } from '@timeback/caliper';
2
2
  import type { TimebackClient } from '@timeback/core';
3
- import type { ActivityEndPayload, ActivityMetrics } from '../../shared/types';
4
- import type { AppConfig } from '../types';
3
+ import type { ActivityCourseRef, ActivityMetrics } from '../../../shared/types';
4
+ import type { ActivityBeforeSendData, AppConfig } from '../../types';
5
+ import type { ValidatedActivityPayload } from './types';
6
+ /**
7
+ * Activity Caliper Events
8
+ *
9
+ * Build and send Caliper events for activity submissions.
10
+ */
5
11
  /**
6
12
  * Error thrown when a course is missing a synced ID for the target environment.
7
13
  */
@@ -39,7 +45,11 @@ export declare class InvalidSensorUrlError extends Error {
39
45
  * @param sensor - Sensor URL for building the canonical activity URL
40
46
  * @returns Caliper activity context payload
41
47
  */
42
- export declare function buildActivityContext(payload: ActivityEndPayload, course: AppConfig['courses'][number], appName: string, apiEnv: 'staging' | 'production', sensor: string): TimebackActivityContext;
48
+ export declare function buildActivityContext(payload: {
49
+ id: string;
50
+ name: string;
51
+ course: ActivityCourseRef;
52
+ }, course: AppConfig['courses'][number], appName: string, apiEnv: 'staging' | 'production', sensor: string): TimebackActivityContext;
43
53
  /**
44
54
  * Build Caliper activity metrics from the client payload.
45
55
  *
@@ -55,6 +65,21 @@ export declare function buildActivityMetrics(metrics: ActivityMetrics): Timeback
55
65
  * @returns Normalized Caliper time spent metrics
56
66
  */
57
67
  export declare function buildTimeSpentMetrics(elapsedMs: number, pausedMs: number): TimeSpentMetric[];
68
+ /**
69
+ * Build Caliper events for an activity.
70
+ *
71
+ * @param params - Event building parameters
72
+ * @returns Built events and context
73
+ */
74
+ export declare function buildActivityEvents(params: {
75
+ sensor: string;
76
+ timebackId: string;
77
+ email: string;
78
+ payload: ValidatedActivityPayload;
79
+ course: AppConfig['courses'][number];
80
+ appName: string;
81
+ apiEnv: 'staging' | 'production';
82
+ }): ActivityBeforeSendData;
58
83
  /**
59
84
  * Send a batch of Caliper events as a single envelope.
60
85
  *
@@ -64,4 +89,4 @@ export declare function buildTimeSpentMetrics(elapsedMs: number, pausedMs: numbe
64
89
  * @param timeSpentEvent - TimeSpentEvent payload
65
90
  */
66
91
  export declare function sendCaliperEnvelope(client: TimebackClient, sensor: string, activityEvent: ActivityCompletedEvent, timeSpentEvent: TimeSpentEvent): Promise<void>;
67
- //# sourceMappingURL=build-activity-events.d.ts.map
92
+ //# sourceMappingURL=caliper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caliper.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/caliper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EAEtB,cAAc,EACd,eAAe,EACf,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEvD;;;;GAIG;AAMH;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,YAAY,CAAA;IAEtC,YAAY,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,YAAY,EAW9E;CACD;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IAEvB,YAAY,MAAM,EAAE,MAAM,EAMzB;CACD;AAiHD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CACnC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,EAChE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,GAAG,YAAY,EAChC,MAAM,EAAE,MAAM,GACZ,uBAAuB,CAmBzB;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,sBAAsB,EAAE,CAoBvF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAQ5F;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,wBAAwB,CAAA;IACjC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,GAAG,YAAY,CAAA;CAChC,GAAG,sBAAsB,CA4CzB;AAMD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,sBAAsB,EACrC,cAAc,EAAE,cAAc,GAC5B,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Activity Gradebook (OneRoster)
3
+ *
4
+ * Write assessment line items and results for activity submissions.
5
+ *
6
+ * Attempt semantics:
7
+ * - `attempt` is the primary identity (1-based) stored in `metadata.attempt`
8
+ * - Results are written via PUT upsert using a deterministic `sourcedId`
9
+ * - Retry detection: if `payload.endedAt` matches an existing result's `scoreDate` (and `metadata.endedAt`),
10
+ * the same attempt number is reused to make retries idempotent
11
+ * - New attempt: if no matching `endedAt` is found, attempt is `max(existingAttempt) + 1`
12
+ *
13
+ * Concurrency note:
14
+ * - Two concurrent "new attempts" for the same (lineItem, student) can race.
15
+ * - We avoid silent overwrites by including `endedAt` in the result `sourcedId` so two distinct submissions
16
+ * never share an identifier even if they compute the same attempt number.
17
+ */
18
+ import type { TimebackClient } from '@timeback/core';
19
+ import type { ValidatedActivityPayload } from './types';
20
+ /**
21
+ * Resolve the attempt number for a gradebook result.
22
+ *
23
+ * - If an existing result has `scoreDate === endedAt` or `metadata.endedAt === endedAt`,
24
+ * return its `metadata.attempt` (retry of the same attempt).
25
+ * - Otherwise, return `max(metadata.attempt) + 1` (new attempt).
26
+ *
27
+ * @param client - Timeback client
28
+ * @param lineItemId - The assessment line item sourcedId
29
+ * @param timebackId - The student's Timeback user sourcedId
30
+ * @param endedAt - The activity end timestamp from the client payload
31
+ * @returns The attempt number to use (1-based)
32
+ */
33
+ export declare function resolveAttemptNumber(client: TimebackClient, lineItemId: string, timebackId: string, endedAt: string): Promise<number>;
34
+ /**
35
+ * Write gradebook entry (assessment line item + result) for an activity.
36
+ *
37
+ * This is best-effort: if the write fails, we log and continue.
38
+ * Gradebook writes are only performed when both totalQuestions and correctQuestions are present.
39
+ *
40
+ * Result identity is based on attempt number:
41
+ * - `resultId = lineItemId:studentId:attempt-N`
42
+ * - Retries of the same attempt (same `endedAt`) reuse the same result ID
43
+ * - New attempts get an incremented attempt number
44
+ *
45
+ * @param params - Gradebook write parameters
46
+ */
47
+ export declare function writeGradebookEntry(params: {
48
+ client: TimebackClient;
49
+ courseId: string;
50
+ activityId: string;
51
+ activityName: string;
52
+ timebackId: string;
53
+ payload: ValidatedActivityPayload;
54
+ appName: string;
55
+ }): Promise<void>;
56
+ //# sourceMappingURL=gradebook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradebook.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/gradebook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAkEvD;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAyMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,wBAAwB,CAAA;IACjC,OAAO,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhB"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Activity Handler
3
+ *
4
+ * HTTP route handler for activity submissions.
5
+ * Orchestrates validation, user resolution, gradebook writes, and Caliper event sending.
6
+ */
7
+ import type { ActivityHandler, ActivityHandlerConfig } from './types';
8
+ /**
9
+ * Create the activity POST handler.
10
+ *
11
+ * @param config - Handler configuration
12
+ * @returns The activity request handler
13
+ */
14
+ export declare function createActivityHandler(config: ActivityHandlerConfig): ActivityHandler;
15
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAoB,MAAM,SAAS,CAAA;AAmFvF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAuGpF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Activity Handler
3
+ *
4
+ * Route handler for activity tracking and submission.
5
+ */
6
+ export { createActivityHandler } from './handler';
7
+ export { buildActivityContext, buildActivityMetrics, buildTimeSpentMetrics, InvalidSensorUrlError, MissingSyncedCourseIdError, sendCaliperEnvelope, } from './caliper';
8
+ export type { ActivityHandler, ActivityHandlerConfig, ActivityUserInfo, ValidatedActivityPayload, ValidationResult, } from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,GACnB,MAAM,WAAW,CAAA;AAElB,YAAY,EACX,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,GAChB,MAAM,SAAS,CAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Activity Course Resolution
3
+ *
4
+ * Resolves course selectors from activity payloads to configured courses.
5
+ */
6
+ import type { ActivityCourseRef } from '../../../shared/types';
7
+ import type { AppConfig } from '../../types';
8
+ /**
9
+ * Error thrown when a course selector cannot be resolved against config.
10
+ */
11
+ export declare class ActivityCourseResolutionError extends Error {
12
+ readonly code: 'unknown_course' | 'ambiguous_course';
13
+ readonly selector: ActivityCourseRef;
14
+ readonly count?: number;
15
+ constructor(code: ActivityCourseResolutionError['code'], selector: ActivityCourseRef, count?: number);
16
+ /**
17
+ * Get a human-readable description of the selector.
18
+ *
19
+ * @returns Human-readable selector description
20
+ */
21
+ get selectorDescription(): string;
22
+ }
23
+ /**
24
+ * Resolve a course config entry from an activity course selector.
25
+ *
26
+ * **Use case:** Activity handler — match the client's course selector
27
+ * to a configured course in `timeback.config.json`.
28
+ *
29
+ * Supports two selector modes:
30
+ * - **subjectGrade**: Match by `(subject, grade)`
31
+ * - **courseCode**: Match by `courseCode`
32
+ *
33
+ * @param courses - Configured courses from `timeback.config.json`
34
+ * @param courseRef - Course selector from the client payload
35
+ * @returns Matched course config entry
36
+ * @throws {ActivityCourseResolutionError} When selector is unknown or ambiguous
37
+ */
38
+ export declare function resolveActivityCourse(courses: AppConfig['courses'], courseRef: ActivityCourseRef): AppConfig['courses'][number];
39
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACvD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CAAA;IACpD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IAEvB,YACC,IAAI,EAAE,6BAA6B,CAAC,MAAM,CAAC,EAC3C,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,CAAC,EAAE,MAAM,EAMd;IAED;;;;OAIG;IACH,IAAI,mBAAmB,IAAI,MAAM,CAKhC;CACD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAC7B,SAAS,EAAE,iBAAiB,GAC1B,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAoB9B"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Activity Handler Schema
3
+ *
4
+ * Zod schemas and validation logic for activity submissions.
5
+ */
6
+ import * as z from 'zod';
7
+ import type { AppConfig, Environment } from '../../types';
8
+ import type { ValidationResult } from './types';
9
+ /** Zod schema for validating activity payloads. */
10
+ export declare const activityPayloadSchema: z.ZodObject<{
11
+ id: z.ZodString;
12
+ name: z.ZodString;
13
+ course: z.ZodUnion<readonly [z.ZodObject<{
14
+ subject: z.ZodEnum<{
15
+ FastMath: "FastMath";
16
+ Language: "Language";
17
+ Math: "Math";
18
+ None: "None";
19
+ Other: "Other";
20
+ Reading: "Reading";
21
+ Science: "Science";
22
+ "Social Studies": "Social Studies";
23
+ Vocabulary: "Vocabulary";
24
+ Writing: "Writing";
25
+ }>;
26
+ grade: z.ZodUnion<readonly [z.ZodLiteral<-1>, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>, z.ZodLiteral<6>, z.ZodLiteral<7>, z.ZodLiteral<8>, z.ZodLiteral<9>, z.ZodLiteral<10>, z.ZodLiteral<11>, z.ZodLiteral<12>, z.ZodLiteral<13>]>;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ code: z.ZodString;
29
+ }, z.core.$strip>]>;
30
+ startedAt: z.ZodISODateTime;
31
+ endedAt: z.ZodISODateTime;
32
+ elapsedMs: z.ZodNumber;
33
+ pausedMs: z.ZodNumber;
34
+ metrics: z.ZodObject<{
35
+ totalQuestions: z.ZodOptional<z.ZodNumber>;
36
+ correctQuestions: z.ZodOptional<z.ZodNumber>;
37
+ xpEarned: z.ZodOptional<z.ZodNumber>;
38
+ masteredUnits: z.ZodOptional<z.ZodNumber>;
39
+ }, z.core.$strip>;
40
+ attemptNumber: z.ZodOptional<z.ZodNumber>;
41
+ pctCompleteApp: z.ZodPipe<z.ZodOptional<z.ZodNumber>, z.ZodTransform<number | undefined, number | undefined>>;
42
+ }, z.core.$strip>;
43
+ /**
44
+ * Validate the activity request body and resolve config dependencies.
45
+ *
46
+ * @param body - Raw request body
47
+ * @param appConfig - App configuration
48
+ * @param env - Environment
49
+ * @returns Validated data or error response
50
+ */
51
+ export declare function validateActivityRequest(body: unknown, appConfig: AppConfig, env: Environment): ValidationResult;
52
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAUxB,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AA0C/C,mDAAmD;AACnD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAchC,CAAA;AAmBF;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,WAAW,GACd,gBAAgB,CAoElB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Activity Handler Types
3
+ *
4
+ * Feature-local types for the activity submission flow.
5
+ */
6
+ import type { ActivityCourseRef } from '../../../shared/types';
7
+ import type { ApiCredentials, AppConfig, Environment, IdentityConfig, TimebackConfig } from '../../types';
8
+ /** User identity info needed for activity submission. */
9
+ export interface ActivityUserInfo {
10
+ email: string;
11
+ /** Timeback ID if already resolved (SSO mode). When present, skip lookup. */
12
+ timebackId?: string;
13
+ }
14
+ /** Validated activity payload ready for submission. */
15
+ export interface ValidatedActivityPayload {
16
+ id: string;
17
+ name: string;
18
+ course: ActivityCourseRef;
19
+ startedAt: string;
20
+ endedAt: string;
21
+ elapsedMs: number;
22
+ pausedMs: number;
23
+ metrics: {
24
+ totalQuestions?: number;
25
+ correctQuestions?: number;
26
+ xpEarned?: number;
27
+ masteredUnits?: number;
28
+ };
29
+ attemptNumber?: number;
30
+ pctCompleteApp?: number;
31
+ }
32
+ /** Result of request validation - either valid data or an error response. */
33
+ export type ValidationResult = {
34
+ ok: true;
35
+ payload: ValidatedActivityPayload;
36
+ course: AppConfig['courses'][number];
37
+ sensor: string;
38
+ } | {
39
+ ok: false;
40
+ response: Response;
41
+ };
42
+ /** Configuration for the activity handler. */
43
+ export interface ActivityHandlerConfig {
44
+ env: Environment;
45
+ identity: IdentityConfig;
46
+ appConfig: AppConfig;
47
+ api: ApiCredentials;
48
+ hooks?: TimebackConfig['hooks'];
49
+ }
50
+ /** Activity handler type. */
51
+ export type ActivityHandler = (req: Request) => Promise<Response>;
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,KAAK,EACX,cAAc,EACd,SAAS,EACT,WAAW,EACX,cAAc,EACd,cAAc,EACd,MAAM,aAAa,CAAA;AAMpB,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,iBAAiB,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,aAAa,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;CACvB;AAMD,6EAA6E;AAC7E,MAAM,MAAM,gBAAgB,GACzB;IACA,EAAE,EAAE,IAAI,CAAA;IACR,OAAO,EAAE,wBAAwB,CAAA;IACjC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;CACb,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAA;AAMpC,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACrC,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAC/B;AAED,6BAA6B;AAC7B,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Identity Handlers (full SDK)
3
+ *
4
+ * This module includes Timeback user resolution and therefore depends on Timeback API access.
5
+ */
6
+ import type { IdentityHandlerParams, IdentityHandlers } from './types';
7
+ /**
8
+ * Create identity route handlers (full SDK).
9
+ *
10
+ * @param params - Handler configuration
11
+ * @returns Identity handlers
12
+ */
13
+ export declare function createIdentityHandlers<TState = unknown>(params: IdentityHandlerParams<TState>): IdentityHandlers;
14
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEtE;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAG,OAAO,EACtD,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,GACnC,gBAAgB,CAQlB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Identity Handler (full SDK)
3
+ *
4
+ * Route handlers for SSO authentication with Timeback user resolution.
5
+ */
6
+ export { createIdentityHandlers } from './handler';
7
+ export type { IdentityHandlerParams, IdentityHandlers } from './types';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Identity OIDC Flow
3
+ *
4
+ * Sign-in, callback, and token exchange for SSO authentication.
5
+ * This is the full SDK version that resolves Timeback users.
6
+ */
7
+ import type { Environment, IdentityConfig } from '../../types';
8
+ import type { IdentityHandlerParams } from './types';
9
+ /**
10
+ * Handle sign-in request.
11
+ *
12
+ * @param req - Incoming request
13
+ * @param env - Environment configuration
14
+ * @param identity - Identity configuration
15
+ * @returns Redirect response to IdP
16
+ */
17
+ export declare function handleSignIn<TState>(req: Request, env: Environment, identity: IdentityConfig<TState>): Promise<Response>;
18
+ /**
19
+ * Exchange code for tokens and complete SSO flow (full SDK).
20
+ *
21
+ * @param code - Authorization code
22
+ * @param url - Callback URL
23
+ * @param state - Decoded state (if provided)
24
+ * @param req - Incoming request
25
+ * @param env - Environment configuration
26
+ * @param identity - SSO identity configuration
27
+ * @param api - Timeback API provider (credentials + shared client getter)
28
+ * @returns Success or error response
29
+ */
30
+ export declare function completeCallback<TState>(code: string, url: URL, state: TState | undefined, req: Request, env: Environment, identity: IdentityConfig<TState> & {
31
+ mode: 'sso';
32
+ }, api: IdentityHandlerParams<TState>['api']): Promise<Response>;
33
+ /**
34
+ * Handle callback request.
35
+ *
36
+ * @param req - Incoming request
37
+ * @param env - Environment configuration
38
+ * @param identity - Identity configuration
39
+ * @param api - Timeback API provider (credentials + shared client getter)
40
+ * @returns Response from callback handler
41
+ */
42
+ export declare function handleCallback<TState>(req: Request, env: Environment, identity: IdentityConfig<TState>, api: IdentityHandlerParams<TState>['api']): Promise<Response>;
43
+ //# sourceMappingURL=oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity/oidc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,OAAO,KAAK,EAA0B,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACtF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAMpD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,MAAM,EACxC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAC5C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,EAClD,GAAG,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GACvC,OAAO,CAAC,QAAQ,CAAC,CA0DnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAC1C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,EAChC,GAAG,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GACvC,OAAO,CAAC,QAAQ,CAAC,CAiBnB"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Identity Handler Types (full SDK)
3
+ *
4
+ * Feature-local types for the identity/SSO handlers.
5
+ */
6
+ import type { TimebackClient } from '@timeback/core';
7
+ import type { ApiCredentials, CallbackErrorContext, CallbackSuccessContext, Environment, IdentityConfig, SsoIdentityConfig } from '../../types';
8
+ /** Configuration for identity handlers (full SDK). */
9
+ export interface IdentityHandlerParams<TState = unknown> {
10
+ env: Environment;
11
+ identity: IdentityConfig<TState>;
12
+ api: {
13
+ credentials: ApiCredentials;
14
+ getClient: () => TimebackClient;
15
+ };
16
+ }
17
+ /** Identity handlers returned by createIdentityHandlers. */
18
+ export interface IdentityHandlers {
19
+ signIn: (req: Request) => Promise<Response>;
20
+ callback: (req: Request) => Promise<Response>;
21
+ signOut: () => Response;
22
+ }
23
+ export type { CallbackErrorContext, CallbackSuccessContext, Environment, IdentityConfig, SsoIdentityConfig, };
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EACX,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,MAAM,aAAa,CAAA;AAEpB,sDAAsD;AACtD,MAAM,WAAW,qBAAqB,CAAC,MAAM,GAAG,OAAO;IACtD,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IAChC,GAAG,EAAE;QACJ,WAAW,EAAE,cAAc,CAAA;QAC3B,SAAS,EAAE,MAAM,cAAc,CAAA;KAC/B,CAAA;CACD;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7C,OAAO,EAAE,MAAM,QAAQ,CAAA;CACvB;AAGD,YAAY,EACX,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,iBAAiB,GACjB,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Identity-Only Handlers
3
+ *
4
+ * This module is intentionally minimal and does NOT import Timeback API client code.
5
+ * It is safe to include in edge runtimes (e.g. Cloudflare Workers / workerd).
6
+ */
7
+ import type { IdentityOnlyHandlerParams, IdentityOnlyHandlers } from './types';
8
+ /**
9
+ * Create identity route handlers (identity-only mode).
10
+ *
11
+ * @param params - Handler configuration
12
+ * @returns Identity-only handlers
13
+ */
14
+ export declare function createIdentityOnlyHandlers<TState = unknown>(params: IdentityOnlyHandlerParams<TState>): IdentityOnlyHandlers;
15
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity-only/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE9E;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,GAAG,OAAO,EAC1D,MAAM,EAAE,yBAAyB,CAAC,MAAM,CAAC,GACvC,oBAAoB,CAYtB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Identity-Only Handler
3
+ *
4
+ * Route handlers for SSO authentication without Timeback user resolution (edge-safe).
5
+ */
6
+ export { createIdentityOnlyHandlers } from './handler';
7
+ export type { IdentityOnlyHandlerParams, IdentityOnlyHandlers } from './types';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity-only/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA;AACtD,YAAY,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Identity-Only OIDC Flow
3
+ *
4
+ * Sign-in, callback, and token exchange for SSO authentication (edge-safe).
5
+ * This module is intentionally minimal and does NOT import Timeback API client code.
6
+ */
7
+ import type { Environment, IdentityOnlyCallbackSuccessContext, SsoIdentityConfig } from '../../types';
8
+ /**
9
+ * Handle sign-in request.
10
+ *
11
+ * @param req - Incoming request
12
+ * @param env - Environment configuration
13
+ * @param identity - Identity-only SSO configuration
14
+ * @returns Redirect response to IdP
15
+ */
16
+ export declare function handleSignIn<TState>(req: Request, env: Environment, identity: SsoIdentityConfig<TState, IdentityOnlyCallbackSuccessContext<TState>>): Promise<Response>;
17
+ /**
18
+ * Handle callback request for identity-only mode.
19
+ *
20
+ * @param req - Incoming request
21
+ * @param env - Environment configuration
22
+ * @param identity - Identity-only SSO configuration
23
+ * @returns Response from callback handler
24
+ */
25
+ export declare function handleCallback<TState>(req: Request, env: Environment, identity: SsoIdentityConfig<TState, IdentityOnlyCallbackSuccessContext<TState>>): Promise<Response>;
26
+ //# sourceMappingURL=oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity-only/oidc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,KAAK,EACX,WAAW,EACX,kCAAkC,EAClC,iBAAiB,EACjB,MAAM,aAAa,CAAA;AAMpB;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,MAAM,EACxC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,iBAAiB,CAAC,MAAM,EAAE,kCAAkC,CAAC,MAAM,CAAC,CAAC,GAC7E,OAAO,CAAC,QAAQ,CAAC,CASnB;AA4ED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAC1C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,iBAAiB,CAAC,MAAM,EAAE,kCAAkC,CAAC,MAAM,CAAC,CAAC,GAC7E,OAAO,CAAC,QAAQ,CAAC,CAYnB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Identity-Only Handler Types
3
+ *
4
+ * Feature-local types for identity-only SSO handlers (edge-safe).
5
+ */
6
+ import type { CallbackErrorContext, Environment, IdentityOnlyCallbackSuccessContext, SsoIdentityConfig } from '../../types';
7
+ /** Configuration for identity-only handlers. */
8
+ export interface IdentityOnlyHandlerParams<TState = unknown> {
9
+ env: Environment;
10
+ identity: SsoIdentityConfig<TState, IdentityOnlyCallbackSuccessContext<TState>>;
11
+ }
12
+ /** Identity-only handlers returned by createIdentityOnlyHandlers. */
13
+ export interface IdentityOnlyHandlers {
14
+ signIn: (req: Request) => Promise<Response>;
15
+ callback: (req: Request) => Promise<Response>;
16
+ signOut: () => Response;
17
+ }
18
+ export type { CallbackErrorContext, Environment, IdentityOnlyCallbackSuccessContext, SsoIdentityConfig, };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity-only/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACX,oBAAoB,EACpB,WAAW,EACX,kCAAkC,EAClC,iBAAiB,EACjB,MAAM,aAAa,CAAA;AAEpB,gDAAgD;AAChD,MAAM,WAAW,yBAAyB,CAAC,MAAM,GAAG,OAAO;IAC1D,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,iBAAiB,CAAC,MAAM,EAAE,kCAAkC,CAAC,MAAM,CAAC,CAAC,CAAA;CAC/E;AAED,qEAAqE;AACrE,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7C,OAAO,EAAE,MAAM,QAAQ,CAAA;CACvB;AAGD,YAAY,EACX,oBAAoB,EACpB,WAAW,EACX,kCAAkC,EAClC,iBAAiB,GACjB,CAAA"}
@@ -3,7 +3,10 @@
3
3
  *
4
4
  * Route handlers for Timeback server operations.
5
5
  */
6
- export { createIdentityHandlers } from './identity-full';
7
6
  export { createActivityHandler } from './activity';
8
- export { createUserHandler } from './user';
7
+ export { createIdentityHandlers } from './identity';
8
+ export { createUserHandler, createUserVerifyHandler } from './user';
9
+ export type { ActivityHandler, ActivityHandlerConfig } from './activity';
10
+ export type { IdentityHandlerParams, IdentityHandlers } from './identity';
11
+ export type { UserHandler, UserHandlerConfig, UserVerifyHandler, UserVerifyHandlerConfig } from './user';
9
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAEnE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACxE,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA"}
@@ -1,4 +1,9 @@
1
- import type { AppConfig } from '../types';
1
+ /**
2
+ * User Enrollment Utilities
3
+ *
4
+ * Helpers for processing enrollments and building profile data.
5
+ */
6
+ import type { AppConfig } from '../../types';
2
7
  type EnrollmentGoals = NonNullable<AppConfig['courses'][number]['metadata']>['goals'];
3
8
  type EnrollmentLike = {
4
9
  course: {
@@ -59,4 +64,4 @@ export declare function getUtcDayRange(date: Date): {
59
64
  */
60
65
  export declare function sumXp(facts: ActivityFacts): number;
61
66
  export {};
62
- //# sourceMappingURL=build-user-profile.d.ts.map
67
+ //# sourceMappingURL=enrollments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrollments.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/enrollments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,KAAK,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AAErF,KAAK,cAAc,GAAG;IACrB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,eAAe,CAAA;KAAE,CAAA;CACtC,CAAA;AAED,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAAC,CAAA;AAEhG;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAC7B,MAAM,EAAE,SAAS,GAAG,YAAY,GAC9B,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAW3C;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,WAAW,EAAE,cAAc,EAAE,EAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GACnD,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUnD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACvC,WAAW,EAAE,cAAc,EAAE,GAC3B,eAAe,GAAG,SAAS,CAE7B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAQrE;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CASlD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * User Handler
3
+ *
4
+ * HTTP route handler for user profile data.
5
+ */
6
+ import type { UserHandler, UserHandlerConfig } from './types';
7
+ /**
8
+ * Create the user profile handler.
9
+ *
10
+ * Returns the current user's profile, including identity and enriched data
11
+ * from the Timeback API.
12
+ *
13
+ * @param config - Handler configuration
14
+ * @returns The user profile request handler
15
+ */
16
+ export declare function createUserHandler(config: UserHandlerConfig): UserHandler;
17
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AA6C7D;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAiDxE"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * User Handler
3
+ *
4
+ * Route handler for user profile data.
5
+ */
6
+ export { createUserHandler } from './handler';
7
+ export { createUserVerifyHandler } from './verify';
8
+ export { buildUserProfile } from './profile';
9
+ export type { ResolvedUser, UserHandler, UserHandlerConfig, UserVerifyHandler, UserVerifyHandlerConfig, } from './types';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EACX,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,GACvB,MAAM,SAAS,CAAA"}