UNPKG

scorm-again

Version:

A modern SCORM JavaScript run-time library for AICC, SCORM 1.2, and SCORM 2004

510 lines (468 loc) 12 kB
/** * Class representing SCORM 2004's `cmi.interactions` object */ import { BaseCMI } from "../common/base_cmi"; import { CMIArray } from "../common/array"; import { scorm2004_errors } from "../../constants/error_codes"; import { Scorm2004ValidationError } from "../../exceptions/scorm2004_exceptions"; import { scorm2004_constants } from "../../constants/api_constants"; import { check2004ValidFormat } from "./validation"; import { scorm2004_regex } from "../../constants/regex"; import { LearnerResponses } from "../../constants/response_constants"; export class CMIInteractions extends CMIArray { /** * Constructor for `cmi.objectives` Array */ constructor() { super({ children: scorm2004_constants.interactions_children, errorCode: scorm2004_errors.READ_ONLY_ELEMENT as number, errorClass: Scorm2004ValidationError, }); } } /** * Class for SCORM 2004's cmi.interaction.n object */ export class CMIInteractionsObject extends BaseCMI { private _id = ""; private _type = ""; private _timestamp = ""; private _weighting = ""; private _learner_response = ""; private _result = ""; private _latency = ""; private _description = ""; /** * Constructor for cmi.interaction.n */ constructor() { super(); this.objectives = new CMIArray({ errorCode: scorm2004_errors.READ_ONLY_ELEMENT as number, errorClass: Scorm2004ValidationError, children: scorm2004_constants.objectives_children, }); this.correct_responses = new CMIArray({ errorCode: scorm2004_errors.READ_ONLY_ELEMENT as number, errorClass: Scorm2004ValidationError, children: scorm2004_constants.correct_responses_children, }); } public objectives: CMIArray; public correct_responses: CMIArray; /** * Called when the API has been initialized after the CMI has been created */ override initialize() { super.initialize(); this.objectives?.initialize(); this.correct_responses?.initialize(); } /** * Called when the API has been reset */ override reset() { this._initialized = false; this._id = ""; this._type = ""; this._timestamp = ""; this._weighting = ""; this._learner_response = ""; this._result = ""; this._latency = ""; this._description = ""; this.objectives = new CMIArray({ errorCode: scorm2004_errors.READ_ONLY_ELEMENT as number, errorClass: Scorm2004ValidationError, children: scorm2004_constants.objectives_children, }); this.correct_responses = new CMIArray({ errorCode: scorm2004_errors.READ_ONLY_ELEMENT as number, errorClass: Scorm2004ValidationError, children: scorm2004_constants.correct_responses_children, }); } /** * Getter for _id * @return {string} */ get id(): string { return this._id; } /** * Setter for _id * @param {string} id */ set id(id: string) { if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) { this._id = id; } } /** * Getter for _type * @return {string} */ get type(): string { return this._type; } /** * Setter for _type * @param {string} type */ set type(type: string) { if (this.initialized && this._id === "") { throw new Scorm2004ValidationError( scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED as number, ); } else { if (check2004ValidFormat(type, scorm2004_regex.CMIType)) { this._type = type; } } } /** * Getter for _timestamp * @return {string} */ get timestamp(): string { return this._timestamp; } /** * Setter for _timestamp * @param {string} timestamp */ set timestamp(timestamp: string) { if (this.initialized && this._id === "") { throw new Scorm2004ValidationError( scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED as number, ); } else { if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) { this._timestamp = timestamp; } } } /** * Getter for _weighting * @return {string} */ get weighting(): string { return this._weighting; } /** * Setter for _weighting * @param {string} weighting */ set weighting(weighting: string) { if (this.initialized && this._id === "") { throw new Scorm2004ValidationError( scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED as number, ); } else { if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) { this._weighting = weighting; } } } /** * Getter for _learner_response * @return {string} */ get learner_response(): string { return this._learner_response; } /** * Setter for _learner_response. Does type validation to make sure response * matches SCORM 2004's spec * @param {string} learner_response */ set learner_response(learner_response: string) { if (this.initialized && (this._type === "" || this._id === "")) { throw new Scorm2004ValidationError( scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED as number, ); } else { let nodes = []; const response_type = LearnerResponses[this.type]; if (response_type) { if (response_type?.delimiter) { nodes = learner_response.split(response_type.delimiter); } else { nodes[0] = learner_response; } if (nodes.length > 0 && nodes.length <= response_type.max) { const formatRegex = new RegExp(response_type.format); for (let i = 0; i < nodes.length; i++) { if (response_type?.delimiter2) { const values = nodes[i]?.split(response_type.delimiter2); if (values?.length === 2) { if (!values[0]?.match(formatRegex)) { throw new Scorm2004ValidationError( scorm2004_errors.TYPE_MISMATCH as number, ); } else { if ( !response_type.format2 || !values[1]?.match(new RegExp(response_type.format2)) ) { throw new Scorm2004ValidationError( scorm2004_errors.TYPE_MISMATCH as number, ); } } } else { throw new Scorm2004ValidationError( scorm2004_errors.TYPE_MISMATCH as number, ); } } else { if (!nodes[i]?.match(formatRegex)) { throw new Scorm2004ValidationError( scorm2004_errors.TYPE_MISMATCH as number, ); } else { if (nodes[i] !== "" && response_type.unique) { for (let j = 0; j < i; j++) { if (nodes[i] === nodes[j]) { throw new Scorm2004ValidationError( scorm2004_errors.TYPE_MISMATCH as number, ); } } } } } } } else { throw new Scorm2004ValidationError( scorm2004_errors.GENERAL_SET_FAILURE as number, ); } this._learner_response = learner_response; } else { throw new Scorm2004ValidationError( scorm2004_errors.TYPE_MISMATCH as number, ); } } } /** * Getter for _result * @return {string} */ get result(): string { return this._result; } /** * Setter for _result * @param {string} result */ set result(result: string) { if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) { this._result = result; } } /** * Getter for _latency * @return {string} */ get latency(): string { return this._latency; } /** * Setter for _latency * @param {string} latency */ set latency(latency: string) { if (this.initialized && this._id === "") { throw new Scorm2004ValidationError( scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED as number, ); } else { if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) { this._latency = latency; } } } /** * Getter for _description * @return {string} */ get description(): string { return this._description; } /** * Setter for _description * @param {string} description */ set description(description: string) { if (this.initialized && this._id === "") { throw new Scorm2004ValidationError( scorm2004_errors.DEPENDENCY_NOT_ESTABLISHED as number, ); } else { if ( check2004ValidFormat( description, scorm2004_regex.CMILangString250, true, ) ) { this._description = description; } } } /** * toJSON for cmi.interactions.n * * @return { * { * id: string, * type: string, * objectives: CMIArray, * timestamp: string, * correct_responses: CMIArray, * weighting: string, * learner_response: string, * result: string, * latency: string, * description: string * } * } */ toJSON(): { id: string; type: string; objectives: CMIArray; timestamp: string; correct_responses: CMIArray; weighting: string; learner_response: string; result: string; latency: string; description: string; } { this.jsonString = true; const result = { id: this.id, type: this.type, objectives: this.objectives, timestamp: this.timestamp, weighting: this.weighting, learner_response: this.learner_response, result: this.result, latency: this.latency, description: this.description, correct_responses: this.correct_responses, }; delete this.jsonString; return result; } } /** * Class representing SCORM 2004's cmi.interactions.n.objectives.n object */ export class CMIInteractionsObjectivesObject extends BaseCMI { private _id = ""; /** * Constructor for cmi.interactions.n.objectives.n */ constructor() { super(); } /** * Called when the API has been reset */ override reset() { this._initialized = false; this._id = ""; } /** * Getter for _id * @return {string} */ get id(): string { return this._id; } /** * Setter for _id * @param {string} id */ set id(id: string) { if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) { this._id = id; } } /** * toJSON for cmi.interactions.n.objectives.n * @return { * { * id: string * } * } */ toJSON(): { id: string; } { this.jsonString = true; const result = { id: this.id, }; delete this.jsonString; return result; } } /** * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object */ export class CMIInteractionsCorrectResponsesObject extends BaseCMI { private _pattern = ""; /** * Constructor for cmi.interactions.n.correct_responses.n */ constructor() { super(); } /** * Called when the API has been reset */ override reset() { this._initialized = false; this._pattern = ""; } /** * Getter for _pattern * @return {string} */ get pattern(): string { return this._pattern; } /** * Setter for _pattern * @param {string} pattern */ set pattern(pattern: string) { if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) { this._pattern = pattern; } } /** * toJSON cmi.interactions.n.correct_responses.n object * @return { * { * pattern: string * } * } */ toJSON(): { pattern: string; } { this.jsonString = true; const result = { pattern: this.pattern, }; delete this.jsonString; return result; } }