@timeback/sdk 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +612 -0
  2. package/dist/client/adapters/react/SignInButton.d.ts +60 -0
  3. package/dist/client/adapters/react/SignInButton.d.ts.map +1 -0
  4. package/dist/client/adapters/react/index.d.ts +47 -0
  5. package/dist/client/adapters/react/index.d.ts.map +1 -0
  6. package/dist/client/adapters/react/index.js +478 -0
  7. package/dist/client/adapters/react/provider.d.ts +78 -0
  8. package/dist/client/adapters/react/provider.d.ts.map +1 -0
  9. package/dist/client/adapters/solid/SignInButton.d.ts +52 -0
  10. package/dist/client/adapters/solid/SignInButton.d.ts.map +1 -0
  11. package/dist/client/adapters/solid/SignInButton.tsx +321 -0
  12. package/dist/client/adapters/solid/context.d.ts +73 -0
  13. package/dist/client/adapters/solid/context.d.ts.map +1 -0
  14. package/dist/client/adapters/solid/context.tsx +91 -0
  15. package/dist/client/adapters/solid/index.d.ts +46 -0
  16. package/dist/client/adapters/solid/index.d.ts.map +1 -0
  17. package/dist/client/adapters/solid/index.ts +50 -0
  18. package/dist/client/adapters/svelte/SignInButton.svelte +234 -0
  19. package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +24 -0
  20. package/dist/client/adapters/svelte/index.d.ts +37 -0
  21. package/dist/client/adapters/svelte/index.d.ts.map +1 -0
  22. package/dist/client/adapters/svelte/index.ts +42 -0
  23. package/dist/client/adapters/svelte/stores.d.ts +66 -0
  24. package/dist/client/adapters/svelte/stores.d.ts.map +1 -0
  25. package/dist/client/adapters/svelte/stores.ts +143 -0
  26. package/dist/client/adapters/vue/SignInButton.vue +260 -0
  27. package/dist/client/adapters/vue/SignInButton.vue.d.ts +53 -0
  28. package/dist/client/adapters/vue/index.d.ts +43 -0
  29. package/dist/client/adapters/vue/index.d.ts.map +1 -0
  30. package/dist/client/adapters/vue/index.ts +48 -0
  31. package/dist/client/adapters/vue/provider.d.ts +94 -0
  32. package/dist/client/adapters/vue/provider.d.ts.map +1 -0
  33. package/dist/client/adapters/vue/provider.ts +147 -0
  34. package/dist/client/index.d.ts +9 -0
  35. package/dist/client/index.d.ts.map +1 -0
  36. package/dist/client/lib/activity/activity.class.d.ts +73 -0
  37. package/dist/client/lib/activity/activity.class.d.ts.map +1 -0
  38. package/dist/client/lib/activity/activity.d.ts +16 -0
  39. package/dist/client/lib/activity/activity.d.ts.map +1 -0
  40. package/dist/client/lib/activity/index.d.ts +6 -0
  41. package/dist/client/lib/activity/index.d.ts.map +1 -0
  42. package/dist/client/lib/utils.d.ts +20 -0
  43. package/dist/client/lib/utils.d.ts.map +1 -0
  44. package/dist/client/namespaces/activity.d.ts +41 -0
  45. package/dist/client/namespaces/activity.d.ts.map +1 -0
  46. package/dist/client/namespaces/auth.d.ts +33 -0
  47. package/dist/client/namespaces/auth.d.ts.map +1 -0
  48. package/dist/client/namespaces/index.d.ts +7 -0
  49. package/dist/client/namespaces/index.d.ts.map +1 -0
  50. package/dist/client/namespaces/user.d.ts +29 -0
  51. package/dist/client/namespaces/user.d.ts.map +1 -0
  52. package/dist/client/timeback-client.class.d.ts +37 -0
  53. package/dist/client/timeback-client.class.d.ts.map +1 -0
  54. package/dist/client/timeback-client.d.ts +29 -0
  55. package/dist/client/timeback-client.d.ts.map +1 -0
  56. package/dist/client.d.ts +30 -0
  57. package/dist/client.d.ts.map +1 -0
  58. package/dist/client.js +198 -0
  59. package/dist/config.d.ts +20 -0
  60. package/dist/config.d.ts.map +1 -0
  61. package/dist/config.js +0 -0
  62. package/dist/edge.d.ts +13 -0
  63. package/dist/edge.d.ts.map +1 -0
  64. package/dist/edge.js +1149 -0
  65. package/dist/identity.d.ts +14 -0
  66. package/dist/identity.d.ts.map +1 -0
  67. package/dist/identity.js +1019 -0
  68. package/dist/index.d.ts +48 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +84921 -0
  71. package/dist/server/adapters/express.d.ts +66 -0
  72. package/dist/server/adapters/express.d.ts.map +1 -0
  73. package/dist/server/adapters/express.js +67332 -0
  74. package/dist/server/adapters/native.d.ts +47 -0
  75. package/dist/server/adapters/native.d.ts.map +1 -0
  76. package/dist/server/adapters/native.js +190 -0
  77. package/dist/server/adapters/nextjs.d.ts +32 -0
  78. package/dist/server/adapters/nextjs.d.ts.map +1 -0
  79. package/dist/server/adapters/nextjs.js +202 -0
  80. package/dist/server/adapters/nuxt.d.ts +98 -0
  81. package/dist/server/adapters/nuxt.d.ts.map +1 -0
  82. package/dist/server/adapters/nuxt.js +67401 -0
  83. package/dist/server/adapters/solid-start.d.ts +63 -0
  84. package/dist/server/adapters/solid-start.d.ts.map +1 -0
  85. package/dist/server/adapters/solid-start.js +67300 -0
  86. package/dist/server/adapters/svelte-kit.d.ts +84 -0
  87. package/dist/server/adapters/svelte-kit.d.ts.map +1 -0
  88. package/dist/server/adapters/svelte-kit.js +243 -0
  89. package/dist/server/adapters/tanstack-start.d.ts +42 -0
  90. package/dist/server/adapters/tanstack-start.d.ts.map +1 -0
  91. package/dist/server/adapters/tanstack-start.js +67278 -0
  92. package/dist/server/adapters/types.d.ts +294 -0
  93. package/dist/server/adapters/types.d.ts.map +1 -0
  94. package/dist/server/adapters/utils.d.ts +76 -0
  95. package/dist/server/adapters/utils.d.ts.map +1 -0
  96. package/dist/server/handlers/activity.d.ts +28 -0
  97. package/dist/server/handlers/activity.d.ts.map +1 -0
  98. package/dist/server/handlers/identity-full.d.ts +28 -0
  99. package/dist/server/handlers/identity-full.d.ts.map +1 -0
  100. package/dist/server/handlers/identity-only.d.ts +22 -0
  101. package/dist/server/handlers/identity-only.d.ts.map +1 -0
  102. package/dist/server/handlers/index.d.ts +9 -0
  103. package/dist/server/handlers/index.d.ts.map +1 -0
  104. package/dist/server/handlers/user.d.ts +31 -0
  105. package/dist/server/handlers/user.d.ts.map +1 -0
  106. package/dist/server/index.d.ts +9 -0
  107. package/dist/server/index.d.ts.map +1 -0
  108. package/dist/server/lib/build-activity-events.d.ts +39 -0
  109. package/dist/server/lib/build-activity-events.d.ts.map +1 -0
  110. package/dist/server/lib/build-user-profile.d.ts +62 -0
  111. package/dist/server/lib/build-user-profile.d.ts.map +1 -0
  112. package/dist/server/lib/index.d.ts +14 -0
  113. package/dist/server/lib/index.d.ts.map +1 -0
  114. package/dist/server/lib/logger.d.ts +21 -0
  115. package/dist/server/lib/logger.d.ts.map +1 -0
  116. package/dist/server/lib/oidc.d.ts +76 -0
  117. package/dist/server/lib/oidc.d.ts.map +1 -0
  118. package/dist/server/lib/resolve-activity-course.d.ts +22 -0
  119. package/dist/server/lib/resolve-activity-course.d.ts.map +1 -0
  120. package/dist/server/lib/resolve-timeback-id.d.ts +28 -0
  121. package/dist/server/lib/resolve-timeback-id.d.ts.map +1 -0
  122. package/dist/server/lib/resolve-timeback-user.d.ts +42 -0
  123. package/dist/server/lib/resolve-timeback-user.d.ts.map +1 -0
  124. package/dist/server/lib/utils.d.ts +54 -0
  125. package/dist/server/lib/utils.d.ts.map +1 -0
  126. package/dist/server/timeback-identity.d.ts +19 -0
  127. package/dist/server/timeback-identity.d.ts.map +1 -0
  128. package/dist/server/timeback.d.ts +68 -0
  129. package/dist/server/timeback.d.ts.map +1 -0
  130. package/dist/server/types.d.ts +421 -0
  131. package/dist/server/types.d.ts.map +1 -0
  132. package/dist/shared/constants.d.ts +18 -0
  133. package/dist/shared/constants.d.ts.map +1 -0
  134. package/dist/shared/types.d.ts +159 -0
  135. package/dist/shared/types.d.ts.map +1 -0
  136. package/package.json +119 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Server Library
3
+ *
4
+ * Internal utilities for the server SDK.
5
+ */
6
+ export { getIssuer, buildAuthorizationUrl, exchangeCodeForTokens, getUserInfo } from './oidc';
7
+ export { jsonResponse, redirectResponse, encodeBase64Url, decodeBase64Url, mapEnvForApi, } from './utils';
8
+ export { ssoLog, oidcLog, createScopedLogger } from './logger';
9
+ export { resolveTimebackUserByEmail, TimebackUserResolutionError } from './resolve-timeback-user';
10
+ export { buildActivityContext, buildActivityMetrics, buildTimeSpentMetrics, sendCaliperEnvelope, } from './build-activity-events';
11
+ export { resolveActivityCourse, ActivityCourseResolutionError } from './resolve-activity-course';
12
+ export { resolveStatusForUserResolutionError, resolveTimebackIdForActivity, } from './resolve-timeback-id';
13
+ export { buildCourseLookup, getUtcDayRange, mapEnrollmentsToCourses, pickGoalsFromEnrollments, sumXp, } from './build-user-profile';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,GACZ,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACjG,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EACN,mCAAmC,EACnC,4BAA4B,GAC5B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,GACL,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SDK Logger
3
+ *
4
+ * Debug logging for the Timeback SDK server components.
5
+ * Only logs when DEBUG=1 or DEBUG=true is set.
6
+ */
7
+ import type { Logger } from '@timeback/internal-logger';
8
+ /**
9
+ * Create a scoped logger for SDK components.
10
+ *
11
+ * Only logs debug/info when DEBUG=1 or DEBUG=true.
12
+ *
13
+ * @param scope - Logger scope name (e.g., 'sso', 'oidc')
14
+ * @returns Configured logger instance
15
+ */
16
+ export declare function createScopedLogger(scope: string): Logger;
17
+ /** Logger for SSO/identity operations */
18
+ export declare const ssoLog: Logger;
19
+ /** Logger for OIDC protocol operations */
20
+ export declare const oidcLog: Logger;
21
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * OIDC Helpers
3
+ *
4
+ * Helpers for Timeback SSO via OIDC with automatic endpoint discovery.
5
+ */
6
+ import type { Environment, OIDCTokens, OIDCUserInfo } from '../types';
7
+ /**
8
+ * OIDC Discovery document structure.
9
+ */
10
+ interface OIDCDiscoveryDocument {
11
+ issuer: string;
12
+ authorization_endpoint: string;
13
+ token_endpoint: string;
14
+ userinfo_endpoint: string;
15
+ jwks_uri: string;
16
+ end_session_endpoint?: string;
17
+ }
18
+ /** Parameters for building an authorization URL. */
19
+ interface BuildAuthorizationUrlParams {
20
+ issuer: string;
21
+ clientId: string;
22
+ redirectUri: string;
23
+ state: string;
24
+ }
25
+ /** Parameters for exchanging an authorization code for tokens. */
26
+ interface ExchangeCodeParams {
27
+ issuer: string;
28
+ clientId: string;
29
+ clientSecret: string;
30
+ code: string;
31
+ redirectUri: string;
32
+ }
33
+ /** Parameters for fetching user info. */
34
+ interface GetUserInfoParams {
35
+ issuer: string;
36
+ accessToken: string;
37
+ }
38
+ /**
39
+ * Fetch the OIDC discovery document for an issuer.
40
+ *
41
+ * @param issuer - The OIDC issuer URL
42
+ * @returns The discovery document
43
+ */
44
+ export declare function fetchDiscoveryDocument(issuer: string): Promise<OIDCDiscoveryDocument>;
45
+ /**
46
+ * Get the Timeback IdP issuer URL for the given environment.
47
+ *
48
+ * Uses AWS Cognito User Pools as the identity provider.
49
+ *
50
+ * @param env - The environment
51
+ * @returns The issuer URL
52
+ */
53
+ export declare function getIssuer(env: Environment): string;
54
+ /**
55
+ * Build the authorization URL for OIDC.
56
+ *
57
+ * @param params - Authorization parameters
58
+ * @returns The authorization URL
59
+ */
60
+ export declare function buildAuthorizationUrl(params: BuildAuthorizationUrlParams): Promise<string>;
61
+ /**
62
+ * Exchange authorization code for tokens.
63
+ *
64
+ * @param params - Token exchange parameters
65
+ * @returns The token response
66
+ */
67
+ export declare function exchangeCodeForTokens(params: ExchangeCodeParams): Promise<OIDCTokens>;
68
+ /**
69
+ * Get user info from the IdP.
70
+ *
71
+ * @param params - User info request parameters
72
+ * @returns The user info claims
73
+ */
74
+ export declare function getUserInfo(params: GetUserInfoParams): Promise<OIDCUserInfo>;
75
+ export {};
76
+ //# sourceMappingURL=oidc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../../../src/server/lib/oidc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAErE;;GAEG;AACH,UAAU,qBAAqB;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,oDAAoD;AACpD,UAAU,2BAA2B;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACb;AAED,kEAAkE;AAClE,UAAU,kBAAkB;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,yCAAyC;AACzC,UAAU,iBAAiB;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;CACnB;AAKD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuB3F;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CASlD;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhG;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4B3F;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAclF"}
@@ -0,0 +1,22 @@
1
+ import type { ActivityCourseRef } from '../../shared/types';
2
+ import type { AppConfig } from '../types';
3
+ /**
4
+ * Resolve a course config entry from an activity course selector.
5
+ *
6
+ * @param courses - Configured courses from `timeback.config.ts`
7
+ * @param courseRef - Course selector sent from the client
8
+ * @returns Matched course config entry
9
+ * @throws {ActivityCourseResolutionError} When selector is unknown or ambiguous
10
+ */
11
+ export declare function resolveActivityCourse(courses: AppConfig['courses'], courseRef: ActivityCourseRef): AppConfig['courses'][number];
12
+ /**
13
+ * Error thrown when a client-provided course selector cannot be resolved against config.
14
+ */
15
+ export declare class ActivityCourseResolutionError extends Error {
16
+ readonly code: 'unknown_course' | 'ambiguous_course';
17
+ readonly subject: ActivityCourseRef['subject'];
18
+ readonly grade: ActivityCourseRef['grade'];
19
+ readonly count?: number;
20
+ constructor(code: ActivityCourseResolutionError['code'], courseRef: ActivityCourseRef, count?: number);
21
+ }
22
+ //# sourceMappingURL=resolve-activity-course.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-activity-course.d.ts","sourceRoot":"","sources":["../../../src/server/lib/resolve-activity-course.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAC7B,SAAS,EAAE,iBAAiB,GAC1B,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAc9B;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACvD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CAAA;IACpD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAA;IAC9C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IAEvB,YACC,IAAI,EAAE,6BAA6B,CAAC,MAAM,CAAC,EAC3C,SAAS,EAAE,iBAAiB,EAC5B,KAAK,CAAC,EAAE,MAAM,EAOd;CACD"}
@@ -0,0 +1,28 @@
1
+ import { TimebackUserResolutionError } from './resolve-timeback-user';
2
+ import type { TimebackClient } from '@timeback/core';
3
+ import type { ApiCredentials, Environment, IdentityConfig } from '../types';
4
+ /**
5
+ * Map a Timeback user resolution error code to an HTTP status for handlers.
6
+ *
7
+ * @param err - Timeback user resolution error
8
+ * @returns HTTP status code
9
+ */
10
+ export declare function resolveStatusForUserResolutionError(err: TimebackUserResolutionError): number;
11
+ /**
12
+ * Resolve the canonical Timeback user ID for server-side activity submission.
13
+ *
14
+ * @param params - Resolution parameters
15
+ * @returns Timeback user ID
16
+ * @throws {TimebackUserResolutionError} When resolution fails
17
+ */
18
+ export declare function resolveTimebackIdForActivity(params: {
19
+ env: Environment;
20
+ api: ApiCredentials;
21
+ identity: IdentityConfig;
22
+ user: {
23
+ id: string;
24
+ email: string;
25
+ };
26
+ client: TimebackClient;
27
+ }): Promise<string>;
28
+ //# sourceMappingURL=resolve-timeback-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-timeback-id.d.ts","sourceRoot":"","sources":["../../../src/server/lib/resolve-timeback-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAEjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE3E;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,2BAA2B,GAAG,MAAM,CAE5F;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IAC1D,GAAG,EAAE,WAAW,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,QAAQ,EAAE,cAAc,CAAA;IACxB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,MAAM,EAAE,cAAc,CAAA;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBlB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Timeback User Resolution
3
+ *
4
+ * Resolves the Timeback user by email using server credentials.
5
+ */
6
+ import { TimebackClient } from '@timeback/core';
7
+ import type { TimebackAuthUser } from '../../shared/types';
8
+ import type { ApiCredentials, Environment, OIDCUserInfo, TimebackUserResolutionErrorCode } from '../types';
9
+ /**
10
+ * Error thrown when Timeback user resolution fails.
11
+ */
12
+ export declare class TimebackUserResolutionError extends Error {
13
+ readonly code: TimebackUserResolutionErrorCode;
14
+ constructor(message: string, code: TimebackUserResolutionErrorCode);
15
+ }
16
+ interface ResolveTimebackUserByEmailParams {
17
+ /** Environment (staging/production) */
18
+ env: Environment;
19
+ /** API credentials for Timeback API */
20
+ apiCredentials: ApiCredentials;
21
+ /** OIDC user info from the IdP */
22
+ userInfo: OIDCUserInfo;
23
+ /**
24
+ * Optional pre-configured Timeback client to use (e.g. `timeback.api`).
25
+ *
26
+ * When provided, this function will use it and will NOT close it.
27
+ */
28
+ client?: TimebackClient;
29
+ }
30
+ /**
31
+ * Resolve a TimebackAuthUser by looking up the Timeback user via email.
32
+ *
33
+ * Uses server API credentials to query OneRoster for a user matching the IdP email.
34
+ * Strict mode: fails if no user found or if multiple users match (ambiguous).
35
+ *
36
+ * @param params - Resolution parameters
37
+ * @returns Resolved TimebackAuthUser with Timeback profile and IdP claims
38
+ * @throws {TimebackUserResolutionError} If resolution fails
39
+ */
40
+ export declare function resolveTimebackUserByEmail(params: ResolveTimebackUserByEmailParams): Promise<TimebackAuthUser>;
41
+ export {};
42
+ //# sourceMappingURL=resolve-timeback-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-timeback-user.d.ts","sourceRoot":"","sources":["../../../src/server/lib/resolve-timeback-user.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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;AAIjB;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;aAGpC,IAAI,EAAE,+BAA+B;IAFtD,YACC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,+BAA+B,EAIrD;CACD;AAED,UAAU,gCAAgC;IACzC,uCAAuC;IACvC,GAAG,EAAE,WAAW,CAAA;IAChB,uCAAuC;IACvC,cAAc,EAAE,cAAc,CAAA;IAC9B,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAA;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,CAAA;CACvB;AAkBD;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC/C,MAAM,EAAE,gCAAgC,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAuG3B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Server Utilities
3
+ *
4
+ * Internal utility functions for the server SDK.
5
+ */
6
+ import type { Environment } from '../types';
7
+ /**
8
+ * Map SDK environment to the environment used for outbound Timeback API calls.
9
+ *
10
+ * The SDK's `env` config controls runtime mode, but for outbound service calls
11
+ * (OneRoster, Caliper, etc.) we need a real Timeback environment:
12
+ *
13
+ * - `local` → `staging` (local dev uses staging services)
14
+ * - `staging` → `staging`
15
+ * - `production` → `production`
16
+ *
17
+ * @param env - SDK environment setting
18
+ * @returns Environment to use for TimebackClient
19
+ */
20
+ export declare function mapEnvForApi(env: Environment): 'staging' | 'production';
21
+ /**
22
+ * Create a JSON response.
23
+ *
24
+ * @param data - Response data
25
+ * @param status - HTTP status code
26
+ * @param headers - Additional headers
27
+ * @returns JSON response
28
+ */
29
+ export declare function jsonResponse<T>(data: T, status?: number, headers?: HeadersInit): Response;
30
+ /**
31
+ * Create a redirect response.
32
+ *
33
+ * @param url - URL to redirect to
34
+ * @param headers - Additional headers (e.g., Set-Cookie)
35
+ * @returns Redirect response
36
+ */
37
+ export declare function redirectResponse(url: string, headers?: HeadersInit): Response;
38
+ /**
39
+ * Encode an object to a base64url-safe string.
40
+ *
41
+ * Used for OIDC state parameter.
42
+ *
43
+ * @param data - Data to encode
44
+ * @returns Base64url encoded string
45
+ */
46
+ export declare function encodeBase64Url(data: unknown): string;
47
+ /**
48
+ * Decode a base64url string back to an object.
49
+ *
50
+ * @param encoded - Base64url encoded string
51
+ * @returns Decoded object
52
+ */
53
+ export declare function decodeBase64Url<T>(encoded: string): T;
54
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAMvE;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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Timeback Server SDK (Identity-only)
3
+ *
4
+ * This file is intentionally Node-free so it can be used in edge runtimes
5
+ * (e.g. Cloudflare Workers / workerd) without pulling in Node-only deps
6
+ * like `jiti`, `fs`, etc.
7
+ */
8
+ import type { IdentityOnlyConfig, IdentityOnlyInstance } from './types';
9
+ /**
10
+ * Create an identity-only Timeback server instance.
11
+ *
12
+ * Use this when you only need SSO authentication without activity tracking
13
+ * or Timeback API integration. Does not require `timeback.config.ts`.
14
+ *
15
+ * @param config - Identity-only configuration
16
+ * @returns Identity-only Timeback server instance
17
+ */
18
+ export declare function createTimebackIdentity<TState = unknown>(config: IdentityOnlyConfig<TState>): IdentityOnlyInstance<TState>;
19
+ //# sourceMappingURL=timeback-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeback-identity.d.ts","sourceRoot":"","sources":["../../src/server/timeback-identity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEvE;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAG,OAAO,EACtD,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAChC,oBAAoB,CAAC,MAAM,CAAC,CAY9B"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Timeback Server SDK
3
+ *
4
+ * Factory functions to create Timeback server instances.
5
+ */
6
+ import type { TimebackConfig, TimebackInstance } from './types';
7
+ /**
8
+ * Create a Timeback server instance.
9
+ *
10
+ * Returns a framework-agnostic instance with raw handlers.
11
+ *
12
+ * Use an adapter to integrate with your framework:
13
+ * - `toNextjsHandler()` for Next.js App Router
14
+ * - `toHonoApp()` / `toHonoMiddleware()` for Hono
15
+ * - `toExpressMiddleware()` / `mountExpressRoutes()` for Express
16
+ *
17
+ * When using SSO mode, the callback receives an enriched `TimebackAuthUser` with
18
+ * `user.id` being the canonical Timeback user ID (timebackId).
19
+ *
20
+ * @param config - Server configuration
21
+ * @returns Timeback instance with handlers
22
+ *
23
+ * @example SSO mode
24
+ * ```typescript
25
+ * import { createTimeback } from '@timeback/sdk'
26
+ * import { toNextjsHandler } from '@timeback/sdk/nextjs'
27
+ *
28
+ * const timeback = await createTimeback({
29
+ * env: 'production',
30
+ * api: {
31
+ * clientId: process.env.TIMEBACK_API_CLIENT_ID!,
32
+ * clientSecret: process.env.TIMEBACK_API_CLIENT_SECRET!,
33
+ * },
34
+ * identity: {
35
+ * mode: 'sso',
36
+ * clientId: process.env.AWS_COGNITO_CLIENT_ID!,
37
+ * clientSecret: process.env.AWS_COGNITO_CLIENT_SECRET!,
38
+ * onCallbackSuccess: async ({ user, state, redirect }) => {
39
+ * // user.id is the timebackId (canonical stable identifier)
40
+ * await setSession({ id: user.id, email: user.email })
41
+ * return redirect(state.returnTo ?? '/')
42
+ * },
43
+ * onCallbackError: ({ error, redirect }) => redirect('/?error=sso_failed'),
44
+ * getUser: (req) => getSessionUser(req),
45
+ * },
46
+ * })
47
+ *
48
+ * // For Next.js App Router
49
+ * export const { GET, POST } = toNextjsHandler(timeback)
50
+ * ```
51
+ *
52
+ * @example Custom identity mode (bring your own auth)
53
+ * ```typescript
54
+ * const timeback = await createTimeback({
55
+ * env: 'production',
56
+ * api: { ... },
57
+ * identity: {
58
+ * mode: 'custom',
59
+ * getUser: async (req) => {
60
+ * const session = await getSession(req)
61
+ * return session ? { id: session.userId, email: session.email } : undefined
62
+ * },
63
+ * },
64
+ * })
65
+ * ```
66
+ */
67
+ export declare function createTimeback<TState = unknown>(config: TimebackConfig<TState>): Promise<TimebackInstance<TState>>;
68
+ //# sourceMappingURL=timeback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeback.d.ts","sourceRoot":"","sources":["../../src/server/timeback.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,wBAAsB,cAAc,CAAC,MAAM,GAAG,OAAO,EACpD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAsEnC"}