@timeback/sdk 0.1.8 → 0.1.10

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 (159) hide show
  1. package/README.md +6 -6
  2. package/dist/chunk-3mqpr9vx.js +2 -0
  3. package/dist/chunk-92nnwa7t.js +2 -0
  4. package/dist/{chunk-ewsp6v3b.js → chunk-af3xwwsv.js} +5 -5
  5. package/dist/{chunk-07j8zre9.js → chunk-b8649tw4.js} +1 -1
  6. package/dist/{chunk-3886xy48.js → chunk-bd09q1fw.js} +6 -6
  7. package/dist/chunk-js665z11.js +1 -0
  8. package/dist/chunk-nsr7a2dv.js +2 -0
  9. package/dist/chunk-sgcwg4j6.js +1 -0
  10. package/dist/{chunk-9se82640.js → chunk-txwjkpfz.js} +1 -1
  11. package/dist/client/adapters/react/hooks/types.d.ts +34 -27
  12. package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
  13. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts +17 -5
  14. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
  15. package/dist/client/adapters/react/index.d.ts +1 -1
  16. package/dist/client/adapters/react/index.d.ts.map +1 -1
  17. package/dist/client/adapters/react/index.js +2 -2
  18. package/dist/client/adapters/react/provider.d.ts.map +1 -1
  19. package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts +3 -1
  20. package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts.map +1 -1
  21. package/dist/client/adapters/solid/primitives/createTimebackVerification.ts +55 -15
  22. package/dist/client/adapters/solid/types.d.ts +25 -29
  23. package/dist/client/adapters/solid/types.d.ts.map +1 -1
  24. package/dist/client/adapters/solid/types.ts +27 -18
  25. package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -1
  26. package/dist/client/adapters/svelte/stores/client.ts +2 -9
  27. package/dist/client/adapters/svelte/stores/profile.d.ts +1 -1
  28. package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -1
  29. package/dist/client/adapters/svelte/stores/profile.ts +4 -11
  30. package/dist/client/adapters/svelte/stores/verification.d.ts +1 -1
  31. package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -1
  32. package/dist/client/adapters/svelte/stores/verification.ts +90 -17
  33. package/dist/client/adapters/svelte/types.d.ts +1 -29
  34. package/dist/client/adapters/svelte/types.d.ts.map +1 -1
  35. package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts +3 -1
  36. package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts.map +1 -1
  37. package/dist/client/adapters/vue/composables/useTimebackVerification.ts +59 -18
  38. package/dist/client/adapters/vue/provider.d.ts.map +1 -1
  39. package/dist/client/adapters/vue/provider.ts +4 -11
  40. package/dist/client/adapters/vue/types.d.ts +25 -29
  41. package/dist/client/adapters/vue/types.d.ts.map +1 -1
  42. package/dist/client/adapters/vue/types.ts +27 -18
  43. package/dist/client/auth/types.d.ts +1 -1
  44. package/dist/client/index.d.ts +1 -1
  45. package/dist/client/lib/activity/activity.class.d.ts +130 -22
  46. package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
  47. package/dist/client/lib/activity/transport.d.ts +15 -0
  48. package/dist/client/lib/activity/transport.d.ts.map +1 -0
  49. package/dist/client/lib/activity/types.d.ts +53 -0
  50. package/dist/client/lib/activity/types.d.ts.map +1 -0
  51. package/dist/client/lib/utils.d.ts +33 -0
  52. package/dist/client/lib/utils.d.ts.map +1 -1
  53. package/dist/client/lib/utils.ts +109 -0
  54. package/dist/client/namespaces/activity.d.ts +45 -6
  55. package/dist/client/namespaces/activity.d.ts.map +1 -1
  56. package/dist/client/timeback-client.class.d.ts +7 -1
  57. package/dist/client/timeback-client.class.d.ts.map +1 -1
  58. package/dist/client.d.ts +1 -1
  59. package/dist/client.js +1 -1
  60. package/dist/edge.js +1 -1
  61. package/dist/identity.js +1 -1
  62. package/dist/index.d.ts +3 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +22 -22
  65. package/dist/server/adapters/express.d.ts.map +1 -1
  66. package/dist/server/adapters/express.js +1 -1
  67. package/dist/server/adapters/native.d.ts.map +1 -1
  68. package/dist/server/adapters/native.js +1 -1
  69. package/dist/server/adapters/nextjs.js +1 -1
  70. package/dist/server/adapters/nuxt.d.ts.map +1 -1
  71. package/dist/server/adapters/nuxt.js +1 -1
  72. package/dist/server/adapters/solid-start.d.ts.map +1 -1
  73. package/dist/server/adapters/solid-start.js +1 -1
  74. package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
  75. package/dist/server/adapters/svelte-kit.js +1 -1
  76. package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
  77. package/dist/server/adapters/tanstack-start.js +1 -1
  78. package/dist/server/adapters/utils.d.ts +1 -1
  79. package/dist/server/adapters/utils.d.ts.map +1 -1
  80. package/dist/server/handlers/activity/caliper.d.ts +50 -14
  81. package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
  82. package/dist/server/handlers/activity/heartbeat-handler.d.ts +15 -0
  83. package/dist/server/handlers/activity/heartbeat-handler.d.ts.map +1 -0
  84. package/dist/server/handlers/activity/index.d.ts +5 -3
  85. package/dist/server/handlers/activity/index.d.ts.map +1 -1
  86. package/dist/server/handlers/activity/progress.d.ts +2 -2
  87. package/dist/server/handlers/activity/progress.d.ts.map +1 -1
  88. package/dist/server/handlers/activity/schema.d.ts +40 -6
  89. package/dist/server/handlers/activity/schema.d.ts.map +1 -1
  90. package/dist/server/handlers/activity/submit-handler.d.ts +29 -0
  91. package/dist/server/handlers/activity/submit-handler.d.ts.map +1 -0
  92. package/dist/server/handlers/activity/submit.d.ts +44 -0
  93. package/dist/server/handlers/activity/submit.d.ts.map +1 -0
  94. package/dist/server/handlers/activity/types.d.ts +126 -5
  95. package/dist/server/handlers/activity/types.d.ts.map +1 -1
  96. package/dist/server/handlers/identity/handler.d.ts +23 -4
  97. package/dist/server/handlers/identity/handler.d.ts.map +1 -1
  98. package/dist/server/handlers/identity/index.d.ts +2 -2
  99. package/dist/server/handlers/identity/index.d.ts.map +1 -1
  100. package/dist/server/handlers/identity/oidc.d.ts.map +1 -1
  101. package/dist/server/handlers/identity/types.d.ts +0 -6
  102. package/dist/server/handlers/identity/types.d.ts.map +1 -1
  103. package/dist/server/handlers/index.d.ts +3 -3
  104. package/dist/server/handlers/index.d.ts.map +1 -1
  105. package/dist/server/handlers/user/handler.d.ts.map +1 -1
  106. package/dist/server/handlers/user/profile.d.ts.map +1 -1
  107. package/dist/server/handlers/user/types.d.ts +3 -0
  108. package/dist/server/handlers/user/types.d.ts.map +1 -1
  109. package/dist/server/handlers/user/verify.d.ts.map +1 -1
  110. package/dist/server/index.d.ts +1 -1
  111. package/dist/server/index.d.ts.map +1 -1
  112. package/dist/server/lib/hooks.d.ts +20 -0
  113. package/dist/server/lib/hooks.d.ts.map +1 -0
  114. package/dist/server/lib/index.d.ts +4 -2
  115. package/dist/server/lib/index.d.ts.map +1 -1
  116. package/dist/server/lib/logger.d.ts +36 -9
  117. package/dist/server/lib/logger.d.ts.map +1 -1
  118. package/dist/server/lib/resolve.d.ts +1 -1
  119. package/dist/server/lib/resolve.d.ts.map +1 -1
  120. package/dist/server/lib/utils.d.ts +19 -1
  121. package/dist/server/lib/utils.d.ts.map +1 -1
  122. package/dist/server/lib/validation.d.ts +55 -0
  123. package/dist/server/lib/validation.d.ts.map +1 -0
  124. package/dist/server/namespaces/activity/index.d.ts +8 -0
  125. package/dist/server/namespaces/activity/index.d.ts.map +1 -0
  126. package/dist/server/namespaces/activity/record.d.ts +49 -0
  127. package/dist/server/namespaces/activity/record.d.ts.map +1 -0
  128. package/dist/server/namespaces/activity/schema.d.ts +50 -0
  129. package/dist/server/namespaces/activity/schema.d.ts.map +1 -0
  130. package/dist/server/namespaces/user/get-profile.d.ts +32 -0
  131. package/dist/server/namespaces/user/get-profile.d.ts.map +1 -0
  132. package/dist/server/namespaces/user/index.d.ts +8 -0
  133. package/dist/server/namespaces/user/index.d.ts.map +1 -0
  134. package/dist/server/namespaces/user/verify.d.ts +28 -0
  135. package/dist/server/namespaces/user/verify.d.ts.map +1 -0
  136. package/dist/server/timeback.d.ts +3 -3
  137. package/dist/server/timeback.d.ts.map +1 -1
  138. package/dist/server/types.d.ts +394 -12
  139. package/dist/server/types.d.ts.map +1 -1
  140. package/dist/shared/constants.d.ts +20 -0
  141. package/dist/shared/constants.d.ts.map +1 -1
  142. package/dist/shared/constants.ts +51 -0
  143. package/dist/shared/index.d.ts +9 -0
  144. package/dist/shared/index.d.ts.map +1 -0
  145. package/dist/shared/schemas.d.ts +57 -0
  146. package/dist/shared/schemas.d.ts.map +1 -0
  147. package/dist/shared/types.d.ts +263 -10
  148. package/dist/shared/types.d.ts.map +1 -1
  149. package/dist/shared/types.ts +620 -0
  150. package/package.json +5 -5
  151. package/dist/chunk-ahy54f2r.js +0 -2
  152. package/dist/chunk-j1xdrfqj.js +0 -2
  153. package/dist/chunk-qaa129bd.js +0 -2
  154. package/dist/chunk-qr0bbnsr.js +0 -1
  155. package/dist/chunk-rgbpvxbv.js +0 -1
  156. package/dist/server/handlers/activity/handler.d.ts +0 -32
  157. package/dist/server/handlers/activity/handler.d.ts.map +0 -1
  158. package/dist/shared/xp-calculator.d.ts +0 -25
  159. package/dist/shared/xp-calculator.d.ts.map +0 -1
