@atomicjolt/lti-types
Version:
LTI Typescript definitions.
458 lines (405 loc) • 18.8 kB
text/typescript
export const LTI_VERSION = "https://purl.imsglobal.org/spec/lti/claim/version";
export const LAUNCH_PRESENTATION = "https://purl.imsglobal.org/spec/lti/claim/launch_presentation";
export const DEPLOYMENT_ID = "https://purl.imsglobal.org/spec/lti/claim/deployment_id";
export const MESSAGE_TYPE = "https://purl.imsglobal.org/spec/lti/claim/message_type";
// Claims
export const CONTEXT_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/context";
export const RESOURCE_LINK_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/resource_link";
export const TOOL_PLATFORM_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/tool_platform";
export const AGS_CLAIM = "https://purl.imsglobal.org/spec/lti-ags/claim/endpoint";
export const BASIC_OUTCOME_CLAIM = "https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome";
export const MENTOR_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/role_scope_mentor";
export const ROLES_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/roles";
export const CUSTOM_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/custom";
export const EXTENSION_CLAIM = "http://www.ExamplePlatformVendor.com/session";
export const LIS_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/lis";
export const TARGET_LINK_URI_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/target_link_uri";
export const LTI11_LEGACY_USER_ID_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/lti11_legacy_user_id";
export const LTI1P1_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/lti1p1";
export const DEEP_LINKING_CLAIM = "https://purl.imsglobal.org/spec/lti-dl/claim/deep_linking_settings";
export const DEEP_LINKING_DATA_CLAIM = "https://purl.imsglobal.org/spec/lti-dl/claim/data";
export const DEEP_LINKING_TOOL_MSG_CLAIM = "https://purl.imsglobal.org/spec/lti-dl/claim/msg";
export const DEEP_LINKING_TOOL_LOG_CLAIM = "https://purl.imsglobal.org/spec/lti-dl/claim/log";
export const CONTENT_ITEM_CLAIM = "https://purl.imsglobal.org/spec/lti-dl/claim/content_items";
export const NAMES_AND_ROLES_CLAIM = "https://purl.imsglobal.org/spec/lti-nrps/claim/namesroleservice";
export const MIGRATION_CLAIM = "https://purl.imsglobal.org/spec/lti/claim/lti1p1";
export const NAMES_AND_ROLES_SERVICE_VERSIONS = ["2.0"];
export const CALIPER_CLAIM = "https://purl.imsglobal.org/spec/lti-ces/claim/caliper-endpoint-service";
export const TOOL_LAUNCH_CALIPER_CONTEXT = "http://purl.imsglobal.org/ctx/caliper/v1p1/ToolLaunchProfile-extension";
export const TOOL_USE_CALIPER_CONTEXT = "http://purl.imsglobal.org/ctx/caliper/v1p1";
// Scopes
export const AGS_SCOPE_LINE_ITEM = "https://purl.imsglobal.org/spec/lti-ags/scope/lineitem";
export const AGS_SCOPE_LINE_ITEM_READONLY = "https://purl.imsglobal.org/spec/lti-ags/scope/lineitem.readonly";
export const AGS_SCOPE_RESULT = "https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly";
export const AGS_SCOPE_SCORE = "https://purl.imsglobal.org/spec/lti-ags/scope/score";
export const NAMES_AND_ROLES_SCOPE = "https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly";
export const CALIPER_SCOPE = "https://purl.imsglobal.org/spec/lti-ces/v1p0/scope/send";
export const STUDENT_SCOPE = "http://purl.imsglobal.org/vocab/lis/v2/institution/person#Student";
export const INSTRUCTOR_SCOPE = "http://purl.imsglobal.org/vocab/lis/v2/institution/person#Instructor";
export const LEARNER_SCOPE = "http://purl.imsglobal.org/vocab/lis/v2/membership#Learner";
export const MENTOR_SCOPE = "http://purl.imsglobal.org/vocab/lis/v2/membership#Mentor";
export const MENTOR_ROLE_SCOPE = "a62c52c02ba262003f5e";
// Launch contexts
export const COURSE_CONTEXT = "http://purl.imsglobal.org/vocab/lis/v2/course#CourseOffering";
export const ACCOUNT_CONTEXT = "Account";
// Configuration
export const LTI_TOOL_CONFIGURATION = "https://purl.imsglobal.org/spec/lti-tool-configuration";
export const LTI_PLATFORM_CONFIGURATION = "https://purl.imsglobal.org/spec/lti-platform-configuration";
// Specfies all available scopes.
export const ALL_SCOPES = [
AGS_SCOPE_LINE_ITEM,
AGS_SCOPE_LINE_ITEM_READONLY,
AGS_SCOPE_RESULT,
AGS_SCOPE_SCORE,
NAMES_AND_ROLES_SCOPE,
];
// Canvas specific
export const CANVAS_PUBLIC_JWKS_URL = "https://sso.canvaslms.com/api/lti/security/jwks";
export const CANVAS_AUTH_TOKEN_URL = "https://canvas.instructure.com/login/oauth2/token";
export const CANVAS_OIDC_URL = "https://sso.canvaslms.com/api/lti/authorize_redirect";
export const CANVAS_BETA_PUBLIC_JWKS_URL = "https://sso.beta.canvaslms.com/api/lti/security/jwks";
export const CANVAS_BETA_AUTH_TOKEN_URL = "https://sso.beta.canvaslms.com/login/oauth2/token";
export const CANVAS_BETA_OIDC_URL = "https://sso.beta.canvaslms.com/api/lti/authorize_redirect";
export const CANVAS_SUBMISSION_TYPE = "https://canvas.instructure.com/lti/submission_type";
export const CANVAS_PRIVACY_LEVEL = "https://canvas.instructure.com/lti/privacy_level";
export const CANVAS_PLACEMENT_VISIBILITY = "https://canvas.instructure.com/lti/visibility";
export const CANVAS_PLACEMENT_COURSE_NAVIGATION_ENABLED = "https://canvas.instructure.com/lti/course_navigation/default_enabled";
interface IdTokenErrors {
errors: {
errors?: {
}
}
}
export enum LtiVersions {
v1_3_0 = '1.3.0',
}
export enum DocumentTargets {
iframe = 'iframe',
window = 'window',
embed = 'embed',
}
export enum AcceptTypes {
link = 'link',
file = 'file',
html = 'html',
ltiResourceLink = 'ltiResourceLink',
image = 'image',
}
export enum MessageTypes {
LtiResourceLinkRequest = 'LtiResourceLinkRequest',
LtiDeepLinkingRequest = 'LtiDeepLinkingRequest',
LtiDeepLinkingResponse = "LtiDeepLinkingResponse",
}
// Below are all the roles specified in the LTI 1.3 spec. (https://www.imsglobal.org/spec/lti/v1p3#role-vocabularies-0)
// https://www.imsglobal.org/spec/lti/v1p3#roles-claim
export enum Roles {
// Core system roles
AdministratorSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#Administrator',
NoneSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#None',
// Non‑core system roles
AccountAdminSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#AccountAdmin',
CreatorSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#Creator',
SysAdminSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#SysAdmin',
SysSupportSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#SysSupport',
UserSystemRole = 'http://purl.imsglobal.org/vocab/lis/v2/system/person#User',
// Core institution roles
AdministratorInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Administrator',
FacultyInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Faculty',
GuestInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Guest',
NoneInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#None',
OtherInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Other',
StaffInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Staff',
StudentInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Student',
// Non‑core institution roles
AlumniInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Alumni',
InstructorInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Instructor',
LearnerInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Learner',
MemberInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Member',
MentorInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Mentor',
ObserverInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#Observer',
ProspectiveStudentInstitutionRole = 'http://purl.imsglobal.org/vocab/lis/v2/institution/person#ProspectiveStudent',
// Core context roles
AdministratorContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Administrator',
ContentDeveloperContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#ContentDeveloper',
InstructorContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor',
LearnerContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Learner',
MentorContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Mentor',
// Non‑core context roles
ManagerContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Manager',
MemberContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Member',
OfficerContextRole = 'http://purl.imsglobal.org/vocab/lis/v2/membership#Officer',
}
// https://www.imsglobal.org/spec/lti/v1p3#resource-link-claim
export type ResourceLinkClaim = {
// Opaque identifier for a placement of an LTI resource link within a context that MUST
// be a stable and locally unique to the deployment_id. This value MUST change if the link
// is copied or exported from one system or context and imported into another system or context.
// The value of id MUST NOT exceed 255 ASCII characters in length and is case-sensitive
id: string;
// Descriptive phrase for an LTI resource link placement.
description?: string | null;
// Descriptive title for an LTI resource link placement.
title?: string;
validation_context?: string | null;
errors?: IdTokenErrors;
};
// https://www.imsglobal.org/spec/lti/v1p3#launch-presentation-claim
export type LaunchPresentationClaim = {
// The kind of browser window or frame from which the user launched inside the message
// sender's system. The value for this property MUST be one of: frame, iframe, or window.
document_target?: DocumentTargets;
// Fully-qualified HTTPS URL within the message sender's user experience to where the message
// receiver can redirect the user back. The message receiver can redirect to this URL after
// the user has finished activity, or if the receiver cannot start because of some technical difficulty.
return_url?: string;
// Language, country, and variant as represented using the IETF Best Practices for Tags for Identifying Languages
locale: string;
// Height of the window or frame where the content from the message receiver will be displayed to the user.
height?: number;
// Width of the window or frame where the content from the message receiver will be displayed to the user.
width?: number;
validation_context?: string | null;
errors?: IdTokenErrors;
};
// https://www.imsglobal.org/spec/lti-dl/v2p0#deep-linking-settings
export type DeepLinkingClaim = {
// Fully qualified URL where the tool redirects the user back to the platform interface.
// This URL can be used once the tool is finished.
deep_link_return_url: string;
// An array of types accepted, e.g.
accept_types: Array<keyof typeof AcceptTypes>;
// An array of document targets supported, e.g.,
accept_presentation_document_targets: Array<keyof typeof DocumentTargets>;
// Media types [RFC7231] the platform accepts. This only applies to File types, e.g., "image/:::asterisk:::,text/html".
accept_media_types?: string;
// Whether the platform allows multiple content items to be submitted in a single response.
accept_multiple?: boolean;
// Whether the platform in the context of that deep linking request supports or ignores line
// items included in LTI Resource Link items. False indicates line items will be ignored.
// True indicates the platform will create a line item when creating the resource link.
// If the field is not present, no assumption that can be made about the support of line items
accept_lineitem?: boolean;
// Whether any content items returned by the tool would be automatically persisted
// without any option for the user to cancel the operation. The default is false.
auto_create?: boolean;
// Default text to be used as the title or alt text for the content item returned by the tool.
// This value is normally short in length, for example, suitable for use as a heading.
title?: string;
//Default text to be used as the visible text for the content item returned by the tool.
// If no text is returned by the tool, the platform may use the value of the title parameter instead (if any).
// This value may be a long description of the content item.
text?: string;
// An opaque value which must be returned by the tool in its response if it was passed in on the request
data?: string;
};
// https://www.imsglobal.org/spec/lti-nrps/v2p0#claim-for-inclusion-in-lti-messages
export type NamesAndRolesClaim = {
// Service URL that is always fully resolved, and matches the context of the launch
context_memberships_url: string;
// Specifies the versions of the service that are supported on the end point provided by context_memberships_url
service_versions: Array<string>;
validation_context?: string | null;
errors?: IdTokenErrors;
};
export enum AGSScopes {
lineItem = 'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem',
resultReadOnly = 'https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly',
score = 'https://purl.imsglobal.org/spec/lti-ags/scope/score',
lineItemReadOnly = 'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem.readonly',
}
// https://www.imsglobal.org/spec/lti-ags/v2p0/#assignment-and-grade-service-claim
export type AGSClaim = {
// An array of scopes the tool may ask an access token for.
scope: Array<AGSScopes>;
// The endpoint URL for accessing the line item container for the current context.
// May be omitted if the tool has no permissions to access this endpoint
lineitems?: string;
// When an LTI message is launching a resource associated to one and only one lineitem,
// the claim must include the endpoint URL for accessing the associated line item;
// in all other cases, this property must be either blank or not included in the claim
lineitem?: string;
validation_context?: string | null;
errors?: IdTokenErrors;
};
// https://www.imsglobal.org/spec/lti/v1p3#learning-information-services-lis-claim
export type LISClaim = {
person_sourcedid: string;
course_offering_sourcedid: string;
course_section_sourcedid: string;
validation_context?: string | null;
errors?: IdTokenErrors;
};
// https://www.imsglobal.org/spec/lti/v1p3#context-claim
export type ContextClaim = {
id: string;
label?: string;
title?: string;
type?: Array<string>;
validation_context?: string | null;
errors?: IdTokenErrors;
};
// https://www.imsglobal.org/spec/lti/v1p3#platform-instance-claim
export type ToolPlatformClaim = {
guid: string;
contact_email?: string;
description?: string;
name?: string;
url?: string;
product_family_code?: string;
version?: string;
validation_context?: string | null;
errors?: IdTokenErrors;
};
// https://www.imsglobal.org/spec/lti/v1p3#resource-link-launch-request-message
export type IdToken = {
aud: string;
auds?: Array<string>;
azp?: string;
exp: number;
iat: number;
iss: string;
nonce: string;
sub: string;
[MESSAGE_TYPE]: MessageTypes;
[LTI_VERSION]: LtiVersions;
[RESOURCE_LINK_CLAIM]: ResourceLinkClaim;
[DEPLOYMENT_ID]: string;
[TARGET_LINK_URI_CLAIM]: string;
[ROLES_CLAIM]: Array<Roles>;
[CONTEXT_CLAIM]?: ContextClaim;
[TOOL_PLATFORM_CLAIM]?: ToolPlatformClaim;
[DEEP_LINKING_CLAIM]?: DeepLinkingClaim;
[DEEP_LINKING_DATA_CLAIM]?: string;
[LAUNCH_PRESENTATION]?: LaunchPresentationClaim;
[NAMES_AND_ROLES_CLAIM]?: NamesAndRolesClaim;
[AGS_CLAIM]?: AGSClaim;
[LIS_CLAIM]?: LISClaim;
[MIGRATION_CLAIM]?: object;
[CUSTOM_CLAIM]?: object;
[LTI11_LEGACY_USER_ID_CLAIM]?: string;
[LTI1P1_CLAIM]?: object,
picture?: string;
email?: string;
name?: string;
given_name?: string;
family_name?: string;
middle_name?: string;
locale?: string;
errors?: IdTokenErrors;
};
//
// Dynamic Registration
//
export type PlatformConfiguration = {
issuer: string;
authorization_endpoint: string;
token_endpoint: string;
token_endpoint_auth_methods_supported?: string[];
token_endpoint_auth_signing_alg_values_supported?: string[];
jwks_uri: string;
registration_endpoint?: string;
scopes_supported?: string[];
response_types_supported?: string[];
subject_types_supported?: string[];
id_token_signing_alg_values_supported?: string[];
claims_supported?: string[];
authorization_server?: string;
[LTI_PLATFORM_CONFIGURATION]?: LtiPlatformConfiguration;
};
export type LtiPlatformConfiguration = {
product_family_code: string;
version: string;
messages_supported: MessageSupported[];
variables?: string[];
};
export type MessageSupported = {
type: string;
placements?: string[];
};
export type RegistrationConfiguration = {
platformToolConfiguration: ToolConfiguration,
platformConfiguration: PlatformConfiguration,
}
export type ToolConfiguration = {
application_type: string;
grant_types: string[];
response_types: string[];
redirect_uris: string[];
initiate_login_uri: string;
client_name: string;
jwks_uri: string;
logo_uri?: string;
token_endpoint_auth_method: string;
contacts?: string[];
scope: string;
[LTI_TOOL_CONFIGURATION]: LtiToolConfiguration;
client_uri?: string;
tos_uri?: string;
policy_uri?: string;
client_id?: string;
registration_client_uri?: string;
}
export type LtiToolConfiguration = {
domain: string;
secondary_domains?: string[];
deployment_id?: string;
target_link_uri: string;
custom_parameters?: { [key: string]: string };
description?: string;
messages: LtiMessage[];
claims: string[];
[CANVAS_PRIVACY_LEVEL]?: string;
}
export type LtiMessage = {
type: string;
target_link_uri?: string;
label?: string;
icon_uri?: string;
custom_parameters?: { [key: string]: string };
placements?: string[];
roles?: string[];
[CANVAS_PLACEMENT_VISIBILITY]?: string;
[CANVAS_PLACEMENT_COURSE_NAVIGATION_ENABLED]?: boolean;
}
//
// Names and Roles
//
export interface Context {
id: string;
label?: string;
title?: string;
}
export enum MemberStatus {
Active = 'Active',
Inactive = 'Inactive',
Deleted = 'Deleted'
}
export interface Member {
user_id: string;
roles: string[];
status?: MemberStatus;
name?: string;
email?: string;
picture?: string;
given_name?: string;
family_name?: string;
middle_name?: string;
lis_person_sourcedid?: string;
lti11_legacy_user_id?: string;
message?: Array<{
[key: string]: any;
[MESSAGE_TYPE]?: string;
[BASIC_OUTCOME_CLAIM]?: {
lis_result_sourcedid: string;
lis_outcome_service_url: string;
};
[CUSTOM_CLAIM]?: {
[key: string]: string;
};
}>;
}
export interface MembershipContainer {
id: string;
context: Context;
members: Member[];
}