ltijs
Version:
Easily turn your web application into a LTI 1.3 Learning Tool.
156 lines (155 loc) • 5.76 kB
TypeScript
import type { IdTokenClaim, LtiMessageType } from '#services/launch/id-token.constants';
import type { IdTokenValidationMethod } from '#services/platform-manager/platform-manager.constants';
export interface IdTokenValidation {
method: IdTokenValidationMethod;
key: string;
}
export interface PlatformKeys {
public: string;
private: string;
}
/** The persisted fields for a platform, excluding its `id` (assigned by `savePlatform`). */
export interface PlatformAttributes {
url: string;
clientId: string;
name: string;
authenticationEndpoint: string;
accessTokenEndpoint: string;
authorizationServer?: string;
idTokenValidation: IdTokenValidation;
active: boolean;
keys: PlatformKeys;
}
/** A stored platform as returned by `DatabaseManager`'s read methods -- `PlatformAttributes` plus its assigned `id`. */
export interface PlatformRecord extends PlatformAttributes {
id: string;
}
export interface PlatformFilter {
url?: string;
name?: string;
clientId?: string | string[];
}
/** A cached platform-issued OAuth2 access token (client-credentials grant), keyed by `platformUrl`+`clientId`+`scopes`. */
export interface AccessTokenRecord {
access_token: string;
token_type: string;
expires_in: number;
scope?: string;
createdAt: number;
}
export interface ToolPlatformClaim {
name?: string;
description?: string;
guid?: string;
contact_email?: string;
version?: string;
product_family_code?: string;
[claim: string]: unknown;
}
export interface LaunchPresentationClaim {
document_target?: string;
width?: number;
height?: number;
return_url?: string;
locale?: string;
[claim: string]: unknown;
}
export interface DeepLinkingSettingsClaim {
accept_types?: string[];
accept_media_types?: string[];
accept_presentation_document_targets?: string[];
accept_multiple?: boolean;
auto_create?: boolean;
title?: string;
text?: string;
data?: string;
deep_link_return_url?: string;
[claim: string]: unknown;
}
export interface AssignmentAndGradesClaim {
scope?: string[];
lineitem?: string;
lineitems?: string;
[claim: string]: unknown;
}
export interface ContextClaim {
id?: string;
label?: string;
title?: string;
type?: string[];
[claim: string]: unknown;
}
export interface ResourceLinkClaim {
id?: string;
title?: string;
description?: string;
[claim: string]: unknown;
}
export interface NamesRoleServiceClaim {
context_memberships_url?: string;
service_versions?: string[];
[claim: string]: unknown;
}
export interface ForUserClaim {
user_id?: string;
[claim: string]: unknown;
}
/** The raw, validated claims of an LTI 1.3 id_token, keyed by their spec-defined claim URIs/names (see `IdTokenClaim`). */
export interface IdTokenClaims {
[IdTokenClaim.Iss]: string;
[IdTokenClaim.Sub]: string;
[IdTokenClaim.Aud]?: string | string[];
[IdTokenClaim.Azp]?: string;
[IdTokenClaim.Exp]?: number;
[IdTokenClaim.Iat]?: number;
[IdTokenClaim.Nonce]?: string;
[IdTokenClaim.GivenName]?: string;
[IdTokenClaim.FamilyName]?: string;
[IdTokenClaim.Name]?: string;
[IdTokenClaim.Email]?: string;
[IdTokenClaim.ClientId]: string;
[IdTokenClaim.PlatformId]: string;
[IdTokenClaim.DeploymentId]: string;
[IdTokenClaim.MessageType]: LtiMessageType;
[IdTokenClaim.Version]: string;
[IdTokenClaim.Roles]: string[];
[IdTokenClaim.RoleScopeMentor]?: string[];
[IdTokenClaim.TargetLinkUri]?: string;
[IdTokenClaim.ToolPlatform]?: ToolPlatformClaim;
[IdTokenClaim.Context]?: ContextClaim;
[IdTokenClaim.ResourceLink]?: ResourceLinkClaim;
[IdTokenClaim.LaunchPresentation]?: LaunchPresentationClaim;
[IdTokenClaim.Custom]?: Record<string, unknown>;
[IdTokenClaim.Lis]?: Record<string, unknown>;
[IdTokenClaim.ForUser]?: ForUserClaim;
[IdTokenClaim.Endpoint]?: AssignmentAndGradesClaim;
[IdTokenClaim.NamesRoleService]?: NamesRoleServiceClaim;
[IdTokenClaim.DeepLinkingSettings]?: DeepLinkingSettingsClaim;
[claim: string]: unknown;
}
/** A stored id_token as returned by `getIdToken` -- `IdTokenClaims` plus the record's own `id`. */
export interface IdTokenRecord extends IdTokenClaims {
id: string;
}
/**
* The pluggable storage contract `Provider` reads/writes platforms, access tokens, id tokens, and OIDC
* nonces through. The default implementation is `MongoDatabaseManager`; implement this interface directly
* to back ltijs with anything else (a different database, an ORM, a remote service), and pass it via
* `ProviderOptions.databaseManager`.
*/
export interface DatabaseManager {
listen: () => Promise<void>;
close: () => Promise<void>;
getPlatforms: (filter?: PlatformFilter) => Promise<PlatformRecord[]>;
getPlatformById: (id: string) => Promise<PlatformRecord | undefined>;
getPlatformByUrlAndClientId: (url: string, clientId: string) => Promise<PlatformRecord | undefined>;
savePlatform: (platform: PlatformAttributes) => Promise<string>;
updatePlatformById: (id: string, fields: Partial<PlatformAttributes>) => Promise<void>;
deletePlatformById: (id: string) => Promise<void>;
getAccessToken: (platformUrl: string, clientId: string, scopes: string) => Promise<AccessTokenRecord | undefined>;
saveAccessToken: (platformUrl: string, clientId: string, scopes: string, token: AccessTokenRecord) => Promise<string>;
getIdToken: (id: string) => Promise<IdTokenRecord | undefined>;
saveIdToken: (token: IdTokenClaims) => Promise<string>;
saveNonce: (nonce: string) => Promise<string>;
consumeNonce: (nonce: string) => Promise<boolean>;
}