@@ -3,23 +3,50 @@
3
3
  *
4
4
  * Feature-local types for the activity submission flow.
5
5
  */
6
+ import type { ActivityCompletedEvent, TimebackActivityContext } from '@timeback/caliper';
7
+ import type { TimebackClient } from '@timeback/core';
6
8
  import type { ActivityCourseRef } from '../../../shared/types';
7
9
  import type { ApiCredentials, AppConfig, Environment, IdentityConfig, TimebackConfig } from '../../types';
10
+ import type { maybeWriteCompletionEntry } from './completion';
11
+ import type { computeProgress } from './progress';
8
12
  /** User identity info needed for activity submission. */
9
13
  export interface ActivityUserInfo {
10
14
  email: string;
11
15
  /** Timeback ID if already resolved (SSO mode). When present, skip lookup. */
12
16
  timebackId?: string;
13
17
  }
14
- /** Validated activity payload ready for submission. */
15
- export interface ValidatedActivityPayload {
18
+ /** Validated completion payload for activity submission. */
19
+ export interface CompletionPayload {
16
20
  id: string;
17
21
  name: string;
18
22
  course: ActivityCourseRef;
23
+ endedAt: string;
24
+ metrics: {
25
+ totalQuestions?: number;
26
+ correctQuestions?: number;
27
+ xpEarned?: number;
28
+ masteredUnits?: number;
29
+ };
30
+ pctComplete?: number;
31
+ }
32
+ /** Validated heartbeat payload for time-spent tracking. */
33
+ export interface ValidatedHeartbeatPayload {
34
+ id: string;
35
+ name: string;
36
+ course: ActivityCourseRef;
37
+ runId: string;
19
38
  startedAt: string;
20
39
  endedAt: string;
21
40
  elapsedMs: number;
22
41
  pausedMs: number;
42
+ }
43
+ /** Validated submit payload for activity completion. */
44
+ export interface ValidatedSubmitPayload {
45
+ id: string;
46
+ name: string;
47
+ course: ActivityCourseRef;
48
+ runId: string;
49
+ endedAt: string;
23
50
  metrics: {
24
51
  totalQuestions?: number;
25
52
  correctQuestions?: number;
@@ -28,10 +55,20 @@ export interface ValidatedActivityPayload {
28
55
  };
29
56
  pctComplete?: number;
30
57
  }
31
- /** Result of request validation - either valid data or an error response. */
32
- export type ValidationResult = {
58
+ /** Result of heartbeat validation. */
59
+ export type HeartbeatValidationResult = {
33
60
  ok: true;
34
- payload: ValidatedActivityPayload;
61
+ payload: ValidatedHeartbeatPayload;
62
+ course: AppConfig['courses'][number];
63
+ sensor: string;
64
+ } | {
65
+ ok: false;
66
+ response: Response;
67
+ };
68
+ /** Result of submit validation. */
69
+ export type SubmitValidationResult = {
70
+ ok: true;
71
+ payload: ValidatedSubmitPayload;
35
72
  course: AppConfig['courses'][number];
36
73
  sensor: string;
37
74
  } | {
@@ -44,8 +81,92 @@ export interface ActivityHandlerConfig {
44
81
  identity: IdentityConfig;
45
82
  appConfig: AppConfig;
46
83
  api: ApiCredentials;
84
+ getClient: () => TimebackClient;
47
85
  hooks?: TimebackConfig['hooks'];
48
86
  }
49
87
  /** Activity handler type. */
50
88
  export type ActivityHandler = (req: Request) => Promise<Response>;
89
+ /**
90
+ * Configuration for activity completion recording.
91
+ */
92
+ export interface CompletionConfig {
93
+ /** Environment (local, staging, production) */
94
+ env: Environment;
95
+ /** API credentials */
96
+ api: ApiCredentials;
97
+ /** App configuration */
98
+ appConfig: AppConfig;
99
+ /** Get the shared Timeback API client. */
100
+ getClient: () => TimebackClient;
101
+ /** Optional hooks */
102
+ hooks?: TimebackConfig['hooks'];
103
+ }
104
+ /**
105
+ * Options for recording an activity completion.
106
+ */
107
+ export interface CompletionOptions {
108
+ /** User info (email + optional timebackId) */
109
+ userInfo: ActivityUserInfo;
110
+ /** Validated completion payload */
111
+ payload: CompletionPayload;
112
+ /** Resolved course from config */
113
+ course: AppConfig['courses'][number];
114
+ /** Resolved sensor URL */
115
+ sensor: string;
116
+ /** Whether to skip sending (preview mode) */
117
+ preview?: boolean;
118
+ /** Optional correlation ID linking to client-side heartbeats */
119
+ runId?: string;
120
+ }
121
+ /**
122
+ * Result of recording an activity completion.
123
+ */
124
+ export interface CompletionResult {
125
+ success: true;
126
+ preview?: boolean;
127
+ sensor?: string;
128
+ actor?: {
129
+ id: string;
130
+ type: 'TimebackUser';
131
+ email: string;
132
+ };
133
+ object?: TimebackActivityContext;
134
+ event?: ActivityCompletedEvent;
135
+ }
136
+ /**
137
+ * Options for sending a time-spent event.
138
+ */
139
+ export interface TimeSpentOptions {
140
+ /** User info (email + optional timebackId) */
141
+ userInfo: ActivityUserInfo;
142
+ /** Time-spent payload */
143
+ payload: {
144
+ id: string;
145
+ name: string;
146
+ course: ActivityCourseRef;
147
+ startedAt: string;
148
+ endedAt: string;
149
+ elapsedMs: number;
150
+ pausedMs: number;
151
+ };
152
+ /** Resolved course from config */
153
+ course: AppConfig['courses'][number];
154
+ /** Resolved sensor URL */
155
+ sensor: string;
156
+ /** Correlation ID linking to client-side heartbeats */
157
+ runId?: string;
158
+ }
159
+ /**
160
+ * Internal dependencies for activity completion.
161
+ *
162
+ * This interface enables unit tests to inject mock implementations of
163
+ * computeProgress and maybeWriteCompletionEntry without mocking the entire
164
+ * TimebackClient.
165
+ *
166
+ * Not part of the public API - only exposed for testing purposes.
167
+ */
168
+ export interface CompletionDeps {
169
+ computeProgress: typeof computeProgress;
170
+ maybeWriteCompletionEntry: typeof maybeWriteCompletionEntry;
171
+ }
51
172
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,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;AACpB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAMjD,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,iBAAiB,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,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,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,yBAAyB;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,iBAAiB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,iBAAiB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,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,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB;AAMD,sCAAsC;AACtC,MAAM,MAAM,yBAAyB,GAClC;IACA,EAAE,EAAE,IAAI,CAAA;IACR,OAAO,EAAE,yBAAyB,CAAA;IAClC,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;AAEpC,mCAAmC;AACnC,MAAM,MAAM,sBAAsB,GAC/B;IACA,EAAE,EAAE,IAAI,CAAA;IACR,OAAO,EAAE,sBAAsB,CAAA;IAC/B,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,SAAS,EAAE,MAAM,cAAc,CAAA;IAC/B,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;AAMjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,+CAA+C;IAC/C,GAAG,EAAE,WAAW,CAAA;IAChB,sBAAsB;IACtB,GAAG,EAAE,cAAc,CAAA;IACnB,wBAAwB;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,cAAc,CAAA;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,8CAA8C;IAC9C,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,mCAAmC;IACnC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,kCAAkC;IAClC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;IACpC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3D,MAAM,CAAC,EAAE,uBAAuB,CAAA;IAChC,KAAK,CAAC,EAAE,sBAAsB,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,yBAAyB;IACzB,OAAO,EAAE;QACR,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,iBAAiB,CAAA;QACzB,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,kCAAkC;IAClC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;IACpC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC9B,eAAe,EAAE,OAAO,eAAe,CAAA;IACvC,yBAAyB,EAAE,OAAO,yBAAyB,CAAA;CAC3D"}
@@ -3,12 +3,31 @@
3
3
  *
4
4
  * This module includes Timeback user resolution and therefore depends on Timeback API access.
5
5
  */
6
- import type { IdentityHandlerParams, IdentityHandlers } from './types';
6
+ import type { IdentityHandlerParams } from './types';
7
7
  /**
8
- * Create identity route handlers (full SDK).
8
+ * Create the sign-in handler.
9
+ *
10
+ * Initiates the OIDC sign-in flow by redirecting to the identity provider.
11
+ *
12
+ * @param params - Handler configuration
13
+ * @returns Sign-in request handler
14
+ */
15
+ export declare function createSignInHandler<TState = unknown>(params: IdentityHandlerParams<TState>): (req: Request) => Promise<Response>;
16
+ /**
17
+ * Create the OIDC callback handler.
18
+ *
19
+ * Exchanges the authorization code for tokens and resolves the Timeback user.
9
20
  *
10
21
  * @param params - Handler configuration
11
- * @returns Identity handlers
22
+ * @returns Callback request handler
23
+ */
24
+ export declare function createCallbackHandler<TState = unknown>(params: IdentityHandlerParams<TState>): (req: Request) => Promise<Response>;
25
+ /**
26
+ * Create a sign-out handler.
27
+ *
28
+ * Returns a redirect to the root path.
29
+ *
30
+ * @returns Sign-out handler
12
31
  */
13
- export declare function createIdentityHandlers<TState = unknown>(params: IdentityHandlerParams<TState>): IdentityHandlers;
32
+ export declare function createSignOutHandler(): () => Response;
14
33
  //# sourceMappingURL=handler.d.ts.map
@@ -1 +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"}
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,MAAM,SAAS,CAAA;AAEpD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAG,OAAO,EACnD,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,GACnC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAGrC;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAG,OAAO,EACrD,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,GACnC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAGrC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,QAAQ,CAErD"}
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * Route handlers for SSO authentication with Timeback user resolution.
5
5
  */
6
- export { createIdentityHandlers } from './handler';
7
- export type { IdentityHandlerParams, IdentityHandlers } from './types';
6
+ export { createSignInHandler, createCallbackHandler, createSignOutHandler } from './handler';
7
+ export type { IdentityHandlerParams } from './types';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAC5F,YAAY,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA"}
@@ -1 +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"}
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/identity/oidc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,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,CA8DnB;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"}
@@ -14,11 +14,5 @@ export interface IdentityHandlerParams<TState = unknown> {
14
14
  getClient: () => TimebackClient;
15
15
  };
16
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
17
  export type { CallbackErrorContext, CallbackSuccessContext, Environment, IdentityConfig, SsoIdentityConfig, };
24
18
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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"}
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;AAGD,YAAY,EACX,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,iBAAiB,GACjB,CAAA"}
@@ -3,10 +3,10 @@
3
3
  *
4
4
  * Route handlers for Timeback server operations.
5
5
  */
6
- export { createActivityHandler } from './activity';
7
- export { createIdentityHandlers } from './identity';
6
+ export { createHeartbeatHandler, createSubmitHandler } from './activity';
7
+ export { createSignInHandler, createCallbackHandler, createSignOutHandler } from './identity';
8
8
  export { createUserHandler, createUserVerifyHandler } from './user';
9
9
  export type { ActivityHandler, ActivityHandlerConfig } from './activity';
10
- export type { IdentityHandlerParams, IdentityHandlers } from './identity';
10
+ export type { IdentityHandlerParams } from './identity';
11
11
  export type { UserHandler, UserHandlerConfig, UserVerifyHandler, UserVerifyHandlerConfig } from './user';
12
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,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
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAEnE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACxE,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACvD,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA"}
@@ -1 +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"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AA8C7D;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAwCxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAQ5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,SAAS,GAAG,YAAY,GAC9B,OAAO,CAAC,eAAe,CAAC,CAoC1B"}
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,SAAS,GAAG,YAAY,GAC9B,OAAO,CAAC,eAAe,CAAC,CAoC1B"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Feature-local types for the user profile handler.
5
5
  */
6
+ import type { TimebackClient } from '@timeback/core';
6
7
  import type { ApiCredentials, AppConfig, Environment, IdentityConfig } from '../../types';
7
8
  /** Configuration for the user handler. */
8
9
  export interface UserHandlerConfig {
@@ -10,6 +11,7 @@ export interface UserHandlerConfig {
10
11
  identity: IdentityConfig;
11
12
  api: ApiCredentials;
12
13
  appConfig: AppConfig;
14
+ getClient: () => TimebackClient;
13
15
  }
14
16
  /** User handler type. */
15
17
  export type UserHandler = (req: Request) => Promise<Response>;
@@ -18,6 +20,7 @@ export interface UserVerifyHandlerConfig {
18
20
  env: Environment;
19
21
  identity: IdentityConfig;
20
22
  api: ApiCredentials;
23
+ getClient: () => TimebackClient;
21
24
  }
22
25
  /** User verify handler type. */
23
26
  export type UserVerifyHandler = (req: Request) => Promise<Response>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEzF,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;CACpB;AAED,yBAAyB;AACzB,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7D,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;CACnB;AAED,gCAAgC;AAChC,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEnE,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEzF,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,MAAM,cAAc,CAAA;CAC/B;AAED,yBAAyB;AACzB,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7D,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,MAAM,cAAc,CAAA;CAC/B;AAED,gCAAgC;AAChC,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEnE,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;CACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AA0BzE;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,iBAAiB,CA0D1F"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/user/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AA0BzE;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,iBAAiB,CA+C1F"}
@@ -5,5 +5,5 @@
5
5
  */
6
6
  export { createTimeback } from './timeback';
7
7
  export { createTimebackIdentity } from './timeback-identity';
8
- export type { TimebackConfig, TimebackInstance, Environment, EnvironmentInput, ApiCredentials, IdentityConfig, SsoIdentityConfig, CustomIdentityConfig, Handlers, IdentityOnlyConfig, IdentityOnlyInstance, IdentityOnlyHandlers, BuildStateContext, CallbackSuccessContext, IdentityOnlyCallbackSuccessContext, CallbackErrorContext, OIDCTokens, OIDCUserInfo, IdpData, TimebackUserResolutionErrorCode, } from './types';
8
+ export type { TimebackConfig, TimebackInstance, Environment, EnvironmentInput, ApiCredentials, IdentityConfig, SsoIdentityConfig, CustomIdentityConfig, Handlers, ActivityRecordInput, ActivityRecordUserInput, ActivityRecordActivityInput, ActivityRecordMetricsInput, ActivityRecordTimeInput, ActivityNamespace, UserNamespace, IdentityOnlyConfig, IdentityOnlyInstance, IdentityOnlyHandlers, BuildStateContext, CallbackSuccessContext, IdentityOnlyCallbackSuccessContext, CallbackErrorContext, OIDCTokens, OIDCUserInfo, IdpData, ActivityBeforeSendData, TimeSpentBeforeSendData, HandlerName, RequestStartContext, RequestEndContext, TimebackUserResolutionErrorCode, ErrorCode, SdkError, SdkErrorBody, SdkLogger, SdkLogLevel, } from './types';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,YAAY,EAEX,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EAER,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EAEpB,iBAAiB,EACjB,sBAAsB,EACtB,kCAAkC,EAClC,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,OAAO,EAEP,+BAA+B,GAC/B,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,YAAY,EAEX,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EAER,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,iBAAiB,EAEjB,aAAa,EAEb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EAEpB,iBAAiB,EACjB,sBAAsB,EACtB,kCAAkC,EAClC,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,OAAO,EAEP,sBAAsB,EACtB,uBAAuB,EAEvB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EAEjB,+BAA+B,EAC/B,SAAS,EACT,QAAQ,EACR,YAAY,EAEZ,SAAS,EACT,WAAW,GACX,MAAM,SAAS,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Request Lifecycle Hook Utilities
3
+ *
4
+ * Wraps request handlers with optional `onRequestStart` / `onRequestEnd` hooks
5
+ * for timing, tracing, and metrics.
6
+ */
7
+ import type { HandlerName, TimebackConfig } from '../types';
8
+ /**
9
+ * Wrap a request handler with lifecycle hooks.
10
+ *
11
+ * When neither `onRequestStart` nor `onRequestEnd` is configured the original
12
+ * handler is returned as-is (zero overhead).
13
+ *
14
+ * @param handler - Handler name for identification
15
+ * @param hooks - Hook configuration
16
+ * @param fn - The request handler to wrap
17
+ * @returns Wrapped handler
18
+ */
19
+ export declare function withRequestHooks(handler: HandlerName, hooks: TimebackConfig['hooks'], fn: (req: Request) => Promise<Response>): (req: Request) => Promise<Response>;
20
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/server/lib/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAC9B,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GACrC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAyBrC"}
@@ -4,8 +4,10 @@
4
4
  * Shared utilities for the server SDK.
5
5
  */
6
6
  export { getIssuer, buildAuthorizationUrl, exchangeCodeForTokens, getUserInfo } from './oidc';
7
- export { deriveCourseStructureIds, jsonResponse, redirectResponse, encodeBase64Url, decodeBase64Url, mapEnvForApi, normalizeEnv, safeIdSegment, sameInstant, hashSuffix64Base36, sha256Hex, } from './utils';
8
- export { ssoLog, oidcLog, createScopedLogger } from './logger';
7
+ export { deriveCourseStructureIds, jsonResponse, errorResponse, redirectResponse, encodeBase64Url, decodeBase64Url, mapEnvForApi, normalizeEnv, safeIdSegment, sameInstant, hashSuffix64Base36, sha256Hex, } from './utils';
8
+ export { ssoLog, oidcLog, createScopedLogger, configureSdkLogging, resetSdkLogging } from './logger';
9
9
  export { lookupTimebackIdByEmail, resolveStatusForUserResolutionError, resolveTimebackUserByEmail, TimebackUserResolutionError, } from './resolve';
10
10
  export { buildErrorContext, computeRedirectUri, handleIdpError, handleMissingCode, initiateSignIn, parseCallback, tryDecodeState, } from './sso';
11
+ export { refineQuestionMetrics, resolveSensor } from './validation';
12
+ export { withRequestHooks } from './hooks';
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/lib/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAC7F,OAAO,EACN,wBAAwB,EACxB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,GACT,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EACN,uBAAuB,EACvB,mCAAmC,EACnC,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,GACd,MAAM,OAAO,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/lib/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAC7F,OAAO,EACN,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,GACT,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACpG,OAAO,EACN,uBAAuB,EACvB,mCAAmC,EACnC,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,GACd,MAAM,OAAO,CAAA;AACd,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA"}
@@ -1,21 +1,48 @@
1
1
  /**
2
2
  * SDK Logger
3
3
  *
4
- * Debug logging for the Timeback SDK server components.
5
- * Only logs when DEBUG=1 or DEBUG=true is set.
4
+ * Configurable logging for the Timeback SDK server components.
5
+ *
6
+ * All handler modules create loggers at import time:
7
+ *
8
+ * const log = createScopedLogger('handlers:user')
9
+ *
10
+ * These loggers are lazy proxies — each call resolves the effective
11
+ * logger at invocation time, so module-level loggers automatically
12
+ * pick up configuration set later in `createTimeback()`.
13
+ */
14
+ import type { SdkLogger, SdkLogLevel } from '../types';
15
+ /**
16
+ * Configure SDK-wide logging.
17
+ *
18
+ * Called by `createTimeback()` during initialization. Clears the logger cache
19
+ * so all existing proxies pick up the new configuration on their next call.
20
+ *
21
+ * @param options - Logger and level overrides
22
+ */
23
+ export declare function configureSdkLogging(options: {
24
+ logger?: SdkLogger;
25
+ logLevel?: SdkLogLevel;
26
+ }): void;
27
+ /**
28
+ * Reset SDK logging to defaults.
29
+ *
30
+ * Intended for tests that need isolation between runs.
6
31
  */
7
- import type { Logger } from '@timeback/internal-logger';
32
+ export declare function resetSdkLogging(): void;
8
33
  /**
9
34
  * Create a scoped logger for SDK components.
10
35
  *
11
- * Only logs debug/info when DEBUG=1 or DEBUG=true.
36
+ * Returns a lazy proxy each log call resolves the effective logger
37
+ * at invocation time. This allows module-level loggers to pick up
38
+ * configuration set after import.
12
39
  *
13
- * @param scope - Logger scope name (e.g., 'sso', 'oidc')
14
- * @returns Configured logger instance
40
+ * @param scope - Logger scope name (e.g., 'handlers:user', 'resolve')
41
+ * @returns Logger proxy scoped to `timeback:{scope}`
15
42
  */
16
- export declare function createScopedLogger(scope: string): Logger;
43
+ export declare function createScopedLogger(scope: string): SdkLogger;
17
44
  /** Logger for SSO/identity operations */
18
- export declare const ssoLog: Logger;
45
+ export declare const ssoLog: SdkLogger;
19
46
  /** Logger for OIDC protocol operations */
20
- export declare const oidcLog: Logger;
47
+ export declare const oidcLog: SdkLogger;
21
48
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/server/lib/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAgBvD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,yCAAyC;AACzC,eAAO,MAAM,MAAM,QAA4B,CAAA;AAE/C,0CAA0C;AAC1C,eAAO,MAAM,OAAO,QAA6B,CAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/server/lib/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAgGtD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CAIjG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAiB3D;AAED,yCAAyC;AACzC,eAAO,MAAM,MAAM,WAA4B,CAAA;AAE/C,0CAA0C;AAC1C,eAAO,MAAM,OAAO,WAA6B,CAAA"}
@@ -26,7 +26,7 @@ export declare class TimebackUserResolutionError extends Error {
26
26
  * Map a user resolution error to an HTTP status code.
27
27
  *
28
28
  * @param err - Timeback user resolution error
29
- * @returns HTTP status code (409 for ambiguous, 404 otherwise)
29
+ * @returns HTTP status code (409 for ambiguous, 404 for not found, 502 otherwise)
30
30
  */
31
31
  export declare function resolveStatusForUserResolutionError(err: TimebackUserResolutionError): number;
32
32
  interface ResolveTimebackUserByEmailParams {
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/server/lib/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAM/C,OAAO,KAAK,EAAkB,gBAAgB,EAAmB,MAAM,oBAAoB,CAAA;AAC3F,OAAO,KAAK,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,+BAA+B,EAC/B,MAAM,UAAU,CAAA;AAQjB;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAGpC,IAAI,EAAE,+BAA+B;IAFtD,YACC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,+BAA+B,EAIrD;CACD;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,2BAA2B,GAAG,MAAM,CAE5F;AAMD,UAAU,gCAAgC;IACzC,uCAAuC;IACvC,GAAG,EAAE,WAAW,CAAA;IAChB,uCAAuC;IACvC,cAAc,EAAE,cAAc,CAAA;IAC9B,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAA;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;CACvB;AAED,UAAU,6BAA6B;IACtC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,MAAM,EAAE,cAAc,CAAA;CACtB;AA2FD;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC/C,MAAM,EAAE,gCAAgC,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAsD3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC5C,MAAM,EAAE,6BAA6B,GACnC,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/server/lib/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAM/C,OAAO,KAAK,EAAkB,gBAAgB,EAAmB,MAAM,oBAAoB,CAAA;AAC3F,OAAO,KAAK,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,+BAA+B,EAC/B,MAAM,UAAU,CAAA;AAQjB;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAGpC,IAAI,EAAE,+BAA+B;IAFtD,YACC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,+BAA+B,EAIrD;CACD;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,2BAA2B,GAAG,MAAM,CAS5F;AAMD,UAAU,gCAAgC;IACzC,uCAAuC;IACvC,GAAG,EAAE,WAAW,CAAA;IAChB,uCAAuC;IACvC,cAAc,EAAE,cAAc,CAAA;IAC9B,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAA;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;CACvB;AAED,UAAU,6BAA6B;IACtC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,MAAM,EAAE,cAAc,CAAA;CACtB;AA2FD;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC/C,MAAM,EAAE,gCAAgC,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAsD3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC5C,MAAM,EAAE,6BAA6B,GACnC,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Internal utility functions for the server SDK.
5
5
  */
6
- import type { Environment, EnvironmentInput } from '../types';
6
+ import type { Environment, EnvironmentInput, ErrorCode } from '../types';
7
7
  /**
8
8
  * Derived resource IDs for a course structure.
9
9
  */
@@ -118,6 +118,24 @@ export declare function normalizeEnv(env: EnvironmentInput): Environment;
118
118
  * @returns JSON response
119
119
  */
120
120
  export declare function jsonResponse<T>(data: T, status?: number, headers?: HeadersInit): Response;
121
+ /**
122
+ * Create a JSON error response with the standard SDK error shape.
123
+ *
124
+ * All error responses include `success: false` and a structured `error`
125
+ * object with a machine-readable `code` and human-readable `message`.
126
+ *
127
+ * @param code - Machine-readable error code
128
+ * @param message - Human-readable error message
129
+ * @param status - HTTP status code
130
+ * @param options - Additional fields
131
+ * @returns HTTP Response
132
+ */
133
+ export declare function errorResponse(code: ErrorCode, message: string, status: number, options?: {
134
+ /** Additional top-level fields merged into the body (e.g., `{ verified: false }`). */
135
+ fields?: Record<string, unknown>;
136
+ /** Validation details included in the error object. */
137
+ details?: unknown;
138
+ }): Response;
121
139
  /**
122
140
  * Create a redirect response.
123
141
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAM7D;;GAEG;AACH,UAAU,kBAAkB;IAC3B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAO7E;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcxD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAMvE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,WAAW,CAK/D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,SAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAItF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAI7E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAKrD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAMxE;;GAEG;AACH,UAAU,kBAAkB;IAC3B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAO7E;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcxD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAMvE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,WAAW,CAK/D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,SAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAItF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC5B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACT,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB,GACC,QAAQ,CAQV;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAI7E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAKrD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared Validation Utilities
3
+ *
4
+ * Common validation logic used across server schemas.
5
+ */
6
+ import type * as z from 'zod';
7
+ import type { AppConfig, Environment } from '../types';
8
+ /**
9
+ * Refine question metrics to ensure consistency.
10
+ *
11
+ * Validation rules:
12
+ * - `totalQuestions` and `correctQuestions` must be provided together (both or neither)
13
+ * - `correctQuestions` cannot exceed `totalQuestions`
14
+ *
15
+ * @param metrics - The metrics object containing optional question counts
16
+ * @param ctx - Zod refinement context for adding validation issues
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const metricsSchema = z.object({
21
+ * totalQuestions: z.number().int().nonnegative().optional(),
22
+ * correctQuestions: z.number().int().nonnegative().optional(),
23
+ * }).superRefine(refineQuestionMetrics)
24
+ * ```
25
+ */
26
+ export declare function refineQuestionMetrics(metrics: {
27
+ totalQuestions?: number;
28
+ correctQuestions?: number;
29
+ }, ctx: z.RefinementCtx): void;
30
+ /**
31
+ * Resolve the effective sensor URL for a course.
32
+ *
33
+ * The sensor URL identifies where Caliper events should be sent.
34
+ *
35
+ * Resolution order:
36
+ * 1. Environment-specific sensor override: `course.overrides[env].sensor`
37
+ * 2. Course-level sensor: `course.sensor`
38
+ * 3. App-level sensor: `appConfig.sensor`
39
+ * 4. Derived from launchUrl origin (if available)
40
+ *
41
+ * @param appConfig - App configuration from timeback.config.json
42
+ * @param course - Resolved course from config
43
+ * @param env - Environment (local/staging/production)
44
+ * @returns The resolved sensor URL, or undefined if none could be determined
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const sensor = resolveSensor(appConfig, course, env)
49
+ * if (!sensor) {
50
+ * throw new Error('No sensor configured for course')
51
+ * }
52
+ * ```
53
+ */
54
+ export declare function resolveSensor(appConfig: AppConfig, course: AppConfig['courses'][number], env: Environment): string | undefined;
55
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/server/lib/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAA;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/D,GAAG,EAAE,CAAC,CAAC,aAAa,GAClB,IAAI,CAuBN;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC5B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EACpC,GAAG,EAAE,WAAW,GACd,MAAM,GAAG,SAAS,CAqBpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Activity Record
3
+ *
4
+ * Server-side activity recording API.
5
+ */
6
+ export { createActivityRecord, ActivityRecordValidationError, ActivityRecordCourseError, } from './record';
7
+ export { activityRecordInputSchema } from './schema';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/namespaces/activity/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACN,oBAAoB,EACpB,6BAA6B,EAC7B,yBAAyB,GACzB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAA"}