scorm-again
Version:
A modern SCORM JavaScript run-time library for AICC, SCORM 1.2, and SCORM 2004
625 lines (572 loc) • 15.6 kB
text/typescript
import { scorm2004_constants } from "../../constants/api_constants";
import { scorm2004_regex } from "../../constants/regex";
import { scorm2004_errors } from "../../constants/error_codes";
import { Scorm2004ValidationError } from "../../exceptions/scorm2004_exceptions";
import * as Util from "../../utilities";
import { BaseRootCMI } from "../common/base_cmi";
import { check2004ValidFormat, check2004ValidRange } from "./validation";
import { CMILearnerPreference } from "./learner_preference";
import { CMIInteractions } from "./interactions";
import { Scorm2004CMIScore } from "./score";
import { CMICommentsFromLearner, CMICommentsFromLMS } from "./comments";
import { CMIObjectives } from "./objectives";
/**
* Class representing cmi object for SCORM 2004
*/
export class CMI extends BaseRootCMI {
/**
* Constructor for the SCORM 2004 cmi object
* @param {boolean} initialized
*/
constructor(initialized: boolean = false) {
super();
this.learner_preference = new CMILearnerPreference();
this.score = new Scorm2004CMIScore();
this.comments_from_learner = new CMICommentsFromLearner();
this.comments_from_lms = new CMICommentsFromLMS();
this.interactions = new CMIInteractions();
this.objectives = new CMIObjectives();
if (initialized) this.initialize();
}
public learner_preference: CMILearnerPreference;
public score: Scorm2004CMIScore;
public comments_from_learner: CMICommentsFromLearner;
public comments_from_lms: CMICommentsFromLMS;
public interactions: CMIInteractions;
public objectives: CMIObjectives;
private __version = "1.0";
private __children = scorm2004_constants.cmi_children;
private _completion_status = "unknown";
private _completion_threshold = "";
private _credit = "credit";
private _entry = "";
private _exit = "";
private _launch_data = "";
private _learner_id = "";
private _learner_name = "";
private _location = "";
private _max_time_allowed = "";
private _mode = "normal";
private _progress_measure = "";
private _scaled_passing_score = "";
private _session_time = "PT0H0M0S";
private _success_status = "unknown";
private _suspend_data = "";
private _time_limit_action = "continue,no message";
private _total_time = "";
/**
* Called when the API has been initialized after the CMI has been created
*/
override initialize() {
super.initialize();
this.learner_preference?.initialize();
this.score?.initialize();
this.comments_from_learner?.initialize();
this.comments_from_lms?.initialize();
this.interactions?.initialize();
this.objectives?.initialize();
}
/**
* Called when API is moving to another SCO
*/
reset() {
this._initialized = false;
this._completion_status = "incomplete";
this._exit = "";
this._session_time = "PT0H0M0S";
this._progress_measure = "";
this._location = "";
this.objectives?.reset(false);
this.interactions?.reset(true);
this.score?.reset();
this.comments_from_learner?.reset();
this.comments_from_lms?.reset();
this.learner_preference?.reset();
}
/**
* Getter for __version
* @return {string}
* @private
*/
get _version(): string {
return this.__version;
}
/**
* Setter for __version. Just throws an error.
* @param {string} _version
* @private
*/
set _version(_version: string) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
}
/**
* Getter for __children
* @return {string}
* @private
*/
get _children(): string {
return this.__children;
}
/**
* Setter for __children. Just throws an error.
* @param {string} _children
* @private
*/
set _children(_children: string) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
}
/**
* Getter for _completion_status
* @return {string}
*/
get completion_status(): string {
return this._completion_status;
}
/**
* Setter for _completion_status
* @param {string} completion_status
*/
set completion_status(completion_status: string) {
if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {
this._completion_status = completion_status;
}
}
/**
* Getter for _completion_threshold
* @return {string}
*/
get completion_threshold(): string {
return this._completion_threshold;
}
/**
* Setter for _completion_threshold. Can only be called before initialization.
* @param {string} completion_threshold
*/
set completion_threshold(completion_threshold: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._completion_threshold = completion_threshold;
}
}
/**
* Setter for _credit
* @return {string}
*/
get credit(): string {
return this._credit;
}
/**
* Setter for _credit. Can only be called before initialization.
* @param {string} credit
*/
set credit(credit: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._credit = credit;
}
}
/**
* Getter for _entry
* @return {string}
*/
get entry(): string {
return this._entry;
}
/**
* Setter for _entry. Can only be called before initialization.
* @param {string} entry
*/
set entry(entry: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._entry = entry;
}
}
/**
* Getter for _exit. Should only be called during JSON export.
* @return {string}
*/
get exit(): string {
if (!this.jsonString) {
throw new Scorm2004ValidationError(
scorm2004_errors.WRITE_ONLY_ELEMENT as number,
);
}
return this._exit;
}
/**
* Getter for _exit
* @param {string} exit
*/
set exit(exit: string) {
if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {
this._exit = exit;
}
}
/**
* Getter for _launch_data
* @return {string}
*/
get launch_data(): string {
return this._launch_data;
}
/**
* Setter for _launch_data. Can only be called before initialization.
* @param {string} launch_data
*/
set launch_data(launch_data: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._launch_data = launch_data;
}
}
/**
* Getter for _learner_id
* @return {string}
*/
get learner_id(): string {
return this._learner_id;
}
/**
* Setter for _learner_id. Can only be called before initialization.
* @param {string} learner_id
*/
set learner_id(learner_id: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._learner_id = learner_id;
}
}
/**
* Getter for _learner_name
* @return {string}
*/
get learner_name(): string {
return this._learner_name;
}
/**
* Setter for _learner_name. Can only be called before initialization.
* @param {string} learner_name
*/
set learner_name(learner_name: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._learner_name = learner_name;
}
}
/**
* Getter for _location
* @return {string}
*/
get location(): string {
return this._location;
}
/**
* Setter for _location
* @param {string} location
*/
set location(location: string) {
if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {
this._location = location;
}
}
/**
* Getter for _max_time_allowed
* @return {string}
*/
get max_time_allowed(): string {
return this._max_time_allowed;
}
/**
* Setter for _max_time_allowed. Can only be called before initialization.
* @param {string} max_time_allowed
*/
set max_time_allowed(max_time_allowed: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._max_time_allowed = max_time_allowed;
}
}
/**
* Getter for _mode
* @return {string}
*/
get mode(): string {
return this._mode;
}
/**
* Setter for _mode. Can only be called before initialization.
* @param {string} mode
*/
set mode(mode: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._mode = mode;
}
}
/**
* Getter for _progress_measure
* @return {string}
*/
get progress_measure(): string {
return this._progress_measure;
}
/**
* Setter for _progress_measure
* @param {string} progress_measure
*/
set progress_measure(progress_measure: string) {
if (
check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&
check2004ValidRange(progress_measure, scorm2004_regex.progress_range)
) {
this._progress_measure = progress_measure;
}
}
/**
* Getter for _scaled_passing_score
* @return {string}
*/
get scaled_passing_score(): string {
return this._scaled_passing_score;
}
/**
* Setter for _scaled_passing_score. Can only be called before initialization.
* @param {string} scaled_passing_score
*/
set scaled_passing_score(scaled_passing_score: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._scaled_passing_score = scaled_passing_score;
}
}
/**
* Getter for _session_time. Should only be called during JSON export.
* @return {string}
*/
get session_time(): string {
if (!this.jsonString) {
throw new Scorm2004ValidationError(
scorm2004_errors.WRITE_ONLY_ELEMENT as number,
);
}
return this._session_time;
}
/**
* Setter for _session_time
* @param {string} session_time
*/
set session_time(session_time: string) {
if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {
this._session_time = session_time;
}
}
/**
* Getter for _success_status
* @return {string}
*/
get success_status(): string {
return this._success_status;
}
/**
* Setter for _success_status
* @param {string} success_status
*/
set success_status(success_status: string) {
if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {
this._success_status = success_status;
}
}
/**
* Getter for _suspend_data
* @return {string}
*/
get suspend_data(): string {
return this._suspend_data;
}
/**
* Setter for _suspend_data
* @param {string} suspend_data
*/
set suspend_data(suspend_data: string) {
if (
check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000, true)
) {
this._suspend_data = suspend_data;
}
}
/**
* Getter for _time_limit_action
* @return {string}
*/
get time_limit_action(): string {
return this._time_limit_action;
}
/**
* Setter for _time_limit_action. Can only be called before initialization.
* @param {string} time_limit_action
*/
set time_limit_action(time_limit_action: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._time_limit_action = time_limit_action;
}
}
/**
* Getter for _total_time
* @return {string}
*/
get total_time(): string {
return this._total_time;
}
/**
* Setter for _total_time. Can only be called before initialization.
* @param {string} total_time
*/
set total_time(total_time: string) {
if (this.initialized) {
throw new Scorm2004ValidationError(
scorm2004_errors.READ_ONLY_ELEMENT as number,
);
} else {
this._total_time = total_time;
}
}
/**
* Adds the current session time to the existing total time.
*
* @return {string} ISO8601 Duration
*/
getCurrentTotalTime(): string {
let sessionTime = this._session_time;
const startTime = this.start_time;
if (typeof startTime !== "undefined" && startTime !== null) {
const seconds = new Date().getTime() - startTime;
sessionTime = Util.getSecondsAsISODuration(seconds / 1000);
}
return Util.addTwoDurations(
this._total_time,
sessionTime,
scorm2004_regex.CMITimespan,
);
}
/**
* toJSON for cmi
*
* @return {
* {
* comments_from_learner: CMICommentsFromLearner,
* comments_from_lms: CMICommentsFromLMS,
* completion_status: string,
* completion_threshold: string,
* credit: string,
* entry: string,
* exit: string,
* interactions: CMIInteractions,
* launch_data: string,
* learner_id: string,
* learner_name: string,
* learner_preference: CMILearnerPreference,
* location: string,
* max_time_allowed: string,
* mode: string,
* objectives: CMIObjectives,
* progress_measure: string,
* scaled_passing_score: string,
* score: Scorm2004CMIScore,
* session_time: string,
* success_status: string,
* suspend_data: string,
* time_limit_action: string
* }
* }
*/
toJSON(): {
comments_from_learner: CMICommentsFromLearner;
comments_from_lms: CMICommentsFromLMS;
completion_status: string;
completion_threshold: string;
credit: string;
entry: string;
exit: string;
interactions: CMIInteractions;
launch_data: string;
learner_id: string;
learner_name: string;
learner_preference: CMILearnerPreference;
location: string;
max_time_allowed: string;
mode: string;
objectives: CMIObjectives;
progress_measure: string;
scaled_passing_score: string;
score: Scorm2004CMIScore;
session_time: string;
success_status: string;
suspend_data: string;
time_limit_action: string;
} {
this.jsonString = true;
const result = {
comments_from_learner: this.comments_from_learner,
comments_from_lms: this.comments_from_lms,
completion_status: this.completion_status,
completion_threshold: this.completion_threshold,
credit: this.credit,
entry: this.entry,
exit: this.exit,
interactions: this.interactions,
launch_data: this.launch_data,
learner_id: this.learner_id,
learner_name: this.learner_name,
learner_preference: this.learner_preference,
location: this.location,
max_time_allowed: this.max_time_allowed,
mode: this.mode,
objectives: this.objectives,
progress_measure: this.progress_measure,
scaled_passing_score: this.scaled_passing_score,
score: this.score,
session_time: this.session_time,
success_status: this.success_status,
suspend_data: this.suspend_data,
time_limit_action: this.time_limit_action,
};
delete this.jsonString;
return result;
}
}