@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.
- package/README.md +612 -0
- package/dist/client/adapters/react/SignInButton.d.ts +60 -0
- package/dist/client/adapters/react/SignInButton.d.ts.map +1 -0
- package/dist/client/adapters/react/index.d.ts +47 -0
- package/dist/client/adapters/react/index.d.ts.map +1 -0
- package/dist/client/adapters/react/index.js +478 -0
- package/dist/client/adapters/react/provider.d.ts +78 -0
- package/dist/client/adapters/react/provider.d.ts.map +1 -0
- package/dist/client/adapters/solid/SignInButton.d.ts +52 -0
- package/dist/client/adapters/solid/SignInButton.d.ts.map +1 -0
- package/dist/client/adapters/solid/SignInButton.tsx +321 -0
- package/dist/client/adapters/solid/context.d.ts +73 -0
- package/dist/client/adapters/solid/context.d.ts.map +1 -0
- package/dist/client/adapters/solid/context.tsx +91 -0
- package/dist/client/adapters/solid/index.d.ts +46 -0
- package/dist/client/adapters/solid/index.d.ts.map +1 -0
- package/dist/client/adapters/solid/index.ts +50 -0
- package/dist/client/adapters/svelte/SignInButton.svelte +234 -0
- package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +24 -0
- package/dist/client/adapters/svelte/index.d.ts +37 -0
- package/dist/client/adapters/svelte/index.d.ts.map +1 -0
- package/dist/client/adapters/svelte/index.ts +42 -0
- package/dist/client/adapters/svelte/stores.d.ts +66 -0
- package/dist/client/adapters/svelte/stores.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores.ts +143 -0
- package/dist/client/adapters/vue/SignInButton.vue +260 -0
- package/dist/client/adapters/vue/SignInButton.vue.d.ts +53 -0
- package/dist/client/adapters/vue/index.d.ts +43 -0
- package/dist/client/adapters/vue/index.d.ts.map +1 -0
- package/dist/client/adapters/vue/index.ts +48 -0
- package/dist/client/adapters/vue/provider.d.ts +94 -0
- package/dist/client/adapters/vue/provider.d.ts.map +1 -0
- package/dist/client/adapters/vue/provider.ts +147 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/lib/activity/activity.class.d.ts +73 -0
- package/dist/client/lib/activity/activity.class.d.ts.map +1 -0
- package/dist/client/lib/activity/activity.d.ts +16 -0
- package/dist/client/lib/activity/activity.d.ts.map +1 -0
- package/dist/client/lib/activity/index.d.ts +6 -0
- package/dist/client/lib/activity/index.d.ts.map +1 -0
- package/dist/client/lib/utils.d.ts +20 -0
- package/dist/client/lib/utils.d.ts.map +1 -0
- package/dist/client/namespaces/activity.d.ts +41 -0
- package/dist/client/namespaces/activity.d.ts.map +1 -0
- package/dist/client/namespaces/auth.d.ts +33 -0
- package/dist/client/namespaces/auth.d.ts.map +1 -0
- package/dist/client/namespaces/index.d.ts +7 -0
- package/dist/client/namespaces/index.d.ts.map +1 -0
- package/dist/client/namespaces/user.d.ts +29 -0
- package/dist/client/namespaces/user.d.ts.map +1 -0
- package/dist/client/timeback-client.class.d.ts +37 -0
- package/dist/client/timeback-client.class.d.ts.map +1 -0
- package/dist/client/timeback-client.d.ts +29 -0
- package/dist/client/timeback-client.d.ts.map +1 -0
- package/dist/client.d.ts +30 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +198 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +0 -0
- package/dist/edge.d.ts +13 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/edge.js +1149 -0
- package/dist/identity.d.ts +14 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +1019 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84921 -0
- package/dist/server/adapters/express.d.ts +66 -0
- package/dist/server/adapters/express.d.ts.map +1 -0
- package/dist/server/adapters/express.js +67332 -0
- package/dist/server/adapters/native.d.ts +47 -0
- package/dist/server/adapters/native.d.ts.map +1 -0
- package/dist/server/adapters/native.js +190 -0
- package/dist/server/adapters/nextjs.d.ts +32 -0
- package/dist/server/adapters/nextjs.d.ts.map +1 -0
- package/dist/server/adapters/nextjs.js +202 -0
- package/dist/server/adapters/nuxt.d.ts +98 -0
- package/dist/server/adapters/nuxt.d.ts.map +1 -0
- package/dist/server/adapters/nuxt.js +67401 -0
- package/dist/server/adapters/solid-start.d.ts +63 -0
- package/dist/server/adapters/solid-start.d.ts.map +1 -0
- package/dist/server/adapters/solid-start.js +67300 -0
- package/dist/server/adapters/svelte-kit.d.ts +84 -0
- package/dist/server/adapters/svelte-kit.d.ts.map +1 -0
- package/dist/server/adapters/svelte-kit.js +243 -0
- package/dist/server/adapters/tanstack-start.d.ts +42 -0
- package/dist/server/adapters/tanstack-start.d.ts.map +1 -0
- package/dist/server/adapters/tanstack-start.js +67278 -0
- package/dist/server/adapters/types.d.ts +294 -0
- package/dist/server/adapters/types.d.ts.map +1 -0
- package/dist/server/adapters/utils.d.ts +76 -0
- package/dist/server/adapters/utils.d.ts.map +1 -0
- package/dist/server/handlers/activity.d.ts +28 -0
- package/dist/server/handlers/activity.d.ts.map +1 -0
- package/dist/server/handlers/identity-full.d.ts +28 -0
- package/dist/server/handlers/identity-full.d.ts.map +1 -0
- package/dist/server/handlers/identity-only.d.ts +22 -0
- package/dist/server/handlers/identity-only.d.ts.map +1 -0
- package/dist/server/handlers/index.d.ts +9 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/user.d.ts +31 -0
- package/dist/server/handlers/user.d.ts.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/lib/build-activity-events.d.ts +39 -0
- package/dist/server/lib/build-activity-events.d.ts.map +1 -0
- package/dist/server/lib/build-user-profile.d.ts +62 -0
- package/dist/server/lib/build-user-profile.d.ts.map +1 -0
- package/dist/server/lib/index.d.ts +14 -0
- package/dist/server/lib/index.d.ts.map +1 -0
- package/dist/server/lib/logger.d.ts +21 -0
- package/dist/server/lib/logger.d.ts.map +1 -0
- package/dist/server/lib/oidc.d.ts +76 -0
- package/dist/server/lib/oidc.d.ts.map +1 -0
- package/dist/server/lib/resolve-activity-course.d.ts +22 -0
- package/dist/server/lib/resolve-activity-course.d.ts.map +1 -0
- package/dist/server/lib/resolve-timeback-id.d.ts +28 -0
- package/dist/server/lib/resolve-timeback-id.d.ts.map +1 -0
- package/dist/server/lib/resolve-timeback-user.d.ts +42 -0
- package/dist/server/lib/resolve-timeback-user.d.ts.map +1 -0
- package/dist/server/lib/utils.d.ts +54 -0
- package/dist/server/lib/utils.d.ts.map +1 -0
- package/dist/server/timeback-identity.d.ts +19 -0
- package/dist/server/timeback-identity.d.ts.map +1 -0
- package/dist/server/timeback.d.ts +68 -0
- package/dist/server/timeback.d.ts.map +1 -0
- package/dist/server/types.d.ts +421 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/shared/constants.d.ts +18 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/types.d.ts +159 -0
- package/dist/shared/types.d.ts.map +1 -0
- 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"}
